From e4d5434c3a9c7eacadad431fcd03c277c6d2777d Mon Sep 17 00:00:00 2001 From: blueswir1 Date: Thu, 13 Mar 2008 17:34:19 +0000 Subject: [PATCH] Fix i32 memory backed variables on 64-bit host git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4044 c046a42c-6fe2-441c-8c8c-71466251a162 --- tcg/i386/tcg-target.c | 8 ++++---- tcg/sparc/tcg-target.c | 4 ++-- tcg/tcg.c | 18 +++++++++--------- tcg/x86_64/tcg-target.c | 14 ++++++++++---- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c index 9d6aa5c248..54df7dd2e9 100644 --- a/tcg/i386/tcg-target.c +++ b/tcg/i386/tcg-target.c @@ -255,15 +255,15 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, } } -static inline void tcg_out_ld(TCGContext *s, int ret, - int arg1, int32_t arg2) +static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, + int arg1, tcg_target_long arg2) { /* movl */ tcg_out_modrm_offset(s, 0x8b, ret, arg1, arg2); } -static inline void tcg_out_st(TCGContext *s, int arg, - int arg1, int32_t arg2) +static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, + int arg1, tcg_target_long arg2) { /* movl */ tcg_out_modrm_offset(s, 0x89, arg, arg1, arg2); diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c index d00aa5a7e6..340ef94a14 100644 --- a/tcg/sparc/tcg-target.c +++ b/tcg/sparc/tcg-target.c @@ -262,13 +262,13 @@ static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, int offset, in fprintf(stderr, "unimplemented %s with offset %d\n", __func__, offset); } -static inline void tcg_out_ld(TCGContext *s, int ret, +static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, int arg1, tcg_target_long arg2) { fprintf(stderr, "unimplemented %s\n", __func__); } -static inline void tcg_out_st(TCGContext *s, int arg, +static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, int arg1, tcg_target_long arg2) { fprintf(stderr, "unimplemented %s\n", __func__); diff --git a/tcg/tcg.c b/tcg/tcg.c index 15e12b6172..2e9fa18f5e 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -1196,7 +1196,7 @@ static void tcg_reg_free(TCGContext *s, int reg) if (!ts->mem_coherent) { if (!ts->mem_allocated) temp_allocate_frame(s, temp); - tcg_out_st(s, reg, ts->mem_reg, ts->mem_offset); + tcg_out_st(s, ts->type, reg, ts->mem_reg, ts->mem_offset); } ts->val_type = TEMP_VAL_MEM; s->reg_to_temp[reg] = -1; @@ -1296,7 +1296,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def, } else { reg = tcg_reg_alloc(s, arg_ct->u.regs, s->reserved_regs); } - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); } else if (ts->val_type == TEMP_VAL_CONST) { if (ots->val_type == TEMP_VAL_REG) { reg = ots->reg; @@ -1343,7 +1343,7 @@ static void tcg_reg_alloc_op(TCGContext *s, ts = &s->temps[arg]; if (ts->val_type == TEMP_VAL_MEM) { reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); ts->val_type = TEMP_VAL_REG; ts->reg = reg; ts->mem_coherent = 1; @@ -1501,19 +1501,19 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, arg = args[nb_oargs + i]; ts = &s->temps[arg]; if (ts->val_type == TEMP_VAL_REG) { - tcg_out_st(s, ts->reg, TCG_REG_CALL_STACK, stack_offset); + tcg_out_st(s, ts->type, ts->reg, TCG_REG_CALL_STACK, stack_offset); } else if (ts->val_type == TEMP_VAL_MEM) { reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], s->reserved_regs); /* XXX: not correct if reading values from the stack */ - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); - tcg_out_st(s, reg, TCG_REG_CALL_STACK, stack_offset); + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); + tcg_out_st(s, ts->type, reg, TCG_REG_CALL_STACK, stack_offset); } else if (ts->val_type == TEMP_VAL_CONST) { reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], s->reserved_regs); /* XXX: sign extend may be needed on some targets */ tcg_out_movi(s, ts->type, reg, ts->val); - tcg_out_st(s, reg, TCG_REG_CALL_STACK, stack_offset); + tcg_out_st(s, ts->type, reg, TCG_REG_CALL_STACK, stack_offset); } else { tcg_abort(); } @@ -1532,7 +1532,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, tcg_out_mov(s, reg, ts->reg); } } else if (ts->val_type == TEMP_VAL_MEM) { - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); } else if (ts->val_type == TEMP_VAL_CONST) { /* XXX: sign extend ? */ tcg_out_movi(s, ts->type, reg, ts->val); @@ -1549,7 +1549,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, const_func_arg = 0; if (ts->val_type == TEMP_VAL_MEM) { reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); func_arg = reg; } else if (ts->val_type == TEMP_VAL_REG) { reg = ts->reg; diff --git a/tcg/x86_64/tcg-target.c b/tcg/x86_64/tcg-target.c index 8b0f472715..9cd89b2778 100644 --- a/tcg/x86_64/tcg-target.c +++ b/tcg/x86_64/tcg-target.c @@ -356,16 +356,22 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, } } -static inline void tcg_out_ld(TCGContext *s, int ret, +static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, int arg1, tcg_target_long arg2) { - tcg_out_modrm_offset(s, 0x8b | P_REXW, ret, arg1, arg2); /* movq */ + if (type == TCG_TYPE_I32) + tcg_out_modrm_offset(s, 0x8b, ret, arg1, arg2); /* movl */ + else + tcg_out_modrm_offset(s, 0x8b | P_REXW, ret, arg1, arg2); /* movq */ } -static inline void tcg_out_st(TCGContext *s, int arg, +static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, int arg1, tcg_target_long arg2) { - tcg_out_modrm_offset(s, 0x89 | P_REXW, arg, arg1, arg2); /* movq */ + if (type == TCG_TYPE_I32) + tcg_out_modrm_offset(s, 0x89, arg, arg1, arg2); /* movl */ + else + tcg_out_modrm_offset(s, 0x89 | P_REXW, arg, arg1, arg2); /* movq */ } static inline void tgen_arithi32(TCGContext *s, int c, int r0, int32_t val) -- 2.11.0