| ... | @@ -470,6 +470,19 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { | ... | @@ -470,6 +470,19 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { |
| 470 | } | 470 | } |
| 471 | } | 471 | } |
| 472 | | 472 | |
| | 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 | |
| 473 | if (max_level >= 0x7) { | 486 | if (max_level >= 0x7) { |
| 474 | leaf = cpuid(0x7, 0); | 487 | leaf = cpuid(0x7, 0); |
| 475 | | 488 | |
| ... | @@ -555,7 +568,8 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { | ... | @@ -555,7 +568,8 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { |
| 555 | setFeature(cpu, .avxneconvert, bit(leaf.edx, 5) and has_avx_save); | 568 | setFeature(cpu, .avxneconvert, bit(leaf.edx, 5) and has_avx_save); |
| 556 | setFeature(cpu, .amx_complex, bit(leaf.edx, 8) and has_amx_save); | 569 | setFeature(cpu, .amx_complex, bit(leaf.edx, 8) and has_amx_save); |
| 557 | setFeature(cpu, .avxvnniint16, bit(leaf.edx, 10) and has_avx_save); | 570 | 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)); |
| 559 | setFeature(cpu, .usermsr, bit(leaf.edx, 15)); | 573 | setFeature(cpu, .usermsr, bit(leaf.edx, 15)); |
| 560 | // APX | 574 | // APX |
| 561 | setFeature(cpu, .egpr, bit(leaf.edx, 21)); | 575 | setFeature(cpu, .egpr, bit(leaf.edx, 21)); |
| ... | @@ -581,7 +595,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { | ... | @@ -581,7 +595,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { |
| 581 | .avxneconvert, | 595 | .avxneconvert, |
| 582 | .amx_complex, | 596 | .amx_complex, |
| 583 | .avxvnniint16, | 597 | .avxvnniint16, |
| 584 | .prefetchi, | 598 | // prefetchi already handled earlier. |
| 585 | .usermsr, | 599 | .usermsr, |
| 586 | .egpr, | 600 | .egpr, |
| 587 | .push2pop2, | 601 | .push2pop2, |
| ... | @@ -662,7 +676,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { | ... | @@ -662,7 +676,7 @@ fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void { |
| 662 | .avxneconvert, | 676 | .avxneconvert, |
| 663 | .amx_complex, | 677 | .amx_complex, |
| 664 | .avxvnniint16, | 678 | .avxvnniint16, |
| 665 | .prefetchi, | 679 | // prefetchi already handled earlier. |
| 666 | .usermsr, | 680 | .usermsr, |
| 667 | .egpr, | 681 | .egpr, |
| 668 | .push2pop2, | 682 | .push2pop2, |