aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2016-05-11 18:56:19 +0200
committerMichael Matz <matz@suse.de>2016-05-11 18:56:19 +0200
commit613962e35399e0b87baf8ac031b74aecd09f24f1 (patch)
treeeb293c335d659f2f1868affbbb66c592820a7503
parentbd93dc6923a9fe202401666a1f2749fbdced9971 (diff)
downloadtinycc-613962e35399e0b87baf8ac031b74aecd09f24f1.tar.gz
tinycc-613962e35399e0b87baf8ac031b74aecd09f24f1.tar.bz2
x86-64 asm: Remove useless jmp opcode
Also remove the hacky mod/rm byte emission during disp/imm writing.
-rw-r--r--i386-asm.c7
-rw-r--r--tests/asmtest.S1
-rw-r--r--x86_64-asm.h1
3 files changed, 1 insertions, 8 deletions
diff --git a/i386-asm.c b/i386-asm.c
index 69514c0..2cbc858 100644
--- a/i386-asm.c
+++ b/i386-asm.c
@@ -1042,13 +1042,6 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode)
g(0xE0 + ops[i].reg);
}
#endif
-#ifdef TCC_TARGET_X86_64
- } else if (v & (OP_REG32 | OP_REG64)) {
- if (pa->instr_type & (OPC_JMP | OPC_SHORTJMP)) {
- /* jmp $r */
- g(0xE0 + ops[i].reg);
- }
-#endif
}
}
#ifdef I386_ASM_16
diff --git a/tests/asmtest.S b/tests/asmtest.S
index 2a9f403..985d824 100644
--- a/tests/asmtest.S
+++ b/tests/asmtest.S
@@ -236,6 +236,7 @@ lcall *(%rax)
#endif
jmp 0x1000
+jmp *(%edi)
#ifdef __i386__
jmp *%eax
#else
diff --git a/x86_64-asm.h b/x86_64-asm.h
index 14e5969..4da5c0b 100644
--- a/x86_64-asm.h
+++ b/x86_64-asm.h
@@ -200,7 +200,6 @@ ALT(DEF_ASM_OP2(shrdw, 0x0fad, 0, OPC_MODRM | OPC_WLQ, OPT_REGW, OPT_EA | OPT_RE
ALT(DEF_ASM_OP1(call, 0xff, 2, OPC_MODRM, OPT_INDIR))
ALT(DEF_ASM_OP1(call, 0xe8, 0, OPC_JMP, OPT_ADDR))
ALT(DEF_ASM_OP1(jmp, 0xff, 4, OPC_MODRM, OPT_INDIR))
-ALT(DEF_ASM_OP1(jmp, 0xff, 0, OPC_JMP | OPC_WL, OPT_REGW))
ALT(DEF_ASM_OP1(jmp, 0xeb, 0, OPC_SHORTJMP | OPC_JMP, OPT_ADDR))
ALT(DEF_ASM_OP1(lcall, 0xff, 3, OPC_MODRM, OPT_EA))