diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 15:50:24 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 15:50:24 +0100 |
| commit | 987e6e03f173bbd4c92983182905c95e124c003d (patch) | |
| tree | 793709bbaf12052d0d990853d69a744def69487c /src | |
| parent | 50045135967768a5a8cba612d15c76fa7afb9c0b (diff) | |
| download | box64-987e6e03f173bbd4c92983182905c95e124c003d.tar.gz box64-987e6e03f173bbd4c92983182905c95e124c003d.zip | |
Added more opcodes, including D8 and DD x87 ones
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64run.c | 17 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 2 | ||||
| -rw-r--r-- | src/emu/x64rund8.c | 198 | ||||
| -rw-r--r-- | src/emu/x64rundd.c | 194 | ||||
| -rw-r--r-- | src/emu/x64runf30f.c | 7 |
5 files changed, 418 insertions, 0 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index a01fdb92..1a461687 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -627,6 +627,14 @@ x64emurun: } break; + case 0xD8: /* x87 opcodes */ + if(RunD8(emu, rex)) { + unimp = 1; + goto fini; + } + if(emu->quit) + goto fini; + break; case 0xD9: /* x87 opcodes */ if(RunD9(emu, rex)) { unimp = 1; @@ -645,6 +653,15 @@ x64emurun: goto fini; break; + case 0xDD: /* x87 opcodes */ + if(RunDD(emu, rex)) { + unimp = 1; + goto fini; + } + if(emu->quit) + goto fini; + break; + case 0xDF: /* x87 opcodes */ if(RunDF(emu, rex)) { unimp = 1; diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index f9d3012e..024564a7 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -100,8 +100,10 @@ int Run64(x64emu_t *emu, rex_t rex); int Run66(x64emu_t *emu, rex_t rex); int Run660F(x64emu_t *emu, rex_t rex); //int Run67(x64emu_t *emu, rex_t rex); +int RunD8(x64emu_t *emu, rex_t rex); int RunD9(x64emu_t *emu, rex_t rex); int RunDB(x64emu_t *emu, rex_t rex); +int RunDD(x64emu_t *emu, rex_t rex); int RunDF(x64emu_t *emu, rex_t rex); int RunF0(x64emu_t *emu, rex_t rex); int RunF20F(x64emu_t *emu, rex_t rex); diff --git a/src/emu/x64rund8.c b/src/emu/x64rund8.c new file mode 100644 index 00000000..e0f1017e --- /dev/null +++ b/src/emu/x64rund8.c @@ -0,0 +1,198 @@ +#define _GNU_SOURCE +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include <signal.h> +#include <sys/types.h> +#include <unistd.h> + +#include "debug.h" +#include "box64stack.h" +#include "x64emu.h" +#include "x64run.h" +#include "x64emu_private.h" +#include "x64run_private.h" +#include "x64primop.h" +#include "x64trace.h" +#include "x87emu_private.h" +#include "box64context.h" +#include "bridge.h" +#ifdef DYNAREC +#include "../dynarec/arm_lock_helper.h" +#endif + +#include "modrm.h" + +int RunD8(x64emu_t *emu, rex_t rex) +{ + uint8_t nextop; + float f; + reg64_t *oped; + + nextop = F8; + switch (nextop) { + + case 0xC0: + case 0xC1: + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: /* FADD */ + ST0.d += ST(nextop&7).d; + break; + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: /* FMUL */ + ST0.d *= ST(nextop&7).d; + break; + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: /* FCOM */ + fpu_fcom(emu, ST(nextop&7).d); + break; + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: /* FCOMP */ + fpu_fcom(emu, ST(nextop&7).d); + fpu_do_pop(emu); + break; + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: /* FSUB */ + ST0.d -= ST(nextop&7).d; + break; + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: /* FSUBR */ + ST0.d = ST(nextop&7).d - ST0.d; + break; + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: /* FDIV */ + ST0.d /= ST(nextop&7).d; + break; + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: /* FDIVR */ + ST0.d = ST(nextop&7).d / ST0.d; + break; + default: + switch((nextop>>3)&7) { + case 0: /* FADD ST0, float */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + ST0.d += *(float*)ED; + else { + memcpy(&f, ED, sizeof(float)); + ST0.d += f; + } + break; + case 1: /* FMUL ST0, float */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + ST0.d *= *(float*)ED; + else { + memcpy(&f, ED, sizeof(float)); + ST0.d *= f; + } + break; + case 2: /* FCOM ST0, float */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + fpu_fcom(emu, *(float*)ED); + else { + memcpy(&f, ED, sizeof(float)); + fpu_fcom(emu, f); + } + break; + case 3: /* FCOMP */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + fpu_fcom(emu, *(float*)ED); + else { + memcpy(&f, ED, sizeof(float)); + fpu_fcom(emu, f); + } + fpu_do_pop(emu); + break; + case 4: /* FSUB ST0, float */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + ST0.d -= *(float*)ED; + else { + memcpy(&f, ED, sizeof(float)); + ST0.d -= f; + } + break; + case 5: /* FSUBR ST0, float */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + ST0.d = *(float*)ED - ST0.d; + else { + memcpy(&f, ED, sizeof(float)); + ST0.d = f - ST0.d; + } + break; + case 6: /* FDIV ST0, float */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + ST0.d /= *(float*)ED; + else { + memcpy(&f, ED, sizeof(float)); + ST0.d /= f; + } + break; + case 7: /* FDIVR ST0, float */ + GETED(0); + if(!(((uintptr_t)ED)&3)) + ST0.d = *(float*)ED / ST0.d; + else { + memcpy(&f, ED, sizeof(float)); + ST0.d = f / ST0.d; + } + break; + default: + return 1; + } + } + return 0; +} \ No newline at end of file diff --git a/src/emu/x64rundd.c b/src/emu/x64rundd.c new file mode 100644 index 00000000..8c5228c9 --- /dev/null +++ b/src/emu/x64rundd.c @@ -0,0 +1,194 @@ +#define _GNU_SOURCE +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include <signal.h> +#include <sys/types.h> +#include <unistd.h> + +#include "debug.h" +#include "box64stack.h" +#include "x64emu.h" +#include "x64run.h" +#include "x64emu_private.h" +#include "x64run_private.h" +#include "x64primop.h" +#include "x64trace.h" +#include "x87emu_private.h" +#include "box64context.h" +#include "bridge.h" +#ifdef DYNAREC +#include "../dynarec/arm_lock_helper.h" +#endif + +#include "modrm.h" + +int RunDD(x64emu_t *emu, rex_t rex) +{ + uint8_t nextop; + reg64_t *oped; + + nextop = F8; + switch (nextop) { + case 0xC0: /* FFREE STx */ + case 0xC1: + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + fpu_do_free(emu, nextop-0xC0); + break; + + case 0xD0: /* FST ST0, STx */ + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + ST(nextop&7).q = ST0.q; + break; + case 0xD8: /* FSTP ST0, STx */ + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + ST(nextop&7).q = ST0.q; + fpu_do_pop(emu); + break; + case 0xE0: /* FUCOM ST0, STx */ + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + fpu_fcom(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt + break; + case 0xE8: /* FUCOMP ST0, STx */ + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + fpu_fcom(emu, ST(nextop&7).d); // bad, should handle QNaN and IA interrupt + fpu_do_pop(emu); + break; + + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + return 1; + + default: + switch((nextop>>3)&7) { + case 0: /* FLD double */ + GETED(0); + fpu_do_push(emu); + if(!(((uintptr_t)ED)&7)) + ST0.d = *(double*)ED; + else { + memcpy(&ST0.d, ED, sizeof(double)); + } + break; + case 1: /* FISTTP ED qword */ + GETED(0); + if(!(((uintptr_t)ED)&7)) + *(int64_t*)ED = ST0.d; + else { + int64_t i64 = ST0.d; + memcpy(ED, &i64, sizeof(int64_t)); + } + fpu_do_pop(emu); + break; + case 2: /* FST double */ + GETED(0); + if(!(((uintptr_t)ED)&7)) + *(double*)ED = ST0.d; + else { + memcpy(ED, &ST0.d, sizeof(double)); + } + break; + case 3: /* FSTP double */ + GETED(0); + if(!(((uintptr_t)ED)&7)) + *(double*)ED = ST0.d; + else { + memcpy(ED, &ST0.d, sizeof(double)); + } + fpu_do_pop(emu); + break; + #if 0 + case 4: /* FRSTOR m108byte */ + GETED(0); + fpu_loadenv(emu, (char*)ED, 0); + // get the STx + { + char* p =(char*)ED; + p += 28; + for (int i=0; i<8; ++i) { + LD2D(p, &ST(i).d); + p+=10; + } + } + break; + case 6: /* FNSAVE m108byte */ + GETED(0); + // ENV first... + // warning, incomplete + fpu_savenv(emu, (char*)ED, 0); + // save the STx + { + char* p =(char*)ED; + p += 28; + for (int i=0; i<8; ++i) { + D2LD(&ST(i).d, p); + p+=10; + } + } + reset_fpu(emu); + break; + #endif + case 7: /* FNSTSW m2byte */ + GETED(0); + emu->sw.f.F87_TOP = emu->top&7; + *(uint16_t*)ED = emu->sw.x16; + break; + default: + return 1; + } + } + return 0; +} \ No newline at end of file diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c index 711f0785..d3fd0508 100644 --- a/src/emu/x64runf30f.c +++ b/src/emu/x64runf30f.c @@ -106,6 +106,13 @@ int RunF30F(x64emu_t *emu, rex_t rex) GX->q[0] = EX->q[0]; GX->q[1] = 0; break; + case 0x7F: /* MOVDQU Ex, Gx */ + nextop = F8; + GETEX(0); + GETGX; + memcpy(EX, GX, 16); // unaligned... + break; + default: return 1; |