Commit e4d5434c3a9c7eacadad431fcd03c277c6d2777d

Authored by blueswir1
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
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)