From 69798f0bc019946f8780ff4462e922d2487bb88f Mon Sep 17 00:00:00 2001 From: John Brawn Date: Fri, 5 May 2017 11:31:25 +0000 Subject: [PATCH] [ARM] Add support for ORR and ORN instruction substitutions Recently support was added for substituting one intruction for another by negating or inverting the immediate, but ORR and ORN were missed so this patch adds them. This one is slightly different to the others in that ORN only exists in thumb, so we only do the substitution in thumb. Differential Revision: https://reviews.llvm.org/D32534 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302224 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMInstrThumb2.td | 13 +++++++++++++ test/MC/ARM/negative-immediates-fail.s | 5 +++++ test/MC/ARM/negative-immediates-thumb1-fail.s | 5 +++++ test/MC/ARM/negative-immediates.s | 16 ++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/lib/Target/ARM/ARMInstrThumb2.td b/lib/Target/ARM/ARMInstrThumb2.td index d6598e38304..bf3d820e7b7 100644 --- a/lib/Target/ARM/ARMInstrThumb2.td +++ b/lib/Target/ARM/ARMInstrThumb2.td @@ -4706,6 +4706,19 @@ def : t2InstSubst<"and${s}${p} $Rd, $Rn, $imm", def : t2InstSubst<"and${s}${p} $Rdn, $imm", (t2BICri rGPR:$Rdn, rGPR:$Rdn, t2_so_imm_not:$imm, pred:$p, cc_out:$s)>; +// And ORR <--> ORN +def : t2InstSubst<"orn${s}${p} $Rd, $Rn, $imm", + (t2ORRri rGPR:$Rd, rGPR:$Rn, t2_so_imm_not:$imm, + pred:$p, cc_out:$s)>; +def : t2InstSubst<"orn${s}${p} $Rdn, $imm", + (t2ORRri rGPR:$Rdn, rGPR:$Rdn, t2_so_imm_not:$imm, + pred:$p, cc_out:$s)>; +def : t2InstSubst<"orr${s}${p} $Rd, $Rn, $imm", + (t2ORNri rGPR:$Rd, rGPR:$Rn, t2_so_imm_not:$imm, + pred:$p, cc_out:$s)>; +def : t2InstSubst<"orr${s}${p} $Rdn, $imm", + (t2ORNri rGPR:$Rdn, rGPR:$Rdn, t2_so_imm_not:$imm, + pred:$p, cc_out:$s)>; // Likewise, "add Rd, t2_so_imm_neg" -> sub def : t2InstSubst<"add${s}${p} $Rd, $Rn, $imm", (t2SUBri GPRnopc:$Rd, GPRnopc:$Rn, t2_so_imm_neg:$imm, diff --git a/test/MC/ARM/negative-immediates-fail.s b/test/MC/ARM/negative-immediates-fail.s index dd45e431638..959e55eebb5 100644 --- a/test/MC/ARM/negative-immediates-fail.s +++ b/test/MC/ARM/negative-immediates-fail.s @@ -11,3 +11,8 @@ ADC r0, r1, #0xFFFFFE02 ADD.W r0, r0, #0xFF01FF01 # CHECK: error: immediate operand must be in the range [0,7] + +ORR r0, r1, #0xFFFFFF00 +# CHECK: error: instruction requires: thumb2 +ORN r0, r1, #0xFFFFFF00 +# CHECK: error: instruction requires: thumb2 diff --git a/test/MC/ARM/negative-immediates-thumb1-fail.s b/test/MC/ARM/negative-immediates-thumb1-fail.s index 0e8525ede90..3648721203a 100644 --- a/test/MC/ARM/negative-immediates-thumb1-fail.s +++ b/test/MC/ARM/negative-immediates-thumb1-fail.s @@ -13,3 +13,8 @@ SUBs r1, r0, #0xFFFFFFF5 SUBs r0, #0xFFFFFEFF # CHECK: error: immediate operand must be in the range [0,255] + +ORRs r0, r1, #0xFFFFFF00 +# CHECK: error: instruction requires: thumb2 +ORNs r0, r1, #0xFFFFFF00 +# CHECK: error: instruction requires: thumb2 diff --git a/test/MC/ARM/negative-immediates.s b/test/MC/ARM/negative-immediates.s index aa3998163d8..38a6bbb1b7b 100644 --- a/test/MC/ARM/negative-immediates.s +++ b/test/MC/ARM/negative-immediates.s @@ -98,6 +98,22 @@ # CHECK: and r0, r1, #16777472 @ encoding: [0x01,0xf0,0x01,0x20] # CHECK-DISABLED: error: instruction requires: NegativeImmediates # CHECK-DISABLED: BIC + ORR r0, r1, #0xFFFFFF00 +# CHECK-DISABLED: error: instruction requires: NegativeImmediates +# CHECK-DISABLED: ORR +# CHECK: orn r0, r1, #255 + ORR r0, r1, #0xFEFFFEFF +# CHECK: orn r0, r1, #16777472 @ encoding: [0x61,0xf0,0x01,0x20] +# CHECK-DISABLED: error: instruction requires: NegativeImmediates +# CHECK-DISABLED: ORR + ORN r0, r1, #0xFFFFFF00 +# CHECK: orr r0, r1, #255 +# CHECK-DISABLED: error: instruction requires: NegativeImmediates +# CHECK-DISABLED: ORN + ORN r0, r1, #0xFEFFFEFF +# CHECK: orr r0, r1, #16777472 @ encoding: [0x41,0xf0,0x01,0x20] +# CHECK-DISABLED: error: instruction requires: NegativeImmediates +# CHECK-DISABLED: ORN CMP r0, #0xFFFFFF01 # CHECK: cmn.w r0, #255 # CHECK-DISABLED: error: instruction requires: NegativeImmediates -- 2.11.0