Home | History | Annotate | Download | only in math
      1 // Copyright 2016 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 // Based on dim_amd64.s
      6 
      7 #include "textflag.h"
      8 
      9 #define PosInf 0x7FF0000000000000
     10 #define NaN    0x7FF8000000000001
     11 #define NegInf 0xFFF0000000000000
     12 
     13 // func Max(x, y float64) float64
     14 TEXT Max(SB),NOSPLIT,$0
     15 	// +Inf special cases
     16 	MOVD    $PosInf, R4
     17 	MOVD    x+0(FP), R8
     18 	CMPUBEQ R4, R8, isPosInf
     19 	MOVD    y+8(FP), R9
     20 	CMPUBEQ R4, R9, isPosInf
     21 	// NaN special cases
     22 	MOVD    $~(1<<63), R5 // bit mask
     23 	MOVD    $PosInf, R4
     24 	MOVD    R8, R2
     25 	AND     R5, R2 // x = |x|
     26 	CMPUBLT R4, R2, isMaxNaN
     27 	MOVD    R9, R3
     28 	AND     R5, R3 // y = |y|
     29 	CMPUBLT R4, R3, isMaxNaN
     30 	// 0 special cases
     31 	OR      R3, R2
     32 	BEQ     isMaxZero
     33 
     34 	FMOVD   x+0(FP), F1
     35 	FMOVD   y+8(FP), F2
     36 	FCMPU   F2, F1
     37 	BGT     +3(PC)
     38 	FMOVD   F1, ret+16(FP)
     39 	RET
     40 	FMOVD   F2, ret+16(FP)
     41 	RET
     42 isMaxNaN: // return NaN
     43 	MOVD	$NaN, R4
     44 isPosInf: // return +Inf
     45 	MOVD    R4, ret+16(FP)
     46 	RET
     47 isMaxZero:
     48 	MOVD    $(1<<63), R4 // -0.0
     49 	CMPUBEQ R4, R8, +3(PC)
     50 	MOVD    R8, ret+16(FP) // return 0
     51 	RET
     52 	MOVD    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 	MOVD    $NegInf, R4
     59 	MOVD    x+0(FP), R8
     60 	CMPUBEQ R4, R8, isNegInf
     61 	MOVD    y+8(FP), R9
     62 	CMPUBEQ R4, R9, isNegInf
     63 	// NaN special cases
     64 	MOVD    $~(1<<63), R5
     65 	MOVD    $PosInf, R4
     66 	MOVD    R8, R2
     67 	AND     R5, R2 // x = |x|
     68 	CMPUBLT R4, R2, isMinNaN
     69 	MOVD    R9, R3
     70 	AND     R5, R3 // y = |y|
     71 	CMPUBLT R4, R3, isMinNaN
     72 	// 0 special cases
     73 	OR      R3, R2
     74 	BEQ     isMinZero
     75 
     76 	FMOVD   x+0(FP), F1
     77 	FMOVD   y+8(FP), F2
     78 	FCMPU   F2, F1
     79 	BLT     +3(PC)
     80 	FMOVD   F1, ret+16(FP)
     81 	RET
     82 	FMOVD   F2, ret+16(FP)
     83 	RET
     84 isMinNaN: // return NaN
     85 	MOVD	$NaN, R4
     86 isNegInf: // return -Inf
     87 	MOVD    R4, ret+16(FP)
     88 	RET
     89 isMinZero:
     90 	MOVD    $(1<<63), R4 // -0.0
     91 	CMPUBEQ R4, R8, +3(PC)
     92 	MOVD    R9, ret+16(FP) // return other 0
     93 	RET
     94 	MOVD    R8, ret+16(FP) // return -0
     95 	RET
     96 
     97