diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64_emitter.h | 10 | ||||
| -rwxr-xr-x | src/dynarec/arm64_printer.c | 14 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_f20f.c | 9 |
3 files changed, 33 insertions, 0 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h index 394a9042..c3c58612 100755 --- a/src/dynarec/arm64_emitter.h +++ b/src/dynarec/arm64_emitter.h @@ -624,4 +624,14 @@ #define FMULS(Sd, Sn, Sm) EMIT(FMUL_scalar(0b00, Sm, Sn, Sd)) #define FMULD(Dd, Dn, Dm) EMIT(FMUL_scalar(0b01, Dm, Dn, Dd)) +// DIV +#define FDIV_vector(Q, sz, Rm, Rn, Rd) ((Q)<<30 | 1<<29 | 0b01110<<24 | (sz)<<22 | 1<<21 | (Rm)<<16 | 0b11111<<11 | 1<<10 | (Rn)<<5 | (Rd)) +#define VFDIVS(Sd, Sn, Sm) EMIT(FDIV_vector(0, 0, Sm, Sn, Sd)) +#define VFDIVQS(Sd, Sn, Sm) EMIT(FDIV_vector(1, 0, Sm, Sn, Sd)) +#define VFDIVQD(Sd, Sn, Sm) EMIT(FDIV_vector(1, 1, Sm, Sn, Sd)) + +#define FDIV_scalar(type, Rm, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | (Rm)<<16 | 0b0001<<12 | 0b10<<10 | (Rn)<<5 | Rd) +#define FDIVS(Sd, Sn, Sm) EMIT(FDIV_scalar(0b00, Sm, Sn, Sd)) +#define FDIVD(Dd, Dn, Dm) EMIT(FDIV_scalar(0b01, Dm, Dn, Dd)) + #endif //__ARM64_EMITTER_H__ diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c index 4f161ba0..57dca1a5 100755 --- a/src/dynarec/arm64_printer.c +++ b/src/dynarec/arm64_printer.c @@ -828,6 +828,20 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) return buff; } + // FDIV + if(isMask(opcode, "0Q1011100f1mmmmm111111nnnnnddddd", &a)) { + char s = a.Q?'V':'D'; + char d = sf?'D':'S'; + int n = (a.Q && !sf)?4:2; + snprintf(buff, sizeof(buff), "VFDIV %c%d.%d%c, %c%d.%d%c, %c%d.%c%d", s, Rd, n, d, s, Rn, n, d, s, Rm, s, d); + return buff; + } + if(isMask(opcode, "00011110ff1mmmmm000110nnnnnddddd", &a)) { + char s = (sf==0)?'S':((sf==1)?'D':'?'); + snprintf(buff, sizeof(buff), "FDIV %c%d, %c%d, %c%d", s, Rd, s, Rn, s, Rm); + return buff; + } + snprintf(buff, sizeof(buff), "%08X ???", __builtin_bswap32(opcode)); return buff; } \ No newline at end of file diff --git a/src/dynarec/dynarec_arm64_f20f.c b/src/dynarec/dynarec_arm64_f20f.c index b2503708..cea7c519 100755 --- a/src/dynarec/dynarec_arm64_f20f.c +++ b/src/dynarec/dynarec_arm64_f20f.c @@ -123,6 +123,15 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n FSUBD(v0, v0, d0); break; + case 0x5E: + INST_NAME("DIVSD Gx, Ex"); + nextop = F8; + GETGX; + v0 = sse_get_reg(dyn, ninst, x1, gd); + GETEX(d0, 0); + FDIVD(v0, v0, d0); + break; + default: DEFAULT; } |