Revision 6d066274 target-mips/translate.c
b/target-mips/translate.c | ||
---|---|---|
431 | 431 |
static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC], cpu_ACX[MIPS_DSP_ACC]; |
432 | 432 |
static TCGv cpu_dspctrl, btarget, bcond; |
433 | 433 |
static TCGv_i32 hflags; |
434 |
static TCGv_i32 fpu_fpr32[32], fpu_fpr32h[32]; |
|
435 | 434 |
static TCGv_i32 fpu_fcr0, fpu_fcr31; |
436 | 435 |
|
437 | 436 |
#include "gen-icount.h" |
... | ... | |
500 | 499 |
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", |
501 | 500 |
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", }; |
502 | 501 |
|
503 |
static const char *fregnames_h[] = |
|
504 |
{ "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7", |
|
505 |
"h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15", |
|
506 |
"h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23", |
|
507 |
"h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31", }; |
|
508 |
|
|
509 | 502 |
#ifdef MIPS_DEBUG_DISAS |
510 | 503 |
#define MIPS_DEBUG(fmt, args...) \ |
511 | 504 |
qemu_log_mask(CPU_LOG_TB_IN_ASM, \ |
... | ... | |
600 | 593 |
/* Floating point register moves. */ |
601 | 594 |
static inline void gen_load_fpr32 (TCGv_i32 t, int reg) |
602 | 595 |
{ |
603 |
tcg_gen_mov_i32(t, fpu_fpr32[reg]);
|
|
596 |
tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[FP_ENDIAN_IDX]));
|
|
604 | 597 |
} |
605 | 598 |
|
606 | 599 |
static inline void gen_store_fpr32 (TCGv_i32 t, int reg) |
607 | 600 |
{ |
608 |
tcg_gen_mov_i32(fpu_fpr32[reg], t); |
|
601 |
tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[FP_ENDIAN_IDX])); |
|
602 |
} |
|
603 |
|
|
604 |
static inline void gen_load_fpr32h (TCGv_i32 t, int reg) |
|
605 |
{ |
|
606 |
tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[!FP_ENDIAN_IDX])); |
|
607 |
} |
|
608 |
|
|
609 |
static inline void gen_store_fpr32h (TCGv_i32 t, int reg) |
|
610 |
{ |
|
611 |
tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].w[!FP_ENDIAN_IDX])); |
|
609 | 612 |
} |
610 | 613 |
|
611 | 614 |
static inline void gen_load_fpr64 (DisasContext *ctx, TCGv_i64 t, int reg) |
612 | 615 |
{ |
613 | 616 |
if (ctx->hflags & MIPS_HFLAG_F64) { |
614 |
tcg_gen_concat_i32_i64(t, fpu_fpr32[reg], fpu_fpr32h[reg]);
|
|
617 |
tcg_gen_ld_i64(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].d));
|
|
615 | 618 |
} else { |
616 |
tcg_gen_concat_i32_i64(t, fpu_fpr32[reg & ~1], fpu_fpr32[reg | 1]); |
|
619 |
TCGv_i32 t0 = tcg_temp_new_i32(); |
|
620 |
TCGv_i32 t1 = tcg_temp_new_i32(); |
|
621 |
gen_load_fpr32(t0, reg & ~1); |
|
622 |
gen_load_fpr32(t1, reg | 1); |
|
623 |
tcg_gen_concat_i32_i64(t, t0, t1); |
|
624 |
tcg_temp_free_i32(t0); |
|
625 |
tcg_temp_free_i32(t1); |
|
617 | 626 |
} |
618 | 627 |
} |
619 | 628 |
|
620 | 629 |
static inline void gen_store_fpr64 (DisasContext *ctx, TCGv_i64 t, int reg) |
621 | 630 |
{ |
622 | 631 |
if (ctx->hflags & MIPS_HFLAG_F64) { |
623 |
tcg_gen_trunc_i64_i32(fpu_fpr32[reg], t); |
|
624 |
tcg_gen_shri_i64(t, t, 32); |
|
625 |
tcg_gen_trunc_i64_i32(fpu_fpr32h[reg], t); |
|
632 |
tcg_gen_st_i64(t, cpu_env, offsetof(CPUState, active_fpu.fpr[reg].d)); |
|
626 | 633 |
} else { |
627 |
tcg_gen_trunc_i64_i32(fpu_fpr32[reg & ~1], t); |
|
628 |
tcg_gen_shri_i64(t, t, 32); |
|
629 |
tcg_gen_trunc_i64_i32(fpu_fpr32[reg | 1], t); |
|
634 |
TCGv_i64 t0 = tcg_temp_new_i64(); |
|
635 |
TCGv_i32 t1 = tcg_temp_new_i32(); |
|
636 |
tcg_gen_trunc_i64_i32(t1, t); |
|
637 |
gen_store_fpr32(t1, reg & ~1); |
|
638 |
tcg_gen_shri_i64(t0, t, 32); |
|
639 |
tcg_gen_trunc_i64_i32(t1, t0); |
|
640 |
gen_store_fpr32(t1, reg | 1); |
|
641 |
tcg_temp_free_i32(t1); |
|
642 |
tcg_temp_free_i64(t0); |
|
630 | 643 |
} |
631 | 644 |
} |
632 | 645 |
|
633 |
static inline void gen_load_fpr32h (TCGv_i32 t, int reg) |
|
634 |
{ |
|
635 |
tcg_gen_mov_i32(t, fpu_fpr32h[reg]); |
|
636 |
} |
|
637 |
|
|
638 |
static inline void gen_store_fpr32h (TCGv_i32 t, int reg) |
|
639 |
{ |
|
640 |
tcg_gen_mov_i32(fpu_fpr32h[reg], t); |
|
641 |
} |
|
642 |
|
|
643 | 646 |
static inline void get_fp_cond (TCGv_i32 t) |
644 | 647 |
{ |
645 | 648 |
TCGv_i32 r_tmp1 = tcg_temp_new_i32(); |
... | ... | |
8408 | 8411 |
hflags = tcg_global_mem_new_i32(TCG_AREG0, |
8409 | 8412 |
offsetof(CPUState, hflags), "hflags"); |
8410 | 8413 |
|
8411 |
for (i = 0; i < 32; i++) |
|
8412 |
fpu_fpr32[i] = tcg_global_mem_new_i32(TCG_AREG0, |
|
8413 |
offsetof(CPUState, active_fpu.fpr[i].w[FP_ENDIAN_IDX]), |
|
8414 |
fregnames[i]); |
|
8415 |
for (i = 0; i < 32; i++) |
|
8416 |
fpu_fpr32h[i] = tcg_global_mem_new_i32(TCG_AREG0, |
|
8417 |
offsetof(CPUState, active_fpu.fpr[i].w[!FP_ENDIAN_IDX]), |
|
8418 |
fregnames_h[i]); |
|
8419 | 8414 |
fpu_fcr0 = tcg_global_mem_new_i32(TCG_AREG0, |
8420 | 8415 |
offsetof(CPUState, active_fpu.fcr0), |
8421 | 8416 |
"fcr0"); |
Also available in: Unified diff