]> Cypherpunks.ru repositories - gostls13.git/blob - src/math/dim_s390x.s
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / 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