// Copyright 2010 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 Hypot(p, q float64) float64 | |
TEXT ·Hypot(SB),NOSPLIT,$0 | |
// test bits for special cases | |
MOVQ p+0(FP), BX | |
MOVQ $~(1<<63), AX | |
ANDQ AX, BX // p = |p| | |
MOVQ q+8(FP), CX | |
ANDQ AX, CX // q = |q| | |
MOVQ $PosInf, AX | |
CMPQ AX, BX | |
JLE isInfOrNaN | |
CMPQ AX, CX | |
JLE isInfOrNaN | |
// hypot = max * sqrt(1 + (min/max)**2) | |
MOVQ BX, X0 | |
MOVQ CX, X1 | |
ORQ CX, BX | |
JEQ isZero | |
MOVAPD X0, X2 | |
MAXSD X1, X0 | |
MINSD X2, X1 | |
DIVSD X0, X1 | |
MULSD X1, X1 | |
ADDSD $1.0, X1 | |
SQRTSD X1, X1 | |
MULSD X1, X0 | |
MOVSD X0, ret+16(FP) | |
RET | |
isInfOrNaN: | |
CMPQ AX, BX | |
JEQ isInf | |
CMPQ AX, CX | |
JEQ isInf | |
MOVQ $NaN, AX | |
MOVQ AX, ret+16(FP) // return NaN | |
RET | |
isInf: | |
MOVQ AX, ret+16(FP) // return +Inf | |
RET | |
isZero: | |
MOVQ $0, AX | |
MOVQ AX, ret+16(FP) // return 0 | |
RET |