Commit e4d5434c3a9c7eacadad431fcd03c277c6d2777d
1 parent
30aa5c0d
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
Showing
4 changed files
with
25 additions
and
19 deletions
tcg/i386/tcg-target.c
@@ -255,15 +255,15 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, | @@ -255,15 +255,15 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, | ||
255 | } | 255 | } |
256 | } | 256 | } |
257 | 257 | ||
258 | -static inline void tcg_out_ld(TCGContext *s, int ret, | ||
259 | - int arg1, int32_t arg2) | 258 | +static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, |
259 | + int arg1, tcg_target_long arg2) | ||
260 | { | 260 | { |
261 | /* movl */ | 261 | /* movl */ |
262 | tcg_out_modrm_offset(s, 0x8b, ret, arg1, arg2); | 262 | tcg_out_modrm_offset(s, 0x8b, ret, arg1, arg2); |
263 | } | 263 | } |
264 | 264 | ||
265 | -static inline void tcg_out_st(TCGContext *s, int arg, | ||
266 | - int arg1, int32_t arg2) | 265 | +static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, |
266 | + int arg1, tcg_target_long arg2) | ||
267 | { | 267 | { |
268 | /* movl */ | 268 | /* movl */ |
269 | tcg_out_modrm_offset(s, 0x89, arg, arg1, arg2); | 269 | tcg_out_modrm_offset(s, 0x89, arg, arg1, arg2); |
tcg/sparc/tcg-target.c
@@ -262,13 +262,13 @@ static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, int offset, in | @@ -262,13 +262,13 @@ static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, int offset, in | ||
262 | fprintf(stderr, "unimplemented %s with offset %d\n", __func__, offset); | 262 | fprintf(stderr, "unimplemented %s with offset %d\n", __func__, offset); |
263 | } | 263 | } |
264 | 264 | ||
265 | -static inline void tcg_out_ld(TCGContext *s, int ret, | 265 | +static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, |
266 | int arg1, tcg_target_long arg2) | 266 | int arg1, tcg_target_long arg2) |
267 | { | 267 | { |
268 | fprintf(stderr, "unimplemented %s\n", __func__); | 268 | fprintf(stderr, "unimplemented %s\n", __func__); |
269 | } | 269 | } |
270 | 270 | ||
271 | -static inline void tcg_out_st(TCGContext *s, int arg, | 271 | +static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, |
272 | int arg1, tcg_target_long arg2) | 272 | int arg1, tcg_target_long arg2) |
273 | { | 273 | { |
274 | fprintf(stderr, "unimplemented %s\n", __func__); | 274 | fprintf(stderr, "unimplemented %s\n", __func__); |
tcg/tcg.c
@@ -1196,7 +1196,7 @@ static void tcg_reg_free(TCGContext *s, int reg) | @@ -1196,7 +1196,7 @@ static void tcg_reg_free(TCGContext *s, int reg) | ||
1196 | if (!ts->mem_coherent) { | 1196 | if (!ts->mem_coherent) { |
1197 | if (!ts->mem_allocated) | 1197 | if (!ts->mem_allocated) |
1198 | temp_allocate_frame(s, temp); | 1198 | temp_allocate_frame(s, temp); |
1199 | - tcg_out_st(s, reg, ts->mem_reg, ts->mem_offset); | 1199 | + tcg_out_st(s, ts->type, reg, ts->mem_reg, ts->mem_offset); |
1200 | } | 1200 | } |
1201 | ts->val_type = TEMP_VAL_MEM; | 1201 | ts->val_type = TEMP_VAL_MEM; |
1202 | s->reg_to_temp[reg] = -1; | 1202 | s->reg_to_temp[reg] = -1; |
@@ -1296,7 +1296,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def, | @@ -1296,7 +1296,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def, | ||
1296 | } else { | 1296 | } else { |
1297 | reg = tcg_reg_alloc(s, arg_ct->u.regs, s->reserved_regs); | 1297 | reg = tcg_reg_alloc(s, arg_ct->u.regs, s->reserved_regs); |
1298 | } | 1298 | } |
1299 | - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); | 1299 | + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); |
1300 | } else if (ts->val_type == TEMP_VAL_CONST) { | 1300 | } else if (ts->val_type == TEMP_VAL_CONST) { |
1301 | if (ots->val_type == TEMP_VAL_REG) { | 1301 | if (ots->val_type == TEMP_VAL_REG) { |
1302 | reg = ots->reg; | 1302 | reg = ots->reg; |
@@ -1343,7 +1343,7 @@ static void tcg_reg_alloc_op(TCGContext *s, | @@ -1343,7 +1343,7 @@ static void tcg_reg_alloc_op(TCGContext *s, | ||
1343 | ts = &s->temps[arg]; | 1343 | ts = &s->temps[arg]; |
1344 | if (ts->val_type == TEMP_VAL_MEM) { | 1344 | if (ts->val_type == TEMP_VAL_MEM) { |
1345 | reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); | 1345 | reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); |
1346 | - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); | 1346 | + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); |
1347 | ts->val_type = TEMP_VAL_REG; | 1347 | ts->val_type = TEMP_VAL_REG; |
1348 | ts->reg = reg; | 1348 | ts->reg = reg; |
1349 | ts->mem_coherent = 1; | 1349 | ts->mem_coherent = 1; |
@@ -1501,19 +1501,19 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, | @@ -1501,19 +1501,19 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, | ||
1501 | arg = args[nb_oargs + i]; | 1501 | arg = args[nb_oargs + i]; |
1502 | ts = &s->temps[arg]; | 1502 | ts = &s->temps[arg]; |
1503 | if (ts->val_type == TEMP_VAL_REG) { | 1503 | if (ts->val_type == TEMP_VAL_REG) { |
1504 | - tcg_out_st(s, ts->reg, TCG_REG_CALL_STACK, stack_offset); | 1504 | + tcg_out_st(s, ts->type, ts->reg, TCG_REG_CALL_STACK, stack_offset); |
1505 | } else if (ts->val_type == TEMP_VAL_MEM) { | 1505 | } else if (ts->val_type == TEMP_VAL_MEM) { |
1506 | reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], | 1506 | reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], |
1507 | s->reserved_regs); | 1507 | s->reserved_regs); |
1508 | /* XXX: not correct if reading values from the stack */ | 1508 | /* XXX: not correct if reading values from the stack */ |
1509 | - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); | ||
1510 | - tcg_out_st(s, reg, TCG_REG_CALL_STACK, stack_offset); | 1509 | + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); |
1510 | + tcg_out_st(s, ts->type, reg, TCG_REG_CALL_STACK, stack_offset); | ||
1511 | } else if (ts->val_type == TEMP_VAL_CONST) { | 1511 | } else if (ts->val_type == TEMP_VAL_CONST) { |
1512 | reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], | 1512 | reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], |
1513 | s->reserved_regs); | 1513 | s->reserved_regs); |
1514 | /* XXX: sign extend may be needed on some targets */ | 1514 | /* XXX: sign extend may be needed on some targets */ |
1515 | tcg_out_movi(s, ts->type, reg, ts->val); | 1515 | tcg_out_movi(s, ts->type, reg, ts->val); |
1516 | - tcg_out_st(s, reg, TCG_REG_CALL_STACK, stack_offset); | 1516 | + tcg_out_st(s, ts->type, reg, TCG_REG_CALL_STACK, stack_offset); |
1517 | } else { | 1517 | } else { |
1518 | tcg_abort(); | 1518 | tcg_abort(); |
1519 | } | 1519 | } |
@@ -1532,7 +1532,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, | @@ -1532,7 +1532,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, | ||
1532 | tcg_out_mov(s, reg, ts->reg); | 1532 | tcg_out_mov(s, reg, ts->reg); |
1533 | } | 1533 | } |
1534 | } else if (ts->val_type == TEMP_VAL_MEM) { | 1534 | } else if (ts->val_type == TEMP_VAL_MEM) { |
1535 | - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); | 1535 | + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); |
1536 | } else if (ts->val_type == TEMP_VAL_CONST) { | 1536 | } else if (ts->val_type == TEMP_VAL_CONST) { |
1537 | /* XXX: sign extend ? */ | 1537 | /* XXX: sign extend ? */ |
1538 | tcg_out_movi(s, ts->type, reg, ts->val); | 1538 | tcg_out_movi(s, ts->type, reg, ts->val); |
@@ -1549,7 +1549,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, | @@ -1549,7 +1549,7 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, | ||
1549 | const_func_arg = 0; | 1549 | const_func_arg = 0; |
1550 | if (ts->val_type == TEMP_VAL_MEM) { | 1550 | if (ts->val_type == TEMP_VAL_MEM) { |
1551 | reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); | 1551 | reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); |
1552 | - tcg_out_ld(s, reg, ts->mem_reg, ts->mem_offset); | 1552 | + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); |
1553 | func_arg = reg; | 1553 | func_arg = reg; |
1554 | } else if (ts->val_type == TEMP_VAL_REG) { | 1554 | } else if (ts->val_type == TEMP_VAL_REG) { |
1555 | reg = ts->reg; | 1555 | reg = ts->reg; |
tcg/x86_64/tcg-target.c
@@ -356,16 +356,22 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, | @@ -356,16 +356,22 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, | ||
356 | } | 356 | } |
357 | } | 357 | } |
358 | 358 | ||
359 | -static inline void tcg_out_ld(TCGContext *s, int ret, | 359 | +static inline void tcg_out_ld(TCGContext *s, TCGType type, int ret, |
360 | int arg1, tcg_target_long arg2) | 360 | int arg1, tcg_target_long arg2) |
361 | { | 361 | { |
362 | - tcg_out_modrm_offset(s, 0x8b | P_REXW, ret, arg1, arg2); /* movq */ | 362 | + if (type == TCG_TYPE_I32) |
363 | + tcg_out_modrm_offset(s, 0x8b, ret, arg1, arg2); /* movl */ | ||
364 | + else | ||
365 | + tcg_out_modrm_offset(s, 0x8b | P_REXW, ret, arg1, arg2); /* movq */ | ||
363 | } | 366 | } |
364 | 367 | ||
365 | -static inline void tcg_out_st(TCGContext *s, int arg, | 368 | +static inline void tcg_out_st(TCGContext *s, TCGType type, int arg, |
366 | int arg1, tcg_target_long arg2) | 369 | int arg1, tcg_target_long arg2) |
367 | { | 370 | { |
368 | - tcg_out_modrm_offset(s, 0x89 | P_REXW, arg, arg1, arg2); /* movq */ | 371 | + if (type == TCG_TYPE_I32) |
372 | + tcg_out_modrm_offset(s, 0x89, arg, arg1, arg2); /* movl */ | ||
373 | + else | ||
374 | + tcg_out_modrm_offset(s, 0x89 | P_REXW, arg, arg1, arg2); /* movq */ | ||
369 | } | 375 | } |
370 | 376 | ||
371 | static inline void tgen_arithi32(TCGContext *s, int c, int r0, int32_t val) | 377 | static inline void tgen_arithi32(TCGContext *s, int c, int r0, int32_t val) |