diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-06-02 20:31:32 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-06-02 20:31:32 +0200 |
| commit | 1c9123637a2464023615598773ac46c87711fda9 (patch) | |
| tree | 77184e1b0273d26dc0128db8572d907c51fb0344 /src | |
| parent | f1f690552fc5c2d1a1db12afa2bbfcfe4300e49d (diff) | |
| download | box64-1c9123637a2464023615598773ac46c87711fda9.tar.gz box64-1c9123637a2464023615598773ac46c87711fda9.zip | |
[ARM64_DYNAREC] Added AVX.F3.0F 52, AVX.66.0F E4 and AVX.0F 52 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_0f.c | 22 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f.c | 14 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c | 23 |
3 files changed, 59 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_0f.c index b8d21d9e..fd579eb4 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_0f.c @@ -260,6 +260,28 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int FCOMI(x1, x2); break; + case 0x52: + INST_NAME("VRSQRTPS Gx, Ex"); + nextop = F8; + SKIPTEST(x1); + v0 = fpu_get_scratch(dyn, ninst); + for(int l=0; l<1+vex.l; ++l) { + if(!l) { GETGX_empty_EX(q0, q1, 0); } else { GETGY_empty_EY(q0, q1); } + if(!l) { + if(q1==q0) + v1 = fpu_get_scratch(dyn, ninst); + else + v1 = q1; + } + // more precise + VFRSQRTEQS(v0, q1); + VFMULQS(v1, v0, q1); + VFRSQRTSQS(v1, v1, v0); + VFMULQS(q0, v1, v0); + } + if(!vex.l) YMM0(gd); + break; + case 0x54: INST_NAME("VANDPS Gx, Vx, Ex"); nextop = F8; diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c index 6e3bbe14..87566c1d 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c @@ -1229,6 +1229,20 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, if(!vex.l) YMM0(gd); break; + case 0xE4: + INST_NAME("VPMULHUW Gx, Vx, Ex"); + nextop = F8; + q0 = fpu_get_scratch(dyn, ninst); + q1 = fpu_get_scratch(dyn, ninst); + for(int l=0; l<1+vex.l; ++l) { + if(!l) { GETGX_empty_VXEX(v0, v2, v1, 0); } else { GETGY_empty_VYEY(v0, v2, v1); } + VUMULL_16(q0, v2, v1); + VUMULL2_16(q1, v2, v1); + UQSHRN_16(v0, q0, 16); + UQSHRN2_16(v0, q1, 16); + } + if(!vex.l) YMM0(gd); + break; case 0xE5: INST_NAME("VPMULHW Gx, Vx, Ex"); nextop = F8; diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c index 30e4ea24..ccf8c5f7 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c @@ -182,6 +182,29 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, } break; + case 0x52: + INST_NAME("VRSQRTSS Gx, Vx Ex"); + nextop = F8; + GETGX(v0, 1); + GETVX(v2, 0); + GETEXSS(v1, 0, 0); + d0 = fpu_get_scratch(dyn, ninst); + d1 = fpu_get_scratch(dyn, ninst); + // so here: F32: Imm8 = abcd efgh that gives => aBbbbbbc defgh000 00000000 00000000 + // and want 1.0f = 0x3f800000 + // so 00111111 10000000 00000000 00000000 + // a = 0, b = 1, c = 1, d = 1, efgh=0 + // 0b01110000 + FMOVS_8(d0, 0b01110000); + FSQRTS(d1, v1); + FDIVS(d0, d0, d1); + if(v0!=v2) { + VMOVQ(v0, v2); + } + VMOVeS(v0, 0, d0, 0); + YMM0(gd); + break; + case 0x58: INST_NAME("VADDSS Gx, Vx, Ex"); nextop = F8; |