From 4c7ac85ae885b61fe8c30daf9b7aba7886ee3f82 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 21 Nov 2023 18:01:41 +0100 Subject: [ARM64_DYNAREC] Added full support for SHA cpu extension, using SHA1/SHA2 extension if present --- src/dynarec/arm64/arm64_emitter.h | 38 +++++- src/dynarec/arm64/arm64_printer.c | 57 ++++++++ src/dynarec/arm64/dynarec_arm64_0f.c | 248 +++++++++++++++++++++++++++++++++++ 3 files changed, 342 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h index 23842f28..8a828d00 100644 --- a/src/dynarec/arm64/arm64_emitter.h +++ b/src/dynarec/arm64/arm64_emitter.h @@ -1497,7 +1497,6 @@ #define VTRNQ1_32(Vd, Vn, Vm) EMIT(TRN_gen(1, 0b10, Vm, 0, Vn, Vd)) #define VTRNQ1_16(Vd, Vn, Vm) EMIT(TRN_gen(1, 0b01, Vm, 0, Vn, Vd)) #define VTRNQ1_8(Vd, Vn, Vm) EMIT(TRN_gen(1, 0b00, Vm, 0, Vn, Vd)) -#define VSWP(Vd, Vn) VTRNQ1_64(Vd, Vn, Vn) #define VTRNQ2_64(Vd, Vn, Vm) EMIT(TRN_gen(1, 0b11, Vm, 1, Vn, Vd)) #define VTRNQ2_32(Vd, Vn, Vm) EMIT(TRN_gen(1, 0b10, Vm, 1, Vn, Vd)) #define VTRNQ2_16(Vd, Vn, Vm) EMIT(TRN_gen(1, 0b01, Vm, 1, Vn, Vd)) @@ -2167,4 +2166,41 @@ #define CRC32CX(Wd, Wn, Xm) EMIT(CRC32C_gen(1, Xm, 0b11, Wn, Wd)) #define CRC32Cxw(Wd, Wn, Rm) EMIT(CRC32C_gen(rex.w, Rm, 0b10|rex.w, Wn, Wd)) +// SHA1 extension +#define SHA1H_gen(Rn, Rd) (0b01011110<<24 | 0b10100<<17 | 0b10<<10 | (Rn)<<5 | (Rd)) +// SHA1 fixed rotate (ROL 30 of 32bits value) +#define SHA1H(Sd, Sn) EMIT(SHA1H_gen(Sn, Sd)) + +#define SHA1SU1_gen(Rn, Rd) (0b01011110<<24 | 0b10100<<17 | 0b00001<<12 | 0b10<<10 | (Rn)<<5 | (Rd)) +// SHA1 schedule update 1 +#define SHA1SU1(Vd, Vn) EMIT(SHA1SU1_gen(Vn, Vd)) + +#define SHA1C_gen(Rm, Rn, Rd) (0b01011110<<24 | (Rm)<<16 | (Rn)<<5 | (Rd)) +// SHA1 hash update (choose) +#define SHA1C(Qd, Sn, Vm) EMIT(SHA1C_gen(Vm, Sn, Qd)) + +#define SHA1M_gen(Rm, Rn, Rd) (0b01011110<<24 | (Rm)<<16 | 0b010<<12 | (Rn)<<5 | (Rd)) +// SHA1 hash update (majority) +#define SHA1M(Qd, Sn, Vm) EMIT(SHA1M_gen(Vm, Sn, Qd)) + +#define SHA1P_gen(Rm, Rn, Rd) (0b01011110<<24 | (Rm)<<16 | 0b001<<12 | (Rn)<<5 | (Rd)) +// SHA1 hash update (parity) +#define SHA1P(Qd, Sn, Vm) EMIT(SHA1P_gen(Vm, Sn, Qd)) + +#define SHA256SU0_gen(Rn,Rd) (0b01011110<<24 | 0b10100<<17 | 0b00010<<12 | 0b10<<10 | (Rn)<<5 | (Rd)) +//SHA256 schedule update 0 +#define SHA256SU0(Vd, Vn) EMIT(SHA256SU0_gen(Vn, Vd)) + +#define SHA256SU1_gen(Rm, Rn, Rd) (0b01011110<<24 | (Rm)<<16 | 0b110<<12 | (Rn)<<5 | (Rd)) +//SHA256 schedule update 1 +#define SHA256SU1(Vd, Vn, Vm) EMIT(SHA256SU1_gen(Vm, Vn, Vd)) + +#define SHA256H_gen(Rm, Rn, Rd) (0b01011110<<24 | (Rm)<<16 | 0b100<<12 | (Rn)<<5 | (Rd)) +//SHA256 hash update (part 1) +#define SHA256H(Vd, Vn, Vm) EMIT(SHA256H_gen(Vm, Vn, Vd)) + +#define SHA256H2_gen(Rm, Rn, Rd) (0b01011110<<24 | (Rm)<<16 | 0b101<<12 | (Rn)<<5 | (Rd)) +//SHA256 hash update (part 2) +#define SHA256H2(Vd, Vn, Vm) EMIT(SHA256H2_gen(Vm, Vn, Vd)) + #endif //__ARM64_EMITTER_H__ diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c index f8d09c89..eca8c632 100644 --- a/src/dynarec/arm64/arm64_printer.c +++ b/src/dynarec/arm64/arm64_printer.c @@ -1692,6 +1692,63 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) snprintf(buff, sizeof(buff), "SETF%d %s", 8<