// 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 |