Commit a7cfbba0cf90e3a42f2fc05556dd5b1d614f4cad

Authored by edgar_igl
1 parent e72210e1

CRIS: Translator updates.

* RFN (Return From NMI) insn.
* Avoid unnecessary T0 transfers.
* Dont do tcg related init more than once.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4717 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 14 additions and 7 deletions
target-cris/translate.c
... ... @@ -735,7 +735,7 @@ static void cris_evaluate_flags(DisasContext *dc)
735 735 else
736 736 tcg_gen_andi_tl(cpu_PR[PR_CCS],
737 737 cpu_PR[PR_CCS], ~X_FLAG);
738   - }
  738 + }
739 739  
740 740 dc->flags_uptodate = 1;
741 741 }
... ... @@ -1530,7 +1530,6 @@ static unsigned int dec_btstq(DisasContext *dc)
1530 1530  
1531 1531 cris_cc_mask(dc, CC_MASK_NZ);
1532 1532  
1533   - t_gen_mov_TN_reg(cpu_T[0], dc->op2);
1534 1533 cris_alu(dc, CC_OP_BTST,
1535 1534 cpu_T[0], cpu_R[dc->op2], tcg_const_tl(dc->op1), 4);
1536 1535 cris_update_cc_op(dc, CC_OP_FLAGS, 4);
... ... @@ -1968,11 +1967,10 @@ static unsigned int dec_movs_r(DisasContext *dc)
1968 1967 dc->op1, dc->op2));
1969 1968  
1970 1969 cris_cc_mask(dc, CC_MASK_NZ);
1971   - t_gen_mov_TN_reg(cpu_T[0], dc->op1);
1972 1970 /* Size can only be qi or hi. */
1973 1971 t_gen_sext(cpu_T[1], cpu_R[dc->op1], size);
1974 1972 cris_alu(dc, CC_OP_MOVE,
1975   - cpu_R[dc->op2], cpu_T[0], cpu_T[1], 4);
  1973 + cpu_R[dc->op2], cpu_R[dc->op1], cpu_T[1], 4);
1976 1974 return 2;
1977 1975 }
1978 1976  
... ... @@ -2788,7 +2786,9 @@ static unsigned int dec_rfe_etc(DisasContext *dc)
2788 2786 break;
2789 2787 case 5:
2790 2788 /* rfn. */
2791   - BUG();
  2789 + cris_evaluate_flags(dc);
  2790 + tcg_gen_helper_0_0(helper_rfn);
  2791 + dc->is_jmp = DISAS_UPDATE;
2792 2792 break;
2793 2793 case 6:
2794 2794 /* break. */
... ... @@ -3271,12 +3271,20 @@ void cpu_dump_state (CPUState *env, FILE *f,
3271 3271 CPUCRISState *cpu_cris_init (const char *cpu_model)
3272 3272 {
3273 3273 CPUCRISState *env;
  3274 + static int tcg_initialized = 0;
3274 3275 int i;
3275 3276  
3276 3277 env = qemu_mallocz(sizeof(CPUCRISState));
3277 3278 if (!env)
3278 3279 return NULL;
  3280 +
3279 3281 cpu_exec_init(env);
  3282 + cpu_reset(env);
  3283 +
  3284 + if (tcg_initialized)
  3285 + return env;
  3286 +
  3287 + tcg_initialized = 1;
3280 3288  
3281 3289 cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
3282 3290 #if TARGET_LONG_BITS > HOST_LONG_BITS
... ... @@ -3337,6 +3345,7 @@ CPUCRISState *cpu_cris_init (const char *cpu_model)
3337 3345 TCG_HELPER(helper_movl_sreg_reg);
3338 3346 TCG_HELPER(helper_movl_reg_sreg);
3339 3347 TCG_HELPER(helper_rfe);
  3348 + TCG_HELPER(helper_rfn);
3340 3349  
3341 3350 TCG_HELPER(helper_evaluate_flags_muls);
3342 3351 TCG_HELPER(helper_evaluate_flags_mulu);
... ... @@ -3346,8 +3355,6 @@ CPUCRISState *cpu_cris_init (const char *cpu_model)
3346 3355 TCG_HELPER(helper_evaluate_flags_move_2);
3347 3356 TCG_HELPER(helper_evaluate_flags);
3348 3357 TCG_HELPER(helper_top_evaluate_flags);
3349   -
3350   - cpu_reset(env);
3351 3358 return env;
3352 3359 }
3353 3360  
... ...