|  | // 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 |