1
0
mirror of https://github.com/golang/go synced 2024-11-07 15:06:16 -07:00

internal/cpu: add options and warnings for required cpu features

Updates #27218

Change-Id: I8603f3a639cdd9ee201c4f1566692e5b88877fc4
Reviewed-on: https://go-review.googlesource.com/c/144107
Run-TryBot: Martin Möhrmann <martisch@uos.de>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Martin Möhrmann 2018-10-23 23:39:29 +02:00 committed by Martin Möhrmann
parent 1e38ecdbbe
commit 980340ade7
5 changed files with 21 additions and 19 deletions

View File

@ -155,8 +155,9 @@ var options []option
type option struct {
Name string
Feature *bool
Specified bool // Stores if feature value was specified in GODEBUGCPU.
Enable bool // Stores if feature should be enabled.
Specified bool // whether feature value was specified in GODEBUGCPU
Enable bool // whether feature should be enabled
Required bool // whether feature is mandatory and can not be disabled
}
// processOptions enables or disables CPU feature values based on the parsed env string.
@ -196,7 +197,7 @@ field:
if key == "all" {
for i := range options {
options[i].Specified = true
options[i].Enable = enable
options[i].Enable = enable || options[i].Required
}
continue field
}
@ -222,6 +223,11 @@ field:
continue
}
if !o.Enable && o.Required {
print("GODEBUGCPU: can not disable \"", o.Name, "\", required feature\n")
continue
}
*o.Feature = o.Enable
}
}

View File

@ -66,8 +66,8 @@ func doinit() {
{Name: "asimdfhm", Feature: &ARM64.HasASIMDFHM},
// These capabilities should always be enabled on arm64:
// {Name: "fp", Feature: &ARM64.HasFP},
// {Name: "asimd", Feature: &ARM64.HasASIMD},
{Name: "fp", Feature: &ARM64.HasFP, Required: true},
{Name: "asimd", Feature: &ARM64.HasASIMD, Required: true},
}
// HWCAP feature bits

View File

@ -40,11 +40,11 @@ func doinit() {
{Name: "scv", Feature: &PPC64.HasSCV},
// These capabilities should always be enabled on ppc64 and ppc64le:
// {Name: "vmx", Feature: &PPC64.HasVMX},
// {Name: "dfp", Feature: &PPC64.HasDFP},
// {Name: "vsx", Feature: &PPC64.HasVSX},
// {Name: "isel", Feature: &PPC64.HasISEL},
// {Name: "vcrypto", Feature: &PPC64.HasVCRYPTO},
{Name: "vmx", Feature: &PPC64.HasVMX, Required: true},
{Name: "dfp", Feature: &PPC64.HasDFP, Required: true},
{Name: "vsx", Feature: &PPC64.HasVSX, Required: true},
{Name: "isel", Feature: &PPC64.HasISEL, Required: true},
{Name: "vcrypto", Feature: &PPC64.HasVCRYPTO, Required: true},
}
// HWCAP feature bits

View File

@ -52,8 +52,9 @@ func TestAllCapabilitiesDisabled(t *testing.T) {
}
for _, o := range Options {
if got := *o.Feature; got != false {
t.Errorf("%v: expected false, got %v", o.Name, got)
want := o.Required
if got := *o.Feature; got != want {
t.Errorf("%v: expected %v, got %v", o.Name, want, got)
}
}
}

View File

@ -55,13 +55,8 @@ func doinit() {
{Name: "sse42", Feature: &X86.HasSSE42},
{Name: "ssse3", Feature: &X86.HasSSSE3},
// sse2 set as last element so it can easily be removed again. See code below.
{Name: "sse2", Feature: &X86.HasSSE2},
}
// Remove sse2 from options on amd64(p32) because SSE2 is a mandatory feature for these GOARCHs.
if GOARCH == "amd64" || GOARCH == "amd64p32" {
options = options[:len(options)-1]
// These capabilities should always be enabled on amd64(p32):
{Name: "sse2", Feature: &X86.HasSSE2, Required: GOARCH == "amd64" || GOARCH == "amd64p32"},
}
maxID, _, _, _ := cpuid(0, 0)