Index: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td =================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td @@ -4706,6 +4706,19 @@ 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, Index: llvm/trunk/test/MC/ARM/negative-immediates-fail.s =================================================================== --- llvm/trunk/test/MC/ARM/negative-immediates-fail.s +++ llvm/trunk/test/MC/ARM/negative-immediates-fail.s @@ -11,3 +11,8 @@ 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 Index: llvm/trunk/test/MC/ARM/negative-immediates-thumb1-fail.s =================================================================== --- llvm/trunk/test/MC/ARM/negative-immediates-thumb1-fail.s +++ llvm/trunk/test/MC/ARM/negative-immediates-thumb1-fail.s @@ -13,3 +13,8 @@ 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 Index: llvm/trunk/test/MC/ARM/negative-immediates.s =================================================================== --- llvm/trunk/test/MC/ARM/negative-immediates.s +++ llvm/trunk/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