diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-22 16:14:59 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-22 16:14:59 +0100 |
| commit | 735d9c107d5054019ef89367256a6df1a01edda7 (patch) | |
| tree | 3629b0930f7528b7011435982dd817791fb0606f /src | |
| parent | daf148c4d628fe52a94b3a020a951e0f29074277 (diff) | |
| download | box64-735d9c107d5054019ef89367256a6df1a01edda7.tar.gz box64-735d9c107d5054019ef89367256a6df1a01edda7.zip | |
[DYNAREC] Added F2 0F 5A opcode
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64_emitter.h | 4 | ||||
| -rwxr-xr-x | src/dynarec/arm64_printer.c | 9 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_f20f.c | 9 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h index 7313854a..4d39a2d3 100755 --- a/src/dynarec/arm64_emitter.h +++ b/src/dynarec/arm64_emitter.h @@ -843,6 +843,10 @@ #define VFCVTZUQS(Vd, Vn) EMIT(FCVT2_vector(1, 1, 1, 0, 1, Vn, Vd)) #define VFCVTZUQD(Vd, Vn) EMIT(FCVT2_vector(1, 1, 1, 1, 1, Vn, Vd)) +#define FCVT_precision(type, opc, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | 0b0001<<17 | (opc)<<15 | 0b10000<<10 | (Rn)<<5 | (Rd)) +#define FCVT_D_S(Dd, Sn) EMIT(FCVT_precision(0b00, 0b01, Sn, Dd)) +#define FCVT_S_D(Sd, Dn) EMIT(FCVT_precision(0b01, 0b00, Dn, Sd)) + #define SCVTF_scalar(sf, type, rmode, opcode, Rn, Rd) ((sf)<<31 | 0b11110<<24 | (type)<<22 | 1<<21 | (rmode)<<19 | (opcode)<<16 | (Rn)<<5 | (Rd)) #define SCVTSw(Sd, Wn) EMIT(SCVTF_scalar(0, 0b00, 0b00, 0b010, Wn, Sd)) #define SCVTDw(Dd, Wn) EMIT(SCVTF_scalar(0, 0b00, 0b01, 0b010, Wn, Dd)) diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c index e217726e..4a4e8247 100755 --- a/src/dynarec/arm64_printer.c +++ b/src/dynarec/arm64_printer.c @@ -945,6 +945,15 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) return buff; } + if(isMask(opcode, "0001111000100010110000nnnnnddddd", &a)) { + snprintf(buff, sizeof(buff), "FCVT D%d, S%d", Rd, Rn); + return buff; + } + if(isMask(opcode, "0001111001100010010000nnnnnddddd", &a)) { + snprintf(buff, sizeof(buff), "FCVT S%d, D%d", Rd, Rn); + return buff; + } + // FMOV if(isMask(opcode, "00011110pp100000010000nnnnnddddd", &a)) { int type = a.p; diff --git a/src/dynarec/dynarec_arm64_f20f.c b/src/dynarec/dynarec_arm64_f20f.c index 906f8bc8..82388dd4 100755 --- a/src/dynarec/dynarec_arm64_f20f.c +++ b/src/dynarec/dynarec_arm64_f20f.c @@ -127,6 +127,15 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n FMULD(d1, v0, d0); VMOVeD(v0, 0, d1, 0); break; + case 0x5A: + INST_NAME("CVTSD2SS Gx, Ex"); + nextop = F8; + GETGX(v0); + GETEX(d0, 0); + d1 = fpu_get_scratch(dyn); + FCVT_D_S(d1, d0); + VMOVeS(v0, 0, d1, 0); + break; case 0x5C: INST_NAME("SUBSD Gx, Ex"); |