diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-09 18:02:39 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-09 18:02:39 +0100 |
| commit | b23fcc83c1a5e5be3a60772835e40b7b3f664755 (patch) | |
| tree | 9afcdfe3bdfdc652934e0f353ec4bc2055b587ab /src | |
| parent | d625cf68e5b1dc71433ae9db845c1f48f79fd736 (diff) | |
| download | box64-b23fcc83c1a5e5be3a60772835e40b7b3f664755.tar.gz box64-b23fcc83c1a5e5be3a60772835e40b7b3f664755.zip | |
Added more various opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run660f.c | 24 | ||||
| -rw-r--r-- | src/emu/x64runf30f.c | 42 |
2 files changed, 65 insertions, 1 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index 8fe491ff..3d1939ca 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -39,6 +39,30 @@ int Run660F(x64emu_t *emu, rex_t rex) switch(opcode) { + case 0x10: /* MOVUPD Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + memcpy(GX, EX, 16); // unaligned... + break; + case 0x11: /* MOVUPD Ex, Gx */ + nextop = F8; + GETEX(0); + GETGX; + memcpy(EX, GX, 16); // unaligned... + break; + case 0x12: /* MOVLPD Gx, Eq */ + nextop = F8; + GETED(0); + GETGX; + GX->q[0] = ED->q[0]; + break; + case 0x13: /* MOVLPD Eq, Gx */ + nextop = F8; + GETED(0); + GETGX; + ED->q[0] = GX->q[0]; + break; case 0x14: /* UNPCKLPD Gx, Ex */ nextop = F8; GETEX(0); diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c index d3fd0508..4e8d67c2 100644 --- a/src/emu/x64runf30f.c +++ b/src/emu/x64runf30f.c @@ -66,6 +66,18 @@ int RunF30F(x64emu_t *emu, rex_t rex) GX->f[0] = ED->sdword[0]; break; + case 0x2C: /* CVTTSS2SI Gd, Ex */ + nextop = F8; + GETEX(0); + GETGD; + if (rex.w) + GD->sq[0] = EX->f[0]; + else { + GD->sdword[0] = EX->f[0]; + GD->dword[1] = 0; + } + break; + case 0x58: /* ADDSS Gx, Ex */ nextop = F8; GETEX(0); @@ -84,13 +96,41 @@ int RunF30F(x64emu_t *emu, rex_t rex) GETGX; GX->d[0] = EX->f[0]; break; - + case 0x5B: /* CVTTPS2DQ Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->sd[0] = EX->f[0]; + GX->sd[1] = EX->f[1]; + GX->sd[2] = EX->f[2]; + GX->sd[3] = EX->f[3]; + break; + case 0x5C: /* SUBSS Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->f[0] -= EX->f[0]; + break; + case 0x5D: /* MINSS Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + if(isnan(GX->f[0]) || isnan(EX->f[0]) || isless(EX->f[0], GX->f[0])) + GX->f[0] = EX->f[0]; + break; case 0x5E: /* DIVSS Gx, Ex */ nextop = F8; GETEX(0); GETGX; GX->f[0] /= EX->f[0]; break; + case 0x5F: /* MAXSS Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + if (isnan(GX->f[0]) || isnan(EX->f[0]) || isgreater(EX->f[0], GX->f[0])) + GX->f[0] = EX->f[0]; + break; case 0x6F: /* MOVDQU Gx, Ex */ nextop = F8; |