| ... | @@ -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 | } |
| 501 | | 501 | |
| 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); |
| 504 | | 504 | |
| 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 | }; |
| 713 | | 719 | |
| 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); |
| 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 | } 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 | } |