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).
Unified · Split
| @@ -552,7 +552,14 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode) · 551 unmodified lines | ||
| 552 | 552 | continue; |
| 553 | 553 | s = (opcode - pa->sym) % NBWLX; |
| 554 | 554 | if ((pa->instr_type & OPC_BWLX) == OPC_WLX) |
| 555 | + { | |
| 556 | + /* We need to reject the xxxb opcodes that we accepted above. | |
| 557 | + Note that pa->sym for WLX opcodes is the 'w' token, | |
| 558 | + to get the 'b' token subtract one. */ | |
| 559 | + if (((opcode - pa->sym + 1) % NBWLX) == 0) | |
| 560 | + continue; | |
| 555 | 561 | s++; |
| 562 | + } | |
| 556 | 563 | } else if (pa->instr_type & OPC_SHIFT) { |
| 557 | 564 | if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX)) |
| 558 | 565 | continue; |
| @@ -157,7 +157,7 @@ ALT(DEF_ASM_OP2(lgs, 0x0fb5, 0, OPC_MODRM, OPT_EA, OPT_REG32)) · 156 unmodified lines | ||
| 157 | 157 | ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */ |
| 158 | 158 | ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG)) |
| 159 | 159 | ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX)) |
| 160 | −ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REG)) | |
| 160 | +ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REGW)) | |
| 161 | 161 | ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG)) |
| 162 | 162 | |
| 163 | 163 | ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) |
| @@ -158,6 +158,22 @@ addl $0x123, %eax · 157 unmodified lines | ||
| 158 | 158 | add $0x123, %ebx |
| 159 | 159 | add $-16, %ecx |
| 160 | 160 | add $-0x123, %esi |
| 161 | +add $1, %bx | |
| 162 | +add $1, %ebx | |
| 163 | +add $-1, %bx | |
| 164 | +add $-1, %ebx | |
| 165 | +add $127, %bx | |
| 166 | +addl $127, %ebx | |
| 167 | +addl $-128, %ebx | |
| 168 | +addl $-128, %ebx | |
| 169 | +addl $-129, %ebx | |
| 170 | +addl $128, %ebx | |
| 171 | +addl $255, %ebx | |
| 172 | +addl $256, %ebx | |
| 173 | +andb $0xf, %ah | |
| 174 | +andb $-15, %cl | |
| 175 | +xorb $127, %dh | |
| 176 | +cmpb $42, (%eax) | |
| 161 | 177 | addl $0x123, 0x100 |
| 162 | 178 | addl $0x123, 0x100(%ebx) |
| 163 | 179 | addl $0x123, 0x100(%ebx,%edx,2) |
| @@ -166,7 +166,7 @@ ALT(DEF_ASM_OP2(lgs, 0x0fb5, 0, OPC_MODRM, OPT_EA, OPT_REG32)) · 165 unmodified lines | ||
| 166 | 166 | ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */ |
| 167 | 167 | ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG)) |
| 168 | 168 | ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX)) |
| 169 | −ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REG)) | |
| 169 | +ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REGW)) | |
| 170 | 170 | ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG)) |
| 171 | 171 | |
| 172 | 172 | ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) |