diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-07 15:32:36 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-07 15:32:36 +0100 |
| commit | 88aaa9608d77ad360f2135da91176ec2340b7b54 (patch) | |
| tree | cf2e01137368f431cb6ec4f4ebd6a83c500d7bc2 | |
| parent | 032c9ff8b55555df337466cad4c735e9e00771fa (diff) | |
| download | box64-88aaa9608d77ad360f2135da91176ec2340b7b54.tar.gz box64-88aaa9608d77ad360f2135da91176ec2340b7b54.zip | |
Added some MMX opcodes and fixed 66 0F 7E MOVQ
| -rw-r--r-- | src/emu/x64run0f.c | 87 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 2 |
2 files changed, 88 insertions, 1 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index a0b63711..ff5cfdd2 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -190,6 +190,31 @@ int Run0F(x64emu_t *emu, rex_t rex) GM->q = (EM->q > 63) ? 0L : (GM->q >> EM->q); break; + case 0xD8: /* PSUBUSB Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + for(int i=0; i<8; ++i) { + tmp32s = (int32_t)GM->ub[i] - EM->ub[i]; + GM->ub[i] = (tmp32s < 0) ? 0 : tmp32s; + } + break; + case 0xD9: /* PSUBUSW Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + for(int i=0; i<4; ++i) { + tmp32s = (int32_t)GM->uw[i] - EM->uw[i]; + GM->uw[i] = (tmp32s < 0) ? 0 : tmp32s; + } + break; + + case 0xDB: /* PAND Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + GM->q &= EM->q; + break; case 0xDC: /* PADDUSB Gm,Em */ nextop = F8; GETEM(0); @@ -209,6 +234,39 @@ int Run0F(x64emu_t *emu, rex_t rex) } break; + case 0xDF: /* PANDN Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + GM->q = ~GM->q; + GM->q &= EM->q; + break; + + case 0xE8: /* PSUBSB Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + for(int i=0; i<8; ++i) { + tmp32s = (int32_t)GM->sb[i] - EM->sb[i]; + GM->sb[i] = (tmp32s>127)?127:((tmp32s<-128)?-128:tmp32s); + } + break; + case 0xE9: /* PSUBSW Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + for(int i=0; i<4; ++i) { + tmp32s = (int32_t)GM->sw[i] - EM->sw[i]; + GM->sw[i] = (tmp32s>32767)?32767:((tmp32s<-32768)?-32768:tmp32s); + } + break; + + case 0xEB: /* POR Gm, Em */ + nextop = F8; + GETEM(0); + GETGM; + GM->q |= EM->q; + break; case 0xEC: /* PADDSB Gm, Em */ nextop = F8; GETEM(0); @@ -228,6 +286,35 @@ int Run0F(x64emu_t *emu, rex_t rex) } break; + case 0xF3: /* PSLLQ Gm, Em */ + nextop = F8; + GETEM(0); + GETGM; + GM->q = (EM->q > 63) ? 0L : (GM->q << EM->ub[0]); + break; + + case 0xF8: /* PSUBB Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + for(int i=0; i<8; ++i) + GM->sb[i] -= EM->sb[i]; + break; + case 0xF9: /* PSUBW Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + for(int i=0; i<4; ++i) + GM->sw[i] -= EM->sw[i]; + break; + case 0xFA: /* PSUBD Gm,Em */ + nextop = F8; + GETEM(0); + GETGM; + for(int i=0; i<2; ++i) + GM->sd[i] -= EM->sd[i]; + break; + case 0xFC: /* PADDB Gm, Em */ nextop = F8; GETEM(0); diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index dc355d9c..3e768eee 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -75,7 +75,7 @@ int Run660F(x64emu_t *emu, rex_t rex) GETED(0); GETGX; if(rex.w) - ED->q[0] = GX->q; + ED->q[0] = GX->q[0]; else { if(MODREG) ED->q[0] = GX->ud[0]; |