about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-10-29 21:11:13 +0800
committerGitHub <noreply@github.com>2024-10-29 14:11:13 +0100
commit8807b1aa3c62bbb8b773135b59244e1c451add02 (patch)
tree71239becf7974d0cb56ffb91a3f1b510ffe5b7f4 /src
parent2aff4239ccb0b6a50fa3aa84a011b293f0b85822 (diff)
downloadbox64-8807b1aa3c62bbb8b773135b59244e1c451add02.tar.gz
box64-8807b1aa3c62bbb8b773135b59244e1c451add02.zip
[INTERP] Fixed overflow checking for convertion opcodes (#1976)
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run660f.c4
-rw-r--r--src/emu/x64runavx660f.c8
-rw-r--r--src/emu/x64runavxf20f.c8
-rw-r--r--src/emu/x64runavxf30f.c6
-rw-r--r--src/emu/x64runf20f.c8
-rw-r--r--src/emu/x64runf30f.c6
6 files changed, 20 insertions, 20 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index cc7ef8a2..46ff4d6e 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -2389,11 +2389,11 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         nextop = F8;

         GETEX(0);

         GETGX;

-        if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>0x7fffffff)

+        if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffff)

             GX->sd[0] = 0x80000000;

         else

             GX->sd[0] = EX->d[0];

-        if(isnan(EX->d[1]) || isinf(EX->d[1]) || EX->d[1]>0x7fffffff)

+        if(isnan(EX->d[1]) || isinf(EX->d[1]) || EX->d[1]>(double)0x7fffffff)

             GX->sd[1] = 0x80000000;

         else

             GX->sd[1] = EX->d[1];

diff --git a/src/emu/x64runavx660f.c b/src/emu/x64runavx660f.c
index 071547eb..e0212dd3 100644
--- a/src/emu/x64runavx660f.c
+++ b/src/emu/x64runavx660f.c
@@ -1714,21 +1714,21 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETEX(0);
             GETGX;
             GETGY;
-            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>0x7fffffff)
+            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffff)
                 GX->sd[0] = 0x80000000;
             else
                 GX->sd[0] = EX->d[0];
-            if(isnan(EX->d[1]) || isinf(EX->d[1]) || EX->d[1]>0x7fffffff)
+            if(isnan(EX->d[1]) || isinf(EX->d[1]) || EX->d[1]>(double)0x7fffffff)
                 GX->sd[1] = 0x80000000;
             else
                 GX->sd[1] = EX->d[1];
             if(vex.l) {
                 GETEY;
-                if(isnan(EY->d[0]) || isinf(EY->d[0]) || EY->d[0]>0x7fffffff)
+                if(isnan(EY->d[0]) || isinf(EY->d[0]) || EY->d[0]>(double)0x7fffffff)
                     GX->sd[2] = 0x80000000;
                 else
                     GX->sd[2] = EY->d[0];
-                if(isnan(EY->d[1]) || isinf(EY->d[1]) || EY->d[1]>0x7fffffff)
+                if(isnan(EY->d[1]) || isinf(EY->d[1]) || EY->d[1]>(double)0x7fffffff)
                     GX->sd[3] = 0x80000000;
                 else
                     GX->sd[3] = EY->d[1];
diff --git a/src/emu/x64runavxf20f.c b/src/emu/x64runavxf20f.c
index 46011f6f..37bc57f6 100644
--- a/src/emu/x64runavxf20f.c
+++ b/src/emu/x64runavxf20f.c
@@ -119,12 +119,12 @@ uintptr_t RunAVX_F20F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETEX(0);
             GETGD;
             if(rex.w)
-                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffffffffffffLL)
+                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>=(double)0x7fffffffffffffffLL)
                     GD->q[0] = 0x8000000000000000LL;
                 else
                     GD->sq[0] = EX->d[0];
             else {
-                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>0x7fffffff)
+                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffff)
                     GD->dword[0] = 0x80000000;
                 else
                     GD->sdword[0] = EX->d[0];
