cmd/go: add GOAMD64 environment variable

The variable represents the microarchitecture level for which to compile.
Valid values are v1 (default), v2, v3, v4.

Updates #45453

Change-Id: I095197fc9239d79f98896d7e745e2341354daca4
GitHub-Last-Rev: f83ed17204
GitHub-Pull-Request: golang/go#48359
Reviewed-on: https://go-review.googlesource.com/c/go/+/349595
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
nimelehin 2021-09-15 04:30:49 +00:00 committed by Matthew Dempsky
parent 04f5116c98
commit b1bedc0774
10 changed files with 71 additions and 1 deletions

11
src/cmd/dist/build.go vendored
View File

@ -32,6 +32,7 @@ var (
goos string goos string
goarm string goarm string
go386 string go386 string
goamd64 string
gomips string gomips string
gomips64 string gomips64 string
goppc64 string goppc64 string
@ -145,6 +146,12 @@ func xinit() {
} }
go386 = b go386 = b
b = os.Getenv("GOAMD64")
if b == "" {
b = "v1"
}
goamd64 = b
b = os.Getenv("GOMIPS") b = os.Getenv("GOMIPS")
if b == "" { if b == "" {
b = "hardfloat" b = "hardfloat"
@ -217,6 +224,7 @@ func xinit() {
// For tools being invoked but also for os.ExpandEnv. // For tools being invoked but also for os.ExpandEnv.
os.Setenv("GO386", go386) os.Setenv("GO386", go386)
os.Setenv("GOAMD64", goamd64)
os.Setenv("GOARCH", goarch) os.Setenv("GOARCH", goarch)
os.Setenv("GOARM", goarm) os.Setenv("GOARM", goarm)
os.Setenv("GOHOSTARCH", gohostarch) os.Setenv("GOHOSTARCH", gohostarch)
@ -1181,6 +1189,9 @@ func cmdenv() {
if goarch == "386" { if goarch == "386" {
xprintf(format, "GO386", go386) xprintf(format, "GO386", go386)
} }
if goarch == "amd64" {
xprintf(format, "GOAMD64", goamd64)
}
if goarch == "mips" || goarch == "mipsle" { if goarch == "mips" || goarch == "mipsle" {
xprintf(format, "GOMIPS", gomips) xprintf(format, "GOMIPS", gomips)
} }

View File

@ -60,6 +60,7 @@ func mkbuildcfg(file string) {
fmt.Fprintf(&buf, "import \"runtime\"\n") fmt.Fprintf(&buf, "import \"runtime\"\n")
fmt.Fprintln(&buf) fmt.Fprintln(&buf)
fmt.Fprintf(&buf, "const defaultGO386 = `%s`\n", go386) fmt.Fprintf(&buf, "const defaultGO386 = `%s`\n", go386)
fmt.Fprintf(&buf, "const defaultGOAMD64 = `%s`\n", goamd64)
fmt.Fprintf(&buf, "const defaultGOARM = `%s`\n", goarm) fmt.Fprintf(&buf, "const defaultGOARM = `%s`\n", goarm)
fmt.Fprintf(&buf, "const defaultGOMIPS = `%s`\n", gomips) fmt.Fprintf(&buf, "const defaultGOMIPS = `%s`\n", gomips)
fmt.Fprintf(&buf, "const defaultGOMIPS64 = `%s`\n", gomips64) fmt.Fprintf(&buf, "const defaultGOMIPS64 = `%s`\n", gomips64)

View File

@ -1987,6 +1987,10 @@
// GO386 // GO386
// For GOARCH=386, how to implement floating point instructions. // For GOARCH=386, how to implement floating point instructions.
// Valid values are sse2 (default), softfloat. // Valid values are sse2 (default), softfloat.
// GOAMD64
// For GOARCH=GOAMD64, the microarchitecture level for which to compile.
// Valid values are v1 (default), v2, v3, v4.
// See https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels.
// GOMIPS // GOMIPS
// For GOARCH=mips{,le}, whether to use floating point instructions. // For GOARCH=mips{,le}, whether to use floating point instructions.
// Valid values are hardfloat (default), softfloat. // Valid values are hardfloat (default), softfloat.

View File

@ -263,6 +263,7 @@ var (
// Used in envcmd.MkEnv and build ID computations. // Used in envcmd.MkEnv and build ID computations.
GOARM = envOr("GOARM", fmt.Sprint(buildcfg.GOARM)) GOARM = envOr("GOARM", fmt.Sprint(buildcfg.GOARM))
GO386 = envOr("GO386", buildcfg.GO386) GO386 = envOr("GO386", buildcfg.GO386)
GOAMD64 = envOr("GOAMD64", fmt.Sprintf("%s%d", "v", buildcfg.GOAMD64))
GOMIPS = envOr("GOMIPS", buildcfg.GOMIPS) GOMIPS = envOr("GOMIPS", buildcfg.GOMIPS)
GOMIPS64 = envOr("GOMIPS64", buildcfg.GOMIPS64) GOMIPS64 = envOr("GOMIPS64", buildcfg.GOMIPS64)
GOPPC64 = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", buildcfg.GOPPC64)) GOPPC64 = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", buildcfg.GOPPC64))
@ -289,6 +290,8 @@ func GetArchEnv() (key, val string) {
return "GOARM", GOARM return "GOARM", GOARM
case "386": case "386":
return "GO386", GO386 return "GO386", GO386
case "amd64":
return "GOAMD64", GOAMD64
case "mips", "mipsle": case "mips", "mipsle":
return "GOMIPS", GOMIPS return "GOMIPS", GOMIPS
case "mips64", "mips64le": case "mips64", "mips64le":

View File

@ -592,6 +592,10 @@ Architecture-specific environment variables:
GO386 GO386
For GOARCH=386, how to implement floating point instructions. For GOARCH=386, how to implement floating point instructions.
Valid values are sse2 (default), softfloat. Valid values are sse2 (default), softfloat.
GOAMD64
For GOARCH=GOAMD64, the microarchitecture level for which to compile.
Valid values are v1 (default), v2, v3, v4.
See https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels.
GOMIPS GOMIPS
For GOARCH=mips{,le}, whether to use floating point instructions. For GOARCH=mips{,le}, whether to use floating point instructions.
Valid values are hardfloat (default), softfloat. Valid values are hardfloat (default), softfloat.

View File

@ -379,6 +379,11 @@ func asmArgs(a *Action, p *load.Package) []interface{} {
args = append(args, "-D", "GO386_"+cfg.GO386) args = append(args, "-D", "GO386_"+cfg.GO386)
} }
if cfg.Goarch == "amd64" {
// Define GOAMD64_value from cfg.GOAMD64.
args = append(args, "-D", "GOAMD64_"+cfg.GOAMD64)
}
if cfg.Goarch == "mips" || cfg.Goarch == "mipsle" { if cfg.Goarch == "mips" || cfg.Goarch == "mipsle" {
// Define GOMIPS_value from cfg.GOMIPS. // Define GOMIPS_value from cfg.GOMIPS.
args = append(args, "-D", "GOMIPS_"+cfg.GOMIPS) args = append(args, "-D", "GOMIPS_"+cfg.GOMIPS)

View File

@ -25,6 +25,7 @@ var (
GOARCH = envOr("GOARCH", defaultGOARCH) GOARCH = envOr("GOARCH", defaultGOARCH)
GOOS = envOr("GOOS", defaultGOOS) GOOS = envOr("GOOS", defaultGOOS)
GO386 = envOr("GO386", defaultGO386) GO386 = envOr("GO386", defaultGO386)
GOAMD64 = goamd64()
GOARM = goarm() GOARM = goarm()
GOMIPS = gomips() GOMIPS = gomips()
GOMIPS64 = gomips64() GOMIPS64 = gomips64()
@ -52,6 +53,21 @@ func envOr(key, value string) string {
return value return value
} }
func goamd64() int {
switch v := envOr("GOAMD64", defaultGOAMD64); v {
case "v1":
return 1
case "v2":
return 2
case "v3":
return 3
case "v4":
return 4
}
Error = fmt.Errorf("invalid GOAMD64: must be v1, v2, v3, v4")
return int(defaultGOAMD64[len("v")] - '0')
}
func goarm() int { func goarm() int {
def := defaultGOARM def := defaultGOARM
if GOOS == "android" && GOARCH == "arm" { if GOOS == "android" && GOARCH == "arm" {

View File

@ -0,0 +1,25 @@
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package buildcfg
import (
"os"
"testing"
)
func TestConfigFlags(t *testing.T) {
os.Setenv("GOAMD64", "v1")
if goamd64() != 1 {
t.Errorf("Wrong parsing of GOAMD64=v1")
}
os.Setenv("GOAMD64", "v4")
if goamd64() != 4 {
t.Errorf("Wrong parsing of GOAMD64=v4")
}
os.Setenv("GOAMD64", "1")
if goamd64() != 1 {
t.Errorf("Wrong parsing of GOAMD64=1")
}
}

View File

@ -33,6 +33,7 @@ const KnownEnv = `
GCCGO GCCGO
GO111MODULE GO111MODULE
GO386 GO386
GOAMD64
GOARCH GOARCH
GOARM GOARM
GOBIN GOBIN

View File

@ -1753,7 +1753,7 @@ var (
// are the supported variants. // are the supported variants.
archVariants = map[string][]string{ archVariants = map[string][]string{
"386": {"GO386", "sse2", "softfloat"}, "386": {"GO386", "sse2", "softfloat"},
"amd64": {}, "amd64": {"GOAMD64", "v1", "v2", "v3", "v4"},
"arm": {"GOARM", "5", "6", "7"}, "arm": {"GOARM", "5", "6", "7"},
"arm64": {}, "arm64": {},
"mips": {"GOMIPS", "hardfloat", "softfloat"}, "mips": {"GOMIPS", "hardfloat", "softfloat"},