diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86InstrBuilder.h')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrBuilder.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86InstrBuilder.h b/llvm/lib/Target/X86/X86InstrBuilder.h index 787f15bc628..4ece035076d 100644 --- a/llvm/lib/Target/X86/X86InstrBuilder.h +++ b/llvm/lib/Target/X86/X86InstrBuilder.h @@ -83,6 +83,34 @@ struct X86AddressMode { } }; +/// Compute the addressing mode from an machine instruction starting with the +/// given operand. +static inline X86AddressMode getAddressFromInstr(MachineInstr *MI, + unsigned Operand) { + X86AddressMode AM; + MachineOperand &Op = MI->getOperand(Operand); + if (Op.isReg()) { + AM.BaseType = X86AddressMode::RegBase; + AM.Base.Reg = Op.getReg(); + } else { + AM.BaseType = X86AddressMode::FrameIndexBase; + AM.Base.FrameIndex = Op.getIndex(); + } + Op = MI->getOperand(Operand + 1); + if (Op.isImm()) + AM.Scale = Op.getImm(); + Op = MI->getOperand(Operand + 2); + if (Op.isImm()) + AM.IndexReg = Op.getImm(); + Op = MI->getOperand(Operand + 3); + if (Op.isGlobal()) { + AM.GV = Op.getGlobal(); + } else { + AM.Disp = Op.getImm(); + } + return AM; +} + /// addDirectMem - This function is used to add a direct memory reference to the /// current instruction -- that is, a dereference of an address in a register, /// with no scale, index or displacement. An example is: DWORD PTR [EAX]. |

