diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-21 14:11:57 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-21 14:11:57 +0100 |
| commit | cd8ee4c4b499393a3c35324e176227960a5d216e (patch) | |
| tree | 672a43cd2be1c80e3769df88793f837099cb485e | |
| parent | c253e4a48eb261c7593dc6cbf65972b7a33232ee (diff) | |
| download | box64-cd8ee4c4b499393a3c35324e176227960a5d216e.tar.gz box64-cd8ee4c4b499393a3c35324e176227960a5d216e.zip | |
[DYNAREC] Added F2 0F 59 opcode
| -rwxr-xr-x | src/dynarec/arm64_emitter.h | 30 | ||||
| -rwxr-xr-x | src/dynarec/arm64_printer.c | 14 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_f20f.c | 8 |
3 files changed, 41 insertions, 11 deletions
diff --git a/src/dynarec/arm64_emitter.h b/src/dynarec/arm64_emitter.h index fd757fb7..394a9042 100755 --- a/src/dynarec/arm64_emitter.h +++ b/src/dynarec/arm64_emitter.h @@ -597,23 +597,31 @@ #define VMOVQ(Vd, Vn) EMIT(ORR_vector(1, Vn, Vn, Vd)) #define VMOV(Dd, Dn) EMIT(ORR_vector(0, Dn, Dn, Dd)) -// ADD -#define FADD_vector(Q, U, sz, Rm, Rn, Rd) ((Q)<<30 | (U)<<29 | 0b01110<<24 | (sz)<<22 | 1<<21 | (Rm)<<16 | 0b11010<<11 | 1<<10 | (Rn)<<5 | (Rd)) -#define VFADDQS(Vd, Vn, Vm) EMIT(FADD_vector(1, 0, 0, Vm, Vn, Vd)) -#define VFADDQD(Vd, Vn, Vm) EMIT(FADD_vector(1, 0, 1, Vm, Vn, Vd)) -#define VFADDS(Dd, Dn, Dm) EMIT(FADD_vector(0, 0, 0, Dm, Dn, Dd)) +// ADD / SUB +#define FADDSUB_vector(Q, U, op, sz, Rm, Rn, Rd) ((Q)<<30 | (U)<<29 | 0b01110<<24 | (op)<<23 | (sz)<<22 | 1<<21 | (Rm)<<16 | 0b11010<<11 | 1<<10 | (Rn)<<5 | (Rd)) +#define VFADDQS(Vd, Vn, Vm) EMIT(FADDSUB_vector(1, 0, 0, 0, Vm, Vn, Vd)) +#define VFADDQD(Vd, Vn, Vm) EMIT(FADDSUB_vector(1, 0, 0, 1, Vm, Vn, Vd)) +#define VFADDS(Dd, Dn, Dm) EMIT(FADDSUB_vector(0, 0, 0, 0, Dm, Dn, Dd)) + +#define VFSUBQS(Vd, Vn, Vm) EMIT(FADDSUB_vector(1, 0, 1, 0, Vm, Vn, Vd)) +#define VFSUBQD(Vd, Vn, Vm) EMIT(FADDSUB_vector(1, 0, 1, 1, Vm, Vn, Vd)) +#define VFSUBS(Dd, Dn, Dm) EMIT(FADDSUB_vector(0, 0, 1, 0, Dm, Dn, Dd)) #define FADDSUB_scalar(type, Rm, op, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | (Rm)<<16 | 0b001<<13 | (op)<<12 | 0b10<<10 | (Rn)<<5 | (Rd)) #define FADDS(Sd, Sn, Sm) EMIT(FADDSUB_scalar(0b00, Sm, 0, Sn, Sd)) #define FADDD(Dd, Dn, Dm) EMIT(FADDSUB_scalar(0b01, Dm, 0, Dn, Dd)) -// SUB -#define FSUB_vector(Q, U, sz, Rm, Rn, Rd) ((Q)<<30 | (U)<<29 | 0b01110<<24 | 1<<23 | (sz)<<22 | 1<<21 | (Rm)<<16 | 0b11010<<11 | 1<<10 | (Rn)<<5 | (Rd)) -#define VFSUBQS(Vd, Vn, Vm) EMIT(FSUB_vector(1, 0, 0, Vm, Vn, Vd)) -#define VFSUBQD(Vd, Vn, Vm) EMIT(FSUB_vector(1, 0, 1, Vm, Vn, Vd)) -#define VFSUBS(Dd, Dn, Dm) EMIT(FSUB_vector(0, 0, 0, Dm, Dn, Dd)) - #define FSUBS(Sd, Sn, Sm) EMIT(FADDSUB_scalar(0b00, Sm, 1, Sn, Sd)) #define FSUBD(Dd, Dn, Dm) EMIT(FADDSUB_scalar(0b01, Dm, 1, Dn, Dd)) +// MUL +#define FMUL_vector(Q, sz, Rm, Rn, Rd) ((Q)<<30 | 1<<29 | 0b01110<<24 | (sz)<<22 | 1<<21 | (Rm)<<16 | 0b011<<11 | 1<<10 | (Rn)<<5 | (Rd)) +#define VFMULS(Sd, Sn, Sm) EMIT(FMUL_vector(0, 0, Sm, Sn, Sd)) +#define VFMULQS(Sd, Sn, Sm) EMIT(FMUL_vector(1, 0, Sm, Sn, Sd)) +#define VFMULQD(Sd, Sn, Sm) EMIT(FMUL_vector(1, 1, Sm, Sn, Sd)) + +#define FMUL_scalar(type, Rm, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | (Rm)<<16 | 0b10<<10 | (Rn)<<5 | Rd) +#define FMULS(Sd, Sn, Sm) EMIT(FMUL_scalar(0b00, Sm, Sn, Sd)) +#define FMULD(Dd, Dn, Dm) EMIT(FMUL_scalar(0b01, Dm, Dn, Dd)) + #endif //__ARM64_EMITTER_H__ diff --git a/src/dynarec/arm64_printer.c b/src/dynarec/arm64_printer.c index 6a7c2f58..4f161ba0 100755 --- a/src/dynarec/arm64_printer.c +++ b/src/dynarec/arm64_printer.c @@ -814,6 +814,20 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) return buff; } + // FMUL + if(isMask(opcode, "0Q1011100f1mmmmm110111nnnnnddddd", &a)) { + char s = a.Q?'V':'D'; + char d = sf?'D':'S'; + int n = (a.Q && !sf)?4:2; + snprintf(buff, sizeof(buff), "VFMUL %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, "00011110ff1mmmmm000010nnnnnddddd", &a)) { + char s = (sf==0)?'S':((sf==1)?'D':'?'); + snprintf(buff, sizeof(buff), "FMUL %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 469cc687..b2503708 100755 --- a/src/dynarec/dynarec_arm64_f20f.c +++ b/src/dynarec/dynarec_arm64_f20f.c @@ -105,6 +105,14 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n GETEX(d0, 0); FADDD(v0, v0, d0); break; + case 0x59: + INST_NAME("MULSD Gx, Ex"); + nextop = F8; + GETGX; + v0 = sse_get_reg(dyn, ninst, x1, gd); + GETEX(d0, 0); + FMULD(v0, v0, d0); + break; case 0x5C: INST_NAME("SUBSD Gx, Ex"); |