diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_660f.c | 47 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 45 |
2 files changed, 91 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c index 25d8e6ee..45610ab0 100755 --- a/src/dynarec/dynarec_arm64_660f.c +++ b/src/dynarec/dynarec_arm64_660f.c @@ -264,6 +264,53 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n SQRDMULHQ_16(q0, q0, q1); break; + case 0x20: + INST_NAME("PMOVSXBW Gx, Ex"); // SSE4 opcode! + nextop = F8; + GETEX(q1, 0); + GETGX_empty(q0); + SXTL_8(q0, q1); // 8bits->16bits + break; + case 0x21: + INST_NAME("PMOVSXBD Gx, Ex"); // SSE4 opcode! + nextop = F8; + GETEX(q1, 0); + GETGX_empty(q0); + SXTL_8(q0, q1); // 8bits->16bits + SXTL_16(q0, q0); //16bits->32bits + break; + case 0x22: + INST_NAME("PMOVSXBQ Gx, Ex"); // SSE4 opcode! + nextop = F8; + GETEX(q1, 0); + GETGX_empty(q0); + SXTL_8(q0, q1); // 8bits->16bits + SXTL_16(q0, q0); //16bits->32bits + SXTL_32(q0, q0); //32bits->64bits + break; + case 0x23: + INST_NAME("PMOVSXWD Gx, Ex"); // SSE4 opcode! + nextop = F8; + GETEX(q1, 0); + GETGX_empty(q0); + SXTL_16(q0, q1); // 16bits->32bits + break; + case 0x24: + INST_NAME("PMOVSXWQ Gx, Ex"); // SSE4 opcode! + nextop = F8; + GETEX(q1, 0); + GETGX_empty(q0); + SXTL_16(q0, q1); // 16bits->32bits + SXTL_32(q0, q1); // 32bits->64bits + break; + case 0x25: + INST_NAME("PMOVSXDQ Gx, Ex"); // SSE4 opcode! + nextop = F8; + GETEX(q1, 0); + GETGX_empty(q0); + SXTL_32(q0, q1); // 32bits->64bits + break; + default: DEFAULT; } diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index be9b29ca..3b2ad0cf 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -256,7 +256,50 @@ int Run660F(x64emu_t *emu, rex_t rex) tmp32s = ((((int32_t)(GX->sw[i])*(int32_t)(EX->sw[i]))>>14) + 1)>>1; GX->uw[i] = tmp32s&0xffff; } - break; + break; + + case 0x20: /* PMOVSXBW Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=7; i>=0; --i) + GX->sw[i] = EX->sb[i]; + break; + case 0x21: /* PMOVSXBD Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=3; i>=0; --i) + GX->sd[i] = EX->sb[i]; + break; + case 0x22: /* PMOVSXBQ Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=1; i>=0; --i) + GX->sq[i] = EX->sb[i]; + break; + case 0x23: /* PMOVSXWD Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=3; i>=0; --i) + GX->sd[i] = EX->sw[i]; + break; + case 0x24: /* PMOVSXWQ Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=1; i>=0; --i) + GX->sq[i] = EX->sw[i]; + break; + case 0x25: /* PMOVSXDQ Gx, Ex */ + nextop = F8; + GETEX(0); + GETGX; + for(int i=1; i>=0; --i) + GX->sq[i] = EX->sd[i]; + break; default: return 1; |