diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-31 16:55:08 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-31 16:55:08 +0200 |
| commit | 74b70253b25328f171f11bd2776dadb553cefc84 (patch) | |
| tree | 71efeae2480b918d2cfe0a6e014ab8eb234a8e05 /src | |
| parent | 0343ee119c07b2ac15162e20a92956ec0abeed99 (diff) | |
| download | box64-74b70253b25328f171f11bd2776dadb553cefc84.tar.gz box64-74b70253b25328f171f11bd2776dadb553cefc84.zip | |
[DYNAREC] Added 0F 60/61/62 opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c index c93590e2..c528e99e 100755 --- a/src/dynarec/dynarec_arm64_0f.c +++ b/src/dynarec/dynarec_arm64_0f.c @@ -44,20 +44,22 @@ VLDR128_U12(a, ed, fixedaddress); \ } -#define GETGM(a) \ - gd = ((nextop&0x38)>>3); \ +#define GETGM(a) \ + gd = ((nextop&0x38)>>3); \ a = mmx_get_reg(dyn, ninst, x1, gd) -#define GETEM(a, D) \ - if(MODREG) { \ - a = mmx_get_reg(dyn, ninst, x1, (nextop&7)); \ + +#define GETEM(a, D) \ + if(MODREG) { \ + a = mmx_get_reg(dyn, ninst, x1, (nextop&7));\ } else { \ - addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0); \ - a = fpu_get_scratch_double(dyn); \ - VLD1_64(a, ed); \ + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, 0, D); \ + a = fpu_get_scratch(dyn); \ + VLDR64_U12(a, ed, fixedaddress); \ } -#define PUTEM(a) \ - if(!MODREG) { \ - VST1_64(a, ed); \ + +#define PUTEM(a) \ + if(!MODREG) { \ + VSTR64_U12(a, ed, fixedaddress); \ } uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog) @@ -70,7 +72,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin uint8_t eb1, eb2; int v0, v1; int q0, q1; - int d0; + int d0, d1; int s0; int fixedaddress; MAYUSE(s0); @@ -79,6 +81,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MAYUSE(v0); MAYUSE(v1); MAYUSE(d0); + MAYUSE(d1); MAYUSE(eb2); MAYUSE(eb1); MAYUSE(wb2); @@ -387,6 +390,27 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETEX(v1, 0); VFMAXQD(v0, v0, v1); break; + case 0x60: + INST_NAME("PUNPCKLBW Gm,Em"); + nextop = F8; + GETGM(d0); + GETEM(d1, 0); + VZIP1_8(d0, d0, d1); + break; + case 0x61: + INST_NAME("PUNPCKLWD Gm,Em"); + nextop = F8; + GETGM(d0); + GETEM(d1, 0); + VZIP1_16(d0, d0, d1); + break; + case 0x62: + INST_NAME("PUNPCKLDQ Gm,Em"); + nextop = F8; + GETGM(d0); + GETEM(d1, 0); + VZIP1_32(d0, d0, d1); + break; case 0x6E: INST_NAME("MOVD Gm, Ed"); |