about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-03 12:49:37 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-03-03 12:49:37 +0100
commit6f4ce37cceaa3f623d43d68f8607151f56216fb9 (patch)
treea98778c94af8ee2a95ef0238199a376d887b20ba /src
parent23bbab10b4d119fb53f0649ee45674e978c43b91 (diff)
downloadbox64-6f4ce37cceaa3f623d43d68f8607151f56216fb9.tar.gz
box64-6f4ce37cceaa3f623d43d68f8607151f56216fb9.zip
Added 64 0F 11 opcode ([DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c19
-rw-r--r--src/emu/x64run64.c6
2 files changed, 24 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index d604047c..4ec25223 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -34,7 +34,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     uint8_t gd, ed, eb1, eb2, gb1, gb2;
     uint8_t wback, wb1, wb2, wb;
     int64_t i64, j64;
-    int v0;
+    int v0, v1;
     int q0;
     int d0;
     int64_t fixedaddress;
@@ -48,6 +48,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
     MAYUSE(d0);
     MAYUSE(q0);
     MAYUSE(v0);
+    MAYUSE(v1);
 
     while((opcode==0xF2) || (opcode==0xF3)) {
         rep = opcode-0xF1;
@@ -117,6 +118,22 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 0x11:
                     switch(rep) {
+                        case 0:
+                            INST_NAME("MOVUPS Ex,Gx");
+                            nextop = F8;
+                            GETG;
+                            v0 = sse_get_reg(dyn, ninst, x1, gd);
+                            if(MODREG) {
+                                ed = (nextop&7)+(rex.b<<3);
+                                v1 = sse_get_reg_empty(dyn, ninst, x1, ed);
+                                VMOVQ(v1, v0);
+                            } else {
+                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, 0, 0);
+                                ADDx_REG(x4, x4, ed);
+                                VSTR128_U12(v0, x4, fixedaddress);
+                            }
+                            break;
                         case 1:
                             INST_NAME("MOVSD Ex, Gx");
                             nextop = F8;
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index 8717d46a..a1e5a38b 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -136,6 +136,12 @@ int Run64(x64emu_t *emu, rex_t rex, int seg)
                     break;

                 case 0x11:

                     switch(rep) {

+                        case 0: /* MOVUPS FS:Ex, Gx */

+                            nextop = F8;

+                            GETEX_OFFS(0, tlsdata);

+                            GETGX;

+                            EX->u128 = GX->u128;

+                            break;

                         case 1: /* MOVSD Ex, Gx */

                             nextop = F8;

                             GETEX_OFFS(0, tlsdata);