err = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 0,
                                               &fault_addr);
 
+               /*
+                * We can't allow the emulated instruction to leave any of
+                * the cause bits set in $fcr31.
+                */
+               current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
+
                /*
                 * this is a tricky issue - lose_fpu() uses LL/SC atomics
                 * if FPU is owned and effectively cancels user level LL/SC.
 
        sig = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1,
                                       &fault_addr);
 
+       /*
+        * We can't allow the emulated instruction to leave any of
+        * the cause bits set in $fcr31.
+        */
+       current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
+
        /* If something went wrong, signal */
        process_fpemu_return(sig, fault_addr);
 
 
                /*
                 * We can't allow the emulated instruction to leave any of
-                * the cause bit set in $fcr31.
+                * the cause bits set in $fcr31.
                 */
                current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
 
                        sig = fpu_emulator_cop1Handler(regs,
                                                       ¤t->thread.fpu,
                                                       0, &fault_addr);
+
+                       /*
+                        * We can't allow the emulated instruction to leave
+                        * any of the cause bits set in $fcr31.
+                        */
+                       current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
+
                        if (!process_fpemu_return(sig, fault_addr) && !err)
                                mt_ase_fp_affinity();
                }