mirror of
https://github.com/ziglang/zig.git
synced 2026-01-21 06:45:24 +00:00
cbe: be more explicit about x86 special cases
This commit is contained in:
parent
676e4f3824
commit
6cab3c304e
@ -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 (
|
||||
|
||||
12
lib/zig.h
12
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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user