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)