about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-22 19:22:28 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-22 19:22:28 +0100
commitf81057416b41a11aa17cbcd864ef2a1bb13e102e (patch)
tree7feec6ef094e68986bba69354423b6bb1f3aac9c /src
parent168675d380ab8591716b3594d12c812eb9af3ba7 (diff)
downloadbox64-f81057416b41a11aa17cbcd864ef2a1bb13e102e.tar.gz
box64-f81057416b41a11aa17cbcd864ef2a1bb13e102e.zip
[ARM64_DYNAREC] Fixed 0F 38 CD opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 7565c924..ae874bb0 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -706,13 +706,14 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         GETEX(q1, 0, 0);

                         v0 = fpu_get_scratch(dyn);

                         v1 = fpu_get_scratch(dyn);

+                        d0 = fpu_get_scratch(dyn);

                         VEORQ(v1, v1, v1);

                         VMOVQ(v0, q0);

-                        SHA256SU1(v0, v1, q1);  // low v0 are ok

-                        VTRNQ1_64(v0, v0, v0);  // duplicate low to hi

-                        VEXTQ_8(d0, q0, q0, 8); // swap high/low

-                        SHA256SU1(d0, v1, v0);  // low is destination high

-                        VEXTQ_8(q0, v0, d0, 8);

+                        SHA256SU1(v0, v1, q1);  // low v0 are ok and also need to be feed again SHA256SU1 to get the high part

+                        VTRNQ1_64(d0, v0, v0);  // duplicate low to hi

+                        VEXTQ_8(q0, q0, q0, 8); // invert low/high now

+                        SHA256SU1(q0, v1, d0);  // low is destination high

+                        VEXTQ_8(q0, d0, q0, 8);

                     } else {

                         if(MODREG) {

                             ed = (nextop&7)+(rex.b<<3);