about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-01-23 16:23:49 +0800
committerGitHub <noreply@github.com>2024-01-23 09:23:49 +0100
commit2367e7df504dadd495abe095bd167cce67afb713 (patch)
tree913d93bc94a70d284e7d90797c7e939ec12dfeeb /src
parent2ca85a49761c38f1b36068fe4104e62c5c42b67b (diff)
downloadbox64-2367e7df504dadd495abe095bd167cce67afb713.tar.gz
box64-2367e7df504dadd495abe095bd167cce67afb713.zip
[DYNAREC_RV64] Enable basic simple wrapper optimization (#1215)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_3.c18
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c24
2 files changed, 19 insertions, 23 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c
index 1a468389..fa074293 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_3.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_3.c
@@ -347,14 +347,13 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     MESSAGE(LOG_DUMP, "Native Call to %s\n", GetNativeName(GetNativeFnc(ip)));
                     x87_forget(dyn, ninst, x3, x4, 0);
                     sse_purge07cache(dyn, ninst, x3);
-                    // disabling isSimpleWrapper because all signed value less than 64bits needs to be sign extended
-                    // and return value needs to be cleanned up
-                    tmp = 0;//isSimpleWrapper(*(wrapper_t*)(addr));
+                    // Partially support isSimpleWrapper
+                    tmp = isSimpleWrapper(*(wrapper_t*)(addr));
                     if(isRetX87Wrapper(*(wrapper_t*)(addr)))
                         // return value will be on the stack, so the stack depth needs to be updated
                         x87_purgecache(dyn, ninst, 0, x3, x1, x4);
-                    if(tmp<0 || tmp>1)
-                        tmp=0;  //TODO: removed when FP is in place
+                    if (tmp < 0 || tmp > 1)
+                        tmp = 0; // TODO: removed when FP is in place
                     if((box64_log<2 && !cycle_log) && tmp) {
                         //GETIP(ip+3+8+8); // read the 0xCC
                         call_n(dyn, ninst, *(void**)(addr+8), tmp);
@@ -825,13 +824,12 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     // calling a native function
                     sse_purge07cache(dyn, ninst, x3);
                     if((box64_log<2 && !cycle_log) && dyn->insts[ninst].natcall) {
-                        // disabling isSimpleWrapper because all signed value less than 64bits needs to be sign extended
-                        // and return value needs to be cleanned up
-                        tmp=0;//isSimpleWrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2));
-                        if(tmp>1 || tmp<0)
-                            tmp=0;  // float paramters not ready!
+                        // Partially support isSimpleWrapper
+                        tmp = isSimpleWrapper(*(wrapper_t*)(dyn->insts[ninst].natcall + 2));
                     } else
                         tmp=0;
+                    if (tmp < 0 || tmp > 1)
+                        tmp = 0; // TODO: removed when FP is in place
                     if(dyn->insts[ninst].natcall && isRetX87Wrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2)))
                         // return value will be on the stack, so the stack depth needs to be updated
                         x87_purgecache(dyn, ninst, 0, x3, x1, x4);
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index 9a12f1e4..f3badafb 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -746,26 +746,24 @@ void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w)
     // RDI, RSI, RDX, RCX, R8, R9 are used for function call
     SUBI(xSP, xSP, 16);
     SD(xEmu, xSP, 0);
-    SD(xRIP, xSP, 8);   // ARM64 stack needs to be 16byte aligned
+    SD(xRIP, xSP, 8); // RV64 stack needs to be 16byte aligned
     STORE_REG(R12);
     STORE_REG(R13);
     STORE_REG(R14);
     STORE_REG(R15);
+    /*
     // float and double args
-    if(abs(w)>1) {
-        /*MESSAGE(LOG_DUMP, "Getting %d XMM args\n", abs(w)-1);
-        for(int i=0; i<abs(w)-1; ++i) {
-            sse_get_reg(dyn, ninst, x6, i, w);
-        }*/
-        MESSAGE(LOG_DUMP, "Warning XMM args not ready\n");
-    }
-    if(w<0) {
-        /*
+    if (abs(w) > 1) {
+        MESSAGE(LOG_DUMP, "Getting %d XMM args\n", abs(w) - 1);
+        for (int i = 0; i < abs(w) - 1; ++i) {
+            sse_get_reg(dyn, ninst, x6, i, 0);
+        }
+    }
+    if (w < 0) {
         MESSAGE(LOG_DUMP, "Return in XMM0\n");
-        sse_get_reg_empty(dyn, ninst, x6, 0);
-        */
-        MESSAGE(LOG_DUMP, "Warning return in XMM args not ready\n");
+        sse_get_reg_empty(dyn, ninst, x6, 0, 0);
     }
+    */
     // prepare regs for native call
     MV(A0, xRDI);
     MV(A1, xRSI);