github.com/MangoDowner/go-gm@v0.0.0-20180818020936-8baa2bd4408c/src/math/hypot_amd64.s (about)

     1  // Copyright 2010 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "textflag.h"
     6  
     7  #define PosInf 0x7FF0000000000000
     8  #define NaN 0x7FF8000000000001
     9  
    10  // func Hypot(p, q float64) float64
    11  TEXT ·Hypot(SB),NOSPLIT,$0
    12  	// test bits for special cases
    13  	MOVQ    p+0(FP), BX
    14  	MOVQ    $~(1<<63), AX
    15  	ANDQ    AX, BX // p = |p|
    16  	MOVQ    q+8(FP), CX
    17  	ANDQ    AX, CX // q = |q|
    18  	MOVQ    $PosInf, AX
    19  	CMPQ    AX, BX
    20  	JLE     isInfOrNaN
    21  	CMPQ    AX, CX
    22  	JLE     isInfOrNaN
    23  	// hypot = max * sqrt(1 + (min/max)**2)
    24  	MOVQ    BX, X0
    25  	MOVQ    CX, X1
    26  	ORQ     CX, BX
    27  	JEQ     isZero
    28  	MOVAPD  X0, X2
    29  	MAXSD   X1, X0
    30  	MINSD   X2, X1
    31  	DIVSD   X0, X1
    32  	MULSD   X1, X1
    33  	ADDSD   $1.0, X1
    34  	SQRTSD  X1, X1
    35  	MULSD   X1, X0
    36  	MOVSD   X0, ret+16(FP)
    37  	RET
    38  isInfOrNaN:
    39  	CMPQ    AX, BX
    40  	JEQ     isInf
    41  	CMPQ    AX, CX
    42  	JEQ     isInf
    43  	MOVQ    $NaN, AX
    44  	MOVQ    AX, ret+16(FP) // return NaN
    45  	RET
    46  isInf:
    47  	MOVQ    AX, ret+16(FP) // return +Inf
    48  	RET
    49  isZero:
    50  	MOVQ    $0, AX
    51  	MOVQ    AX, ret+16(FP) // return 0
    52  	RET