diff options
author | Jan Beulich <jbeulich@suse.com> | 2024-03-15 10:29:35 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2024-03-15 10:29:35 +0100 |
commit | 9fe07b7f95fbfdaf34d5b69e6d73cae000b43eea (patch) | |
tree | 86a6fb610ad8e93edf50f4f280769b4342a7d76c /gas/config | |
parent | 7bb2b9493317714cae731a03828cb97ac74e849f (diff) | |
download | binutils-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.c | 7 |
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) { |