From 03e6073b1340f9a9d92dc4902108ace36f9d5531 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Mon, 16 Mar 2020 03:13:17 +1100 Subject: [PATCH] math: implement Min/Max in riscv64 assembly Change-Id: If34422859d47bc8f44974a00c6b7908e7655ff41 Reviewed-on: https://go-review.googlesource.com/c/go/+/223561 Reviewed-by: Cherry Zhang --- src/math/dim_riscv64.s | 70 ++++++++++++++++++++++++++++++++++++++++ src/math/stubs_riscv64.s | 6 ---- 2 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 src/math/dim_riscv64.s 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) -- 2.50.0