diff options
Diffstat (limited to 'src/dynarec/la64/dynarec_la64_avx_f2_0f.c')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_avx_f2_0f.c | 103 |
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; +} |