diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-10-18 18:50:51 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-10-18 18:50:51 +0200 |
| commit | 479cdb4218ae174b238f88ab28a2bd6f48c65923 (patch) | |
| tree | a45d27ab222e74bc3b99a91010d27823724731a8 /src | |
| parent | 6389ccee8d211ba630b7e37f0da7eb730288025f (diff) | |
| download | box64-479cdb4218ae174b238f88ab28a2bd6f48c65923.tar.gz box64-479cdb4218ae174b238f88ab28a2bd6f48c65923.zip | |
[ARM64_DYNAREC] More ARM64 extensions detection
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/arm64_emitter.h | 23 | ||||
| -rw-r--r-- | src/main.c | 15 |
2 files changed, 27 insertions, 11 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h index 4924f9c1..27a60114 100644 --- a/src/dynarec/arm64/arm64_emitter.h +++ b/src/dynarec/arm64/arm64_emitter.h @@ -1376,17 +1376,6 @@ #define FRINTIS(Sd, Sn) EMIT(FRINTI_scalar(0b00, Sn, Sd)) #define FRINTID(Dd, Dn) EMIT(FRINTI_scalar(0b01, Dn, Dd)) - -#define FRINTxx_scalar(type, op, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | 0b0100<<17 | (op)<<15 | 0b10000<<10 | (Rn)<<5 | (Rd)) -#define FRINT32ZS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b00, Sn, Sd)) -#define FRINT32ZD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b00, Dn, Dd)) -#define FRINT32XS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b01, Sn, Sd)) -#define FRINT32XD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b01, Dn, Dd)) -#define FRINT64ZS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b10, Sn, Sd)) -#define FRINT64ZD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b10, Dn, Dd)) -#define FRINT64XS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b11, Sn, Sd)) -#define FRINT64XD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b11, Dn, Dd)) - #define FRINT_scalar(type, rmode, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | 0b001<<18 | (rmode)<<15 | 0b10000<<10 | (Rn)<<5 | (Rd)) // round toward 0 (truncate) #define FRINTZS(Sd, Sn) EMIT(FRINT_scalar(0b00, 0b011, Sn, Sd)) @@ -2150,4 +2139,16 @@ // NZCV -> N=!C&!Z Z=Z&C C=C|Z V=!C&Z #define XAFLAG() EMIT(0b1101010100<<22 | 0b0100<<12 | 0b001<<5 | 0b11111) +// FRINTTS extension +#define FRINTxx_scalar(type, op, Rn, Rd) (0b11110<<24 | (type)<<22 | 1<<21 | 0b0100<<17 | (op)<<15 | 0b10000<<10 | (Rn)<<5 | (Rd)) +#define FRINT32ZS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b00, Sn, Sd)) +#define FRINT32ZD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b00, Dn, Dd)) +#define FRINT32XS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b01, Sn, Sd)) +#define FRINT32XD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b01, Dn, Dd)) +#define FRINT64ZS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b10, Sn, Sd)) +#define FRINT64ZD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b10, Dn, Dd)) +#define FRINT64XS(Sd, Sn) EMIT(FRINTxx_scalar(0b00, 0b11, Sn, Sd)) +#define FRINT64XD(Dd, Dn) EMIT(FRINTxx_scalar(0b01, 0b11, Dn, Dd)) + + #endif //__ARM64_EMITTER_H__ diff --git a/src/main.c b/src/main.c index 78fc7a78..30c6f7c7 100644 --- a/src/main.c +++ b/src/main.c @@ -76,8 +76,10 @@ int arm64_aes = 0; int arm64_pmull = 0; int arm64_crc32 = 0; int arm64_atomics = 0; +int arm64_uscat = 0; int arm64_flagm = 0; int arm64_flagm2 = 0; +int arm64_frintts = 0; #elif defined(RV64) int rv64_zba = 0; int rv64_zbb = 0; @@ -364,11 +366,15 @@ HWCAP2_ECV arm64_aes = 1; if(hwcap&HWCAP_ATOMICS) arm64_atomics = 1; + if(hwcap&HWCAP_USCAT) + arm64_uscat = 1; if(hwcap&HWCAP_FLAGM) arm64_flagm = 1; unsigned long hwcap2 = real_getauxval(AT_HWCAP2); if(hwcap2&HWCAP2_FLAGM2) arm64_flagm2 = 1; + if(hwcap2&HWCAP2_FRINT) + arm64_frintts = 1; printf_log(LOG_INFO, "Dynarec for ARM64, with extension: ASIMD"); if(arm64_aes) printf_log(LOG_INFO, " AES"); @@ -378,10 +384,14 @@ HWCAP2_ECV printf_log(LOG_INFO, " PMULL"); if(arm64_atomics) printf_log(LOG_INFO, " ATOMICS"); + if(arm64_uscat) + printf_log(LOG_INFO, " USCAT"); if(arm64_flagm) printf_log(LOG_INFO, " FLAGM"); if(arm64_flagm2) printf_log(LOG_INFO, " FLAGM2"); + if(arm64_frintts) + printf_log(LOG_INFO, " FRINT"); printf_log(LOG_INFO, " PageSize:%zd ", box64_pagesize); #elif defined(LA464) printf_log(LOG_INFO, "Dynarec for LoongArch"); @@ -480,6 +490,11 @@ void LoadLogEnv() if(!box64_nobanner && box64_dump) printf_log(LOG_INFO, "Elf Dump if ON\n"); #ifdef DYNAREC + #ifdef ARM64 + // unaligned atomic (with restriction) is supported in hardware + if(arm64_uscat) + box64_dynarec_aligned_atomics = 1; + #endif p = getenv("BOX64_DYNAREC_DUMP"); if(p) { if(strlen(p)==1) { |