diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-10-20 00:40:56 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-10-20 00:40:56 +0000 |
| commit | 2f69ed8f4cdcf20b39a7972c986975bdd58e7af6 (patch) | |
| tree | ce34644d5d16bac519b630f9a13f089ec1193435 /llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp | |
| parent | 772b2f84eb61229d3579478ccb3483fe765a3100 (diff) | |
| download | bcm5719-llvm-2f69ed8f4cdcf20b39a7972c986975bdd58e7af6.tar.gz bcm5719-llvm-2f69ed8f4cdcf20b39a7972c986975bdd58e7af6.zip | |
implement printSORegOperand, add lowering for the nasty and despicable MOVi2pieces :)
llvm-svn: 84573
Diffstat (limited to 'llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp index b227baec62a..abb0399fa45 100644 --- a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp +++ b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp @@ -79,6 +79,37 @@ void ARMInstPrinter::printSOImmOperand(const MCInst *MI, unsigned OpNum) { printSOImm(O, MO.getImm(), VerboseAsm, &MAI); } +/// printSOImm2PartOperand - SOImm is broken into two pieces using a 'mov' +/// followed by an 'orr' to materialize. +void ARMInstPrinter::printSOImm2PartOperand(const MCInst *MI, unsigned OpNum) { + // FIXME: REMOVE this method. + abort(); +} + +// so_reg is a 4-operand unit corresponding to register forms of the A5.1 +// "Addressing Mode 1 - Data-processing operands" forms. This includes: +// REG 0 0 - e.g. R5 +// REG REG 0,SH_OPC - e.g. R5, ROR R3 +// REG 0 IMM,SH_OPC - e.g. R5, LSL #3 +void ARMInstPrinter::printSORegOperand(const MCInst *MI, unsigned OpNum) { + const MCOperand &MO1 = MI->getOperand(OpNum); + const MCOperand &MO2 = MI->getOperand(OpNum+1); + const MCOperand &MO3 = MI->getOperand(OpNum+2); + + O << getRegisterName(MO1.getReg()); + + // Print the shift opc. + O << ", " + << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(MO3.getImm())) + << ' '; + + if (MO2.getReg()) { + O << getRegisterName(MO2.getReg()); + assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0); + } else { + O << "#" << ARM_AM::getSORegOffset(MO3.getImm()); + } +} void ARMInstPrinter::printAddrMode2Operand(const MCInst *MI, unsigned Op) { |

