| 299 | } |
| 300 | |
| 301 | bool X86Instr::GetIndexRegisterAndOffset(int* outRegister, int* outOffset) |
| 302 | { |
| 303 | const MCInstrDesc &instDesc = mX86->mInstrInfo->get(mMCInst.getOpcode()); |
| 304 | |
| 305 | auto form = (instDesc.TSFlags & llvm::X86II::FormMask); |
| 306 | if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) || |
| 307 | ((form >= llvm::X86II::MRM0m) && (form <= llvm::X86II::MRM7m))) |
| 308 | { |
| 309 | auto baseReg = mMCInst.getOperand(llvm::X86::AddrBaseReg); |
| 310 | auto scaleAmt = mMCInst.getOperand(llvm::X86::AddrScaleAmt); |
| 311 | auto indexReg = mMCInst.getOperand(llvm::X86::AddrIndexReg); |
| 312 | auto addrDisp = mMCInst.getOperand(llvm::X86::AddrDisp); |
| 313 | |
| 314 | /*bool a = baseReg.isReg(); |
| 315 | bool b = scaleAmt.isImm(); |
| 316 | int c = scaleAmt.getImm(); |
| 317 | bool d = indexReg.isReg(); |
| 318 | int e = indexReg.getReg(); |
| 319 | bool f = addrDisp.isImm();*/ |
| 320 | |
| 321 | bool isValid = false; |
| 322 | |
| 323 | // Look for [reg+offset] form |
| 324 | if ((baseReg.isReg()) && |
| 325 | (scaleAmt.isImm()) && (scaleAmt.getImm() == 1) && |
| 326 | (indexReg.isReg()) && (indexReg.getReg() == llvm::X86::NoRegister) && |
| 327 | (addrDisp.isImm())) |
| 328 | { |
| 329 | int regNum = ConvertRegNum(baseReg); |
| 330 | if (regNum == -1) |
| 331 | return false; |
| 332 | *outRegister = regNum; |
| 333 | *outOffset = (int)addrDisp.getImm(); |
| 334 | return true; |
| 335 | } |
| 336 | } |
| 337 | return false; |
| 338 | } |
| 339 | |
| 340 | bool X86Instr::GetImmediate(uint32* outImm) |
| 341 | { |
no test coverage detected