diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -2683,7 +2683,7 @@ 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 diff --git a/llvm/test/MC/ARM/thumb2-diagnostics.s b/llvm/test/MC/ARM/thumb2-diagnostics.s --- a/llvm/test/MC/ARM/thumb2-diagnostics.s +++ b/llvm/test/MC/ARM/thumb2-diagnostics.s @@ -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