Text file
src/math/dim_s390x.s
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
14 TEXT ·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
42 isMaxNaN: // return NaN
43 MOVD $NaN, R4
44 isPosInf: // return +Inf
45 MOVD R4, ret+16(FP)
46 RET
47 isMaxZero:
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
56 TEXT ·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
84 isMinNaN: // return NaN
85 MOVD $NaN, R4
86 isNegInf: // return -Inf
87 MOVD R4, ret+16(FP)
88 RET
89 isMinZero:
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
View as plain text