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

std.zig.system.x86: improve AVX10 detection


1 files changed, 14 insertions(+), 4 deletions(-)

lib/std/zig/system/x86.zig+14-4
...@@ -499,7 +499,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {...@@ -499,7 +499,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
499 }499 }
500 }500 }
501501
502 if (max_level >= 0x7) {502 const has_avx10 = if (max_level >= 0x7) has_avx10: {
503 leaf = cpuid(0x7, 0);503 leaf = cpuid(0x7, 0);
504504
505 setFeature(cpu, .fsgsbase, bit(leaf.ebx, 0));505 setFeature(cpu, .fsgsbase, bit(leaf.ebx, 0));
...@@ -596,6 +596,8 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {...@@ -596,6 +596,8 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
596 setFeature(cpu, .nf, bit(leaf.edx, 21) and has_apx_save);596 setFeature(cpu, .nf, bit(leaf.edx, 21) and has_apx_save);
597 setFeature(cpu, .cf, bit(leaf.edx, 21) and has_apx_save);597 setFeature(cpu, .cf, bit(leaf.edx, 21) and has_apx_save);
598 setFeature(cpu, .zu, bit(leaf.edx, 21) and has_apx_save);598 setFeature(cpu, .zu, bit(leaf.edx, 21) and has_apx_save);
599
600 break :has_avx10 bit(leaf.edx, 19);
599 } else {601 } else {
600 for ([_]Target.x86.Feature{602 for ([_]Target.x86.Feature{
601 .sha512,603 .sha512,
...@@ -627,7 +629,9 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {...@@ -627,7 +629,9 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
627 setFeature(cpu, feat, false);629 setFeature(cpu, feat, false);
628 }630 }
629 }631 }
630 } else {632
633 break :has_avx10 false;
634 } else has_avx10: {
631 for ([_]Target.x86.Feature{635 for ([_]Target.x86.Feature{
632 .fsgsbase,636 .fsgsbase,
633 .sgx,637 .sgx,
...@@ -709,7 +713,9 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {...@@ -709,7 +713,9 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
709 }) |feat| {713 }) |feat| {
710 setFeature(cpu, feat, false);714 setFeature(cpu, feat, false);
711 }715 }
712 }716
717 break :has_avx10 false;
718 };
713719
714 if (max_level >= 0xD and has_avx_save) {720 if (max_level >= 0xD and has_avx_save) {
715 leaf = cpuid(0xD, 0x1);721 leaf = cpuid(0xD, 0x1);
...@@ -755,10 +761,14 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {...@@ -755,10 +761,14 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {
755 if (max_level >= 0x24) {761 if (max_level >= 0x24) {
756 leaf = cpuid(0x24, 0);762 leaf = cpuid(0x24, 0);
757763
758 setFeature(cpu, .avx10_1, bit(leaf.ebx, 18));764 const avx_ver = leaf.ebx & 0xff;
765
766 setFeature(cpu, .avx10_1, has_avx10 and avx_ver >= 1);
767 setFeature(cpu, .avx10_2, has_avx10 and avx_ver >= 2);
759 } else {768 } else {
760 for ([_]Target.x86.Feature{769 for ([_]Target.x86.Feature{
761 .avx10_1,770 .avx10_1,
771 .avx10_2,
762 }) |feat| {772 }) |feat| {
763 setFeature(cpu, feat, false);773 setFeature(cpu, feat, false);
764 }774 }