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