Skip to content

Commit 7cb88d6

Browse files
Detect Apple M4 and some related changes (JuliaLang#58301)
The A15 was detected as M2; added codenames for easier future updates. Sources: - https://asahilinux.org/docs/hw/soc/soc-codenames/#socs - https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/arm/cpuid.h - https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/AArch64/AArch64Processors.td#L428 Missing: - the M4 Pro and Max are missing (because they are missing from Apple's `cpuid.h`) Resolves JuliaLang#58278 --------- Co-authored-by: Christian Guinard <28689358+christiangnrd@users.noreply.github.com>
1 parent 906d348 commit 7cb88d6

File tree

1 file changed

+58
-21
lines changed

1 file changed

+58
-21
lines changed

src/processor_arm.cpp

Lines changed: 58 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,11 @@ enum class CPU : uint32_t {
166166
apple_a14,
167167
apple_a15,
168168
apple_a16,
169+
apple_a17,
169170
apple_m1,
170171
apple_m2,
171172
apple_m3,
173+
apple_m4,
172174
apple_s4,
173175
apple_s5,
174176

@@ -355,9 +357,11 @@ constexpr auto apple_a13 = armv8_4a_crypto | get_feature_masks(fp16fml, fullfp16
355357
constexpr auto apple_a14 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3);
356358
constexpr auto apple_a15 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3, i8mm, bf16);
357359
constexpr auto apple_a16 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3, i8mm, bf16);
360+
constexpr auto apple_a17 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3, i8mm, bf16);
358361
constexpr auto apple_m1 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3);
359362
constexpr auto apple_m2 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3, i8mm, bf16);
360363
constexpr auto apple_m3 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3, i8mm, bf16);
364+
constexpr auto apple_m4 = armv8_5a_crypto | get_feature_masks(dotprod,fp16fml, fullfp16, sha3, i8mm, bf16);
361365
// Features based on https://github.com/llvm/llvm-project/blob/82507f1798768280cf5d5aab95caaafbc7fe6f47/llvm/include/llvm/Support/AArch64TargetParser.def
362366
// and sysctl -a hw.optional
363367
constexpr auto apple_s4 = apple_a12;
@@ -441,9 +445,11 @@ static constexpr CPUSpec<CPU, feature_sz> cpus[] = {
441445
{"apple-a14", CPU::apple_a14, CPU::apple_a13, 120000, Feature::apple_a14},
442446
{"apple-a15", CPU::apple_a15, CPU::apple_a14, 160000, Feature::apple_a15},
443447
{"apple-a16", CPU::apple_a16, CPU::apple_a14, 160000, Feature::apple_a16},
448+
{"apple-a17", CPU::apple_a17, CPU::apple_a16, 190000, Feature::apple_a17},
444449
{"apple-m1", CPU::apple_m1, CPU::apple_a14, 130000, Feature::apple_m1},
445450
{"apple-m2", CPU::apple_m2, CPU::apple_m1, 160000, Feature::apple_m2},
446451
{"apple-m3", CPU::apple_m3, CPU::apple_m2, 180000, Feature::apple_m3},
452+
{"apple-m4", CPU::apple_m4, CPU::apple_m3, 190000, Feature::apple_m4},
447453
{"apple-s4", CPU::apple_s4, CPU::generic, 100000, Feature::apple_s4},
448454
{"apple-s5", CPU::apple_s5, CPU::generic, 100000, Feature::apple_s5},
449455
{"thunderx3t110", CPU::marvell_thunderx3t110, CPU::cavium_thunderx2t99, 110000,
@@ -722,6 +728,8 @@ static NOINLINE std::pair<uint32_t,FeatureList<feature_sz>> _get_host_cpu()
722728
return std::make_pair((uint32_t)CPU::apple_m2, Feature::apple_m2);
723729
else if (cpu_name.find("M3") != StringRef ::npos)
724730
return std::make_pair((uint32_t)CPU::apple_m3, Feature::apple_m3);
731+
else if (cpu_name.find("M4") != StringRef ::npos)
732+
return std::make_pair((uint32_t)CPU::apple_m4, Feature::apple_m4);
725733
else
726734
return std::make_pair((uint32_t)CPU::apple_m1, Feature::apple_m1);
727735
}
@@ -1042,7 +1050,10 @@ static CPU get_cpu_name(CPUID cpuid)
10421050
default: return CPU::generic;
10431051
}
10441052
case 0x61: // 'a': Apple
1045-
// https://opensource.apple.com/source/xnu/xnu-7195.141.2/osfmk/arm/cpuid.h.auto.html
1053+
// Data here is partially based on these sources:
1054+
// https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/arm/cpuid.h
1055+
// https://asahilinux.org/docs/hw/soc/soc-codenames/#socs
1056+
// https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/AArch64/AArch64Processors.td
10461057
switch (cpuid.part) {
10471058
case 0x0: // Swift
10481059
return CPU::apple_swift;
@@ -1067,31 +1078,57 @@ static CPU get_cpu_name(CPUID cpuid)
10671078
return CPU::apple_a12;
10681079
case 0xF: // Tempest M9
10691080
return CPU::apple_s4;
1070-
case 0x12: // Lightning
1071-
case 0x13: // Thunder
1081+
case 0x12: // H12 Cebu p-Core "Lightning"
1082+
case 0x13: // H12 Cebu e-Core "Thunder"
10721083
return CPU::apple_a13;
1073-
case 0x20: // Icestorm
1074-
case 0x21: // Firestorm
1084+
case 0x20: // H13 Sicily e-Core "Icestorm"
1085+
case 0x21: // H13 Sicily p-Core "Firestorm"
10751086
return CPU::apple_a14;
1076-
case 0x22: // Icestorm m1
1077-
case 0x23: // Firestorm m1
1078-
case 0x24:
1079-
case 0x25: // From https://github.com/AsahiLinux/m1n1/blob/3b9a71422e45209ef57c563e418f877bf54358be/src/chickens.c#L9
1080-
case 0x28:
1081-
case 0x29:
1087+
case 0x22: // H13G Tonga e-Core "Icestorm" used in Apple M1
1088+
case 0x23: // H13G Tonga p-Core "Firestorm" used in Apple M1
1089+
case 0x24: // H13J Jade Chop e-Core "Icestorm" used in Apple M1 Pro
1090+
case 0x25: // H13J Jade Chop p-Core "Firestorm" used in Apple M1 Pro
1091+
case 0x28: // H13J Jade Die e-Core "Icestorm" used in Apple M1 Max / Ultra
1092+
case 0x29: // H13J Jade Die p-Core "Firestorm" used in Apple M1 Max / Ultra
10821093
return CPU::apple_m1;
1083-
case 0x30: // Blizzard m2
1084-
case 0x31: // Avalanche m2
1085-
case 0x32:
1086-
case 0x33:
1087-
case 0x34:
1088-
case 0x35:
1089-
case 0x38:
1090-
case 0x39:
1094+
case 0x30: // H14 Ellis e-Core "Blizzard" used in Apple A15
1095+
case 0x31: // H14 Ellis p-Core "Avalanche" used in Apple A15
1096+
return CPU::apple_a15;
1097+
case 0x32: // H14G Staten e-Core "Blizzard" used in Apple M2
1098+
case 0x33: // H14G Staten p-Core "Avalanche" used in Apple M2
1099+
case 0x34: // H14S Rhodes Chop e-Core "Blizzard" used in Apple M2 Pro
1100+
case 0x35: // H14S Rhodes Chop p-Core "Avalanche" used in Apple M2 Pro
1101+
case 0x38: // H14C Rhodes Die e-Core "Blizzard" used in Apple M2 Max / Ultra
1102+
case 0x39: // H14C Rhodes Die p-Core "Avalanche" used in Apple M2 Max / Ultra
10911103
return CPU::apple_m2;
1092-
case 0x49: // Everest m3
1093-
case 0x48: // Sawtooth m3
1104+
case 0x40: // H15 Crete e-Core "Sawtooth" used in Apple A16
1105+
case 0x41: // H15 Crete p-Core "Everest" used in Apple A16
1106+
return CPU::apple_a16;
1107+
case 0x42: // H15 Ibiza e-Core "Sawtooth" used in Apple M3
1108+
case 0x43: // H15 Ibiza p-Core "Everest" used in Apple M3
1109+
case 0x44: // H15 Lobos e-Core "Sawtooth" used in Apple M3 Pro
1110+
case 0x45: // H15 Lobos p-Core "Everest" used in Apple M3 Pro
1111+
case 0x49: // H15 Palma e-Core "Sawtooth" used in Apple M3 Max
1112+
case 0x48: // H15 Palma p-Core "Everest" used in Apple M3 Max
10941113
return CPU::apple_m3;
1114+
//case 0x46: // M11 e-Core "Sawtooth" used in Apple S9
1115+
//case 0x47: does not exist
1116+
//return CPU::apple_s9;
1117+
case 0x50: // H15 Coll e-Core "Sawtooth" used in Apple A17 Pro
1118+
case 0x51: // H15 Coll p-Core "Everest" used in Apple A17 Pro
1119+
return CPU::apple_a17;
1120+
case 0x52: // H16G Donan e-Core used in Apple M4
1121+
case 0x53: // H16H Donan p-Core used in Apple M4
1122+
case 0x54: // H16S Brava S e-Core used in Apple M4 Pro
1123+
case 0x55: // H16S Brava S p-Core used in Apple M4 Pro
1124+
case 0x58: // H16C Brava C e-Core used in Apple M4 Max
1125+
case 0x59: // H16C Brava C p-Core used in Apple M4 Max
1126+
return CPU::apple_m4;
1127+
//case 0x60: // H17P Tahiti e-Core used in Apple A18 Pro
1128+
//case 0x61: // H17P Tahiti p-Core used in Apple A18 Pro
1129+
//case 0x6a: // H17A Tupai e-Core used in Apple A18
1130+
//case 0x6b: // H17A Tupai p-Core used in Apple A18
1131+
//return CPU::apple_a18;
10951132
default: return CPU::generic;
10961133
}
10971134
case 0x68: // 'h': Huaxintong Semiconductor

0 commit comments

Comments
 (0)