authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-01-20 23:09:53+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-04-22 15:31:57+02:00
logec0d6201c2bfe2765b986488c48da266565a4f68
tree8c33b3f4a327abed3b19361c97745b8bdcd6f21d
parente0d56643d3efe64314de09537c5199524fe10be4
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.zig.system.x86: fix prefetchi detection on AMD


1 files changed, 17 insertions(+), 3 deletions(-)

lib/std/zig/system/x86.zig+17-3
......@@ -470,6 +470,19 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
470470 }
471471 }
472472
473 if (max_ext_level >= 0x80000021) {
474 leaf = cpuid(0x80000021, 0);
475
476 // AMD uses a different bit for prefetchi.
477 setFeature(cpu, .prefetchi, bit(leaf.eax, 20));
478 } else {
479 for ([_]Target.x86.Feature{
480 .prefetchi,
481 }) |feat| {
482 setFeature(cpu, feat, false);
483 }
484 }
485
473486 if (max_level >= 0x7) {
474487 leaf = cpuid(0x7, 0);
475488
......@@ -555,7 +568,8 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
555568 setFeature(cpu, .avxneconvert, bit(leaf.edx, 5) and has_avx_save);
556569 setFeature(cpu, .amx_complex, bit(leaf.edx, 8) and has_amx_save);
557570 setFeature(cpu, .avxvnniint16, bit(leaf.edx, 10) and has_avx_save);
558 setFeature(cpu, .prefetchi, bit(leaf.edx, 14));
571 // This needs to account for prefetchi already being detected above on AMD.
572 setFeature(cpu, .prefetchi, cpu.has(.x86, .prefetchi) or bit(leaf.edx, 14));
559573 setFeature(cpu, .usermsr, bit(leaf.edx, 15));
560574 // APX
561575 setFeature(cpu, .egpr, bit(leaf.edx, 21));
......@@ -581,7 +595,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
581595 .avxneconvert,
582596 .amx_complex,
583597 .avxvnniint16,
584 .prefetchi,
598 // prefetchi already handled earlier.
585599 .usermsr,
586600 .egpr,
587601 .push2pop2,
......@@ -662,7 +676,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
662676 .avxneconvert,
663677 .amx_complex,
664678 .avxvnniint16,
665 .prefetchi,
679 // prefetchi already handled earlier.
666680 .usermsr,
667681 .egpr,
668682 .push2pop2,