[PATCH] D11055: [ARM] Add Thumb2 ADD with PC narrowing from 3 operand to 2 operand

scott douglass sdouglass at arm.com
Thu Jul 9 03:27:58 PDT 2015


scott-0 created this revision.
scott-0 added a subscriber: llvm-commits.
Herald added subscribers: rengolin, aemerson.

The existing Thumb2 ADD narrowing misses cases involving the PC.  This patch adds them.

Depends on http://reviews.llvm.org/D11054 and http://reviews.llvm.org/D11053.

http://reviews.llvm.org/D11055

Files:
  lib/Target/ARM/AsmParser/ARMAsmParser.cpp
  test/MC/ARM/thumb2-narrow-dp.ll

Index: test/MC/ARM/thumb2-narrow-dp.ll
===================================================================
--- test/MC/ARM/thumb2-narrow-dp.ll
+++ test/MC/ARM/thumb2-narrow-dp.ll
@@ -65,6 +65,10 @@
 
     ADD      r3, r3, r1          // T2
 // CHECK: add  r3, r1               @ encoding: [0x0b,0x44]
+    ADD      r4, r4, pc          // T2
+// CHECK: add  r4, pc               @ encoding: [0x7c,0x44]
+    ADD      pc, pc, r2          // T2
+// CHECK: add  pc, r2               @ encoding: [0x97,0x44]
 
 // ADD (SP plus immediate) A8.8.9
     ADD      sp, sp, #20         // T2
Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp
===================================================================
--- lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -5469,20 +5469,30 @@
 
 // \brief Some Thumb1 instructions have two operand forms that are not
 // available as three operand, convert to two operand form if possible.
+// For most Thumb2 cases we just generate the 3 operand form and
+// reduce it in processInstruction, but for ADD involving PC the the 3
+// operand form won't accept PC so we do the transformation here.
 //
 // FIXME: We would really like to be able to tablegen'erate this.
 void ARMAsmParser::tryConvertingToTwoOperandForm(StringRef Mnemonic,
                                                  bool CarrySetting,
                                                  OperandVector &Operands) {
-  if (Operands.size() != 6 || !isThumbOne())
+  if (Operands.size() != 6)
     return;
 
   ARMOperand &Op3 = static_cast<ARMOperand &>(*Operands[3]);
   ARMOperand &Op4 = static_cast<ARMOperand &>(*Operands[4]);
   if (!Op3.isReg() || !Op4.isReg())
     return;
 
   ARMOperand &Op5 = static_cast<ARMOperand &>(*Operands[5]);
+  if (isThumbTwo()) {
+    if (Mnemonic != "add" ||
+        !(Op3.getReg() == ARM::PC || Op4.getReg() == ARM::PC ||
+          (Op5.isReg() && Op5.getReg() == ARM::PC)))
+      return;
+  } else if (!isThumbOne())
+    return;
 
   // If first 2 operands of a 3 operand instruction are the same
   // then transform to 2 operand version of the same instruction


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11055.29309.patch
Type: text/x-patch
Size: 2143 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150709/59d8f8f2/attachment.bin>


More information about the llvm-commits mailing list