Skip to content

Commit

Permalink
cmd/compile: don't emit unnecessary amd64 extension checks
Browse files Browse the repository at this point in the history
In case of amd64 the compiler issues checks if extensions are
available on a platform. With GOAMD64 microarchitecture levels
provided, some of the checks could be eliminated.

Change-Id: If15c178bcae273b2ce7d3673415cb8849292e087
Reviewed-on: https://go-review.googlesource.com/c/go/+/352010
Reviewed-by: Keith Randall <[email protected]>
Reviewed-by: Matthew Dempsky <[email protected]>
Run-TryBot: Keith Randall <[email protected]>
TryBot-Result: Go Bot <[email protected]>
  • Loading branch information
nimelehin authored and randall77 committed Oct 5, 2021
1 parent 5d946f1 commit 097a82f
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
13 changes: 13 additions & 0 deletions src/cmd/compile/internal/ssagen/ssa.go
Original file line number Diff line number Diff line change
Expand Up @@ -4245,6 +4245,11 @@ func InitTables() {
s.vars[n] = s.callResult(n, callNormal) // types.Types[TFLOAT64]
return s.variable(n, types.Types[types.TFLOAT64])
}

if buildcfg.GOAMD64 >= 3 {
return s.newValue3(ssa.OpFMA, types.Types[types.TFLOAT64], args[0], args[1], args[2])
}

v := s.entryNewValue0A(ssa.OpHasCPUFeature, types.Types[types.TBOOL], ir.Syms.X86HasFMA)
b := s.endBlock()
b.Kind = ssa.BlockIf
Expand Down Expand Up @@ -4307,6 +4312,10 @@ func InitTables() {

makeRoundAMD64 := func(op ssa.Op) func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
return func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
if buildcfg.GOAMD64 >= 2 {
return s.newValue1(op, types.Types[types.TFLOAT64], args[0])
}

v := s.entryNewValue0A(ssa.OpHasCPUFeature, types.Types[types.TBOOL], ir.Syms.X86HasSSE41)
b := s.endBlock()
b.Kind = ssa.BlockIf
Expand Down Expand Up @@ -4513,6 +4522,10 @@ func InitTables() {

makeOnesCountAMD64 := func(op ssa.Op) func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
return func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
if buildcfg.GOAMD64 >= 2 {
return s.newValue1(op, types.Types[types.TINT], args[0])
}

v := s.entryNewValue0A(ssa.OpHasCPUFeature, types.Types[types.TBOOL], ir.Syms.X86HasPOPCNT)
b := s.endBlock()
b.Kind = ssa.BlockIf
Expand Down
9 changes: 9 additions & 0 deletions test/codegen/math.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ import "math"
var sink64 [8]float64

func approx(x float64) {
// amd64/v2:-".*x86HasSSE41" amd64/v3:-".*x86HasSSE41"
// amd64:"ROUNDSD\t[$]2"
// s390x:"FIDBR\t[$]6"
// arm64:"FRINTPD"
// ppc64:"FRIP"
// ppc64le:"FRIP"
// wasm:"F64Ceil"
sink64[0] = math.Ceil(x)

// amd64/v2:-".*x86HasSSE41" amd64/v3:-".*x86HasSSE41"
// amd64:"ROUNDSD\t[$]1"
// s390x:"FIDBR\t[$]7"
// arm64:"FRINTMD"
// ppc64:"FRIM"
Expand All @@ -31,13 +35,17 @@ func approx(x float64) {
// ppc64le:"FRIN"
sink64[2] = math.Round(x)

// amd64/v2:-".*x86HasSSE41" amd64/v3:-".*x86HasSSE41"
// amd64:"ROUNDSD\t[$]3"
// s390x:"FIDBR\t[$]5"
// arm64:"FRINTZD"
// ppc64:"FRIZ"
// ppc64le:"FRIZ"
// wasm:"F64Trunc"
sink64[3] = math.Trunc(x)

// amd64/v2:-".*x86HasSSE41" amd64/v3:-".*x86HasSSE41"
// amd64:"ROUNDSD\t[$]0"
// s390x:"FIDBR\t[$]4"
// arm64:"FRINTND"
// wasm:"F64Nearest"
Expand Down Expand Up @@ -123,6 +131,7 @@ func copysign(a, b, c float64) {
}

func fma(x, y, z float64) float64 {
// amd64/v3:-".*x86HasFMA"
// amd64:"VFMADD231SD"
// arm/6:"FMULAD"
// arm64:"FMADDD"
Expand Down
6 changes: 5 additions & 1 deletion test/codegen/mathbits.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,9 @@ func Len8(n uint8) int {
// bits.OnesCount //
// -------------------- //

// TODO(register args) Restore a m d 6 4 :.*x86HasPOPCNT when only one ABI is tested.
// TODO(register args) Restore a m d 6 4 / v 1 :.*x86HasPOPCNT when only one ABI is tested.
func OnesCount(n uint) int {
// amd64/v2:-".*x86HasPOPCNT" amd64/v3:-".*x86HasPOPCNT"
// amd64:"POPCNTQ"
// arm64:"VCNT","VUADDLV"
// s390x:"POPCNT"
Expand All @@ -130,6 +131,7 @@ func OnesCount(n uint) int {
}

func OnesCount64(n uint64) int {
// amd64/v2:-".*x86HasPOPCNT" amd64/v3:-".*x86HasPOPCNT"
// amd64:"POPCNTQ"
// arm64:"VCNT","VUADDLV"
// s390x:"POPCNT"
Expand All @@ -140,6 +142,7 @@ func OnesCount64(n uint64) int {
}

func OnesCount32(n uint32) int {
// amd64/v2:-".*x86HasPOPCNT" amd64/v3:-".*x86HasPOPCNT"
// amd64:"POPCNTL"
// arm64:"VCNT","VUADDLV"
// s390x:"POPCNT"
Expand All @@ -150,6 +153,7 @@ func OnesCount32(n uint32) int {
}

func OnesCount16(n uint16) int {
// amd64/v2:-".*x86HasPOPCNT" amd64/v3:-".*x86HasPOPCNT"
// amd64:"POPCNTL"
// arm64:"VCNT","VUADDLV"
// s390x:"POPCNT"
Expand Down

0 comments on commit 097a82f

Please sign in to comment.