diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 15:40:17 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 15:40:17 +0100 |
| commit | 50045135967768a5a8cba612d15c76fa7afb9c0b (patch) | |
| tree | 9bc9b429766a854983f9be59bea9ff4a7e7e217a /src | |
| parent | 749961af32d25df77d2c63bb1e20c9a3aeb1d527 (diff) | |
| download | box64-50045135967768a5a8cba612d15c76fa7afb9c0b.tar.gz box64-50045135967768a5a8cba612d15c76fa7afb9c0b.zip | |
More 0F and 66 0F opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run0f.c | 44 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 116 |
2 files changed, 159 insertions, 1 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index f8c6d359..08a31db0 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -52,6 +52,50 @@ int Run0F(x64emu_t *emu, rex_t rex) GETGX; memcpy(EX, GX, 16); // unaligned, so carreful break; + case 0x12: + nextop = F8; + GETEX(0); + GETGX; + if((nextop&0xC0)==0xC0) /* MOVHLPS Gx,Ex */ + GX->q[0] = EX->q[1]; + else + GX->q[0] = EX->q[0]; /* MOVLPS Gx,Ex */ + break; + case 0x13: /* MOVLPS Ex,Gx */ + nextop = F8; + GETEX(0); + GETGX; + EX->q[0] = GX->q[0]; + break; + case 0x14: /* UNPCKLPS Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->ud[3] = EX->ud[1]; + GX->ud[2] = GX->ud[1]; + GX->ud[1] = EX->ud[0]; + break; + case 0x15: /* UNPCKHPS Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->ud[0] = GX->ud[2]; + GX->ud[1] = EX->ud[2]; + GX->ud[2] = GX->ud[3]; + GX->ud[3] = EX->ud[3]; + break; + case 0x16: /* MOVHPS Gx,Ex */ + nextop = F8; /* MOVLHPS Gx,Ex (Ex==reg) */ + GETEX(0); + GETGX; + GX->q[1] = EX->q[0]; + break; + case 0x17: /* MOVHPS Ex,Gx */ + nextop = F8; + GETEX(0); + GETGX; + EX->q[0] = GX->q[1]; + break; case 0x1F: /* NOP (multi-byte) */ nextop = F8; diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index 3e768eee..6dfa4485 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -51,7 +51,121 @@ int Run660F(x64emu_t *emu, rex_t rex) GX->ud[2] = GX->ud[1]; GX->ud[1] = EX->ud[0]; break; - + case 0x63: /* PACKSSWB Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + if(GX==EX) { + for(int i=0; i<8; ++i) + GX->sb[i] = (EX->sw[i]<-128)?-128:((EX->sw[i]>127)?127:EX->sw[i]); + GX->q[1] = GX->q[0]; + } else { + for(int i=0; i<8; ++i) + GX->sb[i] = (GX->sw[i]<-128)?-128:((GX->sw[i]>127)?127:GX->sw[i]); + for(int i=0; i<8; ++i) + GX->sb[8+i] = (EX->sw[i]<-128)?-128:((EX->sw[i]>127)?127:EX->sw[i]); + } + break; + case 0x64: /* PCMPGTB Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<16; ++i) + GX->ub[i] = (GX->sb[i]>EX->sb[i])?0xFF:0x00; + break; + case 0x65: /* PCMPGTW Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<8; ++i) + GX->uw[i] = (GX->sw[i]>EX->sw[i])?0xFFFF:0x0000; + break; + case 0x66: /* PCMPGTD Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<4; ++i) + GX->ud[i] = (GX->sd[i]>EX->sd[i])?0xFFFFFFFF:0x00000000; + break; + case 0x67: /* PACKUSWB Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + if(GX==EX) { + for(int i=0; i<8; ++i) + GX->ub[i] = (EX->sw[i]<0)?0:((EX->sw[i]>0xff)?0xff:EX->sw[i]); + GX->q[1] = GX->q[0]; + } else { + for(int i=0; i<8; ++i) + GX->ub[i] = (GX->sw[i]<0)?0:((GX->sw[i]>0xff)?0xff:GX->sw[i]); + for(int i=0; i<8; ++i) + GX->ub[8+i] = (EX->sw[i]<0)?0:((EX->sw[i]>0xff)?0xff:EX->sw[i]); + } + break; + case 0x68: /* PUNPCKHBW Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<8; ++i) + GX->ub[2 * i] = GX->ub[i + 8]; + if(GX==EX) + for(int i=0; i<8; ++i) + GX->ub[2 * i + 1] = GX->ub[2 * i]; + else + for(int i=0; i<8; ++i) + GX->ub[2 * i + 1] = EX->ub[i + 8]; + break; + case 0x69: /* PUNPCKHWD Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=0; i<4; ++i) + GX->uw[2 * i] = GX->uw[i + 4]; + if(GX==EX) + for(int i=0; i<4; ++i) + GX->uw[2 * i + 1] = GX->uw[2 * i]; + else + for(int i=0; i<4; ++i) + GX->uw[2 * i + 1] = EX->uw[i + 4]; + break; + case 0x6A: /* PUNPCKHDQ Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + // no copy needed if GX==EX + GX->ud[0] = GX->ud[2]; + GX->ud[1] = EX->ud[2]; + GX->ud[2] = GX->ud[3]; + GX->ud[3] = EX->ud[3]; + break; + case 0x6B: /* PACKSSDW Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + if(GX==EX) { + for(int i=0; i<4; ++i) + GX->sw[i] = (EX->sd[i]<-32768)?-32768:((EX->sd[i]>32767)?32767:EX->sd[i]); + GX->q[1] = GX->q[0]; + } else { + for(int i=0; i<4; ++i) + GX->sw[i] = (GX->sd[i]<-32768)?-32768:((GX->sd[i]>32767)?32767:GX->sd[i]); + for(int i=0; i<4; ++i) + GX->sw[4+i] = (EX->sd[i]<-32768)?-32768:((EX->sd[i]>32767)?32767:EX->sd[i]); + } + break; + case 0x6C: /* PUNPCKLQDQ Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->q[1] = EX->q[0]; + break; + case 0x6D: /* PUNPCKHQDQ Gx,Ex */ + nextop = F8; + GETEX(0); + GETGX; + GX->q[0] = GX->q[1]; + GX->q[1] = EX->q[1]; + break; case 0x6E: /* MOVD Gx, Ed */ nextop = F8; GETED(0); |