From: Joel Sing Date: Sun, 15 Mar 2020 16:13:17 +0000 (+1100) Subject: math: implement Min/Max in riscv64 assembly X-Git-Tag: go1.15beta1~239 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=03e6073b1340f9a9d92dc4902108ace36f9d5531;p=gostls13.git math: implement Min/Max in riscv64 assembly Change-Id: If34422859d47bc8f44974a00c6b7908e7655ff41 Reviewed-on: https://go-review.googlesource.com/c/go/+/223561 Reviewed-by: Cherry Zhang --- diff --git a/src/math/dim_riscv64.s b/src/math/dim_riscv64.s new file mode 100644 index 0000000000..38f5fe7a91 --- /dev/null +++ b/src/math/dim_riscv64.s @@ -0,0 +1,70 @@ +// Copyright 2020 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" + +// Values returned from an FCLASS instruction. +#define NegInf 0x001 +#define PosInf 0x080 +#define NaN 0x200 + +// func Max(x, y float64) float64 +TEXT ·Max(SB),NOSPLIT,$0 + MOVD x+0(FP), F0 + MOVD y+8(FP), F1 + FCLASSD F0, X5 + FCLASSD F1, X6 + + // +Inf special cases + MOV $PosInf, X7 + BEQ X7, X5, isMaxX + BEQ X7, X6, isMaxY + + // NaN special cases + MOV $NaN, X7 + BEQ X7, X5, isMaxX + BEQ X7, X6, isMaxY + + // normal case + FMAXD F0, F1, F0 + MOVD F0, ret+16(FP) + RET + +isMaxX: // return x + MOVD F0, ret+16(FP) + RET + +isMaxY: // return y + MOVD F1, ret+16(FP) + RET + +// func Min(x, y float64) float64 +TEXT ·Min(SB),NOSPLIT,$0 + MOVD x+0(FP), F0 + MOVD y+8(FP), F1 + FCLASSD F0, X5 + FCLASSD F1, X6 + + // -Inf special cases + MOV $NegInf, X7 + BEQ X7, X5, isMinX + BEQ X7, X6, isMinY + + // NaN special cases + MOV $NaN, X7 + BEQ X7, X5, isMinX + BEQ X7, X6, isMinY + + // normal case + FMIND F0, F1, F0 + MOVD F0, ret+16(FP) + RET + +isMinX: // return x + MOVD F0, ret+16(FP) + RET + +isMinY: // return y + MOVD F1, ret+16(FP) + RET diff --git a/src/math/stubs_riscv64.s b/src/math/stubs_riscv64.s index ed2b572864..b36efb8b35 100644 --- a/src/math/stubs_riscv64.s +++ b/src/math/stubs_riscv64.s @@ -25,12 +25,6 @@ TEXT ·Atan(SB),NOSPLIT,$0 TEXT ·Atanh(SB),NOSPLIT,$0 JMP ·atanh(SB) -TEXT ·Min(SB),NOSPLIT,$0 - JMP ·min(SB) - -TEXT ·Max(SB),NOSPLIT,$0 - JMP ·max(SB) - TEXT ·Erf(SB),NOSPLIT,$0 JMP ·erf(SB)