diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-05-17 20:42:36 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-05-17 20:42:36 +0200 |
| commit | 727178df574fab93a029c608e022fbbd5fc5a4a3 (patch) | |
| tree | 205af8db7bf9afedf9d931f2cbd4957dfaa3afc2 | |
| parent | 66b3303f2218fb9711e52148b0a6e2bfd680bc50 (diff) | |
| download | box64-727178df574fab93a029c608e022fbbd5fc5a4a3.tar.gz box64-727178df574fab93a029c608e022fbbd5fc5a4a3.zip | |
[DYNAREC] Added 0F 50/52/53 opcodes
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c index 2e41435f..3df73d30 100755 --- a/src/dynarec/dynarec_arm64_0f.c +++ b/src/dynarec/dynarec_arm64_0f.c @@ -347,7 +347,39 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GOCOND(0x40, "CMOV", "Gd, Ed"); #undef GO - + case 0x50: + INST_NAME("MOVMSPKPS Gd, Ex"); + nextop = F8; + GETGD; + MOV32w(gd, 0); + if((nextop&0xC0)==0xC0) { + // EX is an xmm reg + GETEX(q0, 0); + VMOVQDto(x1, q0, 0); + LSRx(x1, x1, 31); + BFIx(gd, x1, 0, 1); + LSRx(x1, x1, 32); + BFIx(gd, x1, 1, 1); + VMOVQDto(x1, q0, 1); + LSRx(x1, x1, 31); + BFIx(gd, x1, 2, 1); + LSRx(x1, x1, 32); + BFIx(gd, x1, 3, 1); + } else { + // EX is memory + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, (0xfff<<3)-8, 7, rex, 0, 0); + LDRx_U12(x1, ed, fixedaddress+0); + LSRx(x1, x1, 31); + BFIx(gd, x1, 0, 1); + LSRx(x1, x1, 32); + BFIx(gd, x1, 1, 1); + LDRx_U12(x1, ed, fixedaddress+8); + LSRx(x1, x1, 31); + BFIx(gd, x1, 2, 1); + LSRx(x1, x1, 32); + BFIx(gd, x1, 3, 1); + } + break; case 0x51: INST_NAME("SQRTPS Gx, Ex"); nextop = F8; @@ -355,7 +387,36 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETGX_empty(v0); VFSQRTQS(v0, q0); break; - + case 0x52: + INST_NAME("RSQRTPS Gx, Ex"); + nextop = F8; + GETEX(q0, 0); + GETGX_empty(q1); + v0 = fpu_get_scratch(dyn); + // more precise + if(q1==q0) + v1 = fpu_get_scratch(dyn); + else + v1 = q1; + VFRSQRTEQS(v0, q0); + VFMULQS(v1, v0, q0); + VFRSQRTSQS(v1, v1, v0); + VFMULQS(q1, v1, v0); + break; + case 0x53: + INST_NAME("RCPPS Gx, Ex"); + nextop = F8; + GETEX(q0, 0); + GETGX_empty(q1); + if(q0 == q1) + v1 = fpu_get_scratch(dyn); + else + v1 = q1; + v0 = fpu_get_scratch(dyn); + VFRECPEQS(v0, q0); + VFRECPSQS(v1, v0, q0); + VFMULQS(q1, v0, v1); + break; case 0x54: INST_NAME("ANDPS Gx, Ex"); nextop = F8; |