diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-06 09:29:58 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-06 09:29:58 +0200 |
| commit | cc269337f2178844da1c8103efb1bb9197019ef7 (patch) | |
| tree | bfada084c3a7756fa6e12bde6f40104bd8c2ee8d | |
| parent | a2aa5fc650f7e2d4e9400f76832b80689366f4af (diff) | |
| download | box64-cc269337f2178844da1c8103efb1bb9197019ef7.tar.gz box64-cc269337f2178844da1c8103efb1bb9197019ef7.zip | |
[DYNAREC] Added F3 0F 53 opcode (for CB15)
| -rwxr-xr-x | src/dynarec/dynarec_arm64_f30f.c | 17 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 6 |
2 files changed, 17 insertions, 6 deletions
diff --git a/src/dynarec/dynarec_arm64_f30f.c b/src/dynarec/dynarec_arm64_f30f.c index f398f23c..2df33bcf 100755 --- a/src/dynarec/dynarec_arm64_f30f.c +++ b/src/dynarec/dynarec_arm64_f30f.c @@ -184,17 +184,28 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 0x52: INST_NAME("RSQRTSS Gx, Ex"); nextop = F8; - GETGX(v0); GETEX(v1, 0); + GETGX_empty(v0); d0 = fpu_get_scratch(dyn); + d1 = fpu_get_scratch(dyn); // 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(v0, v1); - FDIVS(d0, d0, v0); + FSQRTS(d1, v1); + FDIVS(d0, d0, d1); + VMOVeS(v0, 0, d0, 0); + break; + case 0x53: + INST_NAME("RCPSS Gx, Ex"); + nextop = F8; + GETGX(v0); + GETEX(v1, 0); + d0 = fpu_get_scratch(dyn); + FMOVS_8(d0, 0b01110000); //1.0f + FDIVS(d0, d0, v1); VMOVeS(v0, 0, d0, 0); break; diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index 00a684e3..3b1ab667 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -254,21 +254,21 @@ int Run660F(x64emu_t *emu, rex_t rex) GETGX; for (int i=0; i<16; ++i) GX->sb[i] *= (EX->sb[i]<0)?-1:((EX->sb[i]>0)?1:0); - break; + break; case 0x09: /* PSIGNW Gx, Ex */ nextop = F8; GETEX(0); GETGX; for (int i=0; i<8; ++i) GX->sw[i] *= (EX->sw[i]<0)?-1:((EX->sw[i]>0)?1:0); - break; + break; case 0x0A: /* PSIGND Gx, Ex */ nextop = F8; GETEX(0); GETGX; for (int i=0; i<4; ++i) GX->sd[i] *= (EX->sd[i]<0)?-1:((EX->sd[i]>0)?1:0); - break; + break; case 0x0B: /* PMULHRSW Gx, Ex */ nextop = F8; GETEX(0); |