Commit 4f57689a8d5db61fb42434ed70142b2b0751da68
1 parent
29cf4b75
Explicitly free temporaries.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4667 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
130 additions
and
160 deletions
target-mips/translate.c
| ... | ... | @@ -710,7 +710,7 @@ static inline void gen_save_pc(target_ulong pc) |
| 710 | 710 | tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_ptr); |
| 711 | 711 | tcg_gen_st_tl(r_tmp, r_ptr, offsetof(CPUState, PC)); |
| 712 | 712 | tcg_temp_free(r_tc_off); |
| 713 | - tcg_temp_free(r_tc_off_tl); | |
| 713 | + tcg_temp_free(r_tc_off_ptr); | |
| 714 | 714 | tcg_temp_free(r_ptr); |
| 715 | 715 | tcg_temp_free(r_tmp); |
| 716 | 716 | } |
| ... | ... | @@ -729,7 +729,7 @@ static inline void gen_breg_pc(void) |
| 729 | 729 | tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_ptr); |
| 730 | 730 | tcg_gen_st_tl(r_tmp, r_ptr, offsetof(CPUState, PC)); |
| 731 | 731 | tcg_temp_free(r_tc_off); |
| 732 | - tcg_temp_free(r_tc_off_tl); | |
| 732 | + tcg_temp_free(r_tc_off_ptr); | |
| 733 | 733 | tcg_temp_free(r_ptr); |
| 734 | 734 | tcg_temp_free(r_tmp); |
| 735 | 735 | } |
| ... | ... | @@ -740,6 +740,7 @@ static inline void gen_save_btarget(target_ulong btarget) |
| 740 | 740 | |
| 741 | 741 | tcg_gen_movi_tl(r_tmp, btarget); |
| 742 | 742 | tcg_gen_st_tl(r_tmp, cpu_env, offsetof(CPUState, btarget)); |
| 743 | + tcg_temp_free(r_tmp); | |
| 743 | 744 | } |
| 744 | 745 | |
| 745 | 746 | static always_inline void gen_save_breg_target(int reg) |
| ... | ... | @@ -748,6 +749,7 @@ static always_inline void gen_save_breg_target(int reg) |
| 748 | 749 | |
| 749 | 750 | gen_load_gpr(r_tmp, reg); |
| 750 | 751 | tcg_gen_st_tl(r_tmp, cpu_env, offsetof(CPUState, btarget)); |
| 752 | + tcg_temp_free(r_tmp); | |
| 751 | 753 | } |
| 752 | 754 | |
| 753 | 755 | static always_inline void save_cpu_state (DisasContext *ctx, int do_save_pc) |
| ... | ... | @@ -988,7 +990,7 @@ OP_LD_ATOMIC(lld,ld64); |
| 988 | 990 | #define OP_ST_ATOMIC(insn,fname,almask) \ |
| 989 | 991 | void inline op_ldst_##insn(DisasContext *ctx) \ |
| 990 | 992 | { \ |
| 991 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); \ | |
| 993 | + TCGv r_tmp = tcg_temp_local_new(TCG_TYPE_TL); \ | |
| 992 | 994 | int l1 = gen_new_label(); \ |
| 993 | 995 | int l2 = gen_new_label(); \ |
| 994 | 996 | int l3 = gen_new_label(); \ |
| ... | ... | @@ -1000,6 +1002,7 @@ void inline op_ldst_##insn(DisasContext *ctx) \ |
| 1000 | 1002 | gen_set_label(l1); \ |
| 1001 | 1003 | tcg_gen_ld_tl(r_tmp, cpu_env, offsetof(CPUState, CP0_LLAddr)); \ |
| 1002 | 1004 | tcg_gen_brcond_tl(TCG_COND_NE, cpu_T[0], r_tmp, l2); \ |
| 1005 | + tcg_temp_free(r_tmp); \ | |
| 1003 | 1006 | tcg_gen_qemu_##fname(cpu_T[1], cpu_T[0], ctx->mem_idx); \ |
| 1004 | 1007 | tcg_gen_movi_tl(cpu_T[0], 1); \ |
| 1005 | 1008 | tcg_gen_br(l3); \ |
| ... | ... | @@ -1282,7 +1285,7 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1282 | 1285 | switch (opc) { |
| 1283 | 1286 | case OPC_ADDI: |
| 1284 | 1287 | { |
| 1285 | - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1288 | + TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 1286 | 1289 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_TL); |
| 1287 | 1290 | int l1 = gen_new_label(); |
| 1288 | 1291 | |
| ... | ... | @@ -1294,8 +1297,10 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1294 | 1297 | tcg_gen_xori_tl(r_tmp1, r_tmp1, -1); |
| 1295 | 1298 | tcg_gen_xori_tl(r_tmp2, cpu_T[0], uimm); |
| 1296 | 1299 | tcg_gen_and_tl(r_tmp1, r_tmp1, r_tmp2); |
| 1300 | + tcg_temp_free(r_tmp2); | |
| 1297 | 1301 | tcg_gen_shri_tl(r_tmp1, r_tmp1, 31); |
| 1298 | 1302 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_tmp1, 0, l1); |
| 1303 | + tcg_temp_free(r_tmp1); | |
| 1299 | 1304 | /* operands of same sign, result different sign */ |
| 1300 | 1305 | generate_exception(ctx, EXCP_OVERFLOW); |
| 1301 | 1306 | gen_set_label(l1); |
| ... | ... | @@ -1313,7 +1318,7 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1313 | 1318 | #if defined(TARGET_MIPS64) |
| 1314 | 1319 | case OPC_DADDI: |
| 1315 | 1320 | { |
| 1316 | - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1321 | + TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 1317 | 1322 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_TL); |
| 1318 | 1323 | int l1 = gen_new_label(); |
| 1319 | 1324 | |
| ... | ... | @@ -1325,8 +1330,10 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1325 | 1330 | tcg_gen_xori_tl(r_tmp1, r_tmp1, -1); |
| 1326 | 1331 | tcg_gen_xori_tl(r_tmp2, cpu_T[0], uimm); |
| 1327 | 1332 | tcg_gen_and_tl(r_tmp1, r_tmp1, r_tmp2); |
| 1333 | + tcg_temp_free(r_tmp2); | |
| 1328 | 1334 | tcg_gen_shri_tl(r_tmp1, r_tmp1, 63); |
| 1329 | 1335 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_tmp1, 0, l1); |
| 1336 | + tcg_temp_free(r_tmp1); | |
| 1330 | 1337 | /* operands of same sign, result different sign */ |
| 1331 | 1338 | generate_exception(ctx, EXCP_OVERFLOW); |
| 1332 | 1339 | gen_set_label(l1); |
| ... | ... | @@ -1438,6 +1445,7 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1438 | 1445 | tcg_gen_shl_tl(r_tmp1, cpu_T[0], r_tmp1); |
| 1439 | 1446 | tcg_gen_shri_tl(cpu_T[0], cpu_T[0], uimm); |
| 1440 | 1447 | tcg_gen_or_tl(cpu_T[0], cpu_T[0], r_tmp1); |
| 1448 | + tcg_temp_free(r_tmp1); | |
| 1441 | 1449 | } |
| 1442 | 1450 | opn = "drotr"; |
| 1443 | 1451 | } else { |
| ... | ... | @@ -1478,6 +1486,8 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1478 | 1486 | tcg_gen_shl_tl(r_tmp1, cpu_T[0], r_tmp1); |
| 1479 | 1487 | tcg_gen_shr_tl(cpu_T[0], cpu_T[0], r_tmp2); |
| 1480 | 1488 | tcg_gen_or_tl(cpu_T[0], cpu_T[0], r_tmp1); |
| 1489 | + tcg_temp_free(r_tmp1); | |
| 1490 | + tcg_temp_free(r_tmp2); | |
| 1481 | 1491 | opn = "drotr32"; |
| 1482 | 1492 | } else { |
| 1483 | 1493 | tcg_gen_shri_tl(cpu_T[0], cpu_T[0], uimm + 32); |
| ... | ... | @@ -1524,7 +1534,7 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1524 | 1534 | switch (opc) { |
| 1525 | 1535 | case OPC_ADD: |
| 1526 | 1536 | { |
| 1527 | - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1537 | + TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 1528 | 1538 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_TL); |
| 1529 | 1539 | int l1 = gen_new_label(); |
| 1530 | 1540 | |
| ... | ... | @@ -1537,8 +1547,10 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1537 | 1547 | tcg_gen_xori_tl(r_tmp1, r_tmp1, -1); |
| 1538 | 1548 | tcg_gen_xor_tl(r_tmp2, cpu_T[0], cpu_T[1]); |
| 1539 | 1549 | tcg_gen_and_tl(r_tmp1, r_tmp1, r_tmp2); |
| 1550 | + tcg_temp_free(r_tmp2); | |
| 1540 | 1551 | tcg_gen_shri_tl(r_tmp1, r_tmp1, 31); |
| 1541 | 1552 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_tmp1, 0, l1); |
| 1553 | + tcg_temp_free(r_tmp1); | |
| 1542 | 1554 | /* operands of same sign, result different sign */ |
| 1543 | 1555 | generate_exception(ctx, EXCP_OVERFLOW); |
| 1544 | 1556 | gen_set_label(l1); |
| ... | ... | @@ -1556,7 +1568,7 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1556 | 1568 | break; |
| 1557 | 1569 | case OPC_SUB: |
| 1558 | 1570 | { |
| 1559 | - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1571 | + TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 1560 | 1572 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_TL); |
| 1561 | 1573 | int l1 = gen_new_label(); |
| 1562 | 1574 | |
| ... | ... | @@ -1568,8 +1580,10 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1568 | 1580 | tcg_gen_xor_tl(r_tmp2, r_tmp1, cpu_T[1]); |
| 1569 | 1581 | tcg_gen_xor_tl(r_tmp1, r_tmp1, cpu_T[0]); |
| 1570 | 1582 | tcg_gen_and_tl(r_tmp1, r_tmp1, r_tmp2); |
| 1583 | + tcg_temp_free(r_tmp2); | |
| 1571 | 1584 | tcg_gen_shri_tl(r_tmp1, r_tmp1, 31); |
| 1572 | 1585 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_tmp1, 0, l1); |
| 1586 | + tcg_temp_free(r_tmp1); | |
| 1573 | 1587 | /* operands of different sign, first operand and result different sign */ |
| 1574 | 1588 | generate_exception(ctx, EXCP_OVERFLOW); |
| 1575 | 1589 | gen_set_label(l1); |
| ... | ... | @@ -1588,7 +1602,7 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1588 | 1602 | #if defined(TARGET_MIPS64) |
| 1589 | 1603 | case OPC_DADD: |
| 1590 | 1604 | { |
| 1591 | - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1605 | + TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 1592 | 1606 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_TL); |
| 1593 | 1607 | int l1 = gen_new_label(); |
| 1594 | 1608 | |
| ... | ... | @@ -1600,8 +1614,10 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1600 | 1614 | tcg_gen_xori_tl(r_tmp1, r_tmp1, -1); |
| 1601 | 1615 | tcg_gen_xor_tl(r_tmp2, cpu_T[0], cpu_T[1]); |
| 1602 | 1616 | tcg_gen_and_tl(r_tmp1, r_tmp1, r_tmp2); |
| 1617 | + tcg_temp_free(r_tmp2); | |
| 1603 | 1618 | tcg_gen_shri_tl(r_tmp1, r_tmp1, 63); |
| 1604 | 1619 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_tmp1, 0, l1); |
| 1620 | + tcg_temp_free(r_tmp1); | |
| 1605 | 1621 | /* operands of same sign, result different sign */ |
| 1606 | 1622 | generate_exception(ctx, EXCP_OVERFLOW); |
| 1607 | 1623 | gen_set_label(l1); |
| ... | ... | @@ -1614,7 +1630,7 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1614 | 1630 | break; |
| 1615 | 1631 | case OPC_DSUB: |
| 1616 | 1632 | { |
| 1617 | - TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_TL); | |
| 1633 | + TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_TL); | |
| 1618 | 1634 | TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_TL); |
| 1619 | 1635 | int l1 = gen_new_label(); |
| 1620 | 1636 | |
| ... | ... | @@ -1625,8 +1641,10 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1625 | 1641 | tcg_gen_xor_tl(r_tmp2, r_tmp1, cpu_T[1]); |
| 1626 | 1642 | tcg_gen_xor_tl(r_tmp1, r_tmp1, cpu_T[0]); |
| 1627 | 1643 | tcg_gen_and_tl(r_tmp1, r_tmp1, r_tmp2); |
| 1644 | + tcg_temp_free(r_tmp2); | |
| 1628 | 1645 | tcg_gen_shri_tl(r_tmp1, r_tmp1, 63); |
| 1629 | 1646 | tcg_gen_brcondi_tl(TCG_COND_EQ, r_tmp1, 0, l1); |
| 1647 | + tcg_temp_free(r_tmp1); | |
| 1630 | 1648 | /* operands of different sign, first operand and result different sign */ |
| 1631 | 1649 | generate_exception(ctx, EXCP_OVERFLOW); |
| 1632 | 1650 | gen_set_label(l1); |
| ... | ... | @@ -1792,6 +1810,7 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1792 | 1810 | tcg_gen_shl_tl(r_tmp1, cpu_T[1], r_tmp1); |
| 1793 | 1811 | tcg_gen_shr_tl(cpu_T[0], cpu_T[1], cpu_T[0]); |
| 1794 | 1812 | tcg_gen_or_tl(cpu_T[0], cpu_T[0], r_tmp1); |
| 1813 | + tcg_temp_free(r_tmp1); | |
| 1795 | 1814 | tcg_gen_br(l2); |
| 1796 | 1815 | } |
| 1797 | 1816 | gen_set_label(l1); |
| ... | ... | @@ -1886,6 +1905,9 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, |
| 1886 | 1905 | tcg_gen_rem_i64(r_tmp2, r_tmp1, r_tmp2); |
| 1887 | 1906 | tcg_gen_trunc_i64_tl(cpu_T[0], r_tmp3); |
| 1888 | 1907 | tcg_gen_trunc_i64_tl(cpu_T[1], r_tmp2); |
| 1908 | + tcg_temp_free(r_tmp1); | |
| 1909 | + tcg_temp_free(r_tmp2); | |
| 1910 | + tcg_temp_free(r_tmp3); | |
| 1889 | 1911 | tcg_gen_ext32s_tl(cpu_T[0], cpu_T[0]); |
| 1890 | 1912 | tcg_gen_ext32s_tl(cpu_T[1], cpu_T[1]); |
| 1891 | 1913 | gen_store_LO(cpu_T[0], 0); |
| ... | ... | @@ -1956,6 +1978,8 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, |
| 1956 | 1978 | tcg_gen_rem_i64(r_tmp2, cpu_T[0], cpu_T[1]); |
| 1957 | 1979 | gen_store_LO(r_tmp1, 0); |
| 1958 | 1980 | gen_store_HI(r_tmp2, 0); |
| 1981 | + tcg_temp_free(r_tmp1); | |
| 1982 | + tcg_temp_free(r_tmp2); | |
| 1959 | 1983 | } |
| 1960 | 1984 | } |
| 1961 | 1985 | gen_set_label(l1); |
| ... | ... | @@ -1973,6 +1997,8 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, |
| 1973 | 1997 | |
| 1974 | 1998 | tcg_gen_divu_i64(r_tmp1, cpu_T[0], cpu_T[1]); |
| 1975 | 1999 | tcg_gen_remu_i64(r_tmp2, cpu_T[0], cpu_T[1]); |
| 2000 | + tcg_temp_free(r_tmp1); | |
| 2001 | + tcg_temp_free(r_tmp2); | |
| 1976 | 2002 | gen_store_LO(r_tmp1, 0); |
| 1977 | 2003 | gen_store_HI(r_tmp2, 0); |
| 1978 | 2004 | } |
| ... | ... | @@ -2539,11 +2565,27 @@ fail: |
| 2539 | 2565 | } |
| 2540 | 2566 | |
| 2541 | 2567 | /* CP0 (MMU and control) */ |
| 2568 | +static inline void gen_mfc0_load32 (TCGv t, target_ulong off) | |
| 2569 | +{ | |
| 2570 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 2571 | + | |
| 2572 | + tcg_gen_ld_i32(r_tmp, cpu_env, off); | |
| 2573 | + tcg_gen_ext_i32_tl(t, r_tmp); | |
| 2574 | + tcg_temp_free(r_tmp); | |
| 2575 | +} | |
| 2576 | + | |
| 2577 | +static inline void gen_mfc0_load64 (TCGv t, target_ulong off) | |
| 2578 | +{ | |
| 2579 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I64); | |
| 2580 | + | |
| 2581 | + tcg_gen_ld_i64(r_tmp, cpu_env, off); | |
| 2582 | + tcg_gen_trunc_i64_tl(t, r_tmp); | |
| 2583 | + tcg_temp_free(r_tmp); | |
| 2584 | +} | |
| 2585 | + | |
| 2542 | 2586 | static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2543 | 2587 | { |
| 2544 | 2588 | const char *rn = "invalid"; |
| 2545 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 2546 | - TCGv r_tmp64 = tcg_temp_new(TCG_TYPE_I64); | |
| 2547 | 2589 | |
| 2548 | 2590 | if (sel != 0) |
| 2549 | 2591 | check_insn(env, ctx, ISA_MIPS32); |
| ... | ... | @@ -2552,8 +2594,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2552 | 2594 | case 0: |
| 2553 | 2595 | switch (sel) { |
| 2554 | 2596 | case 0: |
| 2555 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Index)); | |
| 2556 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2597 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Index)); | |
| 2557 | 2598 | rn = "Index"; |
| 2558 | 2599 | break; |
| 2559 | 2600 | case 1: |
| ... | ... | @@ -2583,44 +2624,37 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2583 | 2624 | break; |
| 2584 | 2625 | case 1: |
| 2585 | 2626 | check_insn(env, ctx, ASE_MT); |
| 2586 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEControl)); | |
| 2587 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2627 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEControl)); | |
| 2588 | 2628 | rn = "VPEControl"; |
| 2589 | 2629 | break; |
| 2590 | 2630 | case 2: |
| 2591 | 2631 | check_insn(env, ctx, ASE_MT); |
| 2592 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEConf0)); | |
| 2593 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2632 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEConf0)); | |
| 2594 | 2633 | rn = "VPEConf0"; |
| 2595 | 2634 | break; |
| 2596 | 2635 | case 3: |
| 2597 | 2636 | check_insn(env, ctx, ASE_MT); |
| 2598 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEConf1)); | |
| 2599 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2637 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEConf1)); | |
| 2600 | 2638 | rn = "VPEConf1"; |
| 2601 | 2639 | break; |
| 2602 | 2640 | case 4: |
| 2603 | 2641 | check_insn(env, ctx, ASE_MT); |
| 2604 | - tcg_gen_ld_i64(r_tmp64, cpu_env, offsetof(CPUState, CP0_YQMask)); | |
| 2605 | - tcg_gen_trunc_i64_tl(cpu_T[0], r_tmp64); | |
| 2642 | + gen_mfc0_load64(cpu_T[0], offsetof(CPUState, CP0_YQMask)); | |
| 2606 | 2643 | rn = "YQMask"; |
| 2607 | 2644 | break; |
| 2608 | 2645 | case 5: |
| 2609 | 2646 | check_insn(env, ctx, ASE_MT); |
| 2610 | - tcg_gen_ld_tl(r_tmp64, cpu_env, offsetof(CPUState, CP0_VPESchedule)); | |
| 2611 | - tcg_gen_trunc_i64_tl(cpu_T[0], r_tmp64); | |
| 2647 | + gen_mfc0_load64(cpu_T[0], offsetof(CPUState, CP0_VPESchedule)); | |
| 2612 | 2648 | rn = "VPESchedule"; |
| 2613 | 2649 | break; |
| 2614 | 2650 | case 6: |
| 2615 | 2651 | check_insn(env, ctx, ASE_MT); |
| 2616 | - tcg_gen_ld_tl(r_tmp64, cpu_env, offsetof(CPUState, CP0_VPEScheFBack)); | |
| 2617 | - tcg_gen_trunc_i64_tl(cpu_T[0], r_tmp64); | |
| 2652 | + gen_mfc0_load64(cpu_T[0], offsetof(CPUState, CP0_VPEScheFBack)); | |
| 2618 | 2653 | rn = "VPEScheFBack"; |
| 2619 | 2654 | break; |
| 2620 | 2655 | case 7: |
| 2621 | 2656 | check_insn(env, ctx, ASE_MT); |
| 2622 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEOpt)); | |
| 2623 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2657 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEOpt)); | |
| 2624 | 2658 | rn = "VPEOpt"; |
| 2625 | 2659 | break; |
| 2626 | 2660 | default: |
| ... | ... | @@ -2702,14 +2736,12 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2702 | 2736 | case 5: |
| 2703 | 2737 | switch (sel) { |
| 2704 | 2738 | case 0: |
| 2705 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_PageMask)); | |
| 2706 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2739 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_PageMask)); | |
| 2707 | 2740 | rn = "PageMask"; |
| 2708 | 2741 | break; |
| 2709 | 2742 | case 1: |
| 2710 | 2743 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2711 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_PageGrain)); | |
| 2712 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2744 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_PageGrain)); | |
| 2713 | 2745 | rn = "PageGrain"; |
| 2714 | 2746 | break; |
| 2715 | 2747 | default: |
| ... | ... | @@ -2719,38 +2751,32 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2719 | 2751 | case 6: |
| 2720 | 2752 | switch (sel) { |
| 2721 | 2753 | case 0: |
| 2722 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Wired)); | |
| 2723 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2754 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Wired)); | |
| 2724 | 2755 | rn = "Wired"; |
| 2725 | 2756 | break; |
| 2726 | 2757 | case 1: |
| 2727 | 2758 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2728 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf0)); | |
| 2729 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2759 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf0)); | |
| 2730 | 2760 | rn = "SRSConf0"; |
| 2731 | 2761 | break; |
| 2732 | 2762 | case 2: |
| 2733 | 2763 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2734 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf1)); | |
| 2735 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2764 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf1)); | |
| 2736 | 2765 | rn = "SRSConf1"; |
| 2737 | 2766 | break; |
| 2738 | 2767 | case 3: |
| 2739 | 2768 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2740 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf2)); | |
| 2741 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2769 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf2)); | |
| 2742 | 2770 | rn = "SRSConf2"; |
| 2743 | 2771 | break; |
| 2744 | 2772 | case 4: |
| 2745 | 2773 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2746 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf3)); | |
| 2747 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2774 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf3)); | |
| 2748 | 2775 | rn = "SRSConf3"; |
| 2749 | 2776 | break; |
| 2750 | 2777 | case 5: |
| 2751 | 2778 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2752 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf4)); | |
| 2753 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2779 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf4)); | |
| 2754 | 2780 | rn = "SRSConf4"; |
| 2755 | 2781 | break; |
| 2756 | 2782 | default: |
| ... | ... | @@ -2761,8 +2787,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2761 | 2787 | switch (sel) { |
| 2762 | 2788 | case 0: |
| 2763 | 2789 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2764 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_HWREna)); | |
| 2765 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2790 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_HWREna)); | |
| 2766 | 2791 | rn = "HWREna"; |
| 2767 | 2792 | break; |
| 2768 | 2793 | default: |
| ... | ... | @@ -2805,8 +2830,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2805 | 2830 | case 11: |
| 2806 | 2831 | switch (sel) { |
| 2807 | 2832 | case 0: |
| 2808 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Compare)); | |
| 2809 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2833 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Compare)); | |
| 2810 | 2834 | rn = "Compare"; |
| 2811 | 2835 | break; |
| 2812 | 2836 | /* 6,7 are implementation dependent */ |
| ... | ... | @@ -2817,26 +2841,22 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2817 | 2841 | case 12: |
| 2818 | 2842 | switch (sel) { |
| 2819 | 2843 | case 0: |
| 2820 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Status)); | |
| 2821 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2844 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Status)); | |
| 2822 | 2845 | rn = "Status"; |
| 2823 | 2846 | break; |
| 2824 | 2847 | case 1: |
| 2825 | 2848 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2826 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_IntCtl)); | |
| 2827 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2849 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_IntCtl)); | |
| 2828 | 2850 | rn = "IntCtl"; |
| 2829 | 2851 | break; |
| 2830 | 2852 | case 2: |
| 2831 | 2853 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2832 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSCtl)); | |
| 2833 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2854 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSCtl)); | |
| 2834 | 2855 | rn = "SRSCtl"; |
| 2835 | 2856 | break; |
| 2836 | 2857 | case 3: |
| 2837 | 2858 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2838 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSMap)); | |
| 2839 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2859 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSMap)); | |
| 2840 | 2860 | rn = "SRSMap"; |
| 2841 | 2861 | break; |
| 2842 | 2862 | default: |
| ... | ... | @@ -2846,8 +2866,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2846 | 2866 | case 13: |
| 2847 | 2867 | switch (sel) { |
| 2848 | 2868 | case 0: |
| 2849 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Cause)); | |
| 2850 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2869 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Cause)); | |
| 2851 | 2870 | rn = "Cause"; |
| 2852 | 2871 | break; |
| 2853 | 2872 | default: |
| ... | ... | @@ -2868,14 +2887,12 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2868 | 2887 | case 15: |
| 2869 | 2888 | switch (sel) { |
| 2870 | 2889 | case 0: |
| 2871 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_PRid)); | |
| 2872 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2890 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_PRid)); | |
| 2873 | 2891 | rn = "PRid"; |
| 2874 | 2892 | break; |
| 2875 | 2893 | case 1: |
| 2876 | 2894 | check_insn(env, ctx, ISA_MIPS32R2); |
| 2877 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_EBase)); | |
| 2878 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2895 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_EBase)); | |
| 2879 | 2896 | rn = "EBase"; |
| 2880 | 2897 | break; |
| 2881 | 2898 | default: |
| ... | ... | @@ -2885,35 +2902,29 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2885 | 2902 | case 16: |
| 2886 | 2903 | switch (sel) { |
| 2887 | 2904 | case 0: |
| 2888 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config0)); | |
| 2889 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2905 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config0)); | |
| 2890 | 2906 | rn = "Config"; |
| 2891 | 2907 | break; |
| 2892 | 2908 | case 1: |
| 2893 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config1)); | |
| 2894 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2909 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config1)); | |
| 2895 | 2910 | rn = "Config1"; |
| 2896 | 2911 | break; |
| 2897 | 2912 | case 2: |
| 2898 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config2)); | |
| 2899 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2913 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config2)); | |
| 2900 | 2914 | rn = "Config2"; |
| 2901 | 2915 | break; |
| 2902 | 2916 | case 3: |
| 2903 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config3)); | |
| 2904 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2917 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config3)); | |
| 2905 | 2918 | rn = "Config3"; |
| 2906 | 2919 | break; |
| 2907 | 2920 | /* 4,5 are reserved */ |
| 2908 | 2921 | /* 6,7 are implementation dependent */ |
| 2909 | 2922 | case 6: |
| 2910 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config6)); | |
| 2911 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2923 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config6)); | |
| 2912 | 2924 | rn = "Config6"; |
| 2913 | 2925 | break; |
| 2914 | 2926 | case 7: |
| 2915 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config7)); | |
| 2916 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2927 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config7)); | |
| 2917 | 2928 | rn = "Config7"; |
| 2918 | 2929 | break; |
| 2919 | 2930 | default: |
| ... | ... | @@ -2968,8 +2979,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 2968 | 2979 | /* Officially reserved, but sel 0 is used for R1x000 framemask */ |
| 2969 | 2980 | switch (sel) { |
| 2970 | 2981 | case 0: |
| 2971 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Framemask)); | |
| 2972 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 2982 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Framemask)); | |
| 2973 | 2983 | rn = "Framemask"; |
| 2974 | 2984 | break; |
| 2975 | 2985 | default: |
| ... | ... | @@ -3021,8 +3031,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3021 | 3031 | case 25: |
| 3022 | 3032 | switch (sel) { |
| 3023 | 3033 | case 0: |
| 3024 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Performance0)); | |
| 3025 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3034 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Performance0)); | |
| 3026 | 3035 | rn = "Performance0"; |
| 3027 | 3036 | break; |
| 3028 | 3037 | case 1: |
| ... | ... | @@ -3076,16 +3085,14 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3076 | 3085 | case 2: |
| 3077 | 3086 | case 4: |
| 3078 | 3087 | case 6: |
| 3079 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_TagLo)); | |
| 3080 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3088 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_TagLo)); | |
| 3081 | 3089 | rn = "TagLo"; |
| 3082 | 3090 | break; |
| 3083 | 3091 | case 1: |
| 3084 | 3092 | case 3: |
| 3085 | 3093 | case 5: |
| 3086 | 3094 | case 7: |
| 3087 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_DataLo)); | |
| 3088 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3095 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_DataLo)); | |
| 3089 | 3096 | rn = "DataLo"; |
| 3090 | 3097 | break; |
| 3091 | 3098 | default: |
| ... | ... | @@ -3098,16 +3105,14 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3098 | 3105 | case 2: |
| 3099 | 3106 | case 4: |
| 3100 | 3107 | case 6: |
| 3101 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_TagHi)); | |
| 3102 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3108 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_TagHi)); | |
| 3103 | 3109 | rn = "TagHi"; |
| 3104 | 3110 | break; |
| 3105 | 3111 | case 1: |
| 3106 | 3112 | case 3: |
| 3107 | 3113 | case 5: |
| 3108 | 3114 | case 7: |
| 3109 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_DataHi)); | |
| 3110 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3115 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_DataHi)); | |
| 3111 | 3116 | rn = "DataHi"; |
| 3112 | 3117 | break; |
| 3113 | 3118 | default: |
| ... | ... | @@ -3129,8 +3134,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3129 | 3134 | switch (sel) { |
| 3130 | 3135 | case 0: |
| 3131 | 3136 | /* EJTAG support */ |
| 3132 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_DESAVE)); | |
| 3133 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3137 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_DESAVE)); | |
| 3134 | 3138 | rn = "DESAVE"; |
| 3135 | 3139 | break; |
| 3136 | 3140 | default: |
| ... | ... | @@ -3761,7 +3765,6 @@ die: |
| 3761 | 3765 | static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3762 | 3766 | { |
| 3763 | 3767 | const char *rn = "invalid"; |
| 3764 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 3765 | 3768 | |
| 3766 | 3769 | if (sel != 0) |
| 3767 | 3770 | check_insn(env, ctx, ISA_MIPS64); |
| ... | ... | @@ -3770,8 +3773,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3770 | 3773 | case 0: |
| 3771 | 3774 | switch (sel) { |
| 3772 | 3775 | case 0: |
| 3773 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Index)); | |
| 3774 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3776 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Index)); | |
| 3775 | 3777 | rn = "Index"; |
| 3776 | 3778 | break; |
| 3777 | 3779 | case 1: |
| ... | ... | @@ -3801,20 +3803,17 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3801 | 3803 | break; |
| 3802 | 3804 | case 1: |
| 3803 | 3805 | check_insn(env, ctx, ASE_MT); |
| 3804 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEControl)); | |
| 3805 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3806 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEControl)); | |
| 3806 | 3807 | rn = "VPEControl"; |
| 3807 | 3808 | break; |
| 3808 | 3809 | case 2: |
| 3809 | 3810 | check_insn(env, ctx, ASE_MT); |
| 3810 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEConf0)); | |
| 3811 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3811 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEConf0)); | |
| 3812 | 3812 | rn = "VPEConf0"; |
| 3813 | 3813 | break; |
| 3814 | 3814 | case 3: |
| 3815 | 3815 | check_insn(env, ctx, ASE_MT); |
| 3816 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEConf1)); | |
| 3817 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3816 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEConf1)); | |
| 3818 | 3817 | rn = "VPEConf1"; |
| 3819 | 3818 | break; |
| 3820 | 3819 | case 4: |
| ... | ... | @@ -3834,8 +3833,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3834 | 3833 | break; |
| 3835 | 3834 | case 7: |
| 3836 | 3835 | check_insn(env, ctx, ASE_MT); |
| 3837 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_VPEOpt)); | |
| 3838 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3836 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_VPEOpt)); | |
| 3839 | 3837 | rn = "VPEOpt"; |
| 3840 | 3838 | break; |
| 3841 | 3839 | default: |
| ... | ... | @@ -3914,14 +3912,12 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3914 | 3912 | case 5: |
| 3915 | 3913 | switch (sel) { |
| 3916 | 3914 | case 0: |
| 3917 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_PageMask)); | |
| 3918 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3915 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_PageMask)); | |
| 3919 | 3916 | rn = "PageMask"; |
| 3920 | 3917 | break; |
| 3921 | 3918 | case 1: |
| 3922 | 3919 | check_insn(env, ctx, ISA_MIPS32R2); |
| 3923 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_PageGrain)); | |
| 3924 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3920 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_PageGrain)); | |
| 3925 | 3921 | rn = "PageGrain"; |
| 3926 | 3922 | break; |
| 3927 | 3923 | default: |
| ... | ... | @@ -3931,38 +3927,32 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3931 | 3927 | case 6: |
| 3932 | 3928 | switch (sel) { |
| 3933 | 3929 | case 0: |
| 3934 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Wired)); | |
| 3935 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3930 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Wired)); | |
| 3936 | 3931 | rn = "Wired"; |
| 3937 | 3932 | break; |
| 3938 | 3933 | case 1: |
| 3939 | 3934 | check_insn(env, ctx, ISA_MIPS32R2); |
| 3940 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf0)); | |
| 3941 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3935 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf0)); | |
| 3942 | 3936 | rn = "SRSConf0"; |
| 3943 | 3937 | break; |
| 3944 | 3938 | case 2: |
| 3945 | 3939 | check_insn(env, ctx, ISA_MIPS32R2); |
| 3946 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf1)); | |
| 3947 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3940 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf1)); | |
| 3948 | 3941 | rn = "SRSConf1"; |
| 3949 | 3942 | break; |
| 3950 | 3943 | case 3: |
| 3951 | 3944 | check_insn(env, ctx, ISA_MIPS32R2); |
| 3952 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf2)); | |
| 3953 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3945 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf2)); | |
| 3954 | 3946 | rn = "SRSConf2"; |
| 3955 | 3947 | break; |
| 3956 | 3948 | case 4: |
| 3957 | 3949 | check_insn(env, ctx, ISA_MIPS32R2); |
| 3958 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf3)); | |
| 3959 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3950 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf3)); | |
| 3960 | 3951 | rn = "SRSConf3"; |
| 3961 | 3952 | break; |
| 3962 | 3953 | case 5: |
| 3963 | 3954 | check_insn(env, ctx, ISA_MIPS32R2); |
| 3964 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSConf4)); | |
| 3965 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3955 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSConf4)); | |
| 3966 | 3956 | rn = "SRSConf4"; |
| 3967 | 3957 | break; |
| 3968 | 3958 | default: |
| ... | ... | @@ -3973,8 +3963,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 3973 | 3963 | switch (sel) { |
| 3974 | 3964 | case 0: |
| 3975 | 3965 | check_insn(env, ctx, ISA_MIPS32R2); |
| 3976 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_HWREna)); | |
| 3977 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 3966 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_HWREna)); | |
| 3978 | 3967 | rn = "HWREna"; |
| 3979 | 3968 | break; |
| 3980 | 3969 | default: |
| ... | ... | @@ -4015,8 +4004,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4015 | 4004 | case 11: |
| 4016 | 4005 | switch (sel) { |
| 4017 | 4006 | case 0: |
| 4018 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Compare)); | |
| 4019 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4007 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Compare)); | |
| 4020 | 4008 | rn = "Compare"; |
| 4021 | 4009 | break; |
| 4022 | 4010 | /* 6,7 are implementation dependent */ |
| ... | ... | @@ -4027,26 +4015,22 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4027 | 4015 | case 12: |
| 4028 | 4016 | switch (sel) { |
| 4029 | 4017 | case 0: |
| 4030 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Status)); | |
| 4031 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4018 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Status)); | |
| 4032 | 4019 | rn = "Status"; |
| 4033 | 4020 | break; |
| 4034 | 4021 | case 1: |
| 4035 | 4022 | check_insn(env, ctx, ISA_MIPS32R2); |
| 4036 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_IntCtl)); | |
| 4037 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4023 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_IntCtl)); | |
| 4038 | 4024 | rn = "IntCtl"; |
| 4039 | 4025 | break; |
| 4040 | 4026 | case 2: |
| 4041 | 4027 | check_insn(env, ctx, ISA_MIPS32R2); |
| 4042 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSCtl)); | |
| 4043 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4028 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSCtl)); | |
| 4044 | 4029 | rn = "SRSCtl"; |
| 4045 | 4030 | break; |
| 4046 | 4031 | case 3: |
| 4047 | 4032 | check_insn(env, ctx, ISA_MIPS32R2); |
| 4048 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSMap)); | |
| 4049 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4033 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_SRSMap)); | |
| 4050 | 4034 | rn = "SRSMap"; |
| 4051 | 4035 | break; |
| 4052 | 4036 | default: |
| ... | ... | @@ -4056,8 +4040,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4056 | 4040 | case 13: |
| 4057 | 4041 | switch (sel) { |
| 4058 | 4042 | case 0: |
| 4059 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Cause)); | |
| 4060 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4043 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Cause)); | |
| 4061 | 4044 | rn = "Cause"; |
| 4062 | 4045 | break; |
| 4063 | 4046 | default: |
| ... | ... | @@ -4077,14 +4060,12 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4077 | 4060 | case 15: |
| 4078 | 4061 | switch (sel) { |
| 4079 | 4062 | case 0: |
| 4080 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_PRid)); | |
| 4081 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4063 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_PRid)); | |
| 4082 | 4064 | rn = "PRid"; |
| 4083 | 4065 | break; |
| 4084 | 4066 | case 1: |
| 4085 | 4067 | check_insn(env, ctx, ISA_MIPS32R2); |
| 4086 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_EBase)); | |
| 4087 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4068 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_EBase)); | |
| 4088 | 4069 | rn = "EBase"; |
| 4089 | 4070 | break; |
| 4090 | 4071 | default: |
| ... | ... | @@ -4094,34 +4075,28 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4094 | 4075 | case 16: |
| 4095 | 4076 | switch (sel) { |
| 4096 | 4077 | case 0: |
| 4097 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config0)); | |
| 4098 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4078 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config0)); | |
| 4099 | 4079 | rn = "Config"; |
| 4100 | 4080 | break; |
| 4101 | 4081 | case 1: |
| 4102 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config1)); | |
| 4103 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4082 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config1)); | |
| 4104 | 4083 | rn = "Config1"; |
| 4105 | 4084 | break; |
| 4106 | 4085 | case 2: |
| 4107 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config2)); | |
| 4108 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4086 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config2)); | |
| 4109 | 4087 | rn = "Config2"; |
| 4110 | 4088 | break; |
| 4111 | 4089 | case 3: |
| 4112 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config3)); | |
| 4113 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4090 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config3)); | |
| 4114 | 4091 | rn = "Config3"; |
| 4115 | 4092 | break; |
| 4116 | 4093 | /* 6,7 are implementation dependent */ |
| 4117 | 4094 | case 6: |
| 4118 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config6)); | |
| 4119 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4095 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config6)); | |
| 4120 | 4096 | rn = "Config6"; |
| 4121 | 4097 | break; |
| 4122 | 4098 | case 7: |
| 4123 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Config7)); | |
| 4124 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4099 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Config7)); | |
| 4125 | 4100 | rn = "Config7"; |
| 4126 | 4101 | break; |
| 4127 | 4102 | default: |
| ... | ... | @@ -4173,8 +4148,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4173 | 4148 | /* Officially reserved, but sel 0 is used for R1x000 framemask */ |
| 4174 | 4149 | switch (sel) { |
| 4175 | 4150 | case 0: |
| 4176 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Framemask)); | |
| 4177 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4151 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Framemask)); | |
| 4178 | 4152 | rn = "Framemask"; |
| 4179 | 4153 | break; |
| 4180 | 4154 | default: |
| ... | ... | @@ -4225,8 +4199,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4225 | 4199 | case 25: |
| 4226 | 4200 | switch (sel) { |
| 4227 | 4201 | case 0: |
| 4228 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Performance0)); | |
| 4229 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4202 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_Performance0)); | |
| 4230 | 4203 | rn = "Performance0"; |
| 4231 | 4204 | break; |
| 4232 | 4205 | case 1: |
| ... | ... | @@ -4280,16 +4253,14 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4280 | 4253 | case 2: |
| 4281 | 4254 | case 4: |
| 4282 | 4255 | case 6: |
| 4283 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_TagLo)); | |
| 4284 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4256 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_TagLo)); | |
| 4285 | 4257 | rn = "TagLo"; |
| 4286 | 4258 | break; |
| 4287 | 4259 | case 1: |
| 4288 | 4260 | case 3: |
| 4289 | 4261 | case 5: |
| 4290 | 4262 | case 7: |
| 4291 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_DataLo)); | |
| 4292 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4263 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_DataLo)); | |
| 4293 | 4264 | rn = "DataLo"; |
| 4294 | 4265 | break; |
| 4295 | 4266 | default: |
| ... | ... | @@ -4302,16 +4273,14 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4302 | 4273 | case 2: |
| 4303 | 4274 | case 4: |
| 4304 | 4275 | case 6: |
| 4305 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_TagHi)); | |
| 4306 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4276 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_TagHi)); | |
| 4307 | 4277 | rn = "TagHi"; |
| 4308 | 4278 | break; |
| 4309 | 4279 | case 1: |
| 4310 | 4280 | case 3: |
| 4311 | 4281 | case 5: |
| 4312 | 4282 | case 7: |
| 4313 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_DataHi)); | |
| 4314 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4283 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_DataHi)); | |
| 4315 | 4284 | rn = "DataHi"; |
| 4316 | 4285 | break; |
| 4317 | 4286 | default: |
| ... | ... | @@ -4332,8 +4301,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, int reg, int sel) |
| 4332 | 4301 | switch (sel) { |
| 4333 | 4302 | case 0: |
| 4334 | 4303 | /* EJTAG support */ |
| 4335 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_DESAVE)); | |
| 4336 | - tcg_gen_ext_i32_tl(cpu_T[0], r_tmp); | |
| 4304 | + gen_mfc0_load32(cpu_T[0], offsetof(CPUState, CP0_DESAVE)); | |
| 4337 | 4305 | rn = "DESAVE"; |
| 4338 | 4306 | break; |
| 4339 | 4307 | default: |
| ... | ... | @@ -6629,12 +6597,13 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 6629 | 6597 | |
| 6630 | 6598 | /* Handle blikely not taken case */ |
| 6631 | 6599 | if ((ctx->hflags & MIPS_HFLAG_BMASK) == MIPS_HFLAG_BL) { |
| 6632 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); | |
| 6600 | + TCGv r_tmp = tcg_temp_local_new(TCG_TYPE_TL); | |
| 6633 | 6601 | int l1 = gen_new_label(); |
| 6634 | 6602 | |
| 6635 | 6603 | MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4); |
| 6636 | 6604 | tcg_gen_ld_tl(r_tmp, cpu_env, offsetof(CPUState, bcond)); |
| 6637 | 6605 | tcg_gen_brcondi_tl(TCG_COND_NE, r_tmp, 0, l1); |
| 6606 | + tcg_temp_free(r_tmp); | |
| 6638 | 6607 | gen_op_save_state(ctx->hflags & ~MIPS_HFLAG_BMASK); |
| 6639 | 6608 | gen_goto_tb(ctx, 1, ctx->pc + 4); |
| 6640 | 6609 | gen_set_label(l1); |
| ... | ... | @@ -7188,11 +7157,12 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 7188 | 7157 | /* Conditional branch */ |
| 7189 | 7158 | MIPS_DEBUG("conditional branch"); |
| 7190 | 7159 | { |
| 7191 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); | |
| 7160 | + TCGv r_tmp = tcg_temp_local_new(TCG_TYPE_TL); | |
| 7192 | 7161 | int l1 = gen_new_label(); |
| 7193 | 7162 | |
| 7194 | 7163 | tcg_gen_ld_tl(r_tmp, cpu_env, offsetof(CPUState, bcond)); |
| 7195 | 7164 | tcg_gen_brcondi_tl(TCG_COND_NE, r_tmp, 0, l1); |
| 7165 | + tcg_temp_free(r_tmp); | |
| 7196 | 7166 | gen_goto_tb(ctx, 1, ctx->pc + 4); |
| 7197 | 7167 | gen_set_label(l1); |
| 7198 | 7168 | gen_goto_tb(ctx, 0, ctx->btarget); | ... | ... |