| // 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. |
| |
| #include "textflag.h" |
| |
| #define PosInf 0x7FF0000000000000 |
| #define NaN 0x7FF8000000000001 |
| #define NegInf 0xFFF0000000000000 |
| |
| TEXT ·archMax(SB),NOSPLIT,$0 |
| MOVD x+0(FP), F0 |
| MOVD y+8(FP), F1 |
| FCLASSD F0, F2 |
| FCLASSD F1, F3 |
| |
| // combine x and y categories together to judge |
| MOVV F2, R4 |
| MOVV F3, R5 |
| OR R5, R4 |
| |
| // +Inf special cases |
| AND $64, R4, R5 |
| BNE R5, isPosInf |
| |
| // NaN special cases |
| AND $2, R4, R5 |
| BNE R5, isMaxNaN |
| |
| // normal case |
| FMAXD F0, F1, F0 |
| MOVD F0, ret+16(FP) |
| RET |
| |
| isMaxNaN: |
| MOVV $NaN, R6 |
| MOVV R6, ret+16(FP) |
| RET |
| |
| isPosInf: |
| MOVV $PosInf, R6 |
| MOVV R6, ret+16(FP) |
| RET |
| |
| TEXT ·archMin(SB),NOSPLIT,$0 |
| MOVD x+0(FP), F0 |
| MOVD y+8(FP), F1 |
| FCLASSD F0, F2 |
| FCLASSD F1, F3 |
| |
| // combine x and y categories together to judge |
| MOVV F2, R4 |
| MOVV F3, R5 |
| OR R5, R4 |
| |
| // -Inf special cases |
| AND $4, R4, R5 |
| BNE R5, isNegInf |
| |
| // NaN special cases |
| AND $2, R4, R5 |
| BNE R5, isMinNaN |
| |
| // normal case |
| FMIND F0, F1, F0 |
| MOVD F0, ret+16(FP) |
| RET |
| |
| isMinNaN: |
| MOVV $NaN, R6 |
| MOVV R6, ret+16(FP) |
| RET |
| |
| isNegInf: |
| MOVV $NegInf, R6 |
| MOVV R6, ret+16(FP) |
| RET |