This is the mail archive of the 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: [ARM] Allow MOV/MOV.W to accept all possible immediates

On 05/01/17 13:59, Jiong Wang wrote:
On 05/01/17 10:49, Szabolcs Nagy wrote:
adding the reporter to cc and rich because it broke musl.

On 05/01/17 10:45, Szabolcs Nagy wrote:
On 01/11/16 12:21, Jiong Wang wrote:

AArch32 MOV Rd, #imm should accept all immediates which can be encoded into available encoding, A1/A2 for ARM, T1/T2/T3 for Thumb/Thumb2, and MOV is the preferred disassembly syntax. See latest ARM Architecture Reference Manual for
ARMv8-A, section F6.1.108 and for ARMv8-M, section C2.4.89.

The same for MOV.W under Thumb mode. It should try all possible 32-bit Thumb
encoding instead of T2 only.

This patch let MOV/MOV.W accept more immediate formats while their currently supported immediate formats are not affected, so there is no backward compatibility
issue, also this patch haven't touched the disassembler.

I think this patch brings GAS closer to ARM Architecture Reference Manual.

   OK for master?

2016-11-01  Jiong Wang  <>
                           * config/tc-arm.c (SBIT_SHIFT): New.
         (T2_SBIT_SHIFT): Likewise.
         (t32_insn_ok): Return TRUE for MOV in ARMv8-M Baseline.
(md_apply_fix): Try UINT16 encoding when ARM/Thumb modified immediate
         encoding failed.
         * testsuite/gas/arm/archv6t2-bad.s: New error case.
         * testsuite/gas/arm/archv6t2-bad.l: New error match.
         * testsuite/gas/arm/archv6t2.s: New testcase.
         * testsuite/gas/arm/archv6t2.d: New expected result.
         * testsuite/gas/arm/archv8m.s: New testcase
         * testsuite/gas/arm/archv8m-base.d: New expected result.
         * testsuite/gas/arm/archv8m-main.d: Likewise.
         * testsuite/gas/arm/archv8m-main-dsp-1.d: Likewise.
this caused

$ cat bug.s
.syntax unified
.arch armv7-a
    mov r3,#1

.arch armv4t
.eabi_attribute 6,2
    bx lr

$ arm-none-linux-gnueabihf-as -mthumb bug.s
bug.s: Assembler messages:
bug.s:4: Error: invalid constant (1) after fixup

previously this worked, but i'm not sure if the mix
of .arch directives and .syntax unified is valid here.

It looks to me the failure is caused by the second ".arch armv4t" overrides the
first ".arch armv7-a", therefore the arch feature is lowerd to armv4t in
assembler fixup stage. While "mov r3, #1" under thumb mode is only allowed
with ARMv6T2.

This patch tightend the check from

      if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
          || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)


      if ((fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
           && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2))
          || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)

thus the sequences in bug.s is not allowed.

Does .object_arch works for you? It seems you want the final object arch adjusted.

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