| // Copyright 2016 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | #include "textflag.h" | 
 |  | 
 | #define PosInf 0x7FF0000000000000 | 
 | #define NaN    0x7FF8000000000001 | 
 | #define NegInf 0xFFF0000000000000 | 
 |  | 
 | // func Dim(x, y float64) float64 | 
 | TEXT ·Dim(SB),NOSPLIT,$0 | 
 | 	// (+Inf, +Inf) special case | 
 | 	MOVD	$PosInf, R0 | 
 | 	MOVD	x+0(FP), R1 | 
 | 	MOVD	y+8(FP), R2 | 
 | 	CMP	R0, R1 | 
 | 	BNE	dim2 | 
 | 	CMP	R0, R2 | 
 | 	BEQ	bothInf | 
 | dim2:	// (-Inf, -Inf) special case | 
 | 	MOVD	$NegInf, R0 | 
 | 	CMP	R0, R1 | 
 | 	BNE	dim3 | 
 | 	CMP	R0, R2 | 
 | 	BEQ	bothInf | 
 | dim3:	// normal case | 
 | 	FMOVD	R1, F0 | 
 | 	FMOVD	R2, F1 | 
 | 	FMOVD	$0.0, F2 | 
 | 	FSUBD	F1, F0 | 
 | 	FMAXD	F0, F2, F0 | 
 | 	FMOVD	F0, ret+16(FP) | 
 | 	RET | 
 | bothInf: | 
 | 	MOVD	$NaN, R0 | 
 | 	MOVD	R0, ret+16(FP) | 
 | 	RET | 
 |  | 
 | // func ·Max(x, y float64) float64 | 
 | TEXT ·Max(SB),NOSPLIT,$0 | 
 | 	// +Inf special cases | 
 | 	MOVD	$PosInf, R0 | 
 | 	MOVD	x+0(FP), R1 | 
 | 	CMP	R0, R1 | 
 | 	BEQ	isPosInf | 
 | 	MOVD	y+8(FP), R2 | 
 | 	CMP	R0, R2 | 
 | 	BEQ	isPosInf | 
 | 	// normal case | 
 | 	FMOVD	R1, F0 | 
 | 	FMOVD	R2, F1 | 
 | 	FMAXD	F0, F1, F0 | 
 | 	FMOVD	F0, ret+16(FP) | 
 | 	RET | 
 | isPosInf: // return +Inf | 
 | 	MOVD	R0, ret+16(FP) | 
 | 	RET | 
 |  | 
 | // func Min(x, y float64) float64 | 
 | TEXT ·Min(SB),NOSPLIT,$0 | 
 | 	// -Inf special cases | 
 | 	MOVD	$NegInf, R0 | 
 | 	MOVD	x+0(FP), R1 | 
 | 	CMP	R0, R1 | 
 | 	BEQ	isNegInf | 
 | 	MOVD	y+8(FP), R2 | 
 | 	CMP	R0, R2 | 
 | 	BEQ	isNegInf | 
 | 	// normal case | 
 | 	FMOVD	R1, F0 | 
 | 	FMOVD	R2, F1 | 
 | 	FMIND	F0, F1, F0 | 
 | 	FMOVD	F0, ret+16(FP) | 
 | 	RET | 
 | isNegInf: // return -Inf | 
 | 	MOVD	R0, ret+16(FP) | 
 | 	RET |