]> Cypherpunks repositories - gostls13.git/commitdiff
internal/cpu: disallow disabling options that are required for microarch
authorKeith Randall <khr@golang.org>
Thu, 10 Mar 2022 23:26:22 +0000 (15:26 -0800)
committerKeith Randall <khr@golang.org>
Mon, 14 Mar 2022 21:23:36 +0000 (21:23 +0000)
e.g., if GOAMD64=v3, don't allow GODEBUG=cpu.XXX=off for XXX which
are required for v3.

Change-Id: Ib58a4c8b13c5464ba476448ba44bbb261218787c
Reviewed-on: https://go-review.googlesource.com/c/go/+/391694
Trust: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Martin Möhrmann <martin@golang.org>
src/internal/cpu/cpu_x86.go
src/internal/cpu/cpu_x86.s

index 81d5ceed61a1608698e581e936588c1899318a6a..6fd979a7470ec19c18d2190af3ae1c64d54bacfe 100644 (file)
@@ -14,6 +14,9 @@ func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)
 // xgetbv with ecx = 0 is implemented in cpu_x86.s.
 func xgetbv() (eax, edx uint32)
 
+// getGOAMD64level is implemented in cpu_x86.s. Returns number in [1,4].
+func getGOAMD64level() int32
+
 const (
        // edx bits
        cpuid_SSE2 = 1 << 26
@@ -47,19 +50,30 @@ func doinit() {
        options = []option{
                {Name: "adx", Feature: &X86.HasADX},
                {Name: "aes", Feature: &X86.HasAES},
-               {Name: "avx", Feature: &X86.HasAVX},
-               {Name: "avx2", Feature: &X86.HasAVX2},
-               {Name: "bmi1", Feature: &X86.HasBMI1},
-               {Name: "bmi2", Feature: &X86.HasBMI2},
                {Name: "erms", Feature: &X86.HasERMS},
-               {Name: "fma", Feature: &X86.HasFMA},
                {Name: "pclmulqdq", Feature: &X86.HasPCLMULQDQ},
-               {Name: "popcnt", Feature: &X86.HasPOPCNT},
                {Name: "rdtscp", Feature: &X86.HasRDTSCP},
-               {Name: "sse3", Feature: &X86.HasSSE3},
-               {Name: "sse41", Feature: &X86.HasSSE41},
-               {Name: "sse42", Feature: &X86.HasSSE42},
-               {Name: "ssse3", Feature: &X86.HasSSSE3},
+       }
+       level := getGOAMD64level()
+       if level < 2 {
+               // These options are required at level 2. At lower levels
+               // they can be turned off.
+               options = append(options,
+                       option{Name: "popcnt", Feature: &X86.HasPOPCNT},
+                       option{Name: "sse3", Feature: &X86.HasSSE3},
+                       option{Name: "sse41", Feature: &X86.HasSSE41},
+                       option{Name: "sse42", Feature: &X86.HasSSE42},
+                       option{Name: "ssse3", Feature: &X86.HasSSSE3})
+       }
+       if level < 3 {
+               // These options are required at level 3. At lower levels
+               // they can be turned off.
+               options = append(options,
+                       option{Name: "avx", Feature: &X86.HasAVX},
+                       option{Name: "avx2", Feature: &X86.HasAVX2},
+                       option{Name: "bmi1", Feature: &X86.HasBMI1},
+                       option{Name: "bmi2", Feature: &X86.HasBMI2},
+                       option{Name: "fma", Feature: &X86.HasFMA})
        }
 
        maxID, _, _, _ := cpuid(0, 0)
index edef21905ca51c7b1a50e170d738295d86fe8cbb..2ee8eca248a614ad3840bdf3f138b9d3651064d1 100644 (file)
@@ -24,3 +24,20 @@ TEXT ·xgetbv(SB),NOSPLIT,$0-8
        MOVL AX, eax+0(FP)
        MOVL DX, edx+4(FP)
        RET
+
+// func getGOAMD64level() int32
+TEXT ·getGOAMD64level(SB),NOSPLIT,$0-4
+#ifdef GOAMD64_v4
+       MOVL $4, ret+0(FP)
+#else
+#ifdef GOAMD64_v3
+       MOVL $3, ret+0(FP)
+#else
+#ifdef GOAMD64_v2
+       MOVL $2, ret+0(FP)
+#else
+       MOVL $1, ret+0(FP)
+#endif
+#endif
+#endif
+       RET