History

x86-asm: Fix signed constants and opcode order

Two things: negative constants were rejected (e.g. "add $-15,%eax"). Second the insn order was such that the arithmetic IM8S forms weren't used (always the IM32 ones). Switching them prefers those but requires a fix for size calculation in case the opcodes were OPC_ARITH and OPC_WLX (whose size starts with 1, not zero).

Michael Matz committed 10 years ago

Commit 4f27e211 parent 080ec9f4 files · +12 −3Browse files

Unified · Split

4 files
  1. i386-asm.c +3 −1
  2. i386-asm.h +1 −1
  3. tests/asmtest.S +7 −0
  4. x86_64-asm.h +1 −1
i386-asm.c+3−1
@@ -355,7 +355,7 @@ static void parse_operand(TCCState *s1, Operand *op) · 354 unmodified lines
355 if (op->e.v == (uint16_t)op->e.v)355 if (op->e.v == (uint16_t)op->e.v)
356 op->type |= OP_IM16;356 op->type |= OP_IM16;
357#ifdef TCC_TARGET_X86_64357#ifdef TCC_TARGET_X86_64
358 if (op->e.v != (uint32_t)op->e.v)358 if (op->e.v != (int32_t)op->e.v)
359 op->type = OP_IM64;359 op->type = OP_IM64;
360#endif360#endif
361 }361 }
@@ -551,6 +551,8 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode) · 189 unmodified lines
551 if (!(opcode >= pa->sym && opcode < pa->sym + 8*NBWLX))551 if (!(opcode >= pa->sym && opcode < pa->sym + 8*NBWLX))
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)
555 s++;
554 } else if (pa->instr_type & OPC_SHIFT) {556 } else if (pa->instr_type & OPC_SHIFT) {
555 if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX))557 if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX))
556 continue;558 continue;
i386-asm.h+1−1
@@ -157,8 +157,8 @@ ALT(DEF_ASM_OP2(lgs, 0x0fb5, 0, OPC_MODRM, OPT_EA, OPT_REG32)) · 156 unmodified lines
157ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */157ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */
158ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))158ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))
159ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX))159ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX))
160ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG))
161ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REG))160ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REG))
161ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG))
162 162
163ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG))163ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG))
164ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))164ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))
tests/asmtest.S+7−0
@@ -156,6 +156,8 @@ movl %ebx, %fs · 155 unmodified lines
156 156
157addl $0x123, %eax157addl $0x123, %eax
158add $0x123, %ebx158add $0x123, %ebx
159add $-16, %ecx
160add $-0x123, %esi
159addl $0x123, 0x100161addl $0x123, 0x100
160addl $0x123, 0x100(%ebx)162addl $0x123, 0x100(%ebx)
161addl $0x123, 0x100(%ebx,%edx,2)163addl $0x123, 0x100(%ebx,%edx,2)
@@ -216,6 +218,8 @@ add (%ebx), %dl · 54 unmodified lines
216 div %bl218 div %bl
217 div %ecx, %eax219 div %ecx, %eax
218 220
221and $15,%bx
222and $-20,%edx
219 223
220shl %edx224shl %edx
221shl $10, %edx225shl $10, %edx
@@ -690,3 +694,6 @@ ft1: ft2: ft3: ft4: ft5: ft6: ft7: ft8: ft9: · 468 unmodified lines
690.type ft8,"function"694.type ft8,"function"
691 695
692 pause696 pause
697.rept 6
698 nop
699.endr
x86_64-asm.h+1−1
@@ -166,8 +166,8 @@ ALT(DEF_ASM_OP2(lgs, 0x0fb5, 0, OPC_MODRM, OPT_EA, OPT_REG32)) · 165 unmodified lines
166ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */166ALT(DEF_ASM_OP2(addb, 0x00, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG)) /* XXX: use D bit ? */
167ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))167ALT(DEF_ASM_OP2(addb, 0x02, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))
168ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX))168ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLX, OPT_IM, OPT_EAX))
169ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG))
170ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REG))169ALT(DEF_ASM_OP2(addw, 0x83, 0, OPC_ARITH | OPC_MODRM | OPC_WLX, OPT_IM8S, OPT_EA | OPT_REG))
170ALT(DEF_ASM_OP2(addb, 0x80, 0, OPC_ARITH | OPC_MODRM | OPC_BWLX, OPT_IM, OPT_EA | OPT_REG))
171 171
172ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG))172ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_REG, OPT_EA | OPT_REG))
173ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))173ALT(DEF_ASM_OP2(testb, 0x84, 0, OPC_MODRM | OPC_BWLX, OPT_EA | OPT_REG, OPT_REG))

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t