diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-30 21:27:17 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-30 21:27:17 +0200 |
| commit | 0c4eed79daf33006f61b6fb223ae32728375f018 (patch) | |
| tree | e1f756e0c39ed8027cf8c9cd3443002a999dc9b5 /src | |
| parent | 8bbd9abd27947d9dfcf7abdd24470b611ca93148 (diff) | |
| download | box64-0c4eed79daf33006f61b6fb223ae32728375f018.tar.gz box64-0c4eed79daf33006f61b6fb223ae32728375f018.zip | |
Added 0F 71/72/73 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run0f.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index 048e1a40..41672c6b 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -475,6 +475,80 @@ int Run0F(x64emu_t *emu, rex_t rex) GM->q = EM->q; break; + case 0x71: /* GRP */ + nextop = F8; + GETEM(1); + 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; + 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 + for (int i=0; i<4; ++i) EM->uw[i] <<= tmp8u; + break; + default: + return 1; + } + break; + case 0x72: /* GRP */ + nextop = F8; + GETEM(1); + switch((nextop>>3)&7) { + case 2: /* PSRLD Em, Ib */ + tmp8u = F8; + if(tmp8u>31) + {EM->q = 0;} + else + for (int i=0; i<2; ++i) EM->ud[i] >>= tmp8u; + break; + case 4: /* PSRAD Em, Ib */ + tmp8u = F8; + for (int i=0; i<2; ++i) EM->sd[i] >>= tmp8u; + break; + case 6: /* PSLLD Em, Ib */ + tmp8u = F8; + if(tmp8u>31) + {EM->q = 0;} + else + for (int i=0; i<2; ++i) EM->ud[i] <<= tmp8u; + break; + default: + return 1; + } + break; + case 0x73: /* GRP */ + nextop = F8; + GETEM(1); + switch((nextop>>3)&7) { + case 2: /* PSRLQ Em, Ib */ + tmp8u = F8; + if(tmp8u>63) + {EM->q = 0;} + else + {EM->q >>= tmp8u;} + break; + case 6: /* PSLLQ Em, Ib */ + tmp8u = F8; + if(tmp8u>63) + {EM->q = 0;} + else + {EM->q <<= tmp8u;} + break; + default: + return 1; + } + break; case 0x74: /* PCMPEQB Gm,Em */ nextop = F8; GETEM(0); |