// Copyright 2010 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 ·archMax(x, y float64) float64 TEXT ·archMax(SB),NOSPLIT,$0 // +Inf special cases MOVQ $PosInf, AX MOVQ x+0(FP), R8 CMPQ AX, R8 JEQ isPosInf MOVQ y+8(FP), R9 CMPQ AX, R9 JEQ isPosInf // NaN special cases MOVQ $~(1<<63), DX // bit mask MOVQ $PosInf, AX MOVQ R8, BX ANDQ DX, BX // x = |x| CMPQ AX, BX JLT isMaxNaN MOVQ R9, CX ANDQ DX, CX // y = |y| CMPQ AX, CX JLT isMaxNaN // ±0 special cases ORQ CX, BX JEQ isMaxZero MOVQ R8, X0 MOVQ R9, X1 MAXSD X1, X0 MOVSD X0, ret+16(FP) RET isMaxNaN: // return NaN MOVQ $NaN, AX isPosInf: // return +Inf MOVQ AX, ret+16(FP) RET isMaxZero: MOVQ $(1<<63), AX // -0.0 CMPQ AX, R8 JEQ +3(PC) MOVQ R8, ret+16(FP) // return 0 RET MOVQ R9, ret+16(FP) // return other 0 RET // func archMin(x, y float64) float64 TEXT ·archMin(SB),NOSPLIT,$0 // -Inf special cases MOVQ $NegInf, AX MOVQ x+0(FP), R8 CMPQ AX, R8 JEQ isNegInf MOVQ y+8(FP), R9 CMPQ AX, R9 JEQ isNegInf // NaN special cases MOVQ $~(1<<63), DX MOVQ $PosInf, AX MOVQ R8, BX ANDQ DX, BX // x = |x| CMPQ AX, BX JLT isMinNaN MOVQ R9, CX ANDQ DX, CX // y = |y| CMPQ AX, CX JLT isMinNaN // ±0 special cases ORQ CX, BX JEQ isMinZero MOVQ R8, X0 MOVQ R9, X1 MINSD X1, X0 MOVSD X0, ret+16(FP) RET isMinNaN: // return NaN MOVQ $NaN, AX isNegInf: // return -Inf MOVQ AX, ret+16(FP) RET isMinZero: MOVQ $(1<<63), AX // -0.0 CMPQ AX, R8 JEQ +3(PC) MOVQ R9, ret+16(FP) // return other 0 RET MOVQ R8, ret+16(FP) // return -0 RET