Home | History | Annotate | Download | only in math
      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 
     99