authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-01 18:50:06+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-03 12:07:32+01:00
log204df19d79833382bbee0ed110502919dc7341f8
tree6d7386f97978073f01a89094de2a035d7b8c500a
parent24b57f4d30367b770de230bc0b488e7815fedece
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

zig.h: Avoid depending on cpuid.h for zig_x86_cpuid().

Just use inline assembly instead, which is what that header does. Also make sure we have a dummy implementation when inline assembly is unavailable.

1 files changed, 12 insertions(+), 4 deletions(-)

lib/zig.h+12-4
......@@ -79,8 +79,6 @@
7979
8080#if defined(zig_msvc)
8181#include <intrin.h>
82#elif defined(zig_x86)
83#include <cpuid.h>
8482#endif
8583
8684#if __STDC_VERSION__ >= 202311L
......@@ -4058,19 +4056,29 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax
40584056 *ebx = (uint32_t)cpu_info[1];
40594057 *ecx = (uint32_t)cpu_info[2];
40604058 *edx = (uint32_t)cpu_info[3];
4059#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
4060 __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid));
40614061#else
4062 __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx);
4062 *eax = 0;
4063 *ebx = 0;
4064 *ecx = 0;
4065 *edx = 0;
40634066#endif
40644067}
40654068
40664069static inline uint32_t zig_x86_get_xcr0(void) {
40674070#if defined(zig_msvc)
40684071 return (uint32_t)_xgetbv(0);
4069#else
4072#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
40704073 uint32_t eax;
40714074 uint32_t edx;
40724075 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));
40734076 return eax;
4077#else
4078 *eax = 0;
4079 *ebx = 0;
4080 *ecx = 0;
4081 *edx = 0;
40744082#endif
40754083}
40764084