v5-0003-Refactor-detection-of-x86-ZMM-registers.patch
text/x-patch
Filename: v5-0003-Refactor-detection-of-x86-ZMM-registers.patch
Type: text/x-patch
Part: 1
Message:
Re: centralize CPU feature detection
Patch
Format: format-patch
Series: patch v5-0003
Subject: Refactor detection of x86 ZMM registers
| File | + | − |
|---|---|---|
| src/port/pg_cpu_x86.c | 22 | 18 |
From 126adc79412c808630a94bf87c8eb6e01da0a69a Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Mon, 23 Feb 2026 21:17:49 +0700
Subject: [PATCH v5 3/3] Refactor detection of x86 ZMM registers
- Call _xgetbv within x86_set_runtime_features rather than in a
separate function
- Use symbols for XCR mask bits rather than a magic constant
A future commit will build on this to detect YMM registers without
code duplication.
Reviewed-by: Zsolt Parragi <zsolt.parragi@percona.com>
Discussion: https://postgr.es/m/CANWCAZbgEUFw7LuYSVeJ=Tj98R5HoOB1Ffeqk3aLvbw5rU5NTw@mail.gmail.com
---
src/port/pg_cpu_x86.c | 40 ++++++++++++++++++++++------------------
1 file changed, 22 insertions(+), 18 deletions(-)
diff --git a/src/port/pg_cpu_x86.c b/src/port/pg_cpu_x86.c
index 88863f9762c..b0e0048f561 100644
--- a/src/port/pg_cpu_x86.c
+++ b/src/port/pg_cpu_x86.c
@@ -31,32 +31,29 @@
#include "port/pg_cpu.h"
+/* XSAVE state component bits that we need */
+#define XMM (1<<1)
+#define YMM (1<<2)
+#define OPMASK (1<<5)
+#define ZMM0_15 (1<<6)
+#define ZMM16_31 (1<<7)
+
/* array indexed by enum X86FeatureId */
bool X86Features[X86FeaturesSize] = {0};
-/*
- * Does XGETBV say the ZMM registers are enabled?
- *
- * NB: Caller is responsible for verifying that osxsave is available
- * before calling this.
- */
-#ifdef HAVE_XSAVE_INTRINSICS
-pg_attribute_target("xsave")
-#endif
static bool
-zmm_regs_available(void)
+mask_available(uint32 value, uint32 mask)
{
-#ifdef HAVE_XSAVE_INTRINSICS
- return (_xgetbv(0) & 0xe6) == 0xe6;
-#else
- return false;
-#endif
+ return (value & mask) == mask;
}
/*
* Parse the CPU ID info for runtime checks.
*/
+#ifdef HAVE_XSAVE_INTRINSICS
+pg_attribute_target("xsave")
+#endif
void
set_x86_features(void)
{
@@ -76,17 +73,24 @@ set_x86_features(void)
/* All these features depend on OSXSAVE */
if (exx[2] & (1 << 27))
{
- /* second cpuid call on leaf 7 to check extended AVX-512 support */
+ uint32 xcr0_val = 0;
+ /* second cpuid call on leaf 7 to check extended AVX-512 support */
memset(exx, 0, 4 * sizeof(exx[0]));
-
#if defined(HAVE__GET_CPUID_COUNT)
__get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]);
#elif defined(HAVE__CPUIDEX)
__cpuidex(exx, 7, 0);
#endif
- if (zmm_regs_available())
+#ifdef HAVE_XSAVE_INTRINSICS
+ /* get value of Extended Control Register */
+ xcr0_val = _xgetbv(0);
+#endif
+
+ /* Are ZMM registers enabled? */
+ if (mask_available(xcr0_val, XMM | YMM |
+ OPMASK | ZMM0_15 | ZMM16_31))
{
X86Features[PG_AVX512_BW] = exx[1] >> 30 & 1;
X86Features[PG_AVX512_VL] = exx[1] >> 31 & 1;
--
2.53.0