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 {...@@ -528,7 +528,7 @@ const CpuidLeaf = packed struct {
528 edx: u32,528 edx: u32,
529};529};
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
533fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {533fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
534 // valid for both x86 and x86_64534 // valid for both x86 and x86_64
...@@ -538,7 +538,7 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {...@@ -538,7 +538,7 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
538 var edx: u32 = undefined;538 var edx: u32 = undefined;
539539
540 if (builtin.zig_backend == .stage2_c) {540 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);
542 } else {542 } else {
543 asm volatile ("cpuid"543 asm volatile ("cpuid"
544 : [_] "={eax}" (eax),544 : [_] "={eax}" (eax),
...@@ -553,12 +553,12 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {...@@ -553,12 +553,12 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
553 return .{ .eax = eax, .ebx = ebx, .ecx = ecx, .edx = edx };553 return .{ .eax = eax, .ebx = ebx, .ecx = ecx, .edx = edx };
554}554}
555555
556extern fn zig_get_xcr0() u32;556extern fn zig_x86_get_xcr0() u32;
557557
558// Read control register 0 (XCR0). Used to detect features such as AVX.558// Read control register 0 (XCR0). Used to detect features such as AVX.
559fn getXCR0() u32 {559fn getXCR0() u32 {
560 if (builtin.zig_backend == .stage2_c) {560 if (builtin.zig_backend == .stage2_c) {
561 return zig_get_xcr0();561 return zig_x86_get_xcr0();
562 }562 }
563563
564 return asm volatile (564 return asm volatile (
lib/zig.h+8-4
...@@ -8,7 +8,7 @@...@@ -8,7 +8,7 @@
88
9#if _MSC_VER9#if _MSC_VER
10#include <intrin.h>10#include <intrin.h>
11#else11#elif defined(__i386__) || defined(__x86_64__)
12#include <cpuid.h>12#include <cpuid.h>
13#endif13#endif
1414
...@@ -2345,11 +2345,13 @@ zig_msvc_atomics_128op(u128, nand)...@@ -2345,11 +2345,13 @@ zig_msvc_atomics_128op(u128, nand)
2345zig_msvc_atomics_128op(u128, min)2345zig_msvc_atomics_128op(u128, min)
2346zig_msvc_atomics_128op(u128, max)2346zig_msvc_atomics_128op(u128, max)
23472347
2348#endif2348#endif /* _MSC_VER && (_M_IX86 || _M_X64) */
23492349
2350/* ========================= Special Case Intrinsics ========================= */2350/* ========================= 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) {
2353#if _MSC_VER2355#if _MSC_VER
2354 zig_u32 cpu_info[4];2356 zig_u32 cpu_info[4];
2355 __cpuidex(cpu_info, leaf_id, subid);2357 __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...@@ -2362,7 +2364,7 @@ static inline void zig_cpuid(zig_u32 leaf_id, zig_u32 subid, zig_u32* eax, zig_u
2362#endif2364#endif
2363}2365}
23642366
2365static inline zig_u32 zig_get_xcr0() {2367static inline zig_u32 zig_x86_get_xcr0() {
2366#if _MSC_VER2368#if _MSC_VER
2367 return (zig_u32)_xgetbv(0);2369 return (zig_u32)_xgetbv(0);
2368#else2370#else
...@@ -2372,3 +2374,5 @@ static inline zig_u32 zig_get_xcr0() {...@@ -2372,3 +2374,5 @@ static inline zig_u32 zig_get_xcr0() {
2372 return eax;2374 return eax;
2373#endif2375#endif
2374}2376}
2377
2378#endif