1// Copyright 2016 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// Based on dim_amd64.s
6
7#include "textflag.h"
8
9#define PosInf 0x7FF0000000000000
10#define NaN    0x7FF8000000000001
11#define NegInf 0xFFF0000000000000
12
13// func ·Max(x, y float64) float64
14TEXT ·archMax(SB),NOSPLIT,$0
15	// +Inf special cases
16	MOVD    $PosInf, R4
17	MOVD    x+0(FP), R8
18	CMPUBEQ R4, R8, isPosInf
19	MOVD    y+8(FP), R9
20	CMPUBEQ R4, R9, isPosInf
21	// NaN special cases
22	MOVD    $~(1<<63), R5 // bit mask
23	MOVD    $PosInf, R4
24	MOVD    R8, R2
25	AND     R5, R2 // x = |x|
26	CMPUBLT R4, R2, isMaxNaN
27	MOVD    R9, R3
28	AND     R5, R3 // y = |y|
29	CMPUBLT R4, R3, isMaxNaN
30	// ±0 special cases
31	OR      R3, R2
32	BEQ     isMaxZero
33
34	FMOVD   x+0(FP), F1
35	FMOVD   y+8(FP), F2
36	FCMPU   F2, F1
37	BGT     +3(PC)
38	FMOVD   F1, ret+16(FP)
39	RET
40	FMOVD   F2, ret+16(FP)
41	RET
42isMaxNaN: // return NaN
43	MOVD	$NaN, R4
44isPosInf: // return +Inf
45	MOVD    R4, ret+16(FP)
46	RET
47isMaxZero:
48	MOVD    $(1<<63), R4 // -0.0
49	CMPUBEQ R4, R8, +3(PC)
50	MOVD    R8, ret+16(FP) // return 0
51	RET
52	MOVD    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	MOVD    $NegInf, R4
59	MOVD    x+0(FP), R8
60	CMPUBEQ R4, R8, isNegInf
61	MOVD    y+8(FP), R9
62	CMPUBEQ R4, R9, isNegInf
63	// NaN special cases
64	MOVD    $~(1<<63), R5
65	MOVD    $PosInf, R4
66	MOVD    R8, R2
67	AND     R5, R2 // x = |x|
68	CMPUBLT R4, R2, isMinNaN
69	MOVD    R9, R3
70	AND     R5, R3 // y = |y|
71	CMPUBLT R4, R3, isMinNaN
72	// ±0 special cases
73	OR      R3, R2
74	BEQ     isMinZero
75
76	FMOVD   x+0(FP), F1
77	FMOVD   y+8(FP), F2
78	FCMPU   F2, F1
79	BLT     +3(PC)
80	FMOVD   F1, ret+16(FP)
81	RET
82	FMOVD   F2, ret+16(FP)
83	RET
84isMinNaN: // return NaN
85	MOVD	$NaN, R4
86isNegInf: // return -Inf
87	MOVD    R4, ret+16(FP)
88	RET
89isMinZero:
90	MOVD    $(1<<63), R4 // -0.0
91	CMPUBEQ R4, R8, +3(PC)
92	MOVD    R9, ret+16(FP) // return other 0
93	RET
94	MOVD    R8, ret+16(FP) // return -0
95	RET
96
97