Revision e4d5434c

b/tcg/i386/tcg-target.c
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 261
    /* movl */
262 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 268
    /* movl */
269 269
    tcg_out_modrm_offset(s, 0x89, arg, arg1, arg2);
b/tcg/sparc/tcg-target.c
262 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 266
                              int arg1, tcg_target_long arg2)
267 267
{
268 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 272
                              int arg1, tcg_target_long arg2)
273 273
{
274 274
    fprintf(stderr, "unimplemented %s\n", __func__);
b/tcg/tcg.c
1196 1196
        if (!ts->mem_coherent) {
1197 1197
            if (!ts->mem_allocated) 
1198 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 1201
        ts->val_type = TEMP_VAL_MEM;
1202 1202
        s->reg_to_temp[reg] = -1;
......
1296 1296
        } else {
1297 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 1300
    } else if (ts->val_type == TEMP_VAL_CONST) {
1301 1301
        if (ots->val_type == TEMP_VAL_REG) {
1302 1302
            reg = ots->reg;
......
1343 1343
        ts = &s->temps[arg];
1344 1344
        if (ts->val_type == TEMP_VAL_MEM) {
1345 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 1347
            ts->val_type = TEMP_VAL_REG;
1348 1348
            ts->reg = reg;
1349 1349
            ts->mem_coherent = 1;
......
1501 1501
        arg = args[nb_oargs + i];
1502 1502
        ts = &s->temps[arg];
1503 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 1505
        } else if (ts->val_type == TEMP_VAL_MEM) {
1506 1506
            reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], 
1507 1507
                                s->reserved_regs);
1508 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 1511
        } else if (ts->val_type == TEMP_VAL_CONST) {
1512 1512
            reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], 
1513 1513
                                s->reserved_regs);
1514 1514
            /* XXX: sign extend may be needed on some targets */
1515 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 1517
        } else {
1518 1518
            tcg_abort();
1519 1519
        }
......
1532 1532
                tcg_out_mov(s, reg, ts->reg);
1533 1533
            }
1534 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 1536
        } else if (ts->val_type == TEMP_VAL_CONST) {
1537 1537
            /* XXX: sign extend ? */
1538 1538
            tcg_out_movi(s, ts->type, reg, ts->val);
......
1549 1549
    const_func_arg = 0;
1550 1550
    if (ts->val_type == TEMP_VAL_MEM) {
1551 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 1553
        func_arg = reg;
1554 1554
    } else if (ts->val_type == TEMP_VAL_REG) {
1555 1555
        reg = ts->reg;
b/tcg/x86_64/tcg-target.c
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 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 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 377
static inline void tgen_arithi32(TCGContext *s, int c, int r0, int32_t val)

Also available in: Unified diff