Commit 4b2eb8d2759aa575062c587cded89ae347ce1317
1 parent
f01be154
Use TCG registers for most CPU register accesses.
Signed-off-by: Thiemo Seufer <ths@networkno.de> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5253 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
52 additions
and
17 deletions
target-mips/translate.c
| @@ -423,7 +423,9 @@ enum { | @@ -423,7 +423,9 @@ enum { | ||
| 423 | }; | 423 | }; |
| 424 | 424 | ||
| 425 | /* global register indices */ | 425 | /* global register indices */ |
| 426 | -static TCGv cpu_env, bcond, btarget; | 426 | +static TCGv cpu_env, cpu_gpr[32], cpu_PC; |
| 427 | +static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC], cpu_ACX[MIPS_DSP_ACC]; | ||
| 428 | +static TCGv cpu_dspctrl, bcond, btarget; | ||
| 427 | static TCGv fpu_fpr32[32], fpu_fpr32h[32], fpu_fpr64[32], fpu_fcr0, fpu_fcr31; | 429 | static TCGv fpu_fpr32[32], fpu_fpr32h[32], fpu_fpr64[32], fpu_fcr0, fpu_fcr31; |
| 428 | 430 | ||
| 429 | #include "gen-icount.h" | 431 | #include "gen-icount.h" |
| @@ -542,6 +544,15 @@ static const char *regnames[] = | @@ -542,6 +544,15 @@ static const char *regnames[] = | ||
| 542 | "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", | 544 | "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", |
| 543 | "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", }; | 545 | "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", }; |
| 544 | 546 | ||
| 547 | +static const char *regnames_HI[] = | ||
| 548 | + { "HI0", "HI1", "HI2", "HI3", }; | ||
| 549 | + | ||
| 550 | +static const char *regnames_LO[] = | ||
| 551 | + { "LO0", "LO1", "LO2", "LO3", }; | ||
| 552 | + | ||
| 553 | +static const char *regnames_ACX[] = | ||
| 554 | + { "ACX0", "ACX1", "ACX2", "ACX3", }; | ||
| 555 | + | ||
| 545 | static const char *fregnames[] = | 556 | static const char *fregnames[] = |
| 546 | { "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", | 557 | { "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", |
| 547 | "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", | 558 | "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", |
| @@ -584,40 +595,44 @@ static inline void gen_load_gpr (TCGv t, int reg) | @@ -584,40 +595,44 @@ static inline void gen_load_gpr (TCGv t, int reg) | ||
| 584 | if (reg == 0) | 595 | if (reg == 0) |
| 585 | tcg_gen_movi_tl(t, 0); | 596 | tcg_gen_movi_tl(t, 0); |
| 586 | else | 597 | else |
| 587 | - tcg_gen_ld_tl(t, cpu_env, offsetof(CPUState, active_tc.gpr) + | ||
| 588 | - sizeof(target_ulong) * reg); | 598 | + tcg_gen_mov_tl(t, cpu_gpr[reg]); |
| 589 | } | 599 | } |
| 590 | 600 | ||
| 591 | static inline void gen_store_gpr (TCGv t, int reg) | 601 | static inline void gen_store_gpr (TCGv t, int reg) |
| 592 | { | 602 | { |
| 593 | if (reg != 0) | 603 | if (reg != 0) |
| 594 | - tcg_gen_st_tl(t, cpu_env, offsetof(CPUState, active_tc.gpr) + | ||
| 595 | - sizeof(target_ulong) * reg); | 604 | + tcg_gen_mov_tl(cpu_gpr[reg], t); |
| 596 | } | 605 | } |
| 597 | 606 | ||
| 598 | /* Moves to/from HI and LO registers. */ | 607 | /* Moves to/from HI and LO registers. */ |
| 608 | +static inline void gen_load_HI (TCGv t, int reg) | ||
| 609 | +{ | ||
| 610 | + tcg_gen_mov_tl(t, cpu_HI[reg]); | ||
| 611 | +} | ||
| 612 | + | ||
| 613 | +static inline void gen_store_HI (TCGv t, int reg) | ||
| 614 | +{ | ||
| 615 | + tcg_gen_mov_tl(cpu_HI[reg], t); | ||
| 616 | +} | ||
| 617 | + | ||
| 599 | static inline void gen_load_LO (TCGv t, int reg) | 618 | static inline void gen_load_LO (TCGv t, int reg) |
| 600 | { | 619 | { |
| 601 | - tcg_gen_ld_tl(t, cpu_env, offsetof(CPUState, active_tc.LO) + | ||
| 602 | - sizeof(target_ulong) * reg); | 620 | + tcg_gen_mov_tl(t, cpu_LO[reg]); |
| 603 | } | 621 | } |
| 604 | 622 | ||
| 605 | static inline void gen_store_LO (TCGv t, int reg) | 623 | static inline void gen_store_LO (TCGv t, int reg) |
| 606 | { | 624 | { |
| 607 | - tcg_gen_st_tl(t, cpu_env, offsetof(CPUState, active_tc.LO) + | ||
| 608 | - sizeof(target_ulong) * reg); | 625 | + tcg_gen_mov_tl(cpu_LO[reg], t); |
| 609 | } | 626 | } |
| 610 | 627 | ||
| 611 | -static inline void gen_load_HI (TCGv t, int reg) | 628 | +static inline void gen_load_ACX (TCGv t, int reg) |
| 612 | { | 629 | { |
| 613 | - tcg_gen_ld_tl(t, cpu_env, offsetof(CPUState, active_tc.HI) + | ||
| 614 | - sizeof(target_ulong) * reg); | 630 | + tcg_gen_mov_tl(t, cpu_ACX[reg]); |
| 615 | } | 631 | } |
| 616 | 632 | ||
| 617 | -static inline void gen_store_HI (TCGv t, int reg) | 633 | +static inline void gen_store_ACX (TCGv t, int reg) |
| 618 | { | 634 | { |
| 619 | - tcg_gen_st_tl(t, cpu_env, offsetof(CPUState, active_tc.HI) + | ||
| 620 | - sizeof(target_ulong) * reg); | 635 | + tcg_gen_mov_tl(cpu_ACX[reg], t); |
| 621 | } | 636 | } |
| 622 | 637 | ||
| 623 | /* Moves to/from shadow registers. */ | 638 | /* Moves to/from shadow registers. */ |
| @@ -821,7 +836,7 @@ static inline void gen_save_pc(target_ulong pc) | @@ -821,7 +836,7 @@ static inline void gen_save_pc(target_ulong pc) | ||
| 821 | TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); | 836 | TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); |
| 822 | 837 | ||
| 823 | tcg_gen_movi_tl(r_tmp, pc); | 838 | tcg_gen_movi_tl(r_tmp, pc); |
| 824 | - tcg_gen_st_tl(r_tmp, cpu_env, offsetof(CPUState, active_tc.PC)); | 839 | + tcg_gen_mov_tl(cpu_PC, r_tmp); |
| 825 | tcg_temp_free(r_tmp); | 840 | tcg_temp_free(r_tmp); |
| 826 | } | 841 | } |
| 827 | 842 | ||
| @@ -8441,7 +8456,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | @@ -8441,7 +8456,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | ||
| 8441 | case MIPS_HFLAG_BR: | 8456 | case MIPS_HFLAG_BR: |
| 8442 | /* unconditional branch to register */ | 8457 | /* unconditional branch to register */ |
| 8443 | MIPS_DEBUG("branch to register"); | 8458 | MIPS_DEBUG("branch to register"); |
| 8444 | - tcg_gen_st_tl(btarget, cpu_env, offsetof(CPUState, active_tc.PC)); | 8459 | + tcg_gen_mov_tl(cpu_PC, btarget); |
| 8445 | tcg_gen_exit_tb(0); | 8460 | tcg_gen_exit_tb(0); |
| 8446 | break; | 8461 | break; |
| 8447 | default: | 8462 | default: |
| @@ -8714,6 +8729,26 @@ static void mips_tcg_init(void) | @@ -8714,6 +8729,26 @@ static void mips_tcg_init(void) | ||
| 8714 | return; | 8729 | return; |
| 8715 | 8730 | ||
| 8716 | cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); | 8731 | cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); |
| 8732 | + for (i = 0; i < 32; i++) | ||
| 8733 | + cpu_gpr[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | ||
| 8734 | + offsetof(CPUState, active_tc.gpr[i]), | ||
| 8735 | + regnames[i]); | ||
| 8736 | + cpu_PC = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | ||
| 8737 | + offsetof(CPUState, active_tc.PC), "PC"); | ||
| 8738 | + for (i = 0; i < MIPS_DSP_ACC; i++) { | ||
| 8739 | + cpu_HI[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | ||
| 8740 | + offsetof(CPUState, active_tc.HI[i]), | ||
| 8741 | + regnames_HI[i]); | ||
| 8742 | + cpu_LO[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | ||
| 8743 | + offsetof(CPUState, active_tc.LO[i]), | ||
| 8744 | + regnames_LO[i]); | ||
| 8745 | + cpu_ACX[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | ||
| 8746 | + offsetof(CPUState, active_tc.ACX[i]), | ||
| 8747 | + regnames_ACX[i]); | ||
| 8748 | + } | ||
| 8749 | + cpu_dspctrl = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | ||
| 8750 | + offsetof(CPUState, active_tc.DSPControl), | ||
| 8751 | + "DSPControl"); | ||
| 8717 | bcond = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, | 8752 | bcond = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, |
| 8718 | offsetof(CPUState, bcond), "bcond"); | 8753 | offsetof(CPUState, bcond), "bcond"); |
| 8719 | btarget = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, | 8754 | btarget = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |