Skip to content

Commit 05572fd

Browse files
Update ARM feature and CPU detection
* Clean up old LLVM version check * Clean up old cores that'll probably not be used (and some that are removed from LLVM) * Add document about data sources * Update AArch64 feature list to match changes to the LLVM ones * ARMv8.4 - ARMv8.6 support * Add all known cores that I can find and all information I can find about them * Remove a few A64 only cores from AArch32 CPU list * Rename Apple cores (following LLVM) * SVE register size Co-authored-by: Ian <[email protected]>
1 parent 5bb1053 commit 05572fd

File tree

3 files changed

+513
-135
lines changed

3 files changed

+513
-135
lines changed

src/features_aarch32.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
// This file is a part of Julia. License is MIT: https://julialang.org/license
22

3+
// Copy values `from arch/arm/include/uapi/asm/hwcap.h` from linux kernel source tree
4+
// and match LLVM names.
5+
6+
// LLVM features in `llvm/lib/Target/ARM/ARM.td`
7+
38
// AArch32 features definition
49
// hwcap
510
JL_FEATURE_DEF(neon, 12, 0)
@@ -24,5 +29,8 @@ JL_FEATURE_DEF(v7, 32 * 2 + 3, 0)
2429
JL_FEATURE_DEF(v8, 32 * 2 + 4, 0)
2530
JL_FEATURE_DEF(v8_1a, 32 * 2 + 5, 0)
2631
JL_FEATURE_DEF(v8_2a, 32 * 2 + 6, 0)
27-
JL_FEATURE_DEF(v8_3a, 32 * 2 + 7, 60000)
32+
JL_FEATURE_DEF(v8_3a, 32 * 2 + 7, 0)
2833
JL_FEATURE_DEF(v8_m_main, 32 * 2 + 8, 0)
34+
JL_FEATURE_DEF(v8_4a, 32 * 2 + 9, 0)
35+
JL_FEATURE_DEF(v8_5a, 32 * 2 + 10, 0)
36+
JL_FEATURE_DEF(v8_6a, 32 * 2 + 11, 110000)

src/features_aarch64.h

+73-15
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,83 @@
11
// This file is a part of Julia. License is MIT: https://julialang.org/license
22

