[gas][arm] Make .fpu reset the FPU/Coprocessor feature bits

This patch is fixes the '.fpu' behaviour.
Currently, using '.fpu' resets the previously selected '.fpu' options (by overwriting them),
but does not reset previous FPU options selected by other means (ie. when using
'.arch_extension fp' in conjunction with '.fpu <x>', the FPU is not reset).

Example:
.arch armv8-a         @ SET BASE
.arch_extension fp    @ ADD FP-ARMV8
.fpu vfpv2            @ ADD (already existing bits, does not reset)
vfms.f32 s0, s1, s2   @ OK

.arch armv8-a         @ RESET
.fpu fp-armv8         @ ADD FP-ARMV8
vfms.f32 s0, s1, s2   @ OK
.fpu vfpv2            @ RESET to VFPV2
vfms.f32 s0, s1, s2   @ ERROR

After the patch this becomes:
.arch armv8-a         @ SET BASE
.arch_extension fp    @ ADD FP-ARMV8
.fpu vfpv2            @ RESET TO VFPV2
vfms.f32 s0, s1, s2   @ ERROR

.arch armv8-a         @ RESET
.fpu fp-armv8         @ ADD FP-ARMV8
vfms.f32 s0, s1, s2   @ OK
.fpu vfpv2            @ RESET to VFPV2
vfms.f32 s0, s1, s2   @ ERROR

gas/ChangeLog:

2019-11-11  Mihail Ionescu  <mihail.ionescu@arm.com>

        * config/tc-arm.c (s_arm_fpu): Clear selected_cpu fpu bits.
        (fpu_any): Remove OBJ_ELF guards.
        * gas/testsuite/gas/arm/fpu-rst.s: New.
        * gas/testsuite/gas/arm/fpu-rst.d: New.
        * gas/testsuite/gas/arm/fpu-rst.l: New.
This commit is contained in:
Mihail Ionescu
2019-11-12 13:53:06 +00:00
committed by Kyrylo Tkachov
parent 51c8edf68b
commit f439988037
5 changed files with 32 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2019-11-12 Mihail Ionescu <mihail.ionescu@arm.com>
* config/tc-arm.c (s_arm_fpu): Clear selected_cpu fpu bits.
(fpu_any): Remove OBJ_ELF guards.
* testsuite/gas/arm/fpu-rst.s: New.
* testsuite/gas/arm/fpu-rst.d: New.
* testsuite/gas/arm/fpu-rst.l: New.
2019-11-12 Jan Beulich <jbeulich@suse.com>
* config/tc-i386.c (type_names): Remove OPERAND_TYPE_ESSEG

View File

@ -281,9 +281,7 @@ static const arm_feature_set arm_ext_i8mm =
ARM_FEATURE_CORE_HIGH (ARM_EXT2_I8MM);
static const arm_feature_set arm_arch_any = ARM_ANY;
#ifdef OBJ_ELF
static const arm_feature_set fpu_any = FPU_ANY;
#endif
static const arm_feature_set arm_arch_full ATTRIBUTE_UNUSED = ARM_FEATURE (-1, -1, -1);
static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
@ -32775,6 +32773,7 @@ s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
if (streq (opt->name, name))
{
selected_fpu = opt->value;
ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, fpu_any);
#ifndef CPU_DEFAULT
if (no_cpu_selected ())
ARM_MERGE_FEATURE_SETS (cpu_variant, arm_arch_any, selected_fpu);

View File

@ -0,0 +1,2 @@
#name: arm FPU reset test
#error_output: fpu-rst.l

View File

@ -0,0 +1,4 @@
[^:]*: Assembler messages:
[^:]*:8: Error: selected processor does not support `vfms.f32 s0,s1,s2' in ARM mode
[^:]*:11: Error: selected processor does not support `vfms.f32 s0,s1,s2' in ARM mode
[^:]*:17: Error: selected processor does not support `vfms.f32 s0,s1,s2' in ARM mode

View File

@ -0,0 +1,17 @@
.syntax unified
.text
.arch armv8-a @ SET BASE
.arch_extension fp @ ADD FP-ARMV8
vfms.f32 s0, s1, s2 @ OK
.arch armv8-a @ RESET
vfms.f32 s0, s1, s2 @ ERROR
.fpu vfpv2 @ SET VFPV2
vfms.f32 s0, s1, s2 @ ERROR
.arch armv8-a @ RESET
.fpu fp-armv8 @ ADD FP-ARMV8
vfms.f32 s0, s1, s2 @ OK
.fpu vfpv2 @ RESET to VFPV2
vfms.f32 s0, s1, s2 @ ERROR