authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-28 03:00:21-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-02 13:55:45-07:00
log6cab3c304eb2d45be6aceb48aa5bbd1fd1298fa3
tree62fed7f5ba14794931f9816abc767168a1302314
parent676e4f3824054cf39c87d008909b0e57bb9bdcc8

cbe: be more explicit about x86 special cases


2 files changed, 12 insertions(+), 8 deletions(-)

lib/std/zig/system/x86.zig+4-4
......@@ -528,7 +528,7 @@ const CpuidLeaf = packed struct {
528528 edx: u32,
529529};
530530
531extern fn zig_cpuid(leaf_id: u32, subid: u32, eax: *u32, ebx: *u32, ecx: *u32, edx: *u32) void;
531extern fn zig_x86_cpuid(leaf_id: u32, subid: u32, eax: *u32, ebx: *u32, ecx: *u32, edx: *u32) void;
532532
533533fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
534534 // valid for both x86 and x86_64
......@@ -538,7 +538,7 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
538538 var edx: u32 = undefined;
539539
540540 if (builtin.zig_backend == .stage2_c) {
541 zig_cpuid(leaf_id, subid, &eax, &ebx, &ecx, &edx);
541 zig_x86_cpuid(leaf_id, subid, &eax, &ebx, &ecx, &edx);
542542 } else {
543543 asm volatile ("cpuid"
544544 : [_] "={eax}" (eax),
......@@ -553,12 +553,12 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
553553 return .{ .eax = eax, .ebx = ebx, .ecx = ecx, .edx = edx };
554554}
555555
556extern fn zig_get_xcr0() u32;
556extern fn zig_x86_get_xcr0() u32;
557557
558558// Read control register 0 (XCR0). Used to detect features such as AVX.
559559fn getXCR0() u32 {
560560 if (builtin.zig_backend == .stage2_c) {
561 return zig_get_xcr0();
561 return zig_x86_get_xcr0();
562562 }
563563
564564 return asm volatile (
lib/zig.h+8-4
......@@ -8,7 +8,7 @@
88
99#if _MSC_VER
1010#include <intrin.h>
11#else
11#elif defined(__i386__) || defined(__x86_64__)
1212#include <cpuid.h>
1313#endif
1414
......@@ -2345,11 +2345,13 @@ zig_msvc_atomics_128op(u128, nand)
23452345zig_msvc_atomics_128op(u128, min)
23462346zig_msvc_atomics_128op(u128, max)
23472347
2348#endif
2348#endif /* _MSC_VER && (_M_IX86 || _M_X64) */
23492349
23502350/* ========================= Special Case Intrinsics ========================= */
23512351
2352static inline void zig_cpuid(zig_u32 leaf_id, zig_u32 subid, zig_u32* eax, zig_u32* ebx, zig_u32* ecx, zig_u32* edx) {
2352#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__)
2353
2354static inline void zig_x86_cpuid(zig_u32 leaf_id, zig_u32 subid, zig_u32* eax, zig_u32* ebx, zig_u32* ecx, zig_u32* edx) {
23532355#if _MSC_VER
23542356 zig_u32 cpu_info[4];
23552357 __cpuidex(cpu_info, leaf_id, subid);
......@@ -2362,7 +2364,7 @@ static inline void zig_cpuid(zig_u32 leaf_id, zig_u32 subid, zig_u32* eax, zig_u
23622364#endif
23632365}
23642366
2365static inline zig_u32 zig_get_xcr0() {
2367static inline zig_u32 zig_x86_get_xcr0() {
23662368#if _MSC_VER
23672369 return (zig_u32)_xgetbv(0);
23682370#else
......@@ -2372,3 +2374,5 @@ static inline zig_u32 zig_get_xcr0() {
23722374 return eax;
23732375#endif
23742376}
2377
2378#endif