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, + }, + } +}