| 870 | } |
| 871 | |
| 872 | void BeMCColorizer::Prepare() |
| 873 | { |
| 874 | mReserveParamRegs = false; |
| 875 | mNodes.Resize(mContext->mVRegInfo.size()); |
| 876 | |
| 877 | for (int vregIdx = 0; vregIdx < (int)mNodes.size(); vregIdx++) |
| 878 | { |
| 879 | auto node = &mNodes[vregIdx]; |
| 880 | node->Prepare(); |
| 881 | //node->mActualVRegIdx = vregIdx; |
| 882 | auto vregInfo = mContext->mVRegInfo[vregIdx]; |
| 883 | if ((vregInfo->mIsRetVal) && (mContext->mCompositeRetVRegIdx != -1) && (vregIdx != mContext->mCompositeRetVRegIdx)) |
| 884 | continue; |
| 885 | if (vregInfo->mRelTo) |
| 886 | { |
| 887 | BF_ASSERT(vregInfo->mIsExpr); |
| 888 | |
| 889 | /*if ((vregInfo->IsDirectRelTo()) && (vregInfo->mRelTo.mKind == BeMCOperandKind_VReg)) |
| 890 | node->mActualVRegIdx = vregInfo->mRelTo.mVRegIdx; */ |
| 891 | |
| 892 | //node->mWantsReg = false; |
| 893 | //vregInfo->mReg = X64Reg_None; |
| 894 | //continue; |
| 895 | } |
| 896 | |
| 897 | if ((vregInfo->mRefCount > 0) || (vregInfo->mIsRetVal)) |
| 898 | { |
| 899 | node->mWantsReg = ((vregInfo->mType->mSize > 0) && (!vregInfo->mRegNumPinned) && (!vregInfo->mSpilled) && |
| 900 | (!vregInfo->mIsExpr) && (!vregInfo->mForceMem) && (vregInfo->mFrameOffset == INT_MIN)); |
| 901 | } |
| 902 | |
| 903 | // if (vregInfo->mIsRetVal) |
| 904 | // node->mWantsReg = true; |
| 905 | if (!node->mWantsReg) |
| 906 | vregInfo->mReg = X64Reg_None; |
| 907 | vregInfo->mVRegAffinity = -1; |
| 908 | /*if (vregInfo->mForceReg) |
| 909 | { |
| 910 | // We can't have reg restrictions when we have forceReg set |
| 911 | BF_ASSERT(!vregInfo->mDisableR12); |
| 912 | BF_ASSERT(!vregInfo->mDisableRDX); |
| 913 | }*/ |
| 914 | if (vregInfo->mDisableR11) |
| 915 | node->AdjustRegCost(X64Reg_R11, 0x0FFFFFFF); |
| 916 | if (vregInfo->mDisableR12) |
| 917 | node->AdjustRegCost(X64Reg_R12, 0x0FFFFFFF); |
| 918 | if (vregInfo->mDisableR13) |
| 919 | node->AdjustRegCost(X64Reg_R13, 0x0FFFFFFF); |
| 920 | if (vregInfo->mDisableRAX) |
| 921 | node->AdjustRegCost(X64Reg_RAX, 0x0FFFFFFF); |
| 922 | if (vregInfo->mDisableRDX) |
| 923 | node->AdjustRegCost(X64Reg_RDX, 0x0FFFFFFF); |
| 924 | if (vregInfo->mDisableEx) |
| 925 | { |
| 926 | for (int i = X64Reg_RSI; i <= X64Reg_R15; i++) |
| 927 | node->AdjustRegCost((X64CPURegister)i, 0x0FFFFFFF); |
| 928 | } |
| 929 | } |
no test coverage detected