x86-asm: Reject some invalid arith imm8 instruction

There were two errors in the arithmetic imm8 instruction.  They accept
only REGW, and in case the user write a xxxb opcode that variant
needs to be rejected as well (it's not automatically rejected by REGW
in case the destination is memory).
This commit is contained in:
Michael Matz
2016-05-16 05:10:21 +02:00
parent 0f36f60faa
commit f2a4cb0a0e
4 changed files with 25 additions and 2 deletions

View File

@ -552,7 +552,14 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode)
continue;
s = (opcode - pa->sym) % NBWLX;
if ((pa->instr_type & OPC_BWLX) == OPC_WLX)
{
/* We need to reject the xxxb opcodes that we accepted above.
Note that pa->sym for WLX opcodes is the 'w' token,
to get the 'b' token subtract one. */
if (((opcode - pa->sym + 1) % NBWLX) == 0)
continue;
s++;
}
} else if (pa->instr_type & OPC_SHIFT) {
if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX))
continue;