about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-24 15:01:35 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-24 15:01:46 +0200
commitfcf0cf00d0a82649ba0cf9f6a8c0450bb6ed5f47 (patch)
tree7c3ba3519cf1a9ebdbca47fe3310dbc531212707 /src/dynarec
parent2ee846f48e7fa9b103f0949f63f91712ca7b03ca (diff)
downloadbox64-fcf0cf00d0a82649ba0cf9f6a8c0450bb6ed5f47.tar.gz
box64-fcf0cf00d0a82649ba0cf9f6a8c0450bb6ed5f47.zip
Added support for XSAVE/XRSTOR ([ARM64_DYNAREC] too)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c34
-rw-r--r--src/dynarec/la64/dynarec_la64_0f.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_0f.c6
3 files changed, 33 insertions, 11 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 581d4821..e62caec5 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -68,15 +68,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             if(MODREG)

             switch(nextop) {

                 case 0xD0:

-                    INST_NAME("FAKE xgetbv");

-                    SETFLAGS(X_ALL, SF_SET_NODF);    // Hack to set flags in "don't care" state

-                    GETIP(ip);

-                    STORE_XEMU_CALL(xRIP);

-                    CALL(native_ud, -1);

-                    LOAD_XEMU_CALL(xRIP);

-                    jump_to_epilog(dyn, 0, xRIP, ninst);

-                    *need_epilog = 0;

-                    *ok = 0;

+                    INST_NAME("XGETBV");

+                    CMPSw_REG(xRCX, xZR);

+                    B_MARK(cEQ);

+                    UDF(0);

+                    MARK;

+                    MOV32w(xRAX, 0b11);

+                    MOV32w(xRDX, 0);

                     break;

                 case 0xE0:

                 case 0xE1:

@@ -1805,6 +1803,24 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         LDRw_U12(x4, xEmu, offsetof(x64emu_t, mxcsr));

                         STW(x4, ed, fixedaddress);

                         break;

+                    case 4:

+                        INST_NAME("XSAVE Ed");

+                        MESSAGE(LOG_DUMP, "Need Optimization\n");

+                        fpu_purgecache(dyn, ninst, 0, x1, x2, x3);

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=x1) {MOVx_REG(x1, ed);}

+                        MOV32w(x2, rex.is32bits);

+                        CALL((void*)fpu_xsave, -1);

+                        break;

+                    case 5:

+                        INST_NAME("XRSTOR Ed");

+                        MESSAGE(LOG_DUMP, "Need Optimization\n");

+                        fpu_purgecache(dyn, ninst, 0, x1, x2, x3);

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=x1) {MOVx_REG(x1, ed);}

+                        MOV32w(x2, rex.is32bits);

+                        CALL((void*)fpu_xrstor, -1);

+                        break;

                     case 7:

                         INST_NAME("CLFLUSH Ed");

                         MESSAGE(LOG_DUMP, "Need Optimization?\n");

diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c
index 6d056fa2..18c42025 100644
--- a/src/dynarec/la64/dynarec_la64_0f.c
+++ b/src/dynarec/la64/dynarec_la64_0f.c
@@ -66,6 +66,9 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             if(MODREG) {
                 switch(nextop) {
                     case 0xD0:
+                        //TODO
+                        DEFAULT;
+                        /*
                         INST_NAME("FAKE xgetbv");
                         nextop = F8;
                         addr = fakeed(dyn, addr, ninst, nextop);
@@ -77,6 +80,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         jump_to_epilog(dyn, 0, xRIP, ninst);
                         *need_epilog = 0;
                         *ok = 0;
+                        */
                         break;
                     default:
                         DEFAULT;
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c
index 4159068f..7c5dfe01 100644
--- a/src/dynarec/rv64/dynarec_rv64_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_0f.c
@@ -66,7 +66,9 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             if(MODREG) {
                 switch(nextop) {
                     case 0xD0:
-                        INST_NAME("FAKE xgetbv");
+                        //TODO
+                        DEFAULT;
+                        /*INST_NAME("FAKE xgetbv");
                         nextop = F8;
                         addr = fakeed(dyn, addr, ninst, nextop);
                         SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state
@@ -76,7 +78,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                         LOAD_XEMU_CALL();
                         jump_to_epilog(dyn, 0, xRIP, ninst);
                         *need_epilog = 0;
-                        *ok = 0;
+                        *ok = 0;*/
                         break;
 
                     case 0xF9: