diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2016-03-30 03:10:24 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2016-03-30 03:10:24 +0000 |
commit | 81c3ddeb1c24671c03a25420745ca38efba42263 (patch) | |
tree | 12e21661f5081fe5906538854a09f72f04383b02 | |
parent | a55fd1a9dcc429a2020144b201bf3c98cb1adb18 (diff) | |
download | bcm5719-llvm-81c3ddeb1c24671c03a25420745ca38efba42263.tar.gz bcm5719-llvm-81c3ddeb1c24671c03a25420745ca38efba42263.zip |
[x86] Extract a helper function to compute the full addressing mode from
an x86 MachineInstr's operands. This will be super useful to fix some
bad atomics code in my next commit.
No functionality changed.
llvm-svn: 264819
-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]. |