diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-01 09:15:35 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-01 09:15:35 +0200 |
| commit | b343ab69a56b8279a5339eb32fbb09d8a4e89e0b (patch) | |
| tree | 359b1672e2e653c51f9257ebc4c2e7ecf286938e /src | |
| parent | 697dc5fa3fc1edf7236371a768ae707572434666 (diff) | |
| download | box64-b343ab69a56b8279a5339eb32fbb09d8a4e89e0b.tar.gz box64-b343ab69a56b8279a5339eb32fbb09d8a4e89e0b.zip | |
Fixed 0F 7E opcode, plus a few other small changes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run0f.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index 3dd41799..d8d03b67 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -216,7 +216,7 @@ int Run0F(x64emu_t *emu, rex_t rex) if(EM->ub[i]&128) GM->ub[i] = 0; else - GM->ub[i] = eax1.ub[EM->ub[i]&7]; + GM->ub[i] = eam1.ub[EM->ub[i]&7]; } break; case 0x04: /* PMADDUBSW Gm,Em */ @@ -549,20 +549,19 @@ int Run0F(x64emu_t *emu, rex_t rex) case 0x71: /* GRP */ nextop = F8; GETEM(1); + tmp8u = F8; switch((nextop>>3)&7) { case 2: /* PSRLW Em, Ib */ - tmp8u = F8; if(tmp8u>15) {EM->q = 0;} else for (int i=0; i<4; ++i) EM->uw[i] >>= tmp8u; break; case 4: /* PSRAW Em, Ib */ - tmp8u = F8; + if(tmp8u>15) tmp8u = 15; for (int i=0; i<4; ++i) EM->sw[i] >>= tmp8u; break; case 6: /* PSLLW Em, Ib */ - tmp8u = F8; if(tmp8u>15) {EM->q = 0;} else @@ -656,8 +655,12 @@ int Run0F(x64emu_t *emu, rex_t rex) GETGM; if(rex.w) ED->q[0] = GM->q; - else - ED->q[0] = GM->ud[0]; + else { + if(MODREG) + ED->q[0] = GM->ud[0]; + else + ED->dword[0] = GM->ud[0]; + } break; case 0x7F: /* MOVQ Em, Gm */ nextop = F8; @@ -1333,7 +1336,7 @@ int Run0F(x64emu_t *emu, rex_t rex) GETEM(0); GETGM; for(int i=0; i<4; ++i) { - tmp32u = (int32_t)GM->uw[i] * EM->uw[i]; + tmp32u = (uint32_t)GM->uw[i] * (uint32_t)EM->uw[i]; GM->uw[i] = (tmp32u>>16)&0xffff; } break; @@ -1342,8 +1345,8 @@ int Run0F(x64emu_t *emu, rex_t rex) GETEM(0); GETGM; for(int i=0; i<4; ++i) { - tmp32s = (int32_t)GM->sw[i] * EM->sw[i]; - GM->uw[i] = (tmp32s>>16)&0xffff; + tmp32s = (int32_t)GM->sw[i] * (int32_t)EM->sw[i]; + GM->sw[i] = (tmp32s>>16)&0xffff; } break; @@ -1352,7 +1355,7 @@ int Run0F(x64emu_t *emu, rex_t rex) GETEM(0); GETGM; for(int i=0; i<8; ++i) { - tmp32s = (int32_t)GM->sb[i] - EM->sb[i]; + tmp32s = (int32_t)GM->sb[i] - (int32_t)EM->sb[i]; GM->sb[i] = (tmp32s>127)?127:((tmp32s<-128)?-128:tmp32s); } break; @@ -1455,21 +1458,21 @@ int Run0F(x64emu_t *emu, rex_t rex) GETEM(0); GETGM; for(int i=0; i<8; ++i) - GM->sb[i] -= EM->sb[i]; + GM->ub[i] -= EM->ub[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]; + GM->uw[i] -= EM->uw[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]; + GM->ud[i] -= EM->ud[i]; break; case 0xFC: /* PADDB Gm, Em */ @@ -1477,21 +1480,21 @@ int Run0F(x64emu_t *emu, rex_t rex) GETEM(0); GETGM; for(int i=0; i<8; ++i) - GM->sb[i] += EM->sb[i]; + GM->ub[i] += EM->ub[i]; break; case 0xFD: /* PADDW Gm,Em */ nextop = F8; GETEM(0); GETGM; for(int i=0; i<4; ++i) - GM->sw[i] += EM->sw[i]; + GM->uw[i] += EM->uw[i]; break; case 0xFE: /* PADDD Gm,Em */ nextop = F8; GETEM(0); GETGM; for(int i=0; i<2; ++i) - GM->sd[i] += EM->sd[i]; + GM->ud[i] += EM->ud[i]; break; default: |