diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64runavx660f38.c | 53 | ||||
| -rw-r--r-- | src/emu/x64runavx660f3a.c | 55 |
2 files changed, 108 insertions, 0 deletions
diff --git a/src/emu/x64runavx660f38.c b/src/emu/x64runavx660f38.c index c2ef2965..53a8e345 100644 --- a/src/emu/x64runavx660f38.c +++ b/src/emu/x64runavx660f38.c @@ -351,6 +351,32 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) } break; + case 0x58: /* VPBROADCASTD Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GETGY; + for(int i=0; i<4; ++i) + GX->ud[i] = EX->ud[0]; + if(vex.l) + for(int i=0; i<4; ++i) + GY->ud[i] = EX->ud[0]; + else + GY->u128 = 0; + break; + case 0x59: /* VPBROADCASTQ Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GETGY; + for(int i=0; i<2; ++i) + GX->q[i] = EX->q[0]; + if(vex.l) + for(int i=0; i<2; ++i) + GY->q[i] = EX->q[0]; + else + GY->u128 = 0; + break; case 0x5A: /* VBROADCASTI128 Gx, Ex */ nextop = F8; GETEX(0); @@ -360,6 +386,33 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GY->u128 = EX->u128; break; + case 0x78: /* VPBROADCASTB Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GETGY; + for(int i=0; i<16; ++i) + GX->ub[i] = EX->ub[0]; + if(vex.l) + for(int i=0; i<16; ++i) + GY->ub[i] = EX->ub[0]; + else + GY->u128 = 0; + break; + case 0x79: /* VPBROADCASTW Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + GETGY; + for(int i=0; i<8; ++i) + GX->uw[i] = EX->uw[0]; + if(vex.l) + for(int i=0; i<8; ++i) + GY->uw[i] = EX->uw[0]; + else + GY->u128 = 0; + break; + case 0x92: /* VGATHERDPD/VGATHERDPS Gx, VSIB, Vx */ nextop = F8; if(((nextop&7)!=4) || MODREG) { diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c index 61217ec3..16d10af0 100644 --- a/src/emu/x64runavx660f3a.c +++ b/src/emu/x64runavx660f3a.c @@ -90,6 +90,24 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) switch(opcode) { + case 0x02: /* VBLENDD Gx, Vx, Ex, u8 */ + nextop = F8; + GETEX(1); + GETGX; + GETVX; + GETGY; + tmp8u = F8; + for(int i=0; i<4; ++i) + GX->ud[i] = (tmp8u&(1<<i))?EX->ud[i]:VX->ud[i]; + if(vex.l) { + GETEY; + GETVY; + for(int i=0; i<4; ++i) + GY->ud[i] = (tmp8u&(1<<(i+4)))?EY->ud[i]:VY->ud[i]; + } else + GY->u128 = 0; + break; + case 0x0C: /* VBLENDPS Gx, Vx, Ex, u8 */ nextop = F8; GETEX(1); @@ -124,6 +142,23 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) } else GY->u128 = 0; break; + case 0x0E: /* VBLENDW Gx, Vx, Ex, u8 */ + nextop = F8; + GETEX(1); + GETGX; + GETVX; + GETGY; + tmp8u = F8; + for(int i=0; i<8; ++i) + GX->uw[i] = (tmp8u&(1<<i))?EX->uw[i]:VX->uw[i]; + if(vex.l) { + GETEY; + GETVY; + for(int i=0; i<8; ++i) + GY->uw[i] = (tmp8u&(1<<i))?EY->uw[i]:VY->uw[i]; + } else + GY->u128 = 0; + break; case 0x0F: /* VPALIGNR GX, VX, EX, u8 */ nextop = F8; GETEX(1); @@ -413,6 +448,26 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) } else GY->u128 = 0; break; + case 0x4C: /* VBLENDPVB Gx, Vx, Ex, XMM/u8 */ + nextop = F8; + GETEX(1); + GETGX; + GETVX; + GETGY; + tmp8u = F8; + tmp8u>>=4; + if(rex.is32bits) + tmp8u&=7; + for(int i=0; i<16; ++i) + GX->ub[i] = (emu->xmm[tmp8u].ub[i]&0x80)?EX->ub[i]:VX->ub[i]; + if(vex.l) { + GETEY; + GETVY; + for(int i=0; i<16; ++i) + GY->ub[i] = (emu->ymm[tmp8u].ub[i]&0x80)?EY->ub[i]:VY->ub[i]; + } else + GY->u128 = 0; + break; case 0xDF: // VAESKEYGENASSIST Gx, Ex, u8 nextop = F8; |