| // Copyright 2026 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 | |
| // func archHypot(p, q float64) float64 | |
| TEXT ·archHypot(SB),NOSPLIT,$0 | |
| MOVD p+0(FP), F0 | |
| MOVD q+8(FP), F1 | |
| MOVV $1, R4 | |
| MOVV R4, F9 | |
| FCLASSD F0, F4 | |
| FCLASSD F1, F5 | |
| ABSD F0, F0 | |
| ABSD F1, F1 | |
| MOVV F4, R4 | |
| MOVV F5, R5 | |
| DIVD F9, F9, F7 // F7 = 1.0 | |
| SUBD F7, F7, F4 // F4 = 0.0 | |
| OR R4, R5, R6 | |
| // +Inf special case | |
| AND $68, R6, R7 | |
| BNE R7, isInf | |
| // NaN special case | |
| AND $2, R6, R8 | |
| BNE R8, isNaN | |
| // hypot = max * sqrt(1 + (min/max)**2) | |
| FMAXD F0, F1, F5 | |
| FMIND F0, F1, F2 | |
| CMPEQD F5, F4, FCC0 | |
| BFPT isZero | |
| DIVD F5, F2, F4 | |
| FMADDD F7, F4, F4, F4 | |
| SQRTD F4, F4 | |
| MULD F5, F4, F4 | |
| MOVD F4, ret+16(FP) | |
| RET | |
| isNaN: | |
| MOVV $NaN, R7 | |
| MOVV R7, ret+16(FP) // return NaN | |
| RET | |
| isInf: | |
| MOVV $PosInf, R6 | |
| MOVV R6, ret+16(FP) // return +Inf | |
| RET | |
| isZero: | |
| MOVV R0, ret+16(FP) // return 0 | |
| RET |