github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/math/floor_riscv64.s (about) 1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "textflag.h" 6 7 #define PosInf 0x7FF0000000000000 8 9 // The rounding mode of RISC-V is different from Go spec. 10 11 #define ROUNDFN(NAME, MODE) \ 12 TEXT NAME(SB),NOSPLIT,$0; \ 13 MOVD x+0(FP), F0; \ 14 /* whether x is NaN */; \ 15 FEQD F0, F0, X6; \ 16 BNEZ X6, 3(PC); \ 17 /* return NaN if x is NaN */; \ 18 MOVD F0, ret+8(FP); \ 19 RET; \ 20 MOV $PosInf, X6; \ 21 FMVDX X6, F1; \ 22 FABSD F0, F2; \ 23 /* if abs(x) > +Inf, return Inf instead of round(x) */; \ 24 FLTD F1, F2, X6; \ 25 /* Inf should keep same signed with x then return */; \ 26 BEQZ X6, 3(PC); \ 27 FCVTLD.MODE F0, X6; \ 28 FCVTDL X6, F1; \ 29 /* rounding will drop signed bit in RISCV, restore it */; \ 30 FSGNJD F0, F1, F0; \ 31 MOVD F0, ret+8(FP); \ 32 RET 33 34 // func archFloor(x float64) float64 35 ROUNDFN(·archFloor, RDN) 36 37 // func archCeil(x float64) float64 38 ROUNDFN(·archCeil, RUP) 39 40 // func archTrunc(x float64) float64 41 ROUNDFN(·archTrunc, RTZ)