diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-21 15:27:45 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-21 15:27:45 +0100 |
| commit | 34eea95426fe87fe1871132b85386a0b36366ece (patch) | |
| tree | d443d7286bd1efeed803d19695dfe7e56d21adbf | |
| parent | 5f470be79e1ef446daaf54793ed2af2294956343 (diff) | |
| download | box64-34eea95426fe87fe1871132b85386a0b36366ece.tar.gz box64-34eea95426fe87fe1871132b85386a0b36366ece.zip | |
[DYNAREC] Fixed F2 0F opcodes (NEON reset high part of vector, SSE doesn't)
| -rwxr-xr-x | src/dynarec/dynarec_arm64_f20f.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/dynarec/dynarec_arm64_f20f.c b/src/dynarec/dynarec_arm64_f20f.c index 18a0f03d..2c5ed5bc 100755 --- a/src/dynarec/dynarec_arm64_f20f.c +++ b/src/dynarec/dynarec_arm64_f20f.c @@ -51,7 +51,7 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n uint8_t eb1, eb2; int v0, v1; int q0, q1; - int d0; + int d0, d1; int s0; int fixedaddress; int parity; @@ -102,8 +102,10 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n nextop = F8; GETGX; v0 = sse_get_reg(dyn, ninst, x1, gd); + d1 = fpu_get_scratch(dyn); GETEX(d0, 0); - FSQRTD(v0, d0); + FSQRTD(d1, d0); + VMOVeD(v0, 0, d1, 0); break; case 0x58: @@ -111,16 +113,20 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n nextop = F8; GETGX; v0 = sse_get_reg(dyn, ninst, x1, gd); + d1 = fpu_get_scratch(dyn); GETEX(d0, 0); - FADDD(v0, v0, d0); + FADDD(d1, v0, d0); // the high part of the vector is erased... + VMOVeD(v0, 0, d1, 0); break; case 0x59: INST_NAME("MULSD Gx, Ex"); nextop = F8; GETGX; v0 = sse_get_reg(dyn, ninst, x1, gd); + d1 = fpu_get_scratch(dyn); GETEX(d0, 0); - FMULD(v0, v0, d0); + FMULD(d1, v0, d0); + VMOVeD(v0, 0, d1, 0); break; case 0x5C: @@ -128,8 +134,10 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n nextop = F8; GETGX; v0 = sse_get_reg(dyn, ninst, x1, gd); + d1 = fpu_get_scratch(dyn); GETEX(d0, 0); - FSUBD(v0, v0, d0); + FSUBD(d1, v0, d0); + VMOVeD(v0, 0, d1, 0); break; case 0x5E: @@ -137,8 +145,10 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n nextop = F8; GETGX; v0 = sse_get_reg(dyn, ninst, x1, gd); + d1 = fpu_get_scratch(dyn); GETEX(d0, 0); - FDIVD(v0, v0, d0); + FDIVD(d1, v0, d0); + VMOVeD(v0, 0, d1, 0); break; default: |