From f439988037a589de3798f44e7268301adaec21a9 Mon Sep 17 00:00:00 2001 From: Mihail Ionescu Date: Tue, 12 Nov 2019 13:53:06 +0000 Subject: [PATCH] [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 ', 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 * 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. --- gas/ChangeLog | 8 ++++++++ gas/config/tc-arm.c | 3 +-- gas/testsuite/gas/arm/fpu-rst.d | 2 ++ gas/testsuite/gas/arm/fpu-rst.l | 4 ++++ gas/testsuite/gas/arm/fpu-rst.s | 17 +++++++++++++++++ 5 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 gas/testsuite/gas/arm/fpu-rst.d create mode 100644 gas/testsuite/gas/arm/fpu-rst.l create mode 100644 gas/testsuite/gas/arm/fpu-rst.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 223ea8d9ba8..8dd6bfcf1fd 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2019-11-12 Mihail Ionescu + + * 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 * config/tc-i386.c (type_names): Remove OPERAND_TYPE_ESSEG diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 2a884b13dcd..167d039b764 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -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); diff --git a/gas/testsuite/gas/arm/fpu-rst.d b/gas/testsuite/gas/arm/fpu-rst.d new file mode 100644 index 00000000000..9b5451b042b --- /dev/null +++ b/gas/testsuite/gas/arm/fpu-rst.d @@ -0,0 +1,2 @@ +#name: arm FPU reset test +#error_output: fpu-rst.l diff --git a/gas/testsuite/gas/arm/fpu-rst.l b/gas/testsuite/gas/arm/fpu-rst.l new file mode 100644 index 00000000000..c3cb2433d53 --- /dev/null +++ b/gas/testsuite/gas/arm/fpu-rst.l @@ -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 diff --git a/gas/testsuite/gas/arm/fpu-rst.s b/gas/testsuite/gas/arm/fpu-rst.s new file mode 100644 index 00000000000..26ae832dd22 --- /dev/null +++ b/gas/testsuite/gas/arm/fpu-rst.s @@ -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 -- 2.39.5