Commit 6cab3c304e

kcbanner <kcbanner@gmail.com>
2022-12-28 09:00:21
cbe: be more explicit about x86 special cases
1 parent 676e4f3
Changed files (2)
lib
std
zig
system
lib/std/zig/system/x86.zig
@@ -528,7 +528,7 @@ const CpuidLeaf = packed struct {
     edx: u32,
 };
 
-extern fn zig_cpuid(leaf_id: u32, subid: u32, eax: *u32, ebx: *u32, ecx: *u32, edx: *u32) void;
+extern fn zig_x86_cpuid(leaf_id: u32, subid: u32, eax: *u32, ebx: *u32, ecx: *u32, edx: *u32) void;
 
 fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
     // valid for both x86 and x86_64
@@ -538,7 +538,7 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
     var edx: u32 = undefined;
 
     if (builtin.zig_backend == .stage2_c) {
-        zig_cpuid(leaf_id, subid, &eax, &ebx, &ecx, &edx);
+        zig_x86_cpuid(leaf_id, subid, &eax, &ebx, &ecx, &edx);
     } else {
         asm volatile ("cpuid"
             : [_] "={eax}" (eax),
@@ -553,12 +553,12 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
     return .{ .eax = eax, .ebx = ebx, .ecx = ecx, .edx = edx };
 }
 
-extern fn zig_get_xcr0() u32;
+extern fn zig_x86_get_xcr0() u32;
 
 // Read control register 0 (XCR0). Used to detect features such as AVX.
 fn getXCR0() u32 {
     if (builtin.zig_backend == .stage2_c) {
-        return zig_get_xcr0();
+        return zig_x86_get_xcr0();
     }
 
     return asm volatile (
lib/zig.h
@@ -8,7 +8,7 @@
 
 #if _MSC_VER
 #include <intrin.h>
-#else
+#elif defined(__i386__) || defined(__x86_64__)
 #include <cpuid.h>
 #endif
 
@@ -2345,11 +2345,13 @@ zig_msvc_atomics_128op(u128, nand)
 zig_msvc_atomics_128op(u128, min)
 zig_msvc_atomics_128op(u128, max)
 
-#endif
+#endif /* _MSC_VER && (_M_IX86 || _M_X64) */
 
 /* ========================= Special Case Intrinsics ========================= */
 
-static inline void zig_cpuid(zig_u32 leaf_id, zig_u32 subid, zig_u32* eax, zig_u32* ebx, zig_u32* ecx, zig_u32* edx) {
+#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__)
+
+static inline void zig_x86_cpuid(zig_u32 leaf_id, zig_u32 subid, zig_u32* eax, zig_u32* ebx, zig_u32* ecx, zig_u32* edx) {
 #if _MSC_VER
     zig_u32 cpu_info[4];
     __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
 #endif
 }
 
-static inline zig_u32 zig_get_xcr0() {
+static inline zig_u32 zig_x86_get_xcr0() {
 #if _MSC_VER
     return (zig_u32)_xgetbv(0);
 #else
@@ -2372,3 +2374,5 @@ static inline zig_u32 zig_get_xcr0() {
     return eax;
 #endif
 }
+
+#endif