1// Copyright 2010 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include "textflag.h"
6
7#define PosInf 0x7FF0000000000000
8#define NaN    0x7FF8000000000001
9#define NegInf 0xFFF0000000000000
10
11// func ·archMax(x, y float64) float64
12TEXT ·archMax(SB),NOSPLIT,$0
13	// +Inf special cases
14	MOVQ    $PosInf, AX
15	MOVQ    x+0(FP), R8
16	CMPQ    AX, R8
17	JEQ     isPosInf
18	MOVQ    y+8(FP), R9
19	CMPQ    AX, R9
20	JEQ     isPosInf
21	// NaN special cases
22	MOVQ    $~(1<<63), DX // bit mask
23	MOVQ    $PosInf, AX
24	MOVQ    R8, BX
25	ANDQ    DX, BX // x = |x|
26	CMPQ    AX, BX
27	JLT     isMaxNaN
28	MOVQ    R9, CX
29	ANDQ    DX, CX // y = |y|
30	CMPQ    AX, CX
31	JLT     isMaxNaN
32	// ±0 special cases
33	ORQ     CX, BX
34	JEQ     isMaxZero
35
36	MOVQ    R8, X0
37	MOVQ    R9, X1
38	MAXSD   X1, X0
39	MOVSD   X0, ret+16(FP)
40	RET
41isMaxNaN: // return NaN
42	MOVQ	$NaN, AX
43isPosInf: // return +Inf
44	MOVQ    AX, ret+16(FP)
45	RET
46isMaxZero:
47	MOVQ    $(1<<63), AX // -0.0
48	CMPQ    AX, R8
49	JEQ     +3(PC)
50	MOVQ    R8, ret+16(FP) // return 0
51	RET
52	MOVQ    R9, ret+16(FP) // return other 0
53	RET
54
55// func archMin(x, y float64) float64
56TEXT ·archMin(SB),NOSPLIT,$0
57	// -Inf special cases
58	MOVQ    $NegInf, AX
59	MOVQ    x+0(FP), R8
60	CMPQ    AX, R8
61	JEQ     isNegInf
62	MOVQ    y+8(FP), R9
63	CMPQ    AX, R9
64	JEQ     isNegInf
65	// NaN special cases
66	MOVQ    $~(1<<63), DX
67	MOVQ    $PosInf, AX
68	MOVQ    R8, BX
69	ANDQ    DX, BX // x = |x|
70	CMPQ    AX, BX
71	JLT     isMinNaN
72	MOVQ    R9, CX
73	ANDQ    DX, CX // y = |y|
74	CMPQ    AX, CX
75	JLT     isMinNaN
76	// ±0 special cases
77	ORQ     CX, BX
78	JEQ     isMinZero
79
80	MOVQ    R8, X0
81	MOVQ    R9, X1
82	MINSD   X1, X0
83	MOVSD X0, ret+16(FP)
84	RET
85isMinNaN: // return NaN
86	MOVQ	$NaN, AX
87isNegInf: // return -Inf
88	MOVQ    AX, ret+16(FP)
89	RET
90isMinZero:
91	MOVQ    $(1<<63), AX // -0.0
92	CMPQ    AX, R8
93	JEQ     +3(PC)
94	MOVQ    R9, ret+16(FP) // return other 0
95	RET
96	MOVQ    R8, ret+16(FP) // return -0
97	RET
98
99