From a24eee83903bc9387720fd489e6581b8afd051a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 20 Jan 2026 23:09:53 +0100 Subject: [PATCH] std.zig.system.x86: fix prefetchi detection on AMD --- lib/std/zig/system/x86.zig | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/std/zig/system/x86.zig b/lib/std/zig/system/x86.zig index 1cb55c4b4c..91529b8168 100644 --- a/lib/std/zig/system/x86.zig +++ b/lib/std/zig/system/x86.zig @@ -470,6 +470,19 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { } } + if (max_ext_level >= 0x80000021) { + leaf = cpuid(0x80000021, 0); + + // AMD uses a different bit for prefetchi. + setFeature(cpu, .prefetchi, bit(leaf.eax, 20)); + } else { + for ([_]Target.x86.Feature{ + .prefetchi, + }) |feat| { + setFeature(cpu, feat, false); + } + } + if (max_level >= 0x7) { leaf = cpuid(0x7, 0); @@ -555,7 +568,8 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { setFeature(cpu, .avxneconvert, bit(leaf.edx, 5) and has_avx_save); setFeature(cpu, .amx_complex, bit(leaf.edx, 8) and has_amx_save); setFeature(cpu, .avxvnniint16, bit(leaf.edx, 10) and has_avx_save); - setFeature(cpu, .prefetchi, bit(leaf.edx, 14)); + // This needs to account for prefetchi already being detected above on AMD. + setFeature(cpu, .prefetchi, cpu.has(.x86, .prefetchi) or bit(leaf.edx, 14)); setFeature(cpu, .usermsr, bit(leaf.edx, 15)); // APX setFeature(cpu, .egpr, bit(leaf.edx, 21)); @@ -581,7 +595,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { .avxneconvert, .amx_complex, .avxvnniint16, - .prefetchi, + // prefetchi already handled earlier. .usermsr, .egpr, .push2pop2, @@ -662,7 +676,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { .avxneconvert, .amx_complex, .avxvnniint16, - .prefetchi, + // prefetchi already handled earlier. .usermsr, .egpr, .push2pop2,