[MC][ARM] Reject Thumb "ror rX, #0"

The ROR instruction can only handle immediates between 1 and 31. The
would-be encoding for ROR #0 is actually the RRX instruction.

Reviewed By: nickdesaulniers

Differential Revision: https://reviews.llvm.org/D102455
This commit is contained in:
Ryan Prichard 2021-05-19 15:05:17 -07:00
parent 757a851a2c
commit 65d0264ba2
2 changed files with 7 additions and 1 deletions

View File

@ -2683,7 +2683,7 @@ def : T2Pat<(ARMusat (sra GPRnopc:$Rn, asr_imm:$shft), imm0_31:$pos),
defm t2LSL : T2I_sh_ir<0b00, "lsl", imm1_31, shl>;
defm t2LSR : T2I_sh_ir<0b01, "lsr", imm_sr, srl>;
defm t2ASR : T2I_sh_ir<0b10, "asr", imm_sr, sra>;
defm t2ROR : T2I_sh_ir<0b11, "ror", imm0_31, rotr>;
defm t2ROR : T2I_sh_ir<0b11, "ror", imm1_31, rotr>;
// LSL #0 is actually MOV, and has slightly different permitted registers to
// LSL with non-zero shift

View File

@ -49,6 +49,12 @@
@ CHECK-ERRORS-V7: operand must be an immediate in the range [0,15]
@ CHECK-ERRORS-V8: invalid instruction
@ Out of range immediate for ROR.
@ (Assembling this instruction to "mov r1, r1" might also be OK.)
ror r1, r1, #0
@ CHECK-ERRORS: invalid instruction
@ CHECK-ERRORS: operand must be an immediate in the range [1,31]
isb #-1
isb #16
@ CHECK-ERRORS: error: immediate value out of range