about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/myalign.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c
index 9ef13cf5..aebfb4c7 100644
--- a/src/libtools/myalign.c
+++ b/src/libtools/myalign.c
@@ -1197,7 +1197,7 @@ void myStackAlignScanfWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack,
     }
 }
 
-void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b)
+void myStackAlignGVariantNewVa(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b)
 {
     uint64_t* grp = (uint64_t*)((*b)->reg_save_area);
     uint64_t* frp = (uint64_t*)((*b)->reg_save_area + X64_VA_MAX_REG);
@@ -1239,6 +1239,48 @@ void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch,
     }
 }
 
+void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm)
+{
+    int x = 0;
+    int pos = 1;
+    const char* pfmt = fmt;
+    while (*pfmt) {
+        switch (*pfmt) {
+            case 'd': // double
+                if (xmm) {
+                    *mystack = emu->xmm[x++].q[0];
+                    --xmm;
+                    mystack++;
+                } else {
+                    *mystack = *st;
+                    st++;
+                    mystack++;
+                }
+                break;
+            case 'b':
+            case 'y':
+            case 'n':
+            case 'q':
+            case 'i':
+            case 'h':
+            case 'u':
+            case 'x':
+            case 't':
+                if (pos < 6)
+                    *mystack = emu->regs[regs_abi[pos++]].q[0];
+                else {
+                    *mystack = *st;
+                    ++st;
+                }
+                ++mystack;
+                break;
+            default:
+                break;
+        }
+        pfmt++;
+    }
+}
+
 #endif
 
 #include "my_xcb_defs.h"