diff options
author | Joel Sing <joel@sing.id.au> | 2020-03-16 03:13:17 +1100 |
---|---|---|
committer | Joel Sing <joel@sing.id.au> | 2020-05-04 17:29:13 +0000 |
commit | 03e6073b1340f9a9d92dc4902108ace36f9d5531 (patch) | |
tree | 0ab1bb1323e4d90f743d242cbaa202bba2b07efd /src/math | |
parent | 1dcbd8dc58abf7319a8f557536e3b5158cba8ed7 (diff) | |
download | go-03e6073b1340f9a9d92dc4902108ace36f9d5531.tar.gz go-03e6073b1340f9a9d92dc4902108ace36f9d5531.zip |
math: implement Min/Max in riscv64 assembly
Change-Id: If34422859d47bc8f44974a00c6b7908e7655ff41
Reviewed-on: https://go-review.googlesource.com/c/go/+/223561
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/math')
-rw-r--r-- | src/math/dim_riscv64.s | 70 | ||||
-rw-r--r-- | src/math/stubs_riscv64.s | 6 |
2 files changed, 70 insertions, 6 deletions
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) |