]> Cypherpunks repositories - gostls13.git/commitdiff
math: implement Min/Max in riscv64 assembly
authorJoel Sing <joel@sing.id.au>
Sun, 15 Mar 2020 16:13:17 +0000 (03:13 +1100)
committerJoel Sing <joel@sing.id.au>
Mon, 4 May 2020 17:29:13 +0000 (17:29 +0000)
Change-Id: If34422859d47bc8f44974a00c6b7908e7655ff41
Reviewed-on: https://go-review.googlesource.com/c/go/+/223561
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/math/dim_riscv64.s [new file with mode: 0644]
src/math/stubs_riscv64.s

diff --git a/src/math/dim_riscv64.s b/src/math/dim_riscv64.s
new file mode 100644 (file)
index 0000000..38f5fe7
--- /dev/null
@@ -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
index ed2b5728647ce6b185ce79805c72662e12b00b74..b36efb8b35f9e90bd9ede9a5894209442c3e3cac 100644 (file)
@@ -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)