OSDN Git Service

[VM][I386_NP21] FPU: FISTTP INSNs (prefix DF) are only later than Pentium 4, not...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 31 May 2020 09:08:54 +0000 (18:08 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 31 May 2020 09:08:54 +0000 (18:08 +0900)
source/src/vm/np21/i386c/ia32/instructions/fpu/fpdummy.cpp
source/src/vm/np21/i386c/ia32/instructions/fpu/fpemul_dosbox.cpp
source/src/vm/np21/i386c/ia32/instructions/fpu/fpemul_dosbox2.cpp
source/src/vm/np21/i386c/ia32/instructions/fpu/fpemul_softfloat.cpp

index 8e71ea5..a28f19c 100644 (file)
@@ -158,4 +158,4 @@ NOFPU_ESC7(void)
                madr = calc_ea_dst(op);
                EXCEPTION(NM_EXCEPTION, 0);
        }
-}
\ No newline at end of file
+}
index 9f58d7f..6753566 100644 (file)
@@ -1602,13 +1602,16 @@ DB_ESC3(void)
                        break;
                        
                case 1: /* FISTTP (DWORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               FP_RND oldrnd = FPU_STAT.round;
-                               FPU_STAT.round = ROUND_Down;
-                               FPU_FST_I32(madr);
-                               FPU_STAT.round = oldrnd;
+                               {
+                                       FP_RND oldrnd = FPU_STAT.round;
+                                       FPU_STAT.round = ROUND_Down;
+                                       FPU_FST_I32(madr);
+                                       FPU_STAT.round = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                        
                case 2: /* FIST (DWORD) */
@@ -1769,13 +1772,16 @@ DB_ESC5(void)
                        FPU_FLD_F64(madr,FPU_STAT_TOP);
                        break;
                case 1: /* FISTTP (QWORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               FP_RND oldrnd = FPU_STAT.round;
-                               FPU_STAT.round = ROUND_Down;
-                               FPU_FST_I64(madr);
-                               FPU_STAT.round = oldrnd;
+                               {
+                                       FP_RND oldrnd = FPU_STAT.round;
+                                       FPU_STAT.round = ROUND_Down;
+                                       FPU_FST_I64(madr);
+                                       FPU_STAT.round = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                case 2: /* FST (倍精度実数) */
                        TRACEOUT(("FST double real"));
@@ -1951,13 +1957,16 @@ DB_ESC7(void)
                        FPU_FLD_I16(madr,FPU_STAT_TOP);
                        break;
                case 1: /* FISTTP (WORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               FP_RND oldrnd = FPU_STAT.round;
-                               FPU_STAT.round = ROUND_Down;
-                               FPU_FST_I16(madr);
-                               FPU_STAT.round = oldrnd;
+                               {
+                                       FP_RND oldrnd = FPU_STAT.round;
+                                       FPU_STAT.round = ROUND_Down;
+                                       FPU_FST_I16(madr);
+                                       FPU_STAT.round = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                case 2: /* FIST (WORD) */
                        TRACEOUT(("FIST SINT16"));
index bce0104..53d190b 100644 (file)
@@ -1809,13 +1809,16 @@ DB2_ESC3(void)
                        break;
                        
                case 1: /* FISTTP (DWORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               FP_RND oldrnd = FPU_STAT.round;
-                               FPU_STAT.round = ROUND_Down;
-                               FPU_FST_I32(madr);
-                               FPU_STAT.round = oldrnd;
+                               {
+                                       FP_RND oldrnd = FPU_STAT.round;
+                                       FPU_STAT.round = ROUND_Down;
+                                       FPU_FST_I32(madr);
+                                       FPU_STAT.round = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                        
                case 2: /* FIST (DWORD) */
@@ -1976,13 +1979,16 @@ DB2_ESC5(void)
                        FPU_FLD_F64(madr,FPU_STAT_TOP);
                        break;
                case 1: /* FISTTP (QWORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               FP_RND oldrnd = FPU_STAT.round;
-                               FPU_STAT.round = ROUND_Down;
-                               FPU_FST_I64(madr);
-                               FPU_STAT.round = oldrnd;
+                               {
+                                       FP_RND oldrnd = FPU_STAT.round;
+                                       FPU_STAT.round = ROUND_Down;
+                                       FPU_FST_I64(madr);
+                                       FPU_STAT.round = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                case 2: /* FST (倍精度実数) */
                        TRACEOUT(("FST double real"));
@@ -2158,13 +2164,16 @@ DB2_ESC7(void)
                        FPU_FLD_I16(madr,FPU_STAT_TOP);
                        break;
                case 1: /* FISTTP (WORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               FP_RND oldrnd = FPU_STAT.round;
-                               FPU_STAT.round = ROUND_Down;
-                               FPU_FST_I16(madr);
-                               FPU_STAT.round = oldrnd;
+                               {
+                                       FP_RND oldrnd = FPU_STAT.round;
+                                       FPU_STAT.round = ROUND_Down;
+                                       FPU_FST_I16(madr);
+                                       FPU_STAT.round = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                case 2: /* FIST (WORD) */
                        TRACEOUT(("FIST SINT16"));
index 10bb6dd..db9a340 100644 (file)
@@ -1608,13 +1608,16 @@ SF_ESC3(void)
                        break;
                        
                case 1: /* FISTTP (DWORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
+                               {
                                signed char oldrnd = float_rounding_mode;
                                float_rounding_mode = float_round_down;
                                FPU_FST_I32(madr);
                                float_rounding_mode = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                        
                case 2: /* FIST (DWORD) */
@@ -1776,13 +1779,16 @@ SF_ESC5(void)
                        FPU_FLD_F64(madr,FPU_STAT_TOP);
                        break;
                case 1: /* FISTTP (QWORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               signed char oldrnd = float_rounding_mode;
-                               float_rounding_mode = float_round_down;
-                               FPU_FST_I64(madr);
-                               float_rounding_mode = oldrnd;
+                               {
+                                       signed char oldrnd = float_rounding_mode;
+                                       float_rounding_mode = float_round_down;
+                                       FPU_FST_I64(madr);
+                                       float_rounding_mode = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                case 2: /* FST (倍精度実数) */
                        TRACEOUT(("FST double real"));
@@ -1959,13 +1965,16 @@ SF_ESC7(void)
                        FPU_FLD_I16(madr,FPU_STAT_TOP);
                        break;
                case 1: /* FISTTP (WORD) */
+                       if(i386cpuid.cpu_family >= CPU_PENTIUM_4_FAMILY)
                        {
-                               signed char oldrnd = float_rounding_mode;
-                               float_rounding_mode = float_round_down;
-                               FPU_FST_I16(madr);
-                               float_rounding_mode = oldrnd;
+                               {
+                                       signed char oldrnd = float_rounding_mode;
+                                       float_rounding_mode = float_round_down;
+                                       FPU_FST_I16(madr);
+                                       float_rounding_mode = oldrnd;
+                               }
+                               FPU_FPOP();
                        }
-                       FPU_FPOP();
                        break;
                case 2: /* FIST (WORD) */
                        TRACEOUT(("FIST SINT16"));