| 5817 | } |
| 5818 | |
| 5819 | void BeMCContext::GetRMParams(const BeMCOperand& operand, BeRMParamsInfo& rmInfo, bool doValidate) |
| 5820 | { |
| 5821 | BeMCRMMode rmMode = BeMCRMMode_Invalid; |
| 5822 | if (operand.mKind == BeMCOperandKind_NativeReg) |
| 5823 | { |
| 5824 | if (rmInfo.mRegA == X64Reg_None) |
| 5825 | rmInfo.mRegA = operand.mReg; |
| 5826 | else if (rmInfo.mRegB == X64Reg_None) |
| 5827 | rmInfo.mRegB = operand.mReg; |
| 5828 | else |
| 5829 | { |
| 5830 | rmInfo.mMode = BeMCRMMode_Invalid; |
| 5831 | return; |
| 5832 | } |
| 5833 | rmInfo.mMode = BeMCRMMode_Direct; |
| 5834 | return ValidateRMResult(operand, rmInfo, doValidate); |
| 5835 | } |
| 5836 | else if (operand.IsImmediateInt()) |
| 5837 | { |
| 5838 | rmInfo.mDisp += (int)operand.mImmediate; |
| 5839 | rmInfo.mMode = BeMCRMMode_Direct; |
| 5840 | return ValidateRMResult(operand, rmInfo, doValidate); |
| 5841 | } |
| 5842 | |
| 5843 | if (operand.mKind == BeMCOperandKind_VReg) |
| 5844 | { |
| 5845 | auto vregInfo = mVRegInfo[operand.mVRegIdx]; |
| 5846 | if (!vregInfo->mIsExpr) |
| 5847 | { |
| 5848 | auto reg = vregInfo->mReg; |
| 5849 | if (reg != X64Reg_None) |
| 5850 | { |
| 5851 | if (rmInfo.mRegA == X64Reg_None) |
| 5852 | rmInfo.mRegA = reg; |
| 5853 | else if (rmInfo.mRegB == X64Reg_None) |
| 5854 | rmInfo.mRegB = reg; |
| 5855 | else |
| 5856 | { |
| 5857 | rmInfo.mMode = BeMCRMMode_Invalid; |
| 5858 | return; |
| 5859 | } |
| 5860 | rmInfo.mMode = BeMCRMMode_Direct; |
| 5861 | return ValidateRMResult(operand, rmInfo, doValidate); |
| 5862 | } |
| 5863 | |
| 5864 | GetRMParams(OperandToAddr(operand), rmInfo, doValidate); |
| 5865 | if (rmInfo.mMode == BeMCRMMode_Invalid) |
| 5866 | return; |
| 5867 | BF_ASSERT(rmInfo.mMode == BeMCRMMode_Direct); |
| 5868 | rmInfo.mMode = BeMCRMMode_Deref; |
| 5869 | return ValidateRMResult(OperandToAddr(operand), rmInfo, doValidate); |
| 5870 | } |
| 5871 | // Fall through |
| 5872 | } |
| 5873 | else if (operand.mKind == BeMCOperandKind_VRegAddr) |
| 5874 | { |
| 5875 | auto vregInfo = mVRegInfo[operand.mVRegIdx]; |
| 5876 |
nothing calls this directly
no test coverage detected