Commit 2623c1ecfc87a0a86188c75598410e6b3d0f18a3

Authored by aurel32
1 parent d144d1d9

target-mips: optimize gen_op_addr_add() (2/2)

Instead of dynamically generating different code depending on the UX
flag, add a new flag in ctx->flags to generate different code.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5677 c046a42c-6fe2-441c-8c8c-71466251a162
target-mips/cpu.h
@@ -411,7 +411,7 @@ struct CPUMIPSState { @@ -411,7 +411,7 @@ struct CPUMIPSState {
411 int error_code; 411 int error_code;
412 uint32_t hflags; /* CPU State */ 412 uint32_t hflags; /* CPU State */
413 /* TMASK defines different execution modes */ 413 /* TMASK defines different execution modes */
414 -#define MIPS_HFLAG_TMASK 0x01FF 414 +#define MIPS_HFLAG_TMASK 0x03FF
415 #define MIPS_HFLAG_MODE 0x0007 /* execution modes */ 415 #define MIPS_HFLAG_MODE 0x0007 /* execution modes */
416 /* The KSU flags must be the lowest bits in hflags. The flag order 416 /* The KSU flags must be the lowest bits in hflags. The flag order
417 must be the same as defined for CP0 Status. This allows to use 417 must be the same as defined for CP0 Status. This allows to use
@@ -430,15 +430,16 @@ struct CPUMIPSState { @@ -430,15 +430,16 @@ struct CPUMIPSState {
430 and RSQRT.D. */ 430 and RSQRT.D. */
431 #define MIPS_HFLAG_COP1X 0x0080 /* COP1X instructions enabled */ 431 #define MIPS_HFLAG_COP1X 0x0080 /* COP1X instructions enabled */
432 #define MIPS_HFLAG_RE 0x0100 /* Reversed endianness */ 432 #define MIPS_HFLAG_RE 0x0100 /* Reversed endianness */
  433 +#define MIPS_HFLAG_UX 0x0200 /* 64-bit user mode */
433 /* If translation is interrupted between the branch instruction and 434 /* If translation is interrupted between the branch instruction and
434 * the delay slot, record what type of branch it is so that we can 435 * the delay slot, record what type of branch it is so that we can
435 * resume translation properly. It might be possible to reduce 436 * resume translation properly. It might be possible to reduce
436 * this from three bits to two. */ 437 * this from three bits to two. */
437 -#define MIPS_HFLAG_BMASK 0x0e00  
438 -#define MIPS_HFLAG_B 0x0200 /* Unconditional branch */  
439 -#define MIPS_HFLAG_BC 0x0400 /* Conditional branch */  
440 -#define MIPS_HFLAG_BL 0x0600 /* Likely branch */  
441 -#define MIPS_HFLAG_BR 0x0800 /* branch to register (can't link TB) */ 438 +#define MIPS_HFLAG_BMASK 0x1C00
  439 +#define MIPS_HFLAG_B 0x0400 /* Unconditional branch */
  440 +#define MIPS_HFLAG_BC 0x0800 /* Conditional branch */
  441 +#define MIPS_HFLAG_BL 0x0C00 /* Likely branch */
  442 +#define MIPS_HFLAG_BR 0x1000 /* branch to register (can't link TB) */
442 target_ulong btarget; /* Jump / branch target */ 443 target_ulong btarget; /* Jump / branch target */
443 int bcond; /* Branch condition (if needed) */ 444 int bcond; /* Branch condition (if needed) */
444 445
target-mips/exec.h
@@ -66,7 +66,8 @@ static inline int cpu_halted(CPUState *env) @@ -66,7 +66,8 @@ static inline int cpu_halted(CPUState *env)
66 static inline void compute_hflags(CPUState *env) 66 static inline void compute_hflags(CPUState *env)
67 { 67 {
68 env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 | 68 env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 |
69 - MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU); 69 + MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU |
  70 + MIPS_HFLAG_UX);
70 if (!(env->CP0_Status & (1 << CP0St_EXL)) && 71 if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
71 !(env->CP0_Status & (1 << CP0St_ERL)) && 72 !(env->CP0_Status & (1 << CP0St_ERL)) &&
72 !(env->hflags & MIPS_HFLAG_DM)) { 73 !(env->hflags & MIPS_HFLAG_DM)) {
@@ -77,6 +78,8 @@ static inline void compute_hflags(CPUState *env) @@ -77,6 +78,8 @@ static inline void compute_hflags(CPUState *env)
77 (env->CP0_Status & (1 << CP0St_PX)) || 78 (env->CP0_Status & (1 << CP0St_PX)) ||
78 (env->CP0_Status & (1 << CP0St_UX))) 79 (env->CP0_Status & (1 << CP0St_UX)))
79 env->hflags |= MIPS_HFLAG_64; 80 env->hflags |= MIPS_HFLAG_64;
  81 + if (env->CP0_Status & (1 << CP0St_UX))
  82 + env->hflags |= MIPS_HFLAG_UX;
80 #endif 83 #endif
81 if ((env->CP0_Status & (1 << CP0St_CU0)) || 84 if ((env->CP0_Status & (1 << CP0St_CU0)) ||
82 !(env->hflags & MIPS_HFLAG_KSU)) 85 !(env->hflags & MIPS_HFLAG_KSU))
target-mips/translate.c
@@ -902,16 +902,9 @@ static inline void gen_op_addr_add (DisasContext *ctx, TCGv t0, TCGv t1) @@ -902,16 +902,9 @@ static inline void gen_op_addr_add (DisasContext *ctx, TCGv t0, TCGv t1)
902 /* For compatibility with 32-bit code, data reference in user mode 902 /* For compatibility with 32-bit code, data reference in user mode
903 with Status_UX = 0 should be casted to 32-bit and sign extended. 903 with Status_UX = 0 should be casted to 32-bit and sign extended.
904 See the MIPS64 PRA manual, section 4.10. */ 904 See the MIPS64 PRA manual, section 4.10. */
905 - if ((ctx->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) {  
906 - int l1 = gen_new_label();  
907 - TCGv r_tmp = tcg_temp_new(TCG_TYPE_I32);  
908 -  
909 - tcg_gen_ld_i32(r_tmp, cpu_env, offsetof(CPUState, CP0_Status));  
910 - tcg_gen_andi_i32(r_tmp, r_tmp, (1 << CP0St_UX));  
911 - tcg_gen_brcondi_i32(TCG_COND_NE, r_tmp, 0, l1); 905 + if (((ctx->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) &&
  906 + !(ctx->hflags & MIPS_HFLAG_UX)) {
912 tcg_gen_ext32s_i64(t0, t0); 907 tcg_gen_ext32s_i64(t0, t0);
913 - gen_set_label(l1);  
914 - tcg_temp_free(r_tmp);  
915 } 908 }
916 #endif 909 #endif
917 } 910 }