diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-04-30 23:53:00 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-30 17:53:00 +0200 |
| commit | 5b9d963d314aa99302fa5cddb459e34e408d47b2 (patch) | |
| tree | 34ecee820e04333b58bcf5b69a22da7d2cd1372b /src | |
| parent | 31a6f5c4e32b267bad84057f3b53ad87a53c049c (diff) | |
| download | box64-5b9d963d314aa99302fa5cddb459e34e408d47b2.tar.gz box64-5b9d963d314aa99302fa5cddb459e34e408d47b2.zip | |
Added 66 64 8B MOV opcode (#749)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 9 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_6664.c | 86 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 2 |
4 files changed, 100 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index 455a8d72..c01f0260 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -84,6 +84,10 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni emit_xor32(dyn, ninst, rex, gd, ed, x3, x4); break; + case 0x66: + addr = dynarec64_6664(dyn, addr, ip, ninst, rex, seg, ok, need_epilog); + break; + case 0x88: INST_NAME("MOV Seg:Eb, Gb"); grab_segdata(dyn, addr, ninst, x4, seg); diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index 24584465..4208d21a 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -253,6 +253,15 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni emit_cmp16_0(dyn, ninst, x1, x3, x4); } break; + case 0x64: + addr = dynarec64_6664(dyn, addr, ip, ninst, rex, _FS, ok, need_epilog); + break; + case 0x65: + addr = dynarec64_6664(dyn, addr, ip, ninst, rex, _GS, ok, need_epilog); + break; + case 0x66: + addr = dynarec64_66(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); + break; case 0x69: case 0x6B: if(opcode==0x69) { diff --git a/src/dynarec/rv64/dynarec_rv64_6664.c b/src/dynarec/rv64/dynarec_rv64_6664.c new file mode 100644 index 00000000..569d1c9c --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_6664.c @@ -0,0 +1,86 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <pthread.h> +#include <errno.h> + +#include "debug.h" +#include "box64context.h" +#include "dynarec.h" +#include "emu/x64emu_private.h" +#include "emu/x64run_private.h" +#include "x64run.h" +#include "x64emu.h" +#include "box64stack.h" +#include "callback.h" +#include "emu/x64run_private.h" +#include "x64trace.h" +#include "dynarec_native.h" + +#include "rv64_printer.h" +#include "dynarec_rv64_private.h" +#include "dynarec_rv64_helper.h" +#include "dynarec_rv64_functions.h" + +#define GETG gd = ((nextop&0x38)>>3)+(rex.r<<3) + +uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int seg, int* ok, int* need_epilog) +{ + (void)ip; (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop; + uint8_t gd, ed; + int64_t j64; + int v0, v1; + int64_t fixedaddress; + int unscaled; + MAYUSE(j64); + + // REX prefix before the 66 are ignored + rex.rex = 0; + while(opcode>=0x40 && opcode<=0x4f) { + rex.rex = opcode; + opcode = F8; + } + + switch(opcode) { + case 0x8B: + INST_NAME("MOV Gd, FS:Ed"); + nextop=F8; + GETGD; + if(MODREG) { // reg <= reg + ed = xRAX+(nextop&7)+(rex.b<<3); + if(rex.w) { + MV(gd, ed); + } else { + if(ed!=gd) { + LUI(x1, 0xffff0); + AND(gd, gd, x1); + SLLI(x1, ed, 48); + SRLI(x1, x1, 48); + OR(gd, gd, x1); + } + } + } else { // mem <= reg + grab_segdata(dyn, addr, ninst, x4, seg); + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); + ADD(x4, ed, x4); + if(rex.w) { + LD(gd, x4, fixedaddress); + } else { + LHU(x1, x4, fixedaddress); + SRLI(gd, gd, 16); + SLLI(gd, gd, 16); + OR(gd, gd, x1); + } + } + break; + + + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index d7f52df7..f6be2c94 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -1096,7 +1096,7 @@ uintptr_t dynarec64_DE(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); -//uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int seg, int* ok, int* need_epilog); +uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int seg, int* ok, int* need_epilog); uintptr_t dynarec64_66F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); |