Commit 29cf4b75160f9d518fc43df1463fd86b35f4cfda
1 parent
b6ce8f0a
Remove the temporaries cache of the MIPS target.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4666 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
46 additions
and
83 deletions
target-mips/translate.c
| ... | ... | @@ -425,46 +425,6 @@ enum { |
| 425 | 425 | /* global register indices */ |
| 426 | 426 | static TCGv cpu_env, current_tc_gprs, current_tc_hi, cpu_T[2]; |
| 427 | 427 | |
| 428 | -/* The code generator doesn't like lots of temporaries, so maintain our own | |
| 429 | - cache for reuse within a function. */ | |
| 430 | -#define MAX_TEMPS 4 | |
| 431 | -static int num_temps; | |
| 432 | -static TCGv temps[MAX_TEMPS]; | |
| 433 | - | |
| 434 | -/* Allocate a temporary variable. */ | |
| 435 | -static TCGv new_tmp(void) | |
| 436 | -{ | |
| 437 | - TCGv tmp; | |
| 438 | - if (num_temps == MAX_TEMPS) | |
| 439 | - abort(); | |
| 440 | - | |
| 441 | - if (GET_TCGV(temps[num_temps])) | |
| 442 | - return temps[num_temps++]; | |
| 443 | - | |
| 444 | - tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 445 | - temps[num_temps++] = tmp; | |
| 446 | - return tmp; | |
| 447 | -} | |
| 448 | - | |
| 449 | -/* Release a temporary variable. */ | |
| 450 | -static void dead_tmp(TCGv tmp) | |
| 451 | -{ | |
| 452 | - int i; | |
| 453 | - num_temps--; | |
| 454 | - i = num_temps; | |
| 455 | - if (GET_TCGV(temps[i]) == GET_TCGV(tmp)) | |
| 456 | - return; | |
| 457 | - | |
| 458 | - /* Shuffle this temp to the last slot. */ | |
| 459 | - while (GET_TCGV(temps[i]) != GET_TCGV(tmp)) | |
| 460 | - i--; | |
| 461 | - while (i < num_temps) { | |
| 462 | - temps[i] = temps[i + 1]; | |
| 463 | - i++; | |
| 464 | - } | |
| 465 | - temps[i] = tmp; | |
| 466 | -} | |
| 467 | - | |
| 468 | 428 | typedef struct DisasContext { |
| 469 | 429 | struct TranslationBlock *tb; |
| 470 | 430 | target_ulong pc, saved_pc; |
| ... | ... | @@ -564,7 +524,7 @@ static inline void gen_load_srsgpr (TCGv t, int reg) |
| 564 | 524 | if (reg == 0) |
| 565 | 525 | tcg_gen_movi_tl(t, 0); |
| 566 | 526 | else { |
| 567 | - TCGv r_tmp = new_tmp(); | |
| 527 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 568 | 528 | |
| 569 | 529 | tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSCtl)); |
| 570 | 530 | tcg_gen_shri_i32(r_tmp, r_tmp, CP0SRSCtl_PSS); |
| ... | ... | @@ -573,14 +533,14 @@ static inline void gen_load_srsgpr (TCGv t, int reg) |
| 573 | 533 | tcg_gen_add_i32(r_tmp, cpu_env, r_tmp); |
| 574 | 534 | |
| 575 | 535 | tcg_gen_ld_tl(t, r_tmp, sizeof(target_ulong) * reg); |
| 576 | - dead_tmp(r_tmp); | |
| 536 | + tcg_temp_free(r_tmp); | |
| 577 | 537 | } |
| 578 | 538 | } |
| 579 | 539 | |
| 580 | 540 | static inline void gen_store_srsgpr (TCGv t, int reg) |
| 581 | 541 | { |
| 582 | 542 | if (reg != 0) { |
| 583 | - TCGv r_tmp = new_tmp(); | |
| 543 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 584 | 544 | |
| 585 | 545 | tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_SRSCtl)); |
| 586 | 546 | tcg_gen_shri_i32(r_tmp, r_tmp, CP0SRSCtl_PSS); |
| ... | ... | @@ -589,7 +549,7 @@ static inline void gen_store_srsgpr (TCGv t, int reg) |
| 589 | 549 | tcg_gen_add_i32(r_tmp, cpu_env, r_tmp); |
| 590 | 550 | |
| 591 | 551 | tcg_gen_st_tl(t, r_tmp, sizeof(target_ulong) * reg); |
| 592 | - dead_tmp(r_tmp); | |
| 552 | + tcg_temp_free(r_tmp); | |
| 593 | 553 | } |
| 594 | 554 | } |
| 595 | 555 | |
| ... | ... | @@ -739,7 +699,7 @@ OP_CONDZ(ltz, TCG_COND_LT); |
| 739 | 699 | static inline void gen_save_pc(target_ulong pc) |
| 740 | 700 | { |
| 741 | 701 | TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); |
| 742 | - TCGv r_tc_off = new_tmp(); | |
| 702 | + TCGv r_tc_off = tcg_temp_new(TCG_TYPE_I32); | |
| 743 | 703 | TCGv r_tc_off_ptr = tcg_temp_new(TCG_TYPE_PTR); |
| 744 | 704 | TCGv r_ptr = tcg_temp_new(TCG_TYPE_PTR); |
| 745 | 705 | |
| ... | ... | @@ -749,13 +709,16 @@ static inline void gen_save_pc(target_ulong pc) |
| 749 | 709 | tcg_gen_ext_i32_ptr(r_tc_off_ptr, r_tc_off); |
| 750 | 710 | tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_ptr); |
| 751 | 711 | tcg_gen_st_tl(r_tmp, r_ptr, offsetof(CPUState, PC)); |
| 752 | - dead_tmp(r_tc_off); | |
| 712 | + tcg_temp_free(r_tc_off); | |
| 713 | + tcg_temp_free(r_tc_off_tl); | |
| 714 | + tcg_temp_free(r_ptr); | |
| 715 | + tcg_temp_free(r_tmp); | |
| 753 | 716 | } |
| 754 | 717 | |
| 755 | 718 | static inline void gen_breg_pc(void) |
| 756 | 719 | { |
| 757 | 720 | TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); |
| 758 | - TCGv r_tc_off = new_tmp(); | |
| 721 | + TCGv r_tc_off = tcg_temp_new(TCG_TYPE_I32); | |
| 759 | 722 | TCGv r_tc_off_ptr = tcg_temp_new(TCG_TYPE_PTR); |
| 760 | 723 | TCGv r_ptr = tcg_temp_new(TCG_TYPE_PTR); |
| 761 | 724 | |
| ... | ... | @@ -765,7 +728,10 @@ static inline void gen_breg_pc(void) |
| 765 | 728 | tcg_gen_ext_i32_ptr(r_tc_off_ptr, r_tc_off); |
| 766 | 729 | tcg_gen_add_ptr(r_ptr, cpu_env, r_tc_off_ptr); |
| 767 | 730 | tcg_gen_st_tl(r_tmp, r_ptr, offsetof(CPUState, PC)); |
| 768 | - dead_tmp(r_tc_off); | |
| 731 | + tcg_temp_free(r_tc_off); | |
| 732 | + tcg_temp_free(r_tc_off_tl); | |
| 733 | + tcg_temp_free(r_ptr); | |
| 734 | + tcg_temp_free(r_tmp); | |
| 769 | 735 | } |
| 770 | 736 | |
| 771 | 737 | static inline void gen_save_btarget(target_ulong btarget) |
| ... | ... | @@ -853,18 +819,24 @@ static inline void gen_op_addr_add (void) |
| 853 | 819 | with Status_UX = 0 should be casted to 32-bit and sign extended. |
| 854 | 820 | See the MIPS64 PRA manual, section 4.10. */ |
| 855 | 821 | { |
| 856 | - TCGv r_tmp = new_tmp(); | |
| 857 | 822 | int l1 = gen_new_label(); |
| 858 | 823 | |
| 859 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, hflags)); | |
| 860 | - tcg_gen_andi_i32(r_tmp, r_tmp, MIPS_HFLAG_KSU); | |
| 861 | - tcg_gen_brcondi_i32(TCG_COND_NE, r_tmp, MIPS_HFLAG_UM, l1); | |
| 862 | - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Status)); | |
| 863 | - tcg_gen_andi_i32(r_tmp, r_tmp, (1 << CP0St_UX)); | |
| 864 | - tcg_gen_brcondi_i32(TCG_COND_NE, r_tmp, 0, l1); | |
| 824 | + { | |
| 825 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 826 | + | |
| 827 | + tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, hflags)); | |
| 828 | + tcg_gen_andi_i32(r_tmp, r_tmp, MIPS_HFLAG_KSU); | |
| 829 | + tcg_gen_brcondi_i32(TCG_COND_NE, r_tmp, MIPS_HFLAG_UM, l1); | |
| 830 | + } | |
| 831 | + { | |
| 832 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 833 | + | |
| 834 | + tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Status)); | |
| 835 | + tcg_gen_andi_i32(r_tmp, r_tmp, (1 << CP0St_UX)); | |
| 836 | + tcg_gen_brcondi_i32(TCG_COND_NE, r_tmp, 0, l1); | |
| 837 | + } | |
| 865 | 838 | tcg_gen_ext32s_i64(cpu_T[0], cpu_T[0]); |
| 866 | 839 | gen_set_label(l1); |
| 867 | - dead_tmp(r_tmp); | |
| 868 | 840 | } |
| 869 | 841 | #endif |
| 870 | 842 | } |
| ... | ... | @@ -1413,8 +1385,8 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1413 | 1385 | /* rotr is decoded as srl on non-R2 CPUs */ |
| 1414 | 1386 | if (env->insn_flags & ISA_MIPS32R2) { |
| 1415 | 1387 | if (uimm != 0) { |
| 1416 | - TCGv r_tmp1 = new_tmp(); | |
| 1417 | - TCGv r_tmp2 = new_tmp(); | |
| 1388 | + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32); | |
| 1389 | + TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I32); | |
| 1418 | 1390 | |
| 1419 | 1391 | tcg_gen_trunc_tl_i32(r_tmp1, cpu_T[0]); |
| 1420 | 1392 | tcg_gen_movi_i32(r_tmp2, 0x20); |
| ... | ... | @@ -1423,8 +1395,8 @@ static void gen_arith_imm (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1423 | 1395 | tcg_gen_shri_i32(r_tmp1, r_tmp1, uimm); |
| 1424 | 1396 | tcg_gen_or_i32(r_tmp1, r_tmp1, r_tmp2); |
| 1425 | 1397 | tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1); |
| 1426 | - dead_tmp(r_tmp1); | |
| 1427 | - dead_tmp(r_tmp2); | |
| 1398 | + tcg_temp_free(r_tmp1); | |
| 1399 | + tcg_temp_free(r_tmp2); | |
| 1428 | 1400 | } |
| 1429 | 1401 | opn = "rotr"; |
| 1430 | 1402 | } else { |
| ... | ... | @@ -1751,9 +1723,9 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1751 | 1723 | tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0x1f); |
| 1752 | 1724 | tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[0], 0, l1); |
| 1753 | 1725 | { |
| 1754 | - TCGv r_tmp1 = new_tmp(); | |
| 1755 | - TCGv r_tmp2 = new_tmp(); | |
| 1756 | - TCGv r_tmp3 = new_tmp(); | |
| 1726 | + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32); | |
| 1727 | + TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I32); | |
| 1728 | + TCGv r_tmp3 = tcg_temp_new(TCG_TYPE_I32); | |
| 1757 | 1729 | |
| 1758 | 1730 | tcg_gen_trunc_tl_i32(r_tmp1, cpu_T[0]); |
| 1759 | 1731 | tcg_gen_trunc_tl_i32(r_tmp2, cpu_T[1]); |
| ... | ... | @@ -1763,9 +1735,9 @@ static void gen_arith (CPUState *env, DisasContext *ctx, uint32_t opc, |
| 1763 | 1735 | tcg_gen_shr_i32(r_tmp1, r_tmp2, r_tmp1); |
| 1764 | 1736 | tcg_gen_or_i32(r_tmp1, r_tmp1, r_tmp3); |
| 1765 | 1737 | tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1); |
| 1766 | - dead_tmp(r_tmp1); | |
| 1767 | - dead_tmp(r_tmp2); | |
| 1768 | - dead_tmp(r_tmp3); | |
| 1738 | + tcg_temp_free(r_tmp1); | |
| 1739 | + tcg_temp_free(r_tmp2); | |
| 1740 | + tcg_temp_free(r_tmp3); | |
| 1769 | 1741 | tcg_gen_br(l2); |
| 1770 | 1742 | } |
| 1771 | 1743 | gen_set_label(l1); |
| ... | ... | @@ -1930,9 +1902,9 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, |
| 1930 | 1902 | tcg_gen_ext32s_tl(cpu_T[1], cpu_T[1]); |
| 1931 | 1903 | tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[1], 0, l1); |
| 1932 | 1904 | { |
| 1933 | - TCGv r_tmp1 = new_tmp(); | |
| 1934 | - TCGv r_tmp2 = new_tmp(); | |
| 1935 | - TCGv r_tmp3 = new_tmp(); | |
| 1905 | + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32); | |
| 1906 | + TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I32); | |
| 1907 | + TCGv r_tmp3 = tcg_temp_new(TCG_TYPE_I32); | |
| 1936 | 1908 | |
| 1937 | 1909 | tcg_gen_trunc_tl_i32(r_tmp1, cpu_T[0]); |
| 1938 | 1910 | tcg_gen_trunc_tl_i32(r_tmp2, cpu_T[1]); |
| ... | ... | @@ -1940,11 +1912,11 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, |
| 1940 | 1912 | tcg_gen_remu_i32(r_tmp1, r_tmp1, r_tmp2); |
| 1941 | 1913 | tcg_gen_ext_i32_tl(cpu_T[0], r_tmp3); |
| 1942 | 1914 | tcg_gen_ext_i32_tl(cpu_T[1], r_tmp1); |
| 1915 | + tcg_temp_free(r_tmp1); | |
| 1916 | + tcg_temp_free(r_tmp2); | |
| 1917 | + tcg_temp_free(r_tmp3); | |
| 1943 | 1918 | gen_store_LO(cpu_T[0], 0); |
| 1944 | 1919 | gen_store_HI(cpu_T[1], 0); |
| 1945 | - dead_tmp(r_tmp1); | |
| 1946 | - dead_tmp(r_tmp2); | |
| 1947 | - dead_tmp(r_tmp3); | |
| 1948 | 1920 | } |
| 1949 | 1921 | gen_set_label(l1); |
| 1950 | 1922 | } |
| ... | ... | @@ -5566,13 +5538,13 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) |
| 5566 | 5538 | gen_load_gpr(cpu_T[1], rs); |
| 5567 | 5539 | { |
| 5568 | 5540 | TCGv r_ptr = tcg_temp_new(TCG_TYPE_PTR); |
| 5569 | - TCGv r_tmp = new_tmp(); | |
| 5541 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 5570 | 5542 | |
| 5571 | 5543 | tcg_gen_ld_ptr(r_ptr, cpu_env, offsetof(CPUState, fpu)); |
| 5572 | 5544 | tcg_gen_ld_i32(r_tmp, r_ptr, offsetof(CPUMIPSFPUContext, fcr31)); |
| 5545 | + tcg_temp_free(r_ptr); | |
| 5573 | 5546 | tcg_gen_andi_i32(r_tmp, r_tmp, ccbit); |
| 5574 | 5547 | tcg_gen_brcondi_i32(cond, r_tmp, 0, l1); |
| 5575 | - dead_tmp(r_tmp); | |
| 5576 | 5548 | } |
| 5577 | 5549 | tcg_gen_mov_tl(cpu_T[0], cpu_T[1]); |
| 5578 | 5550 | |
| ... | ... | @@ -7251,9 +7223,6 @@ gen_intermediate_code_internal (CPUState *env, TranslationBlock *tb, |
| 7251 | 7223 | if (search_pc && loglevel) |
| 7252 | 7224 | fprintf (logfile, "search pc %d\n", search_pc); |
| 7253 | 7225 | |
| 7254 | - num_temps = 0; | |
| 7255 | - memset(temps, 0, sizeof(temps)); | |
| 7256 | - | |
| 7257 | 7226 | pc_start = tb->pc; |
| 7258 | 7227 | gen_opc_end = gen_opc_buf + OPC_MAX_SIZE; |
| 7259 | 7228 | ctx.pc = pc_start; |
| ... | ... | @@ -7308,12 +7277,6 @@ gen_intermediate_code_internal (CPUState *env, TranslationBlock *tb, |
| 7308 | 7277 | } |
| 7309 | 7278 | ctx.opcode = ldl_code(ctx.pc); |
| 7310 | 7279 | decode_opc(env, &ctx); |
| 7311 | - if (num_temps) { | |
| 7312 | - fprintf(stderr, | |
| 7313 | - "Internal resource leak before " TARGET_FMT_lx "\n", | |
| 7314 | - ctx.pc); | |
| 7315 | - num_temps = 0; | |
| 7316 | - } | |
| 7317 | 7280 | ctx.pc += 4; |
| 7318 | 7281 | |
| 7319 | 7282 | if (env->singlestep_enabled) | ... | ... |