Revision 4b2eb8d2
b/target-mips/translate.c | ||
---|---|---|
423 | 423 |
}; |
424 | 424 |
|
425 | 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 | 429 |
static TCGv fpu_fpr32[32], fpu_fpr32h[32], fpu_fpr64[32], fpu_fcr0, fpu_fcr31; |
428 | 430 |
|
429 | 431 |
#include "gen-icount.h" |
... | ... | |
542 | 544 |
"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", |
543 | 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 | 556 |
static const char *fregnames[] = |
546 | 557 |
{ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", |
547 | 558 |
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", |
... | ... | |
584 | 595 |
if (reg == 0) |
585 | 596 |
tcg_gen_movi_tl(t, 0); |
586 | 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 | 601 |
static inline void gen_store_gpr (TCGv t, int reg) |
592 | 602 |
{ |
593 | 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 | 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 | 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 | 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 | 638 |
/* Moves to/from shadow registers. */ |
... | ... | |
821 | 836 |
TCGv r_tmp = tcg_temp_new(TCG_TYPE_TL); |
822 | 837 |
|
823 | 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 | 840 |
tcg_temp_free(r_tmp); |
826 | 841 |
} |
827 | 842 |
|
... | ... | |
8441 | 8456 |
case MIPS_HFLAG_BR: |
8442 | 8457 |
/* unconditional branch to register */ |
8443 | 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 | 8460 |
tcg_gen_exit_tb(0); |
8446 | 8461 |
break; |
8447 | 8462 |
default: |
... | ... | |
8714 | 8729 |
return; |
8715 | 8730 |
|
8716 | 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 | 8752 |
bcond = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0, |
8718 | 8753 |
offsetof(CPUState, bcond), "bcond"); |
8719 | 8754 |
btarget = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0, |
Also available in: Unified diff