3+
// Copy values `from arch/arm64/include/uapi/asm/hwcap.h` from linux kernel source tree
4+
// and match LLVM names.
5+
// See also https://www.kernel.org/doc/html/latest/arm64/elf_hwcaps.html
6+
7+
// LLVM features in `llvm/lib/Target/AArch64/AArch64.td`
8+
39
// AArch64 features definition
410
// hwcap
5-
JL_FEATURE_DEF(crypto, 3, 0)
6-
JL_FEATURE_DEF(crc, 7, 0)
7-
JL_FEATURE_DEF(lse, 8, 40000) // ARMv8.1-Atomics
8-
JL_FEATURE_DEF(fullfp16, 9, 0)
9-
JL_FEATURE_DEF(rdm, 12, 50000) // ARMv8.1-SIMD
10-
JL_FEATURE_DEF(jscvt, 13, UINT32_MAX) // Linux Kernel HWCAP name
11-
JL_FEATURE_DEF(fcma, 14, UINT32_MAX) // Linux Kernel HWCAP name
12-
JL_FEATURE_DEF(rcpc, 15, 60000)
13-
JL_FEATURE_DEF(dcpop, 16, UINT32_MAX) // Linux Kernel HWCAP name
14-
// JL_FEATURE_DEF(dotprod, ???, 60000) // ARMv8.2-DotProd
15-
// JL_FEATURE_DEF(ras, ???, 0)
16-
// JL_FEATURE_DEF(sve, ???, UINT32_MAX)
11+
// JL_FEATURE_DEF(fp, 0, 0) // HWCAP_HP. Required
12+
// JL_FEATURE_DEF(asimd, 1, 0) // HWCAP_ASIMD. Required
13+
// JL_FEATURE_DEF(evtstrm, 2, 0) // HWCAP_EVTSTRM. Not needed
14+
// JL_FEATURE_DEF(aes, 3, 0) // HWCAP_AES. Implied by `aes`
15+
JL_FEATURE_DEF(aes, 4, 0) // HWCAP_PMULL, ID_AA64ISAR0_EL1.AES == 2
16+
// JL_FEATURE_DEF(sha1, 5, UINT32_MAX) // HWCAP_SHA1. Implied by `sha2`
17+
JL_FEATURE_DEF(sha2, 6, 0) // HWCAP_SHA2
18+
JL_FEATURE_DEF(crc, 7, 0) // HWCAP_CRC32. Required in ARMv8.1
19+
JL_FEATURE_DEF(lse, 8, 0) // HWCAP_ATOMICS, ARMv8.1-Atomics. Required in ARMv8.1
20+
JL_FEATURE_DEF(fullfp16, 9, 0) // HWCAP_FPHP
21+
// JL_FEATURE_DEF(asimdhp, 10, 0) // HWCAP_ASIMDHP. Same as `fullfp16`
22+
// JL_FEATURE_DEF(cpuid, 11, 0) // HWCAP_CPUID. Not needed
23+
JL_FEATURE_DEF(rdm, 12, 0) // HWCAP_ASIMDRDM, ARMv8.1-SIMD. Required in ARMv8.1
24+
JL_FEATURE_DEF(jsconv, 13, 0) // HWCAP_JSCVT. Required in ARMv8.3
25+
JL_FEATURE_DEF(complxnum, 14, 0) // HWCAP_FCMA. Required in ARMv8.3
26+
JL_FEATURE_DEF(rcpc, 15, 0) // HWCAP_LRCPC, ARMv8.3-RCPC. Required in ARMv8.3
27+
JL_FEATURE_DEF(ccpp, 16, 0) // HWCAP_DCPOP, ARMv8.2-DCPoP. Required in ARMv8.2
28+
JL_FEATURE_DEF(sha3, 17, 0) // HWCAP_SHA3. ARMv8.2-SHA
29+
// JL_FEATURE_DEF(sm3, 18, 0) // HWCAP_SM3. Same as `sm4`
30+
JL_FEATURE_DEF(sm4, 19, 0) // HWCAP_SM4, ARMv8.2-SM
31+
JL_FEATURE_DEF(dotprod, 20, 0) // HWCAP_ASIMDDP, ARMv8.2-DotProd
32+
// JL_FEATURE_DEF(sha512, 21, UINT32_MAX) // HWCAP_SHA512. Not implement in LLVM yet
33+
JL_FEATURE_DEF(sve, 22, 0) // HWCAP_SVE
34+
JL_FEATURE_DEF(fp16fml, 23, 0) // HWCAP_ASIMDFHM, ARMv8.2-FHM
35+
JL_FEATURE_DEF(dit, 24, 0) // HWCAP_DIT, ARMv8.4-DIT. Required in ARMv8.4
36+
// JL_FEATURE_DEF(uscat, 25, UINT32_MAX) // HWCAP_USCAT, ARMv8.4-LSE
37+
JL_FEATURE_DEF_NAME(rcpc_immo, 26, 0, "rcpc-immo") // HWCAP_ILRCPC, ARMv8.4-RCPC. Required in ARMv8.4
38+
JL_FEATURE_DEF(fmi, 27, 0) // HWCAP_FLAGM, ARMv8.4-CondM. Requird in ARMv8.4
39+
JL_FEATURE_DEF(ssbs, 28, 0) // HWCAP_SSBS
40+
JL_FEATURE_DEF(sb, 29, 0) // HWCAP_SB. Required in ARMv8.5
41+
JL_FEATURE_DEF(pa, 30, 0) // HWCAP_PACA
42+
// JL_FEATURE_DEF(pa, 31, 0) // HWCAP_PACG. Merged with `pa`.
1743

