From 5d5eb9e3817a2765297e6dd5649ecb9b8b03e334 Mon Sep 17 00:00:00 2001 From: Jim Grosbach Date: Wed, 10 Nov 2010 23:38:36 +0000 Subject: [PATCH] ARM LDM encoding for the mode (ia, ib, da, db) operand. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118736 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMCodeEmitter.cpp | 2 ++ lib/Target/ARM/ARMInstrFormats.td | 4 +++- lib/Target/ARM/ARMInstrInfo.td | 1 + lib/Target/ARM/ARMMCCodeEmitter.cpp | 13 +++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/Target/ARM/ARMCodeEmitter.cpp b/lib/Target/ARM/ARMCodeEmitter.cpp index 7f073d7c0a1..1d3e3101595 100644 --- a/lib/Target/ARM/ARMCodeEmitter.cpp +++ b/lib/Target/ARM/ARMCodeEmitter.cpp @@ -177,6 +177,8 @@ namespace { const { return 0; } unsigned getBitfieldInvertedMaskOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } + uint32_t getLdStmModeOpValue(const MachineInstr &MI, unsigned OpIdx) + const {return 0; } uint32_t getLdStSORegOpValue(const MachineInstr &MI, unsigned OpIdx) const { return 0; } diff --git a/lib/Target/ARM/ARMInstrFormats.td b/lib/Target/ARM/ARMInstrFormats.td index f03ef56db8b..2e3362c6093 100644 --- a/lib/Target/ARM/ARMInstrFormats.td +++ b/lib/Target/ARM/ARMInstrFormats.td @@ -942,8 +942,10 @@ class AXI4ld { bits<16> dsts; bits<4> Rn; + bits<2> amode; let Inst{27-25} = 0b100; - let Inst{24-22} = 0b010; + let Inst{24-23} = amode; + let Inst{22} = 0; // S bit let Inst{20} = 1; // L bit let Inst{19-16} = Rn; let Inst{15-0} = dsts; diff --git a/lib/Target/ARM/ARMInstrInfo.td b/lib/Target/ARM/ARMInstrInfo.td index f36a9fde06f..5237a55255e 100644 --- a/lib/Target/ARM/ARMInstrInfo.td +++ b/lib/Target/ARM/ARMInstrInfo.td @@ -456,6 +456,7 @@ def am3offset : Operand, // ldstm_mode := {ia, ib, da, db} // def ldstm_mode : OptionalDefOperand { + string EncoderMethod = "getLdStmModeOpValue"; let PrintMethod = "printLdStmModeOperand"; } diff --git a/lib/Target/ARM/ARMMCCodeEmitter.cpp b/lib/Target/ARM/ARMMCCodeEmitter.cpp index bd799f233c0..38f5c797046 100644 --- a/lib/Target/ARM/ARMMCCodeEmitter.cpp +++ b/lib/Target/ARM/ARMMCCodeEmitter.cpp @@ -82,6 +82,19 @@ public: uint32_t getLdStSORegOpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const; + /// getLdStmModeOpValue - Return encoding for load/store multiple mode. + uint32_t getLdStmModeOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &Fixups) const { + ARM_AM::AMSubMode Mode = (ARM_AM::AMSubMode)MI.getOperand(OpIdx).getImm(); + switch (Mode) { + default: assert(0 && "Unknown addressing sub-mode!"); + case ARM_AM::da: return 0; + case ARM_AM::ia: return 1; + case ARM_AM::db: return 2; + case ARM_AM::ib: return 3; + } + } + /// getAddrMode5OpValue - Return encoding info for 'reg +/- imm8' operand. uint32_t getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const; -- 2.34.1