Skip to content

Commit

Permalink
[ARM] Add support for ORR and ORN instruction substitutions
Browse files Browse the repository at this point in the history
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
  • Loading branch information
john-brawn-arm committed May 5, 2017
1 parent 09fdcb4 commit 69798f0
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 0 deletions.
13 changes: 13 additions & 0 deletions lib/Target/ARM/ARMInstrThumb2.td
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
5 changes: 5 additions & 0 deletions test/MC/ARM/negative-immediates-fail.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
5 changes: 5 additions & 0 deletions test/MC/ARM/negative-immediates-thumb1-fail.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
16 changes: 16 additions & 0 deletions test/MC/ARM/negative-immediates.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 69798f0

Please sign in to comment.