1// Copyright 2020 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// Values returned from an FCLASS instruction.
8#define	NegInf	0x001
9#define	PosInf	0x080
10#define	NaN	0x200
11
12// func archMax(x, y float64) float64
13TEXT ·archMax(SB),NOSPLIT,$0
14	MOVD	x+0(FP), F0
15	MOVD	y+8(FP), F1
16	FCLASSD	F0, X5
17	FCLASSD	F1, X6
18
19	// +Inf special cases
20	MOV	$PosInf, X7
21	BEQ	X7, X5, isMaxX
22	BEQ	X7, X6, isMaxY
23
24	// NaN special cases
25	MOV	$NaN, X7
26	BEQ	X7, X5, isMaxX
27	BEQ	X7, X6, isMaxY
28
29	// normal case
30	FMAXD	F0, F1, F0
31	MOVD	F0, ret+16(FP)
32	RET
33
34isMaxX: // return x
35	MOVD	F0, ret+16(FP)
36	RET
37
38isMaxY: // return y
39	MOVD	F1, ret+16(FP)
40	RET
41
42// func archMin(x, y float64) float64
43TEXT ·archMin(SB),NOSPLIT,$0
44	MOVD	x+0(FP), F0
45	MOVD	y+8(FP), F1
46	FCLASSD	F0, X5
47	FCLASSD	F1, X6
48
49	// -Inf special cases
50	MOV	$NegInf, X7
51	BEQ	X7, X5, isMinX
52	BEQ	X7, X6, isMinY
53
54	// NaN special cases
55	MOV	$NaN, X7
56	BEQ	X7, X5, isMinX
57	BEQ	X7, X6, isMinY
58
59	// normal case
60	FMIND	F0, F1, F0
61	MOVD	F0, ret+16(FP)
62	RET
63
64isMinX: // return x
65	MOVD	F0, ret+16(FP)
66	RET
67
68isMinY: // return y
69	MOVD	F1, ret+16(FP)
70	RET
71