]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check GOAMD64 v4 compatibility on Darwin
authorvpachkov <slava.pach@gmail.com>
Fri, 19 Nov 2021 11:38:23 +0000 (14:38 +0300)
committerKeith Randall <khr@golang.org>
Fri, 1 Apr 2022 00:05:05 +0000 (00:05 +0000)
Darwin requires a different approach to check AVX512 support.

Update #45453

Change-Id: Ia3dfecc04b47aab16f472000e92e46d4fc6d596d
Reviewed-on: https://go-review.googlesource.com/c/go/+/365395
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Trust: Heschi Kreinick <heschi@google.com>

src/runtime/asm_amd64.s

index c08ae610fb7759527568d01690142d9142f14ea2..86d6a96d88f88b8450df51e059a3de7d7921c76d 100644 (file)
@@ -136,9 +136,20 @@ GLOBL bad_cpu_msg<>(SB), RODATA, $84
 #define NEED_EXT_FEATURES_CX V4_EXT_FEATURES_CX
 #define NEED_EXT_FEATURES_BX V4_EXT_FEATURES_BX
 
-// Downgrading v4 OS checks on Darwin for now, see CL 285572.
+// Darwin requires a different approach to check AVX512 support, see CL 285572.
 #ifdef GOOS_darwin
 #define NEED_OS_SUPPORT_AX V3_OS_SUPPORT_AX
+// These values are from:
+// https://github.com/apple/darwin-xnu/blob/xnu-4570.1.46/osfmk/i386/cpu_capabilities.h
+#define commpage64_base_address         0x00007fffffe00000
+#define commpage64_cpu_capabilities64   (commpage64_base_address+0x010)
+#define commpage64_version              (commpage64_base_address+0x01E)
+#define hasAVX512F                      0x0000004000000000
+#define hasAVX512CD                     0x0000008000000000
+#define hasAVX512DQ                     0x0000010000000000
+#define hasAVX512BW                     0x0000020000000000
+#define hasAVX512VL                     0x0000100000000000
+#define NEED_DARWIN_SUPPORT             (hasAVX512F | hasAVX512DQ | hasAVX512CD | hasAVX512BW | hasAVX512VL)
 #else
 #define NEED_OS_SUPPORT_AX V4_OS_SUPPORT_AX
 #endif
@@ -311,6 +322,18 @@ ok:
        JNE     bad_cpu
 #endif
 
+#ifdef NEED_DARWIN_SUPPORT
+       MOVQ    $commpage64_version, BX
+       CMPW    (BX), $13  // cpu_capabilities64 undefined in versions < 13
+       JL      bad_cpu
+       MOVQ    $commpage64_cpu_capabilities64, BX
+       MOVQ    (BX), BX
+       MOVQ    $NEED_DARWIN_SUPPORT, CX
+       ANDQ    CX, BX
+       CMPQ    BX, CX
+       JNE     bad_cpu
+#endif
+
        CALL    runtime·check(SB)
 
        MOVL    24(SP), AX              // copy argc