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