diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-10 11:33:15 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-10 11:33:15 +0100 |
| commit | a62f6860247b57b3a27500cd88c9d42e388a782b (patch) | |
| tree | 350893ea5f2044b1168911b646525dfb3cf082b6 /src/emu/x64runf20f.c | |
| parent | 1b09e8a6b06bb19e3b020c4cd93e3bb1b0df05ec (diff) | |
| download | box64-a62f6860247b57b3a27500cd88c9d42e388a782b.tar.gz box64-a62f6860247b57b3a27500cd88c9d42e388a782b.zip | |
Added a bunch of various opcodes
Diffstat (limited to 'src/emu/x64runf20f.c')
| -rw-r--r-- | src/emu/x64runf20f.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c index a45a23d9..cd50f6f6 100644 --- a/src/emu/x64runf20f.c +++ b/src/emu/x64runf20f.c @@ -30,6 +30,9 @@ int RunF20F(x64emu_t *emu, rex_t rex) { uint8_t opcode; uint8_t nextop; + int8_t tmp8s; + uint8_t tmp8u; + int32_t tmp32s; reg64_t *oped, *opgd; sse_regs_t *opex, *opgx; @@ -120,6 +123,31 @@ int RunF20F(x64emu_t *emu, rex_t rex) GX->d[0] = EX->d[0]; break; + GOCOND(0x80 + , tmp32s = F32S; CHECK_FLAGS(emu); + , R_RIP += tmp32s; + , + ) /* 0x80 -> 0x8F Jxx */ + + case 0xC2: /* CMPSD Gx, Ex, Ib */ + nextop = F8; + GETEX(0); + GETGX; + tmp8u = F8; + tmp8s = 0; + switch(tmp8u&7) { + case 0: tmp8s=(GX->d[0] == EX->d[0]); break; + case 1: tmp8s=isless(GX->d[0], EX->d[0]); break; + case 2: tmp8s=islessequal(GX->d[0], EX->d[0]); break; + case 3: tmp8s=isnan(GX->d[0]) || isnan(EX->d[0]); break; + case 4: tmp8s=(GX->d[0] != EX->d[0]); break; + case 5: tmp8s=isnan(GX->d[0]) || isnan(EX->d[0]) || isgreaterequal(GX->d[0], EX->d[0]); break; + case 6: tmp8s=isnan(GX->d[0]) || isnan(EX->d[0]) || isgreater(GX->d[0], EX->d[0]); break; + case 7: tmp8s=!isnan(GX->d[0]) && !isnan(EX->d[0]); break; + } + GX->q[0]=(tmp8s)?0xffffffffffffffffLL:0LL; + break; + default: return 1; } |