[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