mirror of
https://github.com/golang/go
synced 2024-11-25 03:37:58 -07:00
math: Add ARM64 Abs assembly implementation
The benchmark which run on Apple Silicon M1 chip is listed as following. BenchmarkAbs-8 0.9488 ns/op 0 B/op 0 allocs/op BenchmarkAbsGo-8 1.007 ns/op 0 B/op 0 allocs/op Average time per iteration drops 5.78%
This commit is contained in:
parent
891547e2d4
commit
3fef4a07c7
@ -10,5 +10,12 @@ package math
|
|||||||
// Abs(±Inf) = +Inf
|
// Abs(±Inf) = +Inf
|
||||||
// Abs(NaN) = NaN
|
// Abs(NaN) = NaN
|
||||||
func Abs(x float64) float64 {
|
func Abs(x float64) float64 {
|
||||||
|
if haveArchAbs {
|
||||||
|
return archAbs(x)
|
||||||
|
}
|
||||||
|
return abs(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func abs(x float64) float64 {
|
||||||
return Float64frombits(Float64bits(x) &^ (1 << 63))
|
return Float64frombits(Float64bits(x) &^ (1 << 63))
|
||||||
}
|
}
|
||||||
|
12
src/math/abs_arm64.s
Normal file
12
src/math/abs_arm64.s
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
// func archAbs(x float64) float64
|
||||||
|
TEXT ·archAbs(SB), NOSPLIT, $0-16
|
||||||
|
FMOVD x+0(FP), F0
|
||||||
|
FABSD F0, F0
|
||||||
|
FMOVD F0, ret+8(FP)
|
||||||
|
RET
|
12
src/math/abs_asm.go
Normal file
12
src/math/abs_asm.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build arm64
|
||||||
|
// +build arm64
|
||||||
|
|
||||||
|
package math
|
||||||
|
|
||||||
|
const haveArchAbs = true
|
||||||
|
|
||||||
|
func archAbs(x float64) float64
|
14
src/math/abs_noasm.go
Normal file
14
src/math/abs_noasm.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
//go:build !arm64
|
||||||
|
// +build !arm64
|
||||||
|
|
||||||
|
package math
|
||||||
|
|
||||||
|
const haveArchAbs = false
|
||||||
|
|
||||||
|
func archAbs(x float64) float64 {
|
||||||
|
panic("not implemented")
|
||||||
|
}
|
@ -3417,6 +3417,15 @@ func BenchmarkAbs(b *testing.B) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkAbsGo(b *testing.B) {
|
||||||
|
x := 0.0
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
x = AbsGo(absPos)
|
||||||
|
}
|
||||||
|
GlobalF = x
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkDim(b *testing.B) {
|
func BenchmarkDim(b *testing.B) {
|
||||||
x := 0.0
|
x := 0.0
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
package math
|
package math
|
||||||
|
|
||||||
// Export internal functions for testing.
|
// Export internal functions for testing.
|
||||||
|
var AbsGo = abs
|
||||||
var ExpGo = exp
|
var ExpGo = exp
|
||||||
var Exp2Go = exp2
|
var Exp2Go = exp2
|
||||||
var HypotGo = hypot
|
var HypotGo = hypot
|
||||||
|
Loading…
Reference in New Issue
Block a user