Commit d077b6f759d6758e0d2a80f053448f152ca2ba6d
1 parent
d297f464
Make bcond and btarget TCG registers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4805 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
43 additions
and
73 deletions
target-mips/translate.c
... | ... | @@ -423,7 +423,7 @@ enum { |
423 | 423 | }; |
424 | 424 | |
425 | 425 | /* global register indices */ |
426 | -static TCGv cpu_env, current_fpu; | |
426 | +static TCGv cpu_env, bcond, btarget, current_fpu; | |
427 | 427 | |
428 | 428 | /* FPU TNs, global for now. */ |
429 | 429 | static TCGv fpu32_T[3], fpu64_T[3], fpu32h_T[3]; |
... | ... | @@ -532,8 +532,7 @@ typedef struct DisasContext { |
532 | 532 | |
533 | 533 | enum { |
534 | 534 | BS_NONE = 0, /* We go out of the TB without reaching a branch or an |
535 | - * exception condition | |
536 | - */ | |
535 | + * exception condition */ | |
537 | 536 | BS_STOP = 1, /* We want to stop translation for any reason */ |
538 | 537 | BS_BRANCH = 2, /* We reached a branch condition */ |
539 | 538 | BS_EXCP = 3, /* We reached an exception condition */ |
... | ... | @@ -823,33 +822,6 @@ static inline void gen_save_pc(target_ulong pc) |
823 | 822 | tcg_temp_free(r_tmp); |
824 | 823 | } |
825 | 824 | |
826 | -static inline void gen_breg_pc(void) | |
827 | -{ | |
828 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); | |
829 | - | |
830 | - tcg_gen_ld_tl(r_tmp, cpu_env, offsetof(CPUState, btarget)); | |
831 | - tcg_gen_st_tl(r_tmp, cpu_env, offsetof(CPUState, active_tc.PC)); | |
832 | - tcg_temp_free(r_tmp); | |
833 | -} | |
834 | - | |
835 | -static inline void gen_save_btarget(target_ulong btarget) | |
836 | -{ | |
837 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); | |
838 | - | |
839 | - tcg_gen_movi_tl(r_tmp, btarget); | |
840 | - tcg_gen_st_tl(r_tmp, cpu_env, offsetof(CPUState, btarget)); | |
841 | - tcg_temp_free(r_tmp); | |
842 | -} | |
843 | - | |
844 | -static always_inline void gen_save_breg_target(int reg) | |
845 | -{ | |
846 | - TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); | |
847 | - | |
848 | - gen_load_gpr(r_tmp, reg); | |
849 | - tcg_gen_st_tl(r_tmp, cpu_env, offsetof(CPUState, btarget)); | |
850 | - tcg_temp_free(r_tmp); | |
851 | -} | |
852 | - | |
853 | 825 | static always_inline void save_cpu_state (DisasContext *ctx, int do_save_pc) |
854 | 826 | { |
855 | 827 | #if defined MIPS_DEBUG_DISAS |
... | ... | @@ -875,7 +847,7 @@ static always_inline void save_cpu_state (DisasContext *ctx, int do_save_pc) |
875 | 847 | case MIPS_HFLAG_BC: |
876 | 848 | case MIPS_HFLAG_BL: |
877 | 849 | case MIPS_HFLAG_B: |
878 | - gen_save_btarget(ctx->btarget); | |
850 | + tcg_gen_movi_tl(btarget, ctx->btarget); | |
879 | 851 | break; |
880 | 852 | } |
881 | 853 | } |
... | ... | @@ -2505,7 +2477,7 @@ static always_inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong des |
2505 | 2477 | static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2506 | 2478 | int rs, int rt, int32_t offset) |
2507 | 2479 | { |
2508 | - target_ulong btarget = -1; | |
2480 | + target_ulong btgt = -1; | |
2509 | 2481 | int blink = 0; |
2510 | 2482 | int bcond = 0; |
2511 | 2483 | TCGv t0 = tcg_temp_local_new(TCG_TYPE_TL); |
... | ... | @@ -2535,7 +2507,7 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2535 | 2507 | gen_load_gpr(t1, rt); |
2536 | 2508 | bcond = 1; |
2537 | 2509 | } |
2538 | - btarget = ctx->pc + 4 + offset; | |
2510 | + btgt = ctx->pc + 4 + offset; | |
2539 | 2511 | break; |
2540 | 2512 | case OPC_BGEZ: |
2541 | 2513 | case OPC_BGEZAL: |
... | ... | @@ -2554,12 +2526,12 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2554 | 2526 | gen_load_gpr(t0, rs); |
2555 | 2527 | bcond = 1; |
2556 | 2528 | } |
2557 | - btarget = ctx->pc + 4 + offset; | |
2529 | + btgt = ctx->pc + 4 + offset; | |
2558 | 2530 | break; |
2559 | 2531 | case OPC_J: |
2560 | 2532 | case OPC_JAL: |
2561 | 2533 | /* Jump to immediate */ |
2562 | - btarget = ((ctx->pc + 4) & (int32_t)0xF0000000) | (uint32_t)offset; | |
2534 | + btgt = ((ctx->pc + 4) & (int32_t)0xF0000000) | (uint32_t)offset; | |
2563 | 2535 | break; |
2564 | 2536 | case OPC_JR: |
2565 | 2537 | case OPC_JALR: |
... | ... | @@ -2571,7 +2543,7 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2571 | 2543 | generate_exception(ctx, EXCP_RI); |
2572 | 2544 | goto out; |
2573 | 2545 | } |
2574 | - gen_save_breg_target(rs); | |
2546 | + gen_load_gpr(btarget, rs); | |
2575 | 2547 | break; |
2576 | 2548 | default: |
2577 | 2549 | MIPS_INVAL("branch/jump"); |
... | ... | @@ -2625,12 +2597,12 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2625 | 2597 | goto out; |
2626 | 2598 | case OPC_J: |
2627 | 2599 | ctx->hflags |= MIPS_HFLAG_B; |
2628 | - MIPS_DEBUG("j " TARGET_FMT_lx, btarget); | |
2600 | + MIPS_DEBUG("j " TARGET_FMT_lx, btgt); | |
2629 | 2601 | break; |
2630 | 2602 | case OPC_JAL: |
2631 | 2603 | blink = 31; |
2632 | 2604 | ctx->hflags |= MIPS_HFLAG_B; |
2633 | - MIPS_DEBUG("jal " TARGET_FMT_lx, btarget); | |
2605 | + MIPS_DEBUG("jal " TARGET_FMT_lx, btgt); | |
2634 | 2606 | break; |
2635 | 2607 | case OPC_JR: |
2636 | 2608 | ctx->hflags |= MIPS_HFLAG_BR; |
... | ... | @@ -2651,80 +2623,80 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2651 | 2623 | case OPC_BEQ: |
2652 | 2624 | gen_op_eq(t0, t1); |
2653 | 2625 | MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx, |
2654 | - regnames[rs], regnames[rt], btarget); | |
2626 | + regnames[rs], regnames[rt], btgt); | |
2655 | 2627 | goto not_likely; |
2656 | 2628 | case OPC_BEQL: |
2657 | 2629 | gen_op_eq(t0, t1); |
2658 | 2630 | MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx, |
2659 | - regnames[rs], regnames[rt], btarget); | |
2631 | + regnames[rs], regnames[rt], btgt); | |
2660 | 2632 | goto likely; |
2661 | 2633 | case OPC_BNE: |
2662 | 2634 | gen_op_ne(t0, t1); |
2663 | 2635 | MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx, |
2664 | - regnames[rs], regnames[rt], btarget); | |
2636 | + regnames[rs], regnames[rt], btgt); | |
2665 | 2637 | goto not_likely; |
2666 | 2638 | case OPC_BNEL: |
2667 | 2639 | gen_op_ne(t0, t1); |
2668 | 2640 | MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx, |
2669 | - regnames[rs], regnames[rt], btarget); | |
2641 | + regnames[rs], regnames[rt], btgt); | |
2670 | 2642 | goto likely; |
2671 | 2643 | case OPC_BGEZ: |
2672 | 2644 | gen_op_gez(t0); |
2673 | - MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2645 | + MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2674 | 2646 | goto not_likely; |
2675 | 2647 | case OPC_BGEZL: |
2676 | 2648 | gen_op_gez(t0); |
2677 | - MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2649 | + MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2678 | 2650 | goto likely; |
2679 | 2651 | case OPC_BGEZAL: |
2680 | 2652 | gen_op_gez(t0); |
2681 | - MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2653 | + MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2682 | 2654 | blink = 31; |
2683 | 2655 | goto not_likely; |
2684 | 2656 | case OPC_BGEZALL: |
2685 | 2657 | gen_op_gez(t0); |
2686 | 2658 | blink = 31; |
2687 | - MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2659 | + MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2688 | 2660 | goto likely; |
2689 | 2661 | case OPC_BGTZ: |
2690 | 2662 | gen_op_gtz(t0); |
2691 | - MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2663 | + MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2692 | 2664 | goto not_likely; |
2693 | 2665 | case OPC_BGTZL: |
2694 | 2666 | gen_op_gtz(t0); |
2695 | - MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2667 | + MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2696 | 2668 | goto likely; |
2697 | 2669 | case OPC_BLEZ: |
2698 | 2670 | gen_op_lez(t0); |
2699 | - MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2671 | + MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2700 | 2672 | goto not_likely; |
2701 | 2673 | case OPC_BLEZL: |
2702 | 2674 | gen_op_lez(t0); |
2703 | - MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2675 | + MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2704 | 2676 | goto likely; |
2705 | 2677 | case OPC_BLTZ: |
2706 | 2678 | gen_op_ltz(t0); |
2707 | - MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2679 | + MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2708 | 2680 | goto not_likely; |
2709 | 2681 | case OPC_BLTZL: |
2710 | 2682 | gen_op_ltz(t0); |
2711 | - MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2683 | + MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2712 | 2684 | goto likely; |
2713 | 2685 | case OPC_BLTZAL: |
2714 | 2686 | gen_op_ltz(t0); |
2715 | 2687 | blink = 31; |
2716 | - MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2688 | + MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2717 | 2689 | not_likely: |
2718 | 2690 | ctx->hflags |= MIPS_HFLAG_BC; |
2719 | - tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, bcond)); | |
2691 | + tcg_gen_trunc_tl_i32(bcond, t0); | |
2720 | 2692 | break; |
2721 | 2693 | case OPC_BLTZALL: |
2722 | 2694 | gen_op_ltz(t0); |
2723 | 2695 | blink = 31; |
2724 | - MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btarget); | |
2696 | + MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt); | |
2725 | 2697 | likely: |
2726 | 2698 | ctx->hflags |= MIPS_HFLAG_BL; |
2727 | - tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, bcond)); | |
2699 | + tcg_gen_trunc_tl_i32(bcond, t0); | |
2728 | 2700 | break; |
2729 | 2701 | default: |
2730 | 2702 | MIPS_INVAL("conditional branch/jump"); |
... | ... | @@ -2733,9 +2705,9 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
2733 | 2705 | } |
2734 | 2706 | } |
2735 | 2707 | MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx, |
2736 | - blink, ctx->hflags, btarget); | |
2708 | + blink, ctx->hflags, btgt); | |
2737 | 2709 | |
2738 | - ctx->btarget = btarget; | |
2710 | + ctx->btarget = btgt; | |
2739 | 2711 | if (blink > 0) { |
2740 | 2712 | tcg_gen_movi_tl(t0, ctx->pc + 8); |
2741 | 2713 | gen_store_gpr(t0, blink); |
... | ... | @@ -5789,7 +5761,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5789 | 5761 | opn = "bc1tl"; |
5790 | 5762 | likely: |
5791 | 5763 | ctx->hflags |= MIPS_HFLAG_BL; |
5792 | - tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, bcond)); | |
5764 | + tcg_gen_trunc_tl_i32(bcond, t0); | |
5793 | 5765 | break; |
5794 | 5766 | case OPC_BC1FANY2: |
5795 | 5767 | { |
... | ... | @@ -5874,7 +5846,7 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
5874 | 5846 | opn = "bc1any4t"; |
5875 | 5847 | not_likely: |
5876 | 5848 | ctx->hflags |= MIPS_HFLAG_BC; |
5877 | - tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, bcond)); | |
5849 | + tcg_gen_trunc_tl_i32(bcond, t0); | |
5878 | 5850 | break; |
5879 | 5851 | default: |
5880 | 5852 | MIPS_INVAL(opn); |
... | ... | @@ -7209,19 +7181,16 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
7209 | 7181 | |
7210 | 7182 | /* Handle blikely not taken case */ |
7211 | 7183 | if ((ctx->hflags & MIPS_HFLAG_BMASK) == MIPS_HFLAG_BL) { |
7212 | - TCGv r_tmp = tcg_temp_local_new(TCG_TYPE_TL); | |
7213 | 7184 | int l1 = gen_new_label(); |
7214 | 7185 | |
7215 | 7186 | MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4); |
7216 | - tcg_gen_ld_tl(r_tmp, cpu_env, offsetof(CPUState, bcond)); | |
7217 | - tcg_gen_brcondi_tl(TCG_COND_NE, r_tmp, 0, l1); | |
7218 | - tcg_temp_free(r_tmp); | |
7187 | + tcg_gen_brcondi_i32(TCG_COND_NE, bcond, 0, l1); | |
7219 | 7188 | { |
7220 | - TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I32); | |
7189 | + TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32); | |
7221 | 7190 | |
7222 | - tcg_gen_movi_i32(r_tmp2, ctx->hflags & ~MIPS_HFLAG_BMASK); | |
7223 | - tcg_gen_st_i32(r_tmp2, cpu_env, offsetof(CPUState, hflags)); | |
7224 | - tcg_temp_free(r_tmp2); | |
7191 | + tcg_gen_movi_i32(r_tmp, ctx->hflags & ~MIPS_HFLAG_BMASK); | |
7192 | + tcg_gen_st_i32(r_tmp, cpu_env, offsetof(CPUState, hflags)); | |
7193 | + tcg_temp_free(r_tmp); | |
7225 | 7194 | } |
7226 | 7195 | gen_goto_tb(ctx, 1, ctx->pc + 4); |
7227 | 7196 | gen_set_label(l1); |
... | ... | @@ -7818,12 +7787,9 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
7818 | 7787 | /* Conditional branch */ |
7819 | 7788 | MIPS_DEBUG("conditional branch"); |
7820 | 7789 | { |
7821 | - TCGv r_tmp = tcg_temp_local_new(TCG_TYPE_TL); | |
7822 | 7790 | int l1 = gen_new_label(); |
7823 | 7791 | |
7824 | - tcg_gen_ld_tl(r_tmp, cpu_env, offsetof(CPUState, bcond)); | |
7825 | - tcg_gen_brcondi_tl(TCG_COND_NE, r_tmp, 0, l1); | |
7826 | - tcg_temp_free(r_tmp); | |
7792 | + tcg_gen_brcondi_i32(TCG_COND_NE, bcond, 0, l1); | |
7827 | 7793 | gen_goto_tb(ctx, 1, ctx->pc + 4); |
7828 | 7794 | gen_set_label(l1); |
7829 | 7795 | gen_goto_tb(ctx, 0, ctx->btarget); |
... | ... | @@ -7832,7 +7798,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
7832 | 7798 | case MIPS_HFLAG_BR: |
7833 | 7799 | /* unconditional branch to register */ |
7834 | 7800 | MIPS_DEBUG("branch to register"); |
7835 | - gen_breg_pc(); | |
7801 | + tcg_gen_st_tl(btarget, cpu_env, offsetof(CPUState, active_tc.PC)); | |
7836 | 7802 | tcg_gen_exit_tb(0); |
7837 | 7803 | break; |
7838 | 7804 | default: |
... | ... | @@ -8125,6 +8091,10 @@ static void mips_tcg_init(void) |
8125 | 8091 | return; |
8126 | 8092 | |
8127 | 8093 | cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); |
8094 | + bcond = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | |
8095 | + offsetof(CPUState, bcond), "bcond"); | |
8096 | + btarget = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | |
8097 | + offsetof(CPUState, btarget), "btarget"); | |
8128 | 8098 | current_fpu = tcg_global_mem_new(TCG_TYPE_PTR, |
8129 | 8099 | TCG_AREG0, |
8130 | 8100 | offsetof(CPUState, fpu), | ... | ... |