aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-11-25 19:45:38 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-11-28 17:07:34 +0100
commit29aafdcd5520e15d2d395d616f2aee6ed9ba4648 (patch)
tree0c7827520a7f3300fd86226c7e5c71276441e160
parent6edf9127fe810a5f6493e61f123f9f25a2c3f7dd (diff)
downloadzig-29aafdcd5520e15d2d395d616f2aee6ed9ba4648.tar.gz
zig-29aafdcd5520e15d2d395d616f2aee6ed9ba4648.zip
windows: detect native CPU features for aarch64 SoCs
-rw-r--r--lib/std/zig/system/NativeTargetInfo.zig1
-rw-r--r--lib/std/zig/system/windows.zig41
2 files changed, 42 insertions, 0 deletions
diff --git a/lib/std/zig/system/NativeTargetInfo.zig b/lib/std/zig/system/NativeTargetInfo.zig
index 09b863cdf7..0232797387 100644
--- a/lib/std/zig/system/NativeTargetInfo.zig
+++ b/lib/std/zig/system/NativeTargetInfo.zig
@@ -978,6 +978,7 @@ fn detectNativeCpuAndFeatures(cpu_arch: Target.Cpu.Arch, os: Target.Os, cross_ta
switch (builtin.os.tag) {
.linux => return linux.detectNativeCpuAndFeatures(),
.macos => return darwin.macos.detectNativeCpuAndFeatures(),
+ .windows => return windows.detectNativeCpuAndFeatures(),
else => {},
}
diff --git a/lib/std/zig/system/windows.zig b/lib/std/zig/system/windows.zig
index 595dac6278..eb62068120 100644
--- a/lib/std/zig/system/windows.zig
+++ b/lib/std/zig/system/windows.zig
@@ -1,6 +1,10 @@
const std = @import("std");
+const builtin = @import("builtin");
+const Target = std.Target;
pub const WindowsVersion = std.Target.Os.WindowsVersion;
+pub const PF = std.os.windows.PF;
+pub const IsProcessorFeaturePresent = std.os.windows.IsProcessorFeaturePresent;
/// Returns the highest known WindowsVersion deduced from reported runtime information.
/// Discards information about in-between versions we don't differentiate.
@@ -38,3 +42,40 @@ pub fn detectRuntimeVersion() WindowsVersion {
return @intToEnum(WindowsVersion, version);
}
+
+fn detectNativeCpuAndFeaturesArm64() Target.Cpu {
+ const Feature = Target.aarch64.Feature;
+
+ var cpu = Target.Cpu{
+ .arch = .aarch64,
+ .model = Target.Cpu.Model.generic(.aarch64),
+ .features = Target.Cpu.Feature.Set.empty,
+ };
+
+ if (IsProcessorFeaturePresent(PF.ARM_NEON_INSTRUCTIONS_AVAILABLE)) {
+ cpu.features.addFeature(@enumToInt(Feature.neon));
+ }
+ if (IsProcessorFeaturePresent(PF.ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE)) {
+ cpu.features.addFeature(@enumToInt(Feature.crc));
+ }
+ if (IsProcessorFeaturePresent(PF.ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE)) {
+ cpu.features.addFeature(@enumToInt(Feature.crypto));
+ }
+
+ return cpu;
+}
+
+fn getCpuCount() usize {
+ return std.os.windows.peb().NumberOfProcessors;
+}
+
+pub fn detectNativeCpuAndFeatures() ?Target.Cpu {
+ switch (builtin.cpu.arch) {
+ .aarch64 => return detectNativeCpuAndFeaturesArm64(),
+ else => |arch| return .{
+ .arch = arch,
+ .model = Target.Cpu.Model.generic(arch),
+ .features = Target.Cpu.Feature.Set.empty,
+ },
+ }
+}