diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-31 15:51:07 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-31 15:51:07 +0200 |
| commit | 34809e48d81db027b8f91d2167d6ea4db5a88e69 (patch) | |
| tree | 4728a80adbb85d83816cb0c2cbedf35ddd17e2e6 /src | |
| parent | 6749c2d1a6d1762b3a2ad87c0bc70a65359d1c08 (diff) | |
| download | box64-34809e48d81db027b8f91d2167d6ea4db5a88e69.tar.gz box64-34809e48d81db027b8f91d2167d6ea4db5a88e69.zip | |
[ARM64_DYNAREC] Some fixes to AVX opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f.c | 4 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c | 9 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c | 9 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 1 |
5 files changed, 17 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx.c b/src/dynarec/arm64/dynarec_arm64_avx.c index 56236005..14d79ad4 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx.c +++ b/src/dynarec/arm64/dynarec_arm64_avx.c @@ -59,8 +59,8 @@ uintptr_t dynarec64_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ni addr = dynarec64_AVX_66_0F3A(dyn, addr, ip, ninst, vex, ok, need_epilog); else {DEFAULT;} - if(*ok==-1) { - printf_log(LOG_INFO, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode); + if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing)) { + dynarec_log(LOG_NONE, "Dynarec unimplemented AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode); } return addr; } diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c index 7b1af9e2..06044df1 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c @@ -193,10 +193,10 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, GETGX_empty(v0); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 0); - VLD128(v0, ed, fixedaddress); + VLDR128_U12(v0, ed, fixedaddress); if(vex.l) { GETGY_empty(v0, -1, -1, -1); - VLD128(v0, ed, fixedaddress+16); + VLDR128_U12(v0, ed, fixedaddress+16); } } if(!vex.l) YMM0(gd); diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c index 14dfd263..e77eca69 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c @@ -115,8 +115,9 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip // create mask VSSHRQ_32(q0, v2, 31); VBITQ(v1, v0, q0); - if(!MODREG) + if(!MODREG) { VST128(v1, ed, fixedaddress); + } if(vex.l) { GETGYVYEY(v0, v2, v1); VSSHRQ_32(q0, v2, 31); @@ -133,14 +134,16 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip // create mask VSSHRQ_64(q0, v2, 63); VBITQ(v1, v0, q0); - if(!MODREG) + if(!MODREG) { VST128(v1, ed, fixedaddress); + } if(vex.l) { GETGYVYEY(v0, v2, v1); VSSHRQ_64(q0, v2, 63); VBITQ(v1, v0, q0); - if(!MODREG) + if(!MODREG) { VST128(v1, ed, fixedaddress+16); + } } break; diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c index c27310b6..ee1fa401 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c @@ -120,8 +120,9 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } u8 = F8; VMOVHto(ed, v0, u8&7); - if(!MODREG) + if(!MODREG) { STH(ed, wback, fixedaddress); + } break; case 0x16: INST_NAME("VPEXTRD/Q Ed, Gx, imm8"); @@ -140,8 +141,9 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } else { VMOVSto(ed, v0, u8&3); } - if(!MODREG) + if(!MODREG) { STxw(ed, wback, fixedaddress); + } break; case 0x17: INST_NAME("VEXTRACTPS Ed, Gx, imm8"); @@ -156,8 +158,9 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } u8 = F8; VMOVSto(ed, v0, u8&3); - if(!MODREG) + if(!MODREG) { STW(ed, wback, fixedaddress); + } break; case 0x18: INST_NAME("VINSERTF128 Gx, Vx, Ex, imm8"); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index e455acda..b72b4e99 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -517,6 +517,7 @@ } else { \ if(w) {WILLWRITE2();} else {SMREAD();} \ addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, D); \ + unscaled = 0; \ a = fpu_get_scratch(dyn, ninst); \ VLD128(a, ed, fixedaddress); \ } |