Commit 056b05f8d22d0fdd46bbf1fdf01e5f3a32242a16

Authored by j_mayer
1 parent b48d7d69

Optimisations: avoid generation of duplicated micro-ops.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3305 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 14 additions and 3 deletions
target-ppc/translate.c
@@ -2996,6 +2996,7 @@ static inline void gen_bcond (DisasContext *ctx, int type) @@ -2996,6 +2996,7 @@ static inline void gen_bcond (DisasContext *ctx, int type)
2996 case 6: 2996 case 6:
2997 if (type == BCOND_IM) { 2997 if (type == BCOND_IM) {
2998 gen_goto_tb(ctx, 0, target); 2998 gen_goto_tb(ctx, 0, target);
  2999 + goto out;
2999 } else { 3000 } else {
3000 #if defined(TARGET_PPC64) 3001 #if defined(TARGET_PPC64)
3001 if (ctx->sf_mode) 3002 if (ctx->sf_mode)
@@ -3004,8 +3005,9 @@ static inline void gen_bcond (DisasContext *ctx, int type) @@ -3004,8 +3005,9 @@ static inline void gen_bcond (DisasContext *ctx, int type)
3004 #endif 3005 #endif
3005 gen_op_b_T1(); 3006 gen_op_b_T1();
3006 gen_op_reset_T0(); 3007 gen_op_reset_T0();
  3008 + goto no_test;
3007 } 3009 }
3008 - goto no_test; 3010 + break;
3009 } 3011 }
3010 } else { 3012 } else {
3011 mask = 1 << (3 - (bi & 0x03)); 3013 mask = 1 << (3 - (bi & 0x03));
@@ -3079,6 +3081,7 @@ static inline void gen_bcond (DisasContext *ctx, int type) @@ -3079,6 +3081,7 @@ static inline void gen_bcond (DisasContext *ctx, int type)
3079 gen_op_debug(); 3081 gen_op_debug();
3080 gen_op_exit_tb(); 3082 gen_op_exit_tb();
3081 } 3083 }
  3084 + out:
3082 ctx->exception = POWERPC_EXCP_BRANCH; 3085 ctx->exception = POWERPC_EXCP_BRANCH;
3083 } 3086 }
3084 3087
@@ -3381,11 +3384,15 @@ GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001EF801, PPC_64B) @@ -3381,11 +3384,15 @@ GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001EF801, PPC_64B)
3381 /* Special form that does not need any synchronisation */ 3384 /* Special form that does not need any synchronisation */
3382 gen_op_update_riee(); 3385 gen_op_update_riee();
3383 } else { 3386 } else {
  3387 + /* XXX: we need to update nip before the store
  3388 + * if we enter power saving mode, we will exit the loop
  3389 + * directly from ppc_store_msr
  3390 + */
3384 gen_update_nip(ctx, ctx->nip); 3391 gen_update_nip(ctx, ctx->nip);
3385 gen_op_store_msr(); 3392 gen_op_store_msr();
3386 /* Must stop the translation as machine state (may have) changed */ 3393 /* Must stop the translation as machine state (may have) changed */
3387 /* Note that mtmsr is not always defined as context-synchronizing */ 3394 /* Note that mtmsr is not always defined as context-synchronizing */
3388 - GEN_STOP(ctx); 3395 + ctx->exception = POWERPC_EXCP_STOP;
3389 } 3396 }
3390 #endif 3397 #endif
3391 } 3398 }
@@ -3405,6 +3412,10 @@ GEN_HANDLER(mtmsr, 0x1F, 0x12, 0x04, 0x001FF801, PPC_MISC) @@ -3405,6 +3412,10 @@ GEN_HANDLER(mtmsr, 0x1F, 0x12, 0x04, 0x001FF801, PPC_MISC)
3405 /* Special form that does not need any synchronisation */ 3412 /* Special form that does not need any synchronisation */
3406 gen_op_update_riee(); 3413 gen_op_update_riee();
3407 } else { 3414 } else {
  3415 + /* XXX: we need to update nip before the store
  3416 + * if we enter power saving mode, we will exit the loop
  3417 + * directly from ppc_store_msr
  3418 + */
3408 gen_update_nip(ctx, ctx->nip); 3419 gen_update_nip(ctx, ctx->nip);
3409 #if defined(TARGET_PPC64) 3420 #if defined(TARGET_PPC64)
3410 if (!ctx->sf_mode) 3421 if (!ctx->sf_mode)
@@ -3414,7 +3425,7 @@ GEN_HANDLER(mtmsr, 0x1F, 0x12, 0x04, 0x001FF801, PPC_MISC) @@ -3414,7 +3425,7 @@ GEN_HANDLER(mtmsr, 0x1F, 0x12, 0x04, 0x001FF801, PPC_MISC)
3414 gen_op_store_msr(); 3425 gen_op_store_msr();
3415 /* Must stop the translation as machine state (may have) changed */ 3426 /* Must stop the translation as machine state (may have) changed */
3416 /* Note that mtmsrd is not always defined as context-synchronizing */ 3427 /* Note that mtmsrd is not always defined as context-synchronizing */
3417 - GEN_STOP(ctx); 3428 + ctx->exception = POWERPC_EXCP_STOP;
3418 } 3429 }
3419 #endif 3430 #endif
3420 } 3431 }