about summary refs log tree commit diff stats
path: root/src/dynarec/la64/dynarec_la64_avx_f2_0f.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynarec/la64/dynarec_la64_avx_f2_0f.c')
-rw-r--r--src/dynarec/la64/dynarec_la64_avx_f2_0f.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_avx_f2_0f.c b/src/dynarec/la64/dynarec_la64_avx_f2_0f.c
new file mode 100644
index 00000000..6d6f8209
--- /dev/null
+++ b/src/dynarec/la64/dynarec_la64_avx_f2_0f.c
@@ -0,0 +1,103 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <errno.h>
+
+#include "debug.h"
+#include "env.h"
+#include "box64context.h"
+#include "box64cpu.h"
+#include "emu/x64emu_private.h"
+#include "x64emu.h"
+#include "box64stack.h"
+#include "callback.h"
+#include "emu/x64run_private.h"
+#include "x64trace.h"
+#include "dynarec_native.h"
+
+#include "la64_printer.h"
+#include "dynarec_la64_private.h"
+#include "dynarec_la64_functions.h"
+#include "../dynarec_helper.h"
+
+uintptr_t dynarec64_AVX_F2_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog)
+{
+    (void)ip;
+    (void)need_epilog;
+
+    uint8_t opcode = F8;
+    uint8_t nextop, u8;
+    uint8_t gd, ed, vd;
+    uint8_t wback, wb1, wb2;
+    uint8_t eb1, eb2, gb1, gb2;
+    int32_t i32, i32_;
+    int cacheupd = 0;
+    int v0, v1, v2;
+    int q0, q1, q2;
+    int d0, d1, d2;
+    int s0;
+    uint64_t tmp64u, u64;
+    int64_t j64;
+    int64_t fixedaddress;
+    int unscaled;
+    MAYUSE(wb1);
+    MAYUSE(wb2);
+    MAYUSE(eb1);
+    MAYUSE(eb2);
+    MAYUSE(gb1);
+    MAYUSE(gb2);
+    MAYUSE(q0);
+    MAYUSE(q1);
+    MAYUSE(d0);
+    MAYUSE(d1);
+    MAYUSE(s0);
+    MAYUSE(j64);
+    MAYUSE(cacheupd);
+
+    rex_t rex = vex.rex;
+
+    switch (opcode) {
+
+        case 0x10:
+            INST_NAME("VMOVSD Gx, [Vx,] Ex");
+            nextop = F8;
+            if (MODREG) {
+                GETVYx(q1, 0);
+                GETEYSD(q2, 0, 0);
+                GETGYx_empty(q0);
+                if (gd != vex.v) VOR_V(q0, q1, q1);
+                VEXTRINS_D(q0, q2, 0);
+            } else {
+                GETEYSD(q2, 0, 0);
+                GETGYx_empty(q0);                
+                XVXOR_V(q0, q0, q0);
+                XVINSVE0_D(q0, q2, 0);
+                YMM_UNMARK_UPPER_ZERO(q0);
+            }
+            break;
+        case 0x11:
+            INST_NAME("VMOVSD Ex, [Vx,] Gx");
+            nextop = F8;
+            GETGYx(q2, 0);
+            if (MODREG) {
+                if (ed == vex.v) {
+                    GETEYSD(q0, 1, 0);
+                    VEXTRINS_D(q0, q2, 0);
+                } else {
+                    GETVYx(q1, 0);
+                    GETEYSD(q0, 1, 0);
+                    VOR_V(q0, q1, q1);
+                    VEXTRINS_D(q0, q2, 0);
+                }
+            } else {
+                addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
+                FST_D(q2, ed, fixedaddress);
+                SMWRITE2();
+            }
+            break;
+
+        default:
+            DEFAULT;
+    }
+    return addr;
+}