diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 17:05:57 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 17:05:57 +0100 |
| commit | 8e377ca074a7a547d7146e8e8e1b1d3d10b8a8ae (patch) | |
| tree | 5589ed90cfc1d52fe59bf46c0f8409650d3c328f /src | |
| parent | 451cfa521bb8961ad12108bad4395b9548c38ecc (diff) | |
| download | box64-8e377ca074a7a547d7146e8e8e1b1d3d10b8a8ae.tar.gz box64-8e377ca074a7a547d7146e8e8e1b1d3d10b8a8ae.zip | |
Added DE opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64run.c | 9 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 1 | ||||
| -rw-r--r-- | src/emu/x64runde.c | 160 |
3 files changed, 169 insertions, 1 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index b23375fe..e894fa87 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -1101,7 +1101,14 @@ x64emurun: if(emu->quit) goto fini; break; - + case 0xDE: /* x87 opcodes */ + if(RunDE(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 e3b3bbea..a027e398 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -111,6 +111,7 @@ int RunDA(x64emu_t *emu, rex_t rex); int RunDB(x64emu_t *emu, rex_t rex); int RunDC(x64emu_t *emu, rex_t rex); int RunDD(x64emu_t *emu, rex_t rex); +int RunDE(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/x64runde.c b/src/emu/x64runde.c new file mode 100644 index 00000000..0d69f313 --- /dev/null +++ b/src/emu/x64runde.c @@ -0,0 +1,160 @@ +#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" + +#include "modrm.h" + +int RunDE(x64emu_t *emu, rex_t rex) +{ + uint8_t nextop; + reg64_t *oped; + + nextop = F8; + switch(nextop) { + case 0xC0: /* FADDP STx, ST0 */ + case 0xC1: /* FADDP ST1, ST0 */ + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + ST(nextop&7).d += ST0.d; + fpu_do_pop(emu); + break; + case 0xC8: /* FMULP STx, ST0 */ + case 0xC9: /* FMULP ST1, ST0 */ + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + ST(nextop&7).d *= ST0.d; + fpu_do_pop(emu); + break; + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: /* FCOMP */ + fpu_fcom(emu, ST(nextop&7).d); + fpu_do_pop(emu); + break; + + case 0xD9: /* FCOMPP */ + fpu_fcom(emu, ST1.d); + fpu_do_pop(emu); + fpu_do_pop(emu); + break; + + /*ST(1).d = ST0.d - ST(1).d; + fpu_do_pop(emu); + break;*/ + case 0xE0: /* FSUBRP STx, ST0 */ + case 0xE1: /* FSUBRP ST1, ST0 */ + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + ST(nextop&7).d = ST0.d - ST(nextop&7).d; + fpu_do_pop(emu); + break; + case 0xE8: /* FSUBP STx, ST0 */ + case 0xE9: /* FSUBP ST1, ST0 */ + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + ST(nextop&7).d -= ST0.d; + fpu_do_pop(emu); + break; + case 0xF0: /* FDIVRP STx, ST0 */ + case 0xF1: /* FDIVRP ST1, ST0 */ + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + ST(nextop&7).d = ST0.d / ST(nextop&7).d; + fpu_do_pop(emu); + break; + case 0xF8: /* FDIVP STx, ST0 */ + case 0xF9: /* FDIVP ST1, ST0 */ + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + ST(nextop&7).d /= ST0.d; + fpu_do_pop(emu); + break; + + case 0xD8: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + return 1; + + default: + switch((nextop>>3)&7) { + case 0: /* FIADD ST0, Ew int */ + GETEW(0); + ST0.d += EW->sword[0]; + break; + case 1: /* FIMUL ST0, Ew int */ + GETEW(0); + ST0.d *= EW->sword[0]; + break; + case 4: /* FISUB ST0, Ew int */ + GETEW(0); + ST0.d -= EW->sword[0]; + break; + case 5: /* FISUBR ST0, Ew int */ + GETEW(0); + ST0.d = (double)EW->sword[0] - ST0.d; + break; + case 6: /* FIDIV ST0, Ew int */ + GETEW(0); + ST0.d /= EW->sword[0]; + break; + case 7: /* FIDIVR ST0, Ew int */ + GETEW(0); + ST0.d = (double)EW->sword[0] / ST0.d; + break; + default: + return 1; + } + } + return 0; +} \ No newline at end of file |