...

Text file src/pkg/math/dim_amd64.s

     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	#define NegInf 0xFFF0000000000000
    10	
    11	// func ·Max(x, y float64) float64
    12	TEXT ·Max(SB),NOSPLIT,$0
    13		// +Inf special cases
    14		MOVQ    $PosInf, AX
    15		MOVQ    x+0(FP), R8
    16		CMPQ    AX, R8
    17		JEQ     isPosInf
    18		MOVQ    y+8(FP), R9
    19		CMPQ    AX, R9
    20		JEQ     isPosInf
    21		// NaN special cases
    22		MOVQ    $~(1<<63), DX // bit mask
    23		MOVQ    $PosInf, AX
    24		MOVQ    R8, BX
    25		ANDQ    DX, BX // x = |x|
    26		CMPQ    AX, BX
    27		JLT     isMaxNaN
    28		MOVQ    R9, CX
    29		ANDQ    DX, CX // y = |y|
    30		CMPQ    AX, CX
    31		JLT     isMaxNaN
    32		// ±0 special cases
    33		ORQ     CX, BX
    34		JEQ     isMaxZero
    35	
    36		MOVQ    R8, X0
    37		MOVQ    R9, X1
    38		MAXSD   X1, X0
    39		MOVSD   X0, ret+16(FP)
    40		RET
    41	isMaxNaN: // return NaN
    42		MOVQ	$NaN, AX
    43	isPosInf: // return +Inf
    44		MOVQ    AX, ret+16(FP)
    45		RET
    46	isMaxZero:
    47		MOVQ    $(1<<63), AX // -0.0
    48		CMPQ    AX, R8
    49		JEQ     +3(PC)
    50		MOVQ    R8, ret+16(FP) // return 0
    51		RET
    52		MOVQ    R9, ret+16(FP) // return other 0
    53		RET
    54	
    55	// func Min(x, y float64) float64
    56	TEXT ·Min(SB),NOSPLIT,$0
    57		// -Inf special cases
    58		MOVQ    $NegInf, AX
    59		MOVQ    x+0(FP), R8
    60		CMPQ    AX, R8
    61		JEQ     isNegInf
    62		MOVQ    y+8(FP), R9
    63		CMPQ    AX, R9
    64		JEQ     isNegInf
    65		// NaN special cases
    66		MOVQ    $~(1<<63), DX
    67		MOVQ    $PosInf, AX
    68		MOVQ    R8, BX
    69		ANDQ    DX, BX // x = |x|
    70		CMPQ    AX, BX
    71		JLT     isMinNaN
    72		MOVQ    R9, CX
    73		ANDQ    DX, CX // y = |y|
    74		CMPQ    AX, CX
    75		JLT     isMinNaN
    76		// ±0 special cases
    77		ORQ     CX, BX
    78		JEQ     isMinZero
    79	
    80		MOVQ    R8, X0
    81		MOVQ    R9, X1
    82		MINSD   X1, X0
    83		MOVSD X0, ret+16(FP)
    84		RET
    85	isMinNaN: // return NaN
    86		MOVQ	$NaN, AX
    87	isNegInf: // return -Inf
    88		MOVQ    AX, ret+16(FP)
    89		RET
    90	isMinZero:
    91		MOVQ    $(1<<63), AX // -0.0
    92		CMPQ    AX, R8
    93		JEQ     +3(PC)
    94		MOVQ    R9, ret+16(FP) // return other 0
    95		RET
    96		MOVQ    R8, ret+16(FP) // return -0
    97		RET
    98	

View as plain text