| // Copyright 2024 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. |
| // |
| // derived from math/floor_riscv64.s |
| |
| #include "textflag.h" |
| |
| #define ROUNDFN(NAME, FUNC) \ |
| TEXT NAME(SB),NOSPLIT,$0; \ |
| MOVD x+0(FP), F0; \ |
| MOVV F0, R11; \ |
| /* 1023: bias of exponent, [-2^53, 2^53]: exactly integer represent range */; \ |
| MOVV $1023+53, R12; \ |
| /* Drop all fraction bits */; \ |
| SRLV $52, R11, R11; \ |
| /* Remove sign bit */; \ |
| AND $0x7FF, R11, R11; \ |
| BLTU R12, R11, isExtremum; \ |
| normal:; \ |
| FUNC F0, F2; \ |
| MOVV F2, R10; \ |
| BEQ R10, R0, is0; \ |
| FFINTDV F2, F0; \ |
| /* Return either input is +-Inf, NaN(0x7FF) or out of precision limitation */; \ |
| isExtremum:; \ |
| MOVD F0, ret+8(FP); \ |
| RET; \ |
| is0:; \ |
| FCOPYSGD F0, F2, F2; \ |
| MOVD F2, ret+8(FP); \ |
| RET |
| |
| // func archFloor(x float64) float64 |
| ROUNDFN(·archFloor, FTINTRMVD) |
| |
| // func archCeil(x float64) float64 |
| ROUNDFN(·archCeil, FTINTRPVD) |
| |
| // func archTrunc(x float64) float64 |
| ROUNDFN(·archTrunc, FTINTRZVD) |