Revision 36aa55dc

b/target-arm/translate.c
1447 1447

  
1448 1448
static void gen_iwmmxt_movl_wRn_T0_T1(int rn)
1449 1449
{
1450
    tcg_gen_extu_i32_i64(cpu_V0, cpu_T[0]);
1451
    tcg_gen_extu_i32_i64(cpu_V1, cpu_T[0]);
1452
    tcg_gen_shli_i64(cpu_V1, cpu_V1, 32);
1453
    tcg_gen_or_i64(cpu_V0, cpu_V0, cpu_V1);
1450
    tcg_gen_concat_i32_i64(cpu_V0, cpu_T[0], cpu_T[1]);
1454 1451
    iwmmxt_store_reg(cpu_V0, rn);
1455 1452
}
1456 1453

  
......
4663 4660
                    } else {
4664 4661
                        tmp = neon_load_reg(rm + pass, 0);
4665 4662
                        gen_neon_shift_narrow(size, tmp, tmp2, q, u);
4666
                        tcg_gen_extu_i32_i64(cpu_V0, tmp);
4663
                        tmp3 = neon_load_reg(rm + pass, 1);
4664
                        gen_neon_shift_narrow(size, tmp3, tmp2, q, u);
4665
                        tcg_gen_concat_i32_i64(cpu_V0, tmp, tmp3);
4667 4666
                        dead_tmp(tmp);
4668
                        tmp = neon_load_reg(rm + pass, 1);
4669
                        gen_neon_shift_narrow(size, tmp, tmp2, q, u);
4670
                        tcg_gen_extu_i32_i64(cpu_V1, tmp);
4671
                        dead_tmp(tmp);
4672
                        tcg_gen_shli_i64(cpu_V1, cpu_V1, 32);
4673
                        tcg_gen_or_i64(cpu_V0, cpu_V0, cpu_V1);
4667
                        dead_tmp(tmp3);
4674 4668
                    }
4675 4669
                    tmp = new_tmp();
4676 4670
                    if (op == 8 && !u) {
......
5600 5594
    TCGv tmp;
5601 5595
    TCGv tmp2;
5602 5596

  
5603
    /* Load 64-bit value rd:rn.  */
5597
    /* Load value and extend to 64 bits.  */
5604 5598
    tmp = tcg_temp_new(TCG_TYPE_I64);
5605 5599
    tmp2 = load_reg(s, rlow);
5606 5600
    tcg_gen_extu_i32_i64(tmp, tmp2);
......
5612 5606
static void gen_addq(DisasContext *s, TCGv val, int rlow, int rhigh)
5613 5607
{
5614 5608
    TCGv tmp;
5615
    TCGv tmp2;
5609
    TCGv tmpl;
5610
    TCGv tmph;
5616 5611

  
5617 5612
    /* Load 64-bit value rd:rn.  */
5613
    tmpl = load_reg(s, rlow);
5614
    tmph = load_reg(s, rhigh);
5618 5615
    tmp = tcg_temp_new(TCG_TYPE_I64);
5619
    tmp2 = load_reg(s, rhigh);
5620
    tcg_gen_extu_i32_i64(tmp, tmp2);
5621
    dead_tmp(tmp2);
5622
    tcg_gen_shli_i64(tmp, tmp, 32);
5623
    tcg_gen_add_i64(val, val, tmp);
5624

  
5625
    tmp2 = load_reg(s, rlow);
5626
    tcg_gen_extu_i32_i64(tmp, tmp2);
5627
    dead_tmp(tmp2);
5616
    tcg_gen_concat_i32_i64(tmp, tmpl, tmph);
5617
    dead_tmp(tmpl);
5618
    dead_tmp(tmph);
5628 5619
    tcg_gen_add_i64(val, val, tmp);
5629 5620
}
5630 5621

  
b/target-mips/translate.c
693 693
    if (ctx->hflags & MIPS_HFLAG_F64)
694 694
        tcg_gen_mov_i64(t, fpu_fpr64[reg]);
695 695
    else {
696
        TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I64);
697

  
698
        tcg_gen_extu_i32_i64(t, fpu_fpr32[reg | 1]);
699
        tcg_gen_shli_i64(t, t, 32);
700
        tcg_gen_extu_i32_i64(r_tmp2, fpu_fpr32[reg & ~1]);
701
        tcg_gen_or_i64(t, t, r_tmp2);
702
        tcg_temp_free(r_tmp2);
696
        tcg_gen_concat_i32_i64(t, fpu_fpr32[reg & ~1], fpu_fpr32[reg | 1]);
703 697
    }
704 698
}
705 699

  
......
6546 6540
    case FOP(38, 16):
6547 6541
        check_cp1_64bitmode(ctx);
