// 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 DATA hypotrodata<>+0(SB)/8, $1.0 GLOBL hypotrodata<>+0(SB), NOPTR|RODATA, $8 // func archHypot(p, q float64) float64 TEXT ·archHypot(SB),NOSPLIT,$0 MOVD p+0(FP), F0 MOVD q+8(FP), F1 ABSD F0, F0 // p = |p| ABSD F1, F1 // q = |q| FCLASSD F0, F2 FCLASSD F1, F3 MOVV F2, R4 MOVV F3, R5 OR R5, R4 // +Inf special case AND $64, R4, R5 BNE R5, isInf // NaN special case AND $2, R4, R5 BNE R5, isNaN // hypot = max * sqrt(1 + (min/max)**2) MOVD F0, F4 FMAXD F0, F1, F0 // F0 = max(p, q) FMIND F4, F1, F1 // F1 = min(p, q) MOVV F0, R6 MOVV F1, R7 OR R7, R6 BEQ R6, R0, isZero DIVD F0, F1, F1 MULD F1, F1, F1 MOVV $hypotrodata<>+0(SB), R8 MOVD 0(R8), F2 ADDD F2, F1, F1 SQRTD F1, F1 MULD F1, F0, F0 MOVD F0, ret+16(FP) RET isNaN: MOVV $NaN, R6 MOVV R6, 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