x86: don't mistake ordinary immediates for SAE / rounding control

The way SAE templates are constructed was always puzzling me (including
the need for separate templates in the first place), and expressing the
extzra attribute via Imm8 actually has a bad effect: Ordinary immediates
would also be accepted, leading to an extra byte being added after the
instruction (i.e. generating bad code). Before re-working this (in
particular to accept proper Intel syntax there), fix the immediate issue
by adding the so far missing check.
This commit is contained in:
Jan Beulich 2022-04-19 09:26:17 +02:00
parent bb80cf5b42
commit 2aaee75f81
3 changed files with 15 additions and 3 deletions

View File

@ -6287,6 +6287,11 @@ check_VecOperands (const insn_template *t)
return 1;
}
}
else if (t->opcode_modifier.sae)
{
i.error = unsupported_syntax;
return 1;
}
/* Check the special Imm4 cases; must be the first operand. */
if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)

View File

@ -218,6 +218,8 @@
.*:313: Error: .*unsupported broadcast for `vcvtneps2bf16'
.*:316: Error: .*unsupported broadcast for `vcvtneps2bf16'
.*:319: Error: .*unsupported broadcast for `vcvtneps2bf16'
.*:321: Error: .*vaddps.*
.*:322: Error: .*vcmpss.*
GAS LISTING .*
@ -569,6 +571,7 @@ GAS LISTING .*
[ ]*318 \?\?\?\? 62F27E38[ ]+vcvtneps2bf16 \(%eax\)\{1to8\}, %xmm1
[ ]*318[ ]+7208
[ ]*319[ ]+vcvtneps2bf16 \(%eax\)\{1to16\}, %xmm1
[ ]*320[ ]+\?\?\?\? 8DB42600 \.p2align 4
[ ]*320[ ]+0000008D
[ ]*320[ ]+7600
[ ]*320[ ]*
[ ]*321[ ]+vaddps \$0xcc, %zmm0, %zmm0, %zmm0
[ ]*322[ ]+vcmpss \$0, \$0xcc, %xmm0, %xmm0, %k0
#pass

View File

@ -317,4 +317,8 @@ _start:
vcvtneps2bf16 (%eax){1to4}, %xmm1
vcvtneps2bf16 (%eax){1to8}, %xmm1
vcvtneps2bf16 (%eax){1to16}, %xmm1
vaddps $0xcc, %zmm0, %zmm0, %zmm0
vcmpss $0, $0xcc, %xmm0, %xmm0, %k0
.p2align 4