6548 6542
        {
6549
            TCGv fp64_0 = tcg_temp_new(TCG_TYPE_I64);
6550
            TCGv fp64_1 = tcg_temp_new(TCG_TYPE_I64);
6543
            TCGv fp64 = tcg_temp_new(TCG_TYPE_I64);
6551 6544
            TCGv fp32_0 = tcg_temp_new(TCG_TYPE_I32);
6552 6545
            TCGv fp32_1 = tcg_temp_new(TCG_TYPE_I32);
6553 6546

  
6554 6547
            gen_load_fpr32(fp32_0, fs);
6555 6548
            gen_load_fpr32(fp32_1, ft);
6556
            tcg_gen_extu_i32_i64(fp64_0, fp32_0);
6557
            tcg_gen_extu_i32_i64(fp64_1, fp32_1);
6558
            tcg_temp_free(fp32_0);
6549
            tcg_gen_concat_i32_i64(fp64, fp32_0, fp32_1);
6559 6550
            tcg_temp_free(fp32_1);
6560
            tcg_gen_shli_i64(fp64_1, fp64_1, 32);
6561
            tcg_gen_or_i64(fp64_0, fp64_0, fp64_1);
6562
            tcg_temp_free(fp64_1);
6563
            gen_store_fpr64(ctx, fp64_0, fd);
6564
            tcg_temp_free(fp64_0);
6551
            tcg_temp_free(fp32_0);
6552
            gen_store_fpr64(ctx, fp64, fd);
6553
            tcg_temp_free(fp64);
6565 6554
        }
6566 6555
        opn = "cvt.ps.s";
6567 6556
        break;
b/target-ppc/translate.c
5300 5300
#if defined(TARGET_PPC64)
5301 5301
    tcg_gen_mov_i64(t, cpu_gpr[reg]);
5302 5302
#else
5303
    tcg_gen_extu_i32_i64(t, cpu_gprh[reg]);
5304
    tcg_gen_shli_i64(t, t, 32);
5305
    TCGv tmp = tcg_temp_local_new(TCG_TYPE_I64);
5306
    tcg_gen_extu_i32_i64(tmp, cpu_gpr[reg]);
5307
    tcg_gen_or_i64(t, t, tmp);
5308
    tcg_temp_free(tmp);
5303
    tcg_gen_concat_i32_i64(t, cpu_gpr[reg], cpu_gprh[reg]);
5309 5304
#endif
5310 5305
}
5311 5306

  
b/target-sh4/translate.c
400 400
static inline void gen_load_fpr64(TCGv t, int reg)
401 401
{
402 402
    TCGv tmp1 = tcg_temp_new(TCG_TYPE_I32);
403
    TCGv tmp2 = tcg_temp_new(TCG_TYPE_I64);
403
    TCGv tmp2 = tcg_temp_new(TCG_TYPE_I32);
404 404

  
405 405
    tcg_gen_ld_i32(tmp1, cpu_env, offsetof(CPUState, fregs[reg]));
406
    tcg_gen_extu_i32_i64(t, tmp1);
407
    tcg_gen_shli_i64(t, t, 32);
408
    tcg_gen_ld_i32(tmp1, cpu_env, offsetof(CPUState, fregs[reg + 1]));
409
    tcg_gen_extu_i32_i64(tmp2, tmp1);
406
    tcg_gen_ld_i32(tmp2, cpu_env, offsetof(CPUState, fregs[reg + 1]));
407
    tcg_gen_concat_i32_i64(t, tmp2, tmp1);
410 408
    tcg_temp_free(tmp1);
411
    tcg_gen_or_i64(t, t, tmp2);
412 409
    tcg_temp_free(tmp2);
413 410
}
414 411

  
b/tcg/README
265 265
* trunc_i64_i32 t0, t1
266 266
Truncate t1 (64 bit) to t0 (32 bit)
267 267

  
268
* concat_i32_i64 t0, t1, t2
269
Construct t0 (64-bit) taking the low half from t1 (32 bit) and the high half
270
from t2 (32 bit).
271

  
268 272
********* Load/Store
269 273

  
270 274
* ld_i32/i64 t0, t1, offset
b/tcg/tcg-op.h
1395 1395
}
1396 1396
#endif
1397 1397

  
1398
static inline void tcg_gen_concat_i32_i64(TCGv dest, TCGv low, TCGv high)
1399
{
1400
#if TCG_TARGET_REG_BITS == 32
1401
    tcg_gen_mov_i32(dest, low);
1402
    tcg_gen_mov_i32(TCGV_HIGH(dest), high);
1403
#else
1404
    TCGv tmp = tcg_temp_new (TCG_TYPE_I64);
1405
    /* This extension is only needed for type correctness.
1406
       We may be able to do better given target specific information.  */
1407
    tcg_gen_extu_i32_i64(tmp, high);
1408
    tcg_gen_shli_i64(tmp, tmp, 32);
1409
    tcg_gen_extu_i32_i64(dest, low);
1410
    tcg_gen_or_i64(dest, dest, tmp);
1411
    tcg_temp_free(tmp);
1412
#endif
1413
}
1414

  
1398 1415
/***************************************/
1399 1416
/* QEMU specific operations. Their type depend on the QEMU CPU
1400 1417
   type. */

Also available in: Unified diff