This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH ARM/THUMB1] unified syntax MOV with both low register emitting unpredictable code


On 14/11/11 20:21, Thomas Klein wrote:
Hi,

There seems to be a minor bug when running assembler with 'unified
syntax' sources.
The old v4t and v5t architectures did not support a MOV rd, rs with both
low registers.
At pre 'unified syntax' time an 'ADD rd, rs, #0' was used instead.
This instruction changes the flags. So this is not a real move instruction.

I think for architecture v4t and v5t it is better to emit a 'unified
syntax ADDS rd, rs, #0'
than to emit unpredictable code.
Also the author should be informed about the change.

regards
   Thomas


diff.out



Index: gas/config/tc-arm.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-arm.c,v retrieving revision 1.504 diff -u -p -r1.504 tc-arm.c --- gas/config/tc-arm.c 7 Nov 2011 16:20:47 -0000 1.504 +++ gas/config/tc-arm.c 13 Nov 2011 19:18:01 -0000 @@ -10913,10 +10913,24 @@ do_t_mov_cmp (void) switch (inst.instruction) { case T_MNEM_mov: - inst.instruction = T_OPCODE_MOV_HR; - inst.instruction |= (Rn& 0x8)<< 4; - inst.instruction |= (Rn& 0x7); - inst.instruction |= Rm<< 3; + if (low_regs&& !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))

This test is incorrect - you want to check for arm_ext_v6, as all v6 variants whether Thumb-1 or Thumb-2 allow low registers in this instruction.


+	      {
+		 as_warn (_("MOV r%u,r%u is not permitted on this architecture "
+			    "using ADDS r%u,r%u,#0 instead"),Rn,Rm,Rn,Rm);
+		 /* In v4t or v5t a move of two lowregs produces
+		    unpredictable results. Encode this the same way as in
+		    non unified syntax.*/
+		 inst.instruction = T_OPCODE_ADD_I3;
+		 inst.instruction |= Rn;
+		 inst.instruction |= Rm<<  3;
+	      }
+	    else
+	      {
+		 inst.instruction = T_OPCODE_MOV_HR;
+		 inst.instruction |= (Rn&  0x8)<<  4;
+		 inst.instruction |= (Rn&  0x7);
+		 inst.instruction |= Rm<<  3;
+	      }
  	    break;

case T_MNEM_movs:


ChangeLog



2011-11-14 Thomas Klein<th.r.klein@web.de>


	* config/tc-arm.c (do_t_mov_cmp): Encode low register mov for arch v4t
	and v5t the same way as in non unified syntax form.

Some regression tests would be good here.


Thanks,

Matt

--
Matthew Gretton-Dann
Principal Engineer, PD Software - Tools, ARM Ltd


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]