aboutsummaryrefslogtreecommitdiff
path: root/src/build_cpuid.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-01-06 13:43:01 +0000
committerGitHub <noreply@github.com>2025-01-06 13:43:01 +0000
commit6e49bbb66853b5d824ac5bbd534ae3e81c4f39aa (patch)
tree50886a3be8f2fcfab053e07cfe9e15f50fa5f9f6 /src/build_cpuid.cpp
parentbd96cd0af761994210018ca647eb843dfeb71494 (diff)
parent98efb03934b464a1b23759b5695a12ff37588357 (diff)
Merge branch 'master' into d3d11-annotations
Diffstat (limited to 'src/build_cpuid.cpp')
-rw-r--r--src/build_cpuid.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/build_cpuid.cpp b/src/build_cpuid.cpp
new file mode 100644
index 000000000..b7ba5dcdf
--- /dev/null
+++ b/src/build_cpuid.cpp
@@ -0,0 +1,35 @@
+#if !defined(GB_COMPILER_MSVC)
+ #if defined(GB_CPU_X86)
+ #include <cpuid.h>
+ #endif
+#endif
+
+gb_internal void odin_cpuid(int leaf, int result[]) {
+ #if defined(GB_CPU_ARM) || defined(GB_CPU_RISCV)
+ return;
+
+ #elif defined(GB_CPU_X86)
+
+ #if defined(GB_COMPILER_MSVC)
+ __cpuid(result, leaf);
+ #else
+ __get_cpuid(leaf, (unsigned int*)&result[0], (unsigned int*)&result[1], (unsigned int*)&result[2], (unsigned int*)&result[3]);
+ #endif
+
+ #endif
+}
+
+gb_internal bool should_use_march_native() {
+ #if !defined(GB_CPU_X86)
+ return false;
+
+ #else
+
+ int cpu[4];
+ odin_cpuid(0x1, &cpu[0]); // Get feature information in ECX + EDX
+
+ bool have_popcnt = cpu[2] & (1 << 23); // bit 23 in ECX = popcnt
+ return !have_popcnt;
+
+ #endif
+} \ No newline at end of file