1844
// hwcap2
19-
// JL_FEATURE_DEF(?, 32 + ?, 0)
45+
JL_FEATURE_DEF(ccdp, 32 + 0, 0) // HWCAP2_DCPODP, ARMv8.2-DCCVADP. Required in ARMv8.5
46+
JL_FEATURE_DEF(sve2, 32 + 1, 90000) // HWCAP2_SVE2
47+
// JL_FEATURE_DEF_NAME(sve2_aes, 32 + 2, 90000, "sve2-aes") // HWCAP2_SVEAES, Implied by `sve2-aes`
48+
JL_FEATURE_DEF_NAME(sve2_aes, 32 + 3, 90000, "sve2-aes") // HWCAP2_SVEPMULL, ID_AA64ZFR0_EL1.AES == 2
49+
JL_FEATURE_DEF_NAME(sve2_bitperm, 32 + 4, 100000, "sve2-bitperm") // HWCAP2_SVEBITPERM
50+
JL_FEATURE_DEF_NAME(sve2_sha3, 32 + 5, 90000, "sve2-sha3") // HWCAP2_SVESHA3
51+
JL_FEATURE_DEF_NAME(sve2_sm4, 32 + 6, 90000, "sve2-sm4") // HWCAP2_SM4
52+
JL_FEATURE_DEF(altnzcv, 32 + 7, 0) // HWCAP2_FLAGM2, ARMv8.5-CondM. Required in ARMv8.5
53+
JL_FEATURE_DEF(fptoint, 32 + 8, 0) // HWCAP2_FRINT. Required in ARMv8.5
54+
// JL_FEATURE_DEF(svei8mm, 32 + 9, UINT32_MAX) // HWCAP2_SVEI8MM, ARMv8.2-I8MM. Same as `i8mm`
55+
JL_FEATURE_DEF(f32mm, 32 + 10, 110000) // HWCAP2_SVEF32MM, ARMv8.2-F32MM
56+
JL_FEATURE_DEF(f64mm, 32 + 11, 110000) // HWCAP2_SVEF64MM, ARMv8.2-F64MM
57+
// JL_FEATURE_DEF(svebf16, 32 + 12, UINT32_MAX) // HWCAP2_SVEBF16, ARMv8.2-BF16. Same as `bf16`
58+
JL_FEATURE_DEF(i8mm, 32 + 13, 110000) // HWCAP2_I8MM, ARMv8.2-I8MM. Required in ARMv8.6
59+
JL_FEATURE_DEF(bf16, 32 + 14, 110000) // HWCAP2_BF16, ARMv8.2-BF16. Required in ARMv8.6
60+
// JL_FEATURE_DEF(dgh, 32 + 15, UINT32_MAX) // HWCAP2_DGH, ARMv8.0-DGH. Not implement in LLVM yet
61+
JL_FEATURE_DEF(rand, 32 + 16, 0) // HWCAP2_RNG, ARMv8.5-RNG
62+
JL_FEATURE_DEF(bti, 32 + 17, 0) // HWCAP2_BTI
2063

2164
// custom bits to match llvm model
2265
JL_FEATURE_DEF(v8_1a, 32 * 2 + 0, 0)
2366
JL_FEATURE_DEF(v8_2a, 32 * 2 + 1, 0)
24-
JL_FEATURE_DEF(v8_3a, 32 * 2 + 2, 60000)
25-
// JL_FEATURE_DEF(v8_4a, 32 * 2 + 3, ???)
67+
JL_FEATURE_DEF(v8_3a, 32 * 2 + 2, 0)
68+
JL_FEATURE_DEF(v8_4a, 32 * 2 + 3, 0)
69+
JL_FEATURE_DEF(v8_5a, 32 * 2 + 4, 0)
70+
JL_FEATURE_DEF(v8_6a, 32 * 2 + 5, 110000)
71+
72+
// Missing LLVM features available at EL0:
73+
// tme: ID_AA64ISAR0_EL1.TME (0b1) (LLVM 10)
74+
// am: ID_AA64PFR0_EL1.AMU (0b1, 0b10)
75+
// specrestrict: ID_AA64PFR0_EL1.CSV2 (0b10)
76+
// predres: ID_AA64PFR0_EL1.CSV3 (0b1)
77+
// mte: ID_AA64PFR1_EL1.MTE (0b1, 0b10)
78+
// ecv: ID_AA64MMFR0_EL1.ECV (0b1, 0b10) (LLVM 11)
79+
// lor: ID_AA64MMFR1_EL1.LO (0b1)
80+
// perfmon: ID_AA64DFR0_EL1.PMUVer (0b1, 0b100, 0b101, 0b110)
81+
// spe: ID_AA64DFR0_EL1.PMSVer (0b1 or 0b10)
82+
// tracev8.4: ID_AA64DFR0_EL1.TraceFilt (0b1)
83+
// ete: ???

0 commit comments

Comments
 (0)