MCPcopy Create free account
hub / github.com/beefytech/Beef / GetIndexRegisterAndOffset

Method GetIndexRegisterAndOffset

IDEHelper/X86.cpp:301–338  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

299}
300
301bool 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
340bool X86Instr::GetImmediate(uint32* outImm)
341{

Callers 1

DisassembleAtMethod · 0.45

Calls 2

ConvertRegNumFunction · 0.70
getMethod · 0.45

Tested by

no test coverage detected