mirror of
https://github.com/mirror/tinycc.git
synced 2026-08-18 11:03:27 +08:00
div fixes
- Makefile: don't produce unknown targets - libtcc.c: tcc_set_linker(): improve parser - tcc.h: tcc_internal_error(): don't record __FILE__ (for privacy reasons) - tccgen.c: - reject pointer + float operation - use 'int level' for builtin_frame/return_address - save_regs(): remove VT_ARRAY (confuses riscv64-gen) - tccpe.c: store just basename of loaded dlls (rather than full path) - tccpp.c: remove unused TAL defines - *-link.c: add missing ST_FUNC - i386-gen.c: fix thiscall - riscv64-asm.c/arm-asm.c: stay simple C89 - avoid .designators, decl after statement - avoid multiple instances of same static const objects - use skip() instead of next() & expect() - use cstr_printf() instead of snprintf() & cstr_cat() - tcc_error(), expect(): never return
This commit is contained in:
25
i386-asm.c
25
i386-asm.c
@@ -143,10 +143,12 @@ enum {
|
||||
# define TREG_XAX TREG_RAX
|
||||
# define TREG_XCX TREG_RCX
|
||||
# define TREG_XDX TREG_RDX
|
||||
# define TOK_ASM_xax TOK_ASM_rax
|
||||
#else
|
||||
# define TREG_XAX TREG_EAX
|
||||
# define TREG_XCX TREG_ECX
|
||||
# define TREG_XDX TREG_EDX
|
||||
# define TOK_ASM_xax TOK_ASM_eax
|
||||
#endif
|
||||
|
||||
typedef struct ASMInstr {
|
||||
@@ -1505,7 +1507,6 @@ ST_FUNC void subst_asm_operand(CString *add_str,
|
||||
SValue *sv, int modifier)
|
||||
{
|
||||
int r, reg, size, val;
|
||||
char buf[64];
|
||||
|
||||
r = sv->r;
|
||||
if ((r & VT_VALMASK) == VT_CONST) {
|
||||
@@ -1532,32 +1533,19 @@ ST_FUNC void subst_asm_operand(CString *add_str,
|
||||
val = sv->c.i;
|
||||
if (modifier == 'n')
|
||||
val = -val;
|
||||
snprintf(buf, sizeof(buf), "%d", (int)sv->c.i);
|
||||
cstr_cat(add_str, buf, -1);
|
||||
cstr_printf(add_str, "%d", (int)sv->c.i);
|
||||
no_offset:;
|
||||
#ifdef TCC_TARGET_X86_64
|
||||
if (r & VT_LVAL)
|
||||
cstr_cat(add_str, "(%rip)", -1);
|
||||
#endif
|
||||
} else if ((r & VT_VALMASK) == VT_LOCAL) {
|
||||
#ifdef TCC_TARGET_X86_64
|
||||
snprintf(buf, sizeof(buf), "%d(%%rbp)", (int)sv->c.i);
|
||||
#else
|
||||
snprintf(buf, sizeof(buf), "%d(%%ebp)", (int)sv->c.i);
|
||||
#endif
|
||||
cstr_cat(add_str, buf, -1);
|
||||
cstr_printf(add_str, "%d(%%%s)", (int)sv->c.i, get_tok_str(TOK_ASM_xax + 5, NULL));
|
||||
} else if (r & VT_LVAL) {
|
||||
reg = r & VT_VALMASK;
|
||||
if (reg >= VT_CONST)
|
||||
tcc_internal_error("");
|
||||
snprintf(buf, sizeof(buf), "(%%%s)",
|
||||
#ifdef TCC_TARGET_X86_64
|
||||
get_tok_str(TOK_ASM_rax + reg, NULL)
|
||||
#else
|
||||
get_tok_str(TOK_ASM_eax + reg, NULL)
|
||||
#endif
|
||||
);
|
||||
cstr_cat(add_str, buf, -1);
|
||||
cstr_printf(add_str, "(%%%s)", get_tok_str(TOK_ASM_xax + reg, NULL));
|
||||
} else {
|
||||
/* register case */
|
||||
reg = r & VT_VALMASK;
|
||||
@@ -1617,8 +1605,7 @@ ST_FUNC void subst_asm_operand(CString *add_str,
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "%%%s", get_tok_str(reg, NULL));
|
||||
cstr_cat(add_str, buf, -1);
|
||||
cstr_printf(add_str, "%%%s", get_tok_str(reg, NULL));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user