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