about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-06 09:29:58 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-06 09:29:58 +0200
commitcc269337f2178844da1c8103efb1bb9197019ef7 (patch)
treebfada084c3a7756fa6e12bde6f40104bd8c2ee8d
parenta2aa5fc650f7e2d4e9400f76832b80689366f4af (diff)
downloadbox64-cc269337f2178844da1c8103efb1bb9197019ef7.tar.gz
box64-cc269337f2178844da1c8103efb1bb9197019ef7.zip
[DYNAREC] Added F3 0F 53 opcode (for CB15)
-rwxr-xr-xsrc/dynarec/dynarec_arm64_f30f.c17
-rw-r--r--src/emu/x64run660f.c6
2 files changed, 17 insertions, 6 deletions
diff --git a/src/dynarec/dynarec_arm64_f30f.c b/src/dynarec/dynarec_arm64_f30f.c
index f398f23c..2df33bcf 100755
--- a/src/dynarec/dynarec_arm64_f30f.c
+++ b/src/dynarec/dynarec_arm64_f30f.c
@@ -184,17 +184,28 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
         case 0x52:

             INST_NAME("RSQRTSS Gx, Ex");

             nextop = F8;

-            GETGX(v0);

             GETEX(v1, 0);

+            GETGX_empty(v0);

             d0 = fpu_get_scratch(dyn);

+            d1 = fpu_get_scratch(dyn);

             // so here: F32: Imm8 = abcd efgh that gives => aBbbbbbc defgh000 00000000 00000000

             // and want 1.0f = 0x3f800000

             // so 00111111 10000000 00000000 00000000

             // a = 0, b = 1, c = 1, d = 1, efgh=0

             // 0b01110000

             FMOVS_8(d0, 0b01110000);

-            FSQRTS(v0, v1);

-            FDIVS(d0, d0, v0);

+            FSQRTS(d1, v1);

+            FDIVS(d0, d0, d1);

+            VMOVeS(v0, 0, d0, 0);

+            break;

+        case 0x53:

+            INST_NAME("RCPSS Gx, Ex");

+            nextop = F8;

+            GETGX(v0);

+            GETEX(v1, 0);

+            d0 = fpu_get_scratch(dyn);

+            FMOVS_8(d0, 0b01110000);    //1.0f

+            FDIVS(d0, d0, v1);

             VMOVeS(v0, 0, d0, 0);

             break;

 

diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index 00a684e3..3b1ab667 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -254,21 +254,21 @@ int Run660F(x64emu_t *emu, rex_t rex)
                 GETGX;

                 for (int i=0; i<16; ++i)

                     GX->sb[i] *= (EX->sb[i]<0)?-1:((EX->sb[i]>0)?1:0);

-            break;

+                break;

             case 0x09:  /* PSIGNW Gx, Ex */

                 nextop = F8;

                 GETEX(0);

                 GETGX;

                 for (int i=0; i<8; ++i)

                     GX->sw[i] *= (EX->sw[i]<0)?-1:((EX->sw[i]>0)?1:0);

-            break;

+                break;

             case 0x0A:  /* PSIGND Gx, Ex */

                 nextop = F8;

                 GETEX(0);

                 GETGX;

                 for (int i=0; i<4; ++i)

                     GX->sd[i] *= (EX->sd[i]<0)?-1:((EX->sd[i]>0)?1:0);

-            break;

+                break;

             case 0x0B:  /* PMULHRSW Gx, Ex */

                 nextop = F8;

                 GETEX(0);