x86: simplify SAE checking

To determine whether SAE (with or without StaticRounding) is permitted
there's no need to iterate over all operands. Even less so starting at
the front (thus needlessly inspecting immediate operands as well).
Leverage the pattern across all relevant templates and check only the
last two operands, and also only for non-512 ones (besides the non-LIG
case that was already checked for).
This commit is contained in:
Jan Beulich
2024-08-23 09:24:10 +02:00
parent b67ed45877
commit 5637daa206

View File

@@ -8024,18 +8024,16 @@ check_VecOperands (const insn_template *t)
return 1;
}
/* Non-EVEX.LIG forms need to have a ZMM register as at least one
operand. */
if (t->opcode_modifier.evex != EVEXLIG)
/* Non-EVEX.{LIG,512} forms need to have a ZMM register as at least one
operand. There's no need to check all operands, though: Either of the
last two operands will be of the right size in all relevant templates. */
if (t->opcode_modifier.evex != EVEXLIG
&& t->opcode_modifier.evex != EVEX512
&& !i.types[t->operands - 1].bitfield.zmmword
&& !i.types[t->operands - 2].bitfield.zmmword)
{
for (op = 0; op < t->operands; ++op)
if (i.types[op].bitfield.zmmword)
break;
if (op >= t->operands)
{
i.error = operand_size_mismatch;
return 1;
}
i.error = operand_size_mismatch;
return 1;
}
}