diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 22 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrBuilder.h | 28 |
2 files changed, 29 insertions, 21 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 4f8719d1213..2c22ab758e5 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -23707,27 +23707,7 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI, case X86::FP80_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m80; break; } - X86AddressMode AM; - MachineOperand &Op = MI->getOperand(0); - 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(1); - if (Op.isImm()) - AM.Scale = Op.getImm(); - Op = MI->getOperand(2); - if (Op.isImm()) - AM.IndexReg = Op.getImm(); - Op = MI->getOperand(3); - if (Op.isGlobal()) { - AM.GV = Op.getGlobal(); - } else { - AM.Disp = Op.getImm(); - } + X86AddressMode AM = getAddressFromInstr(MI, 0); addFullAddress(BuildMI(*BB, MI, DL, TII->get(Opc)), AM) .addReg(MI->getOperand(X86::AddrNumOperands).getReg()); 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]. |

