aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2024-03-15 10:29:35 +0100
committerJan Beulich <jbeulich@suse.com>2024-03-15 10:29:35 +0100
commit9fe07b7f95fbfdaf34d5b69e6d73cae000b43eea (patch)
tree86a6fb610ad8e93edf50f4f280769b4342a7d76c /gas/config
parent7bb2b9493317714cae731a03828cb97ac74e849f (diff)
downloadbinutils-9fe07b7f95fbfdaf34d5b69e6d73cae000b43eea.zip
binutils-9fe07b7f95fbfdaf34d5b69e6d73cae000b43eea.tar.gz
binutils-9fe07b7f95fbfdaf34d5b69e6d73cae000b43eea.tar.bz2
x86/APX: legacy promoted insns can't access %xmm16-%xmm31
Irrespective of the encoding being EVEX, the usable SIMD register range continues to be limited to %xmm0-%xmm15. Enforce this in gas (but continue to generate code, as in principle we know how to encode things) and recognize/flag the case in the disassembler. Oddly enough wrong forms were actually used in the testsuite (register- only forms are then really meaningless to test here, and are hence dropped instead of adjusted). Convert the POP2 test that needs touching anyway (due to a bad ModR/M byte having been chosen) to .insn.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-i386.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 85dc79f..735c59b 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -10016,6 +10016,13 @@ process_operands (void)
for (unsigned int j = 0; j < i.operands; j++)
if (i.types[j].bitfield.instance != InstanceNone)
i.reg_operands--;
+ else if (i.tm.opcode_space == SPACE_EVEXMAP4
+ && i.types[j].bitfield.class == RegSIMD
+ && (i.op[j].regs->reg_flags & RegVRex)
+ && !dot_insn ())
+ /* Just raise an error, but continue processing. */
+ as_bad (_("`%s%s' cannot be used with `%s'"),
+ register_prefix, i.op[j].regs->reg_name, insn_name (&i.tm));
if (i.tm.opcode_modifier.sse2avx)
{