[PATCH ARM/THUMB1] unified syntax MOV with both low register emitting unpredictable code
Matthew Gretton-Dann
matthew.gretton-dann@arm.com
Tue Nov 15 15:14:00 GMT 2011
More information about the Binutils mailing list
Tue Nov 15 15:14:00 GMT 2011
- Previous message (by thread): [PATCH ARM/THUMB1] unified syntax MOV with both low register emitting unpredictable code
- Next message (by thread): [PATCH ARM/THUMB1] unified syntax MOV with both low register emitting unpredictable code
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message (by thread): [PATCH ARM/THUMB1] unified syntax MOV with both low register emitting unpredictable code
- Next message (by thread): [PATCH ARM/THUMB1] unified syntax MOV with both low register emitting unpredictable code
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list