github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/math/dim_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 "../../cmd/ld/textflag.h"
     6  
     7  #define PosInf 0x7FF0000000000000
     8  #define NaN    0x7FF8000000000001
     9  #define NegInf 0xFFF0000000000000
    10  
    11  // func Dim(x, y float64) float64
    12  TEXT ·Dim(SB),NOSPLIT,$0
    13  	// (+Inf, +Inf) special case
    14  	MOVQ    x+0(FP), BX
    15  	MOVQ    y+8(FP), CX
    16  	MOVQ    $PosInf, AX
    17  	CMPQ    AX, BX
    18  	JNE     dim2
    19  	CMPQ    AX, CX
    20  	JEQ     bothInf
    21  dim2:	// (-Inf, -Inf) special case
    22  	MOVQ    $NegInf, AX
    23  	CMPQ    AX, BX
    24  	JNE     dim3
    25  	CMPQ    AX, CX
    26  	JEQ     bothInf
    27  dim3:	// (NaN, x) or (x, NaN)
    28  	MOVQ    $~(1<<63), DX
    29  	MOVQ    $NaN, AX
    30  	ANDQ    DX, BX // x = |x|
    31  	CMPQ    AX, BX
    32  	JLE     isDimNaN
    33  	ANDQ    DX, CX // y = |y|
    34  	CMPQ    AX, CX
    35  	JLE     isDimNaN
    36  
    37  	MOVSD x+0(FP), X0
    38  	SUBSD y+8(FP), X0
    39  	MOVSD $(0.0), X1
    40  	MAXSD X1, X0
    41  	MOVSD X0, ret+16(FP)
    42  	RET
    43  bothInf: // Dim(-Inf, -Inf) or Dim(+Inf, +Inf)
    44  	MOVQ    $NaN, AX
    45  isDimNaN:
    46  	MOVQ    AX, ret+16(FP)
    47  	RET
    48  
    49  // func ·Max(x, y float64) float64
    50  TEXT ·Max(SB),NOSPLIT,$0
    51  	// +Inf special cases
    52  	MOVQ    $PosInf, AX
    53  	MOVQ    x+0(FP), R8
    54  	CMPQ    AX, R8
    55  	JEQ     isPosInf
    56  	MOVQ    y+8(FP), R9
    57  	CMPQ    AX, R9
    58  	JEQ     isPosInf
    59  	// NaN special cases
    60  	MOVQ    $~(1<<63), DX // bit mask
    61  	MOVQ    $NaN, AX
    62  	MOVQ    R8, BX
    63  	ANDQ    DX, BX // x = |x|
    64  	CMPQ    AX, BX
    65  	JLE     isMaxNaN
    66  	MOVQ    R9, CX
    67  	ANDQ    DX, CX // y = |y|
    68  	CMPQ    AX, CX
    69  	JLE     isMaxNaN
    70  	// ±0 special cases
    71  	ORQ     CX, BX
    72  	JEQ     isMaxZero
    73  
    74  	MOVQ    R8, X0
    75  	MOVQ    R9, X1
    76  	MAXSD   X1, X0
    77  	MOVSD   X0, ret+16(FP)
    78  	RET
    79  isMaxNaN: // return NaN
    80  isPosInf: // return +Inf
    81  	MOVQ    AX, ret+16(FP)
    82  	RET
    83  isMaxZero:
    84  	MOVQ    $(1<<63), AX // -0.0
    85  	CMPQ    AX, R8
    86  	JEQ     +3(PC)
    87  	MOVQ    R8, ret+16(FP) // return 0
    88  	RET
    89  	MOVQ    R9, ret+16(FP) // return other 0
    90  	RET
    91  
    92  /*
    93  	MOVQ    $0, AX
    94  	CMPQ    AX, R8
    95  	JNE     +3(PC)
    96  	MOVQ    R8, ret+16(FP) // return 0
    97  	RET
    98  	MOVQ    R9, ret+16(FP) // return other 0
    99  	RET
   100  */
   101  
   102  // func Min(x, y float64) float64
   103  TEXT ·Min(SB),NOSPLIT,$0
   104  	// -Inf special cases
   105  	MOVQ    $NegInf, AX
   106  	MOVQ    x+0(FP), R8
   107  	CMPQ    AX, R8
   108  	JEQ     isNegInf
   109  	MOVQ    y+8(FP), R9
   110  	CMPQ    AX, R9
   111  	JEQ     isNegInf
   112  	// NaN special cases
   113  	MOVQ    $~(1<<63), DX
   114  	MOVQ    $NaN, AX
   115  	MOVQ    R8, BX
   116  	ANDQ    DX, BX // x = |x|
   117  	CMPQ    AX, BX
   118  	JLE     isMinNaN
   119  	MOVQ    R9, CX
   120  	ANDQ    DX, CX // y = |y|
   121  	CMPQ    AX, CX
   122  	JLE     isMinNaN
   123  	// ±0 special cases
   124  	ORQ     CX, BX
   125  	JEQ     isMinZero
   126  
   127  	MOVQ    R8, X0
   128  	MOVQ    R9, X1
   129  	MINSD   X1, X0
   130  	MOVSD X0, ret+16(FP)
   131  	RET
   132  isMinNaN: // return NaN
   133  isNegInf: // return -Inf
   134  	MOVQ    AX, ret+16(FP)
   135  	RET
   136  isMinZero:
   137  	MOVQ    $(1<<63), AX // -0.0
   138  	CMPQ    AX, R8
   139  	JEQ     +3(PC)
   140  	MOVQ    R9, ret+16(FP) // return other 0
   141  	RET
   142  	MOVQ    R8, ret+16(FP) // return -0
   143  	RET
   144