From ad377e906a8ee6f27545d83de280206dacec1e58 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Tue, 20 Jun 2023 20:43:11 +0800 Subject: [PATCH] math: add round assembly implementations on riscv64 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit goos: linux goarch: riscv64 pkg: math │ floor_old.bench │ floor_new.bench │ │ sec/op │ sec/op vs base │ Ceil 54.12n ± 0% 22.05n ± 0% -59.26% (p=0.000 n=10) Floor 40.80n ± 0% 22.05n ± 0% -45.96% (p=0.000 n=10) Round 20.73n ± 0% 20.74n ± 0% ~ (p=0.441 n=10) RoundToEven 24.07n ± 0% 24.07n ± 0% ~ (p=1.000 n=10) Trunc 38.73n ± 0% 22.05n ± 0% -43.07% (p=0.000 n=10) geomean 33.58n 22.17n -33.98% Change-Id: I24fb9e3bbf8146da253b6791b21377bea1afbd16 Reviewed-on: https://go-review.googlesource.com/c/go/+/504737 TryBot-Result: Gopher Robot Reviewed-by: Russ Cox Reviewed-by: M Zhuo Reviewed-by: Cherry Mui Run-TryBot: M Zhuo LUCI-TryBot-Result: Go LUCI Reviewed-by: David Chase Reviewed-by: Joel Sing --- src/math/floor_asm.go | 2 +- src/math/floor_noasm.go | 2 +- src/math/floor_riscv64.s | 41 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/math/floor_riscv64.s diff --git a/src/math/floor_asm.go b/src/math/floor_asm.go index fb419d6da2..5cb45f5a7e 100644 --- a/src/math/floor_asm.go +++ b/src/math/floor_asm.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build 386 || amd64 || arm64 || ppc64 || ppc64le || s390x || wasm +//go:build 386 || amd64 || arm64 || ppc64 || ppc64le || riscv64 || s390x || wasm package math diff --git a/src/math/floor_noasm.go b/src/math/floor_noasm.go index 5641c7ea0a..6754ca8fc8 100644 --- a/src/math/floor_noasm.go +++ b/src/math/floor_noasm.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !386 && !amd64 && !arm64 && !ppc64 && !ppc64le && !s390x && !wasm +//go:build !386 && !amd64 && !arm64 && !ppc64 && !ppc64le && !riscv64 && !s390x && !wasm package math diff --git a/src/math/floor_riscv64.s b/src/math/floor_riscv64.s new file mode 100644 index 0000000000..62ce963781 --- /dev/null +++ b/src/math/floor_riscv64.s @@ -0,0 +1,41 @@ +// Copyright 2023 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" + +#define PosInf 0x7FF0000000000000 + +// The rounding mode of RISC-V is different from Go spec. + +#define ROUNDFN(NAME, MODE) \ +TEXT NAME(SB),NOSPLIT,$0; \ + MOVD x+0(FP), F0; \ + /* whether x is NaN */; \ + FEQD F0, F0, X6; \ + BNEZ X6, 3(PC); \ + /* return NaN if x is NaN */; \ + MOVD F0, ret+8(FP); \ + RET; \ + MOV $PosInf, X6; \ + FMVDX X6, F1; \ + FABSD F0, F2; \ + /* if abs(x) > +Inf, return Inf instead of round(x) */; \ + FLTD F1, F2, X6; \ + /* Inf should keep same signed with x then return */; \ + BEQZ X6, 3(PC); \ + FCVTLD.MODE F0, X6; \ + FCVTDL X6, F1; \ + /* rounding will drop signed bit in RISCV, restore it */; \ + FSGNJD F0, F1, F0; \ + MOVD F0, ret+8(FP); \ + RET + +// func archFloor(x float64) float64 +ROUNDFN(·archFloor, RDN) + +// func archCeil(x float64) float64 +ROUNDFN(·archCeil, RUP) + +// func archTrunc(x float64) float64 +ROUNDFN(·archTrunc, RTZ) -- 2.48.1