From 9f7ea616742f8d58ecc140afcb0fa53bcb84fe9b Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Fri, 26 Aug 2016 11:39:47 -0400 Subject: [PATCH] math: optimize Ceil, Floor and Trunc on s390x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the FIDBR instruction to round floating-point numbers to integers. name old time/op new time/op delta Ceil 14.1ns ± 0% 3.0ns ± 0% -78.89% (p=0.000 n=10+10) Floor 6.42ns ± 0% 3.03ns ± 0% -52.80% (p=0.000 n=10+10) Trunc 6.67ns ± 0% 3.03ns ± 0% -54.57% (p=0.000 n=10+9) Change-Id: I3b416f6d0bccaaa9b547de86356471365862399c Reviewed-on: https://go-review.googlesource.com/27827 Reviewed-by: Brad Fitzpatrick --- src/math/floor_s390x.s | 26 ++++++++++++++++++++++++++ src/math/stubs_s390x.s | 9 --------- 2 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 src/math/floor_s390x.s diff --git a/src/math/floor_s390x.s b/src/math/floor_s390x.s new file mode 100644 index 0000000000..896e79b807 --- /dev/null +++ b/src/math/floor_s390x.s @@ -0,0 +1,26 @@ +// 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. + +#include "textflag.h" + +// func Floor(x float64) float64 +TEXT ·Floor(SB),NOSPLIT,$0 + FMOVD x+0(FP), F0 + FIDBR $7, F0, F0 + FMOVD F0, ret+8(FP) + RET + +// func Ceil(x float64) float64 +TEXT ·Ceil(SB),NOSPLIT,$0 + FMOVD x+0(FP), F0 + FIDBR $6, F0, F0 + FMOVD F0, ret+8(FP) + RET + +// func Trunc(x float64) float64 +TEXT ·Trunc(SB),NOSPLIT,$0 + FMOVD x+0(FP), F0 + FIDBR $5, F0, F0 + FMOVD F0, ret+8(FP) + RET diff --git a/src/math/stubs_s390x.s b/src/math/stubs_s390x.s index 76868447cd..c3aed13e87 100644 --- a/src/math/stubs_s390x.s +++ b/src/math/stubs_s390x.s @@ -25,15 +25,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)