diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 2e4880a..5aced1d 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -10244,9 +10244,24 @@ do_t_mov_cmp (void) reject_bad_reg (Rn); reject_bad_reg (Rm); } - else if ((Rn == REG_SP || Rn == REG_PC) - && (Rm == REG_SP || Rm == REG_PC)) - reject_bad_reg (Rm); + else if (narrow) + { + /* This is mov.n. */ + if ((Rn == REG_SP || Rn == REG_PC) + && (Rm == REG_SP || Rm == REG_PC)) + { + as_warn (_("Use of r%u as a source register is " + "deprecated when r%u is the destination " + "register."), Rm, Rn); + } + } + else + { + /* This is mov.w. */ + constraint (Rn == REG_PC, BAD_PC); + constraint (Rm == REG_PC, BAD_PC); + constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP); + } } else reject_bad_reg (Rn); diff --git a/gas/testsuite/gas/arm/thumb2_bad_reg.l b/gas/testsuite/gas/arm/thumb2_bad_reg.l index 1da7bac..2679e59 100644 --- a/gas/testsuite/gas/arm/thumb2_bad_reg.l +++ b/gas/testsuite/gas/arm/thumb2_bad_reg.l @@ -137,14 +137,24 @@ [^:]*:[0-9]+: Error: r15 not allowed here -- `mls r0,r0,r0,r15' [^:]*:[0-9]+: Error: r13 not allowed here -- `mov.w r13,#1' [^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,#1' +[^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r0,r15' +[^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,r0' [^:]*:[0-9]+: Error: r13 not allowed here -- `movs.w r0,r13' [^:]*:[0-9]+: Error: r15 not allowed here -- `movs.w r0,r15' [^:]*:[0-9]+: Error: r13 not allowed here -- `movs.w r13,r0' [^:]*:[0-9]+: Error: r15 not allowed here -- `movs.w r15,r0' [^:]*:[0-9]+: Error: r13 not allowed here -- `mov.w r13,r13' -[^:]*:[0-9]+: Error: r13 not allowed here -- `mov.w r15,r13' +[^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,r13' [^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r13,r15' [^:]*:[0-9]+: Error: r15 not allowed here -- `mov.w r15,r15' +[^:]*:[0-9]+: Warning: Use of r13 as a source register is deprecated when r13 is the destination register. +[^:]*:[0-9]+: Warning: Use of r13 as a source register is deprecated when r15 is the destination register. +[^:]*:[0-9]+: Warning: Use of r15 as a source register is deprecated when r13 is the destination register. +[^:]*:[0-9]+: Warning: Use of r15 as a source register is deprecated when r15 is the destination register. +[^:]*:[0-9]+: Error: r13 not allowed here -- `movs r13,r13' +[^:]*:[0-9]+: Error: r15 not allowed here -- `movs r15,r13' +[^:]*:[0-9]+: Error: r13 not allowed here -- `movs r13,r15' +[^:]*:[0-9]+: Error: r15 not allowed here -- `movs r15,r15' [^:]*:[0-9]+: Error: r13 not allowed here -- `movt r13,#1' [^:]*:[0-9]+: Error: r15 not allowed here -- `movt r15,#1' [^:]*:[0-9]+: Error: r13 not allowed here -- `mrc p0,#1,r13,cr0,cr0' diff --git a/gas/testsuite/gas/arm/thumb2_bad_reg.s b/gas/testsuite/gas/arm/thumb2_bad_reg.s index 20a26e0..f1b1c0b 100644 --- a/gas/testsuite/gas/arm/thumb2_bad_reg.s +++ b/gas/testsuite/gas/arm/thumb2_bad_reg.s @@ -191,8 +191,8 @@ test: mov r13, r0 @ OK mov r15, r0 @ OK mov.w r0, r13 @ OK - mov.w r0, r15 @ OK - mov.w r15, r0 @ OK + mov.w r0, r15 + mov.w r15, r0 mov.w r13, r0 @ OK movs.w r0, r13 movs.w r0, r15 @@ -202,6 +202,14 @@ test: mov.w r15, r13 mov.w r13, r15 mov.w r15, r15 + mov r13, r13 @ Deprecated + mov r15, r13 @ Deprecated + mov r13, r15 @ Deprecated + mov r15, r15 @ Deprecated + movs r13, r13 + movs r15, r13 + movs r13, r15 + movs r15, r15 @ MOVT movt r13, #1 movt r15, #1