]> Git Repo - qemu.git/blobdiff - target-ppc/op.c
Gprof prooved the PowerPC emulation spent too much time in MSR load and store
[qemu.git] / target-ppc / op.c
index 4889ad476f535af332679ea0b5e2c2bc6563cf5e..0030c146611b0b7ef90beff8535fd37ae859b56b 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "config.h"
 #include "exec.h"
+#include "helper_regs.h"
 #include "op_helper.h"
 
 #define REG 0
@@ -284,13 +285,13 @@ void OPPROTO op_store_xer_bc (void)
 
 void OPPROTO op_load_xer (void)
 {
-    do_load_xer();
+    T0 = hreg_load_xer(env);
     RETURN();
 }
 
 void OPPROTO op_store_xer (void)
 {
-    do_store_xer();
+    hreg_store_xer(env, T0);
     RETURN();
 }
 
@@ -358,37 +359,36 @@ void OPPROTO op_store_asr (void)
 
 void OPPROTO op_load_msr (void)
 {
-    T0 = do_load_msr(env);
+    T0 = env->msr;
     RETURN();
 }
 
 void OPPROTO op_store_msr (void)
 {
-    if (do_store_msr(env, T0)) {
-        env->halted = 1;
-        do_raise_exception(EXCP_HLT);
-    }
+    do_store_msr();
     RETURN();
 }
 
-void OPPROTO op_update_riee (void)
+#if defined (TARGET_PPC64)
+void OPPROTO op_store_msr_32 (void)
 {
-    msr_ri = (T0 >> MSR_RI) & 1;
-    msr_ee = (T0 >> MSR_EE) & 1;
+    T0 = (env->msr & ~0xFFFFFFFFULL) | (T0 & 0xFFFFFFFF);
+    do_store_msr();
     RETURN();
 }
+#endif
 
-#if defined (TARGET_PPC64)
-void OPPROTO op_store_msr_32 (void)
+void OPPROTO op_update_riee (void)
 {
-    if (ppc_store_msr_32(env, T0)) {
-        env->halted = 1;
-        do_raise_exception(EXCP_HLT);
-    }
+    /* We don't call do_store_msr here as we won't trigger
+     * any special case nor change hflags
+     */
+    T0 &= (1 << MSR_RI) | (1 << MSR_EE);
+    env->msr &= ~(1 << MSR_RI) | (1 << MSR_EE);
+    env->msr |= T0;
     RETURN();
 }
 #endif
-#endif
 
 /* SPR */
 void OPPROTO op_load_spr (void)
@@ -2517,7 +2517,12 @@ void OPPROTO op_rfmci (void)
 
 void OPPROTO op_wrte (void)
 {
-    msr_ee = T0 >> 16;
+    /* We don't call do_store_msr here as we won't trigger
+     * any special case nor change hflags
+     */
+    T0 &= 1 << MSR_EE;
+    env->msr &= ~(1 << MSR_EE);
+    env->msr |= T0;
     RETURN();
 }
 
This page took 0.025963 seconds and 4 git commands to generate.