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 | continue; | 552 | continue; |
| 553 | s = (opcode - pa->sym) % NBWLX; | 553 | s = (opcode - pa->sym) % NBWLX; |
| 554 | if ((pa->instr_type & OPC_BWLX) == OPC_WLX) | 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 | s++; | 561 | s++; |
| 562 | } | ||
| 556 | } else if (pa->instr_type & OPC_SHIFT) { | 563 | } else if (pa->instr_type & OPC_SHIFT) { |
| 557 | if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX)) | 564 | if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX)) |
| 558 | continue; | 565 | continue; |
| @@ -157,7 +157,7 @@ ALT(DEF_ASM_OP2(lgs, 0x0fb5, 0, OPC_MODRM, OPT_EA, OPT_REG32)) · 156 unmodified lines | |||
| 157 | ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */ | 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 | ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG)) | 158 | ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG)) |
| 159 | ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX)) | 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 | ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG)) | 161 | ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG)) |
| 162 | 162 | ||
| 163 | ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) | 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 | add $0x123, %ebx | 158 | add $0x123, %ebx |
| 159 | add $-16, %ecx | 159 | add $-16, %ecx |
| 160 | add $-0x123, %esi | 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 | addl $0x123, 0x100 | 177 | addl $0x123, 0x100 |
| 162 | addl $0x123, 0x100(%ebx) | 178 | addl $0x123, 0x100(%ebx) |
| 163 | addl $0x123, 0x100(%ebx,%edx,2) | 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 | ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */ | 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 | ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG)) | 167 | ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG)) |
| 168 | ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX)) | 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 | ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG)) | 170 | ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG)) |
| 171 | 171 | ||
| 172 | ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) | 172 | ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) |