@@ -136,7 +136,7 @@ uintptr_t RunAVX_F20F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETEX(0);
             GETGD;
             if(rex.w) {
-                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffffffffffffLL)
+                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>=(double)0x7fffffffffffffffLL)
                     GD->q[0] = 0x8000000000000000LL;
                 else
                     switch(emu->mxcsr.f.MXCSR_RC) {
@@ -158,7 +158,7 @@ uintptr_t RunAVX_F20F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                             break;
                     }
             } else {
-                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>0x7fffffff)
+                if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffff)
                     GD->dword[0] = 0x80000000;
                 else
                     switch(emu->mxcsr.f.MXCSR_RC) {
diff --git a/src/emu/x64runavxf30f.c b/src/emu/x64runavxf30f.c
index cd70388a..d712b105 100644
--- a/src/emu/x64runavxf30f.c
+++ b/src/emu/x64runavxf30f.c
@@ -142,12 +142,12 @@ uintptr_t RunAVX_F30F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETEX(0);
             GETGD;
             if (rex.w) {
-                if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>(float)0x7fffffffffffffffLL)
+                if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>=(float)0x7fffffffffffffffLL)
                     GD->q[0] = 0x8000000000000000LL;
                 else
                     GD->sq[0] = EX->f[0];
             } else {
-                if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>(float)0x7fffffff)
+                if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>=(float)0x7fffffff)
                     GD->dword[0] = 0x80000000;
                 else
                     GD->sdword[0] = EX->f[0];
@@ -159,7 +159,7 @@ uintptr_t RunAVX_F30F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETEX(0);
             GETGD;
             if(rex.w) {
-                if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>(float)0x7fffffffffffffffLL)
+                if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>=(float)0x7fffffffffffffffLL)
                     GD->q[0] = 0x8000000000000000LL;
                 else
                     switch(emu->mxcsr.f.MXCSR_RC) {
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index b8d0b265..5b28888f 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -93,12 +93,12 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         _GETEX(0);

         GETGD;

         if(rex.w)

-            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffffffffffffLL)

+            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>=(double)0x7fffffffffffffffLL)

                 GD->q[0] = 0x8000000000000000LL;

             else

                 GD->sq[0] = EX->d[0];

         else {

-            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>0x7fffffff)

+            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffff)

                 GD->dword[0] = 0x80000000;

             else

                 GD->sdword[0] = EX->d[0];

@@ -110,7 +110,7 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         _GETEX(0);

         GETGD;

         if(rex.w) {

-            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffffffffffffLL)

+            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>=(double)0x7fffffffffffffffLL)

                 GD->q[0] = 0x8000000000000000LL;

             else

                 switch(emu->mxcsr.f.MXCSR_RC) {

@@ -132,7 +132,7 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                         break;

                 }

         } else {

-            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>0x7fffffff)

+            if(isnan(EX->d[0]) || isinf(EX->d[0]) || EX->d[0]>(double)0x7fffffff)

                 GD->dword[0] = 0x80000000;

             else

                 switch(emu->mxcsr.f.MXCSR_RC) {

diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index 46268002..69f8fee7 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -104,12 +104,12 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         GETEX(0);

         GETGD;

         if (rex.w) {

-            if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>(float)0x7fffffffffffffffLL)

+            if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>=(float)0x7fffffffffffffffLL)

                 GD->q[0] = 0x8000000000000000LL;

             else

                 GD->sq[0] = EX->f[0];

         } else {

-            if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>(float)0x7fffffff)

+            if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>=(float)0x7fffffff)

                 GD->dword[0] = 0x80000000;

             else

                 GD->sdword[0] = EX->f[0];

@@ -121,7 +121,7 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         GETEX(0);

         GETGD;

         if(rex.w) {

-            if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>(float)0x7fffffffffffffffLL)

+            if(isnanf(EX->f[0]) || isinff(EX->f[0]) || EX->f[0]>=(float)0x7fffffffffffffffLL)

                 GD->q[0] = 0x8000000000000000LL;

             else

                 switch(emu->mxcsr.f.MXCSR_RC) {