diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-11-25 19:45:38 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-11-28 17:07:34 +0100 |
| commit | 29aafdcd5520e15d2d395d616f2aee6ed9ba4648 (patch) | |
| tree | 0c7827520a7f3300fd86226c7e5c71276441e160 | |
| parent | 6edf9127fe810a5f6493e61f123f9f25a2c3f7dd (diff) | |
| download | zig-29aafdcd5520e15d2d395d616f2aee6ed9ba4648.tar.gz zig-29aafdcd5520e15d2d395d616f2aee6ed9ba4648.zip | |
windows: detect native CPU features for aarch64 SoCs
| -rw-r--r-- | lib/std/zig/system/NativeTargetInfo.zig | 1 | ||||
| -rw-r--r-- | lib/std/zig/system/windows.zig | 41 |
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, + }, + } +} |
