From: Jan Beulich Date: Fri, 14 Feb 2025 08:35:07 +0000 (+0100) Subject: x86: correct ISA-used version recording X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b5cb46b155500a87e27ffd4ee3c6b2fca6b82d5d;p=thirdparty%2Fbinutils-gdb.git x86: correct ISA-used version recording Updating should be based solely on the current instruction. For example, recording of VEX-encoded insns as v3 should be independent of there being earlier AMX insns. Further for BASELINE only a very limited set of the GNU_PROPERTY_X86_FEATURE_2_* bits should actually be taken into account: Most of the bits represent advanced (later) features (XSAVE, XSAVEOPT, and XSAVEC for example being part of v3). --- diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 246942a378d..9adf8d5748b 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -12234,21 +12234,23 @@ output_insn (const struct last_insn *last_insn) #ifdef OBJ_ELF if (x86_used_note && now_seg != absolute_section) { + unsigned int feature_2_used = 0; + if ((i.xstate & xstate_tmm) == xstate_tmm || is_cpu (&i.tm, CpuAMX_TILE)) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM; if (is_cpu (&i.tm, Cpu8087) || is_cpu (&i.tm, Cpu287) || is_cpu (&i.tm, Cpu387) || is_cpu (&i.tm, Cpu687) || is_cpu (&i.tm, CpuFISTTP)) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87; if ((i.xstate & xstate_mmx) || i.tm.mnem_off == MN_emms || i.tm.mnem_off == MN_femms) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX; if (i.index_reg) { @@ -12271,25 +12273,29 @@ output_insn (const struct last_insn *last_insn) || is_cpu (&i.tm, CpuAVX))) || is_cpu (&i.tm, CpuWideKL) || is_cpu (&i.tm, CpuKL)) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM; if ((i.xstate & xstate_ymm) == xstate_ymm) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM; if ((i.xstate & xstate_zmm) == xstate_zmm) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM; if (i.mask.reg || (i.xstate & xstate_mask) == xstate_mask) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK; if (is_cpu (&i.tm, CpuFXSR)) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR; if (is_cpu (&i.tm, CpuXsave)) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE; if (is_cpu (&i.tm, CpuXsaveopt)) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT; if (is_cpu (&i.tm, CpuXSAVEC)) - x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC; + feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC; + + x86_feature_2_used |= feature_2_used; if (object_64bit - || x86_feature_2_used + || (feature_2_used + & (GNU_PROPERTY_X86_FEATURE_2_XMM + | GNU_PROPERTY_X86_FEATURE_2_FXSR)) != 0 || is_cpu (&i.tm, CpuCMOV) || is_cpu (&i.tm, CpuSYSCALL) || i.tm.mnem_off == MN_cmpxchg8b) @@ -12317,13 +12323,13 @@ output_insn (const struct last_insn *last_insn) && !is_cpu (&i.tm, CpuFMA4) && !is_cpu (&i.tm, CpuLWP) && !is_cpu (&i.tm, CpuTBM) - && !(x86_feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM)) + && !(feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM)) || is_cpu (&i.tm, CpuF16C) || is_cpu (&i.tm, CpuFMA) || is_cpu (&i.tm, CpuLZCNT) || is_cpu (&i.tm, CpuMovbe) || is_cpu (&i.tm, CpuXSAVES) - || (x86_feature_2_used + || (feature_2_used & (GNU_PROPERTY_X86_FEATURE_2_XSAVE | GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT | GNU_PROPERTY_X86_FEATURE_2_XSAVEC)) != 0) diff --git a/gas/testsuite/gas/i386/property-6.d b/gas/testsuite/gas/i386/property-6.d index a7dab96232f..2120bc714a6 100644 --- a/gas/testsuite/gas/i386/property-6.d +++ b/gas/testsuite/gas/i386/property-6.d @@ -5,5 +5,5 @@ Displaying notes found in: .note.gnu.property [ ]+Owner[ ]+Data size[ ]+Description GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 - Properties: x86 ISA used: x86-64-baseline, x86-64-v4 + Properties: x86 ISA used: (x86-64-baseline, )?x86-64-v4 x86 feature used: x86, MASK