From: Lynn Boger Date: Thu, 22 Sep 2016 19:54:45 +0000 (-0500) Subject: math, cmd/internal/obj/ppc64: improve floor, ceil, trunc with asm X-Git-Tag: go1.8beta1~1187 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3311275ce8eef87a64b78589e0da0bf115f9be07;p=gostls13.git math, cmd/internal/obj/ppc64: improve floor, ceil, trunc with asm This adds the instructions frim, frip, and friz to the ppc64x assembler for use in implementing the math.Floor, math.Ceil, and math.Trunc functions to improve performance. Fixes #17185 BenchmarkCeil-128 21.4 6.99 -67.34% BenchmarkFloor-128 13.9 6.37 -54.17% BenchmarkTrunc-128 12.7 6.33 -50.16% Change-Id: I96131bd4e8c9c8dbafb25bfeb544cf9d2dbb4282 Reviewed-on: https://go-review.googlesource.com/29654 Run-TryBot: Lynn Boger Reviewed-by: Michael Munday --- diff --git a/src/cmd/internal/obj/ppc64/a.out.go b/src/cmd/internal/obj/ppc64/a.out.go index 1b92a669c8..477bc9acd9 100644 --- a/src/cmd/internal/obj/ppc64/a.out.go +++ b/src/cmd/internal/obj/ppc64/a.out.go @@ -496,6 +496,12 @@ const ( /* optional on 32-bit */ AFRES AFRESCC + AFRIM + AFRIMCC + AFRIP + AFRIPCC + AFRIZ + AFRIZCC AFRSQRTE AFRSQRTECC AFSEL diff --git a/src/cmd/internal/obj/ppc64/anames.go b/src/cmd/internal/obj/ppc64/anames.go index e064d45c33..1d766a2d6b 100644 --- a/src/cmd/internal/obj/ppc64/anames.go +++ b/src/cmd/internal/obj/ppc64/anames.go @@ -229,6 +229,12 @@ var Anames = []string{ "RFCI", "FRES", "FRESCC", + "FRIM", + "FRIMCC", + "FRIP", + "FRIPCC", + "FRIZ", + "FRIZCC", "FRSQRTE", "FRSQRTECC", "FSEL", diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 79282acd1c..2a6f1bc577 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -1371,6 +1371,12 @@ func buildop(ctxt *obj.Link) { opset(AFCFIDUCC, r0) opset(AFRES, r0) opset(AFRESCC, r0) + opset(AFRIM, r0) + opset(AFRIMCC, r0) + opset(AFRIP, r0) + opset(AFRIPCC, r0) + opset(AFRIZ, r0) + opset(AFRIZCC, r0) opset(AFRSQRTE, r0) opset(AFRSQRTECC, r0) opset(AFSQRT, r0) @@ -3173,6 +3179,18 @@ func oprrr(ctxt *obj.Link, a obj.As) uint32 { return OPVCC(59, 24, 0, 0) case AFRESCC: return OPVCC(59, 24, 0, 1) + case AFRIM: + return OPVCC(63, 488, 0, 0) + case AFRIMCC: + return OPVCC(63, 488, 0, 1) + case AFRIP: + return OPVCC(63, 456, 0, 0) + case AFRIPCC: + return OPVCC(63, 456, 0, 1) + case AFRIZ: + return OPVCC(63, 424, 0, 0) + case AFRIZCC: + return OPVCC(63, 424, 0, 1) case AFRSP: return OPVCC(63, 12, 0, 0) case AFRSPCC: diff --git a/src/math/floor_ppc64x.s b/src/math/floor_ppc64x.s new file mode 100644 index 0000000000..2ab011d5b5 --- /dev/null +++ b/src/math/floor_ppc64x.s @@ -0,0 +1,25 @@ +// Copyright 2016 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. + +// +build ppc64 ppc64le + +#include "textflag.h" + +TEXT ·Floor(SB),NOSPLIT,$0 + FMOVD x+0(FP), F0 + FRIM F0, F0 + FMOVD F0, ret+8(FP) + RET + +TEXT ·Ceil(SB),NOSPLIT,$0 + FMOVD x+0(FP), F0 + FRIP F0, F0 + FMOVD F0, ret+8(FP) + RET + +TEXT ·Trunc(SB),NOSPLIT,$0 + FMOVD x+0(FP), F0 + FRIZ F0, F0 + FMOVD F0, ret+8(FP) + RET diff --git a/src/math/stubs_ppc64x.s b/src/math/stubs_ppc64x.s index a57357e2ee..de8a5ff8bf 100644 --- a/src/math/stubs_ppc64x.s +++ b/src/math/stubs_ppc64x.s @@ -36,15 +36,6 @@ TEXT ·Expm1(SB),NOSPLIT,$0 TEXT ·Exp(SB),NOSPLIT,$0 BR ·exp(SB) -TEXT ·Floor(SB),NOSPLIT,$0 - BR ·floor(SB) - -TEXT ·Ceil(SB),NOSPLIT,$0 - BR ·ceil(SB) - -TEXT ·Trunc(SB),NOSPLIT,$0 - BR ·trunc(SB) - TEXT ·Frexp(SB),NOSPLIT,$0 BR ·frexp(SB)