[FAST486]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Tue, 14 Jul 2015 23:15:46 +0000 (23:15 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Tue, 14 Jul 2015 23:15:46 +0000 (23:15 +0000)
In FPREM and FPREM1, copy the lowest 3 bits of the quotient
into C1, C3 and C0 (in that order!).

svn path=/trunk/; revision=68399

reactos/lib/fast486/fpu.c

index ad6b128..fd81b3a 100644 (file)
@@ -2419,6 +2419,8 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9)
             /* FPREM1 */
             case 0x35:
             {
+                LONGLONG Quotient;
+
                 Fast486FpuExceptionCheck(State);
                 FPU_SAVE_LAST_INST();
 
@@ -2428,8 +2430,15 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9)
                     break;
                 }
 
-                Fast486FpuRemainder(State, &FPU_ST(0), &FPU_ST(1), TRUE, &FPU_ST(0), NULL);
-                FPU_UPDATE_TAG(0);
+                if (Fast486FpuRemainder(State, &FPU_ST(0), &FPU_ST(1), TRUE, &FPU_ST(0), &Quotient))
+                {
+                    FPU_UPDATE_TAG(0);
+
+                    /* Return the lowest 3 bits of the quotient in C1, C3, C0 */
+                    State->FpuStatus.Code1 = Quotient & 1;
+                    State->FpuStatus.Code3 = (Quotient >> 1) & 1;
+                    State->FpuStatus.Code0 = (Quotient >> 2) & 1;
+                }
 
                 break;
             }
@@ -2451,6 +2460,8 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9)
             /* FPREM */
             case 0x38:
             {
+                LONGLONG Quotient;
+
                 Fast486FpuExceptionCheck(State);
                 FPU_SAVE_LAST_INST();
 
@@ -2460,8 +2471,15 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9)
                     break;
                 }
 
-                Fast486FpuRemainder(State, &FPU_ST(0), &FPU_ST(1), FALSE, &FPU_ST(0), NULL);
-                FPU_UPDATE_TAG(0);
+                if (Fast486FpuRemainder(State, &FPU_ST(0), &FPU_ST(1), FALSE, &FPU_ST(0), &Quotient))
+                {
+                    FPU_UPDATE_TAG(0);
+
+                    /* Return the lowest 3 bits of the quotient in C1, C3, C0 */
+                    State->FpuStatus.Code1 = Quotient & 1;
+                    State->FpuStatus.Code3 = (Quotient >> 1) & 1;
+                    State->FpuStatus.Code0 = (Quotient >> 2) & 1;
+                }
 
                 break;
             }