Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / fmax-fmin.ll
blobaac5e5efc2cf5333bedacd8194de13158fce3a2e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=R32
3 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=R64
5 define float @maxnum_f32(float %x, float %y) nounwind {
6 ; R32-LABEL: maxnum_f32:
7 ; R32:       # %bb.0:
8 ; R32-NEXT:    addi sp, sp, -16
9 ; R32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
10 ; R32-NEXT:    call fmaxf@plt
11 ; R32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
12 ; R32-NEXT:    addi sp, sp, 16
13 ; R32-NEXT:    ret
15 ; R64-LABEL: maxnum_f32:
16 ; R64:       # %bb.0:
17 ; R64-NEXT:    addi sp, sp, -16
18 ; R64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
19 ; R64-NEXT:    call fmaxf@plt
20 ; R64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21 ; R64-NEXT:    addi sp, sp, 16
22 ; R64-NEXT:    ret
23   %r = call float @llvm.maxnum.f32(float %x, float %y)
24   ret float %r
27 define float @maxnum_f32_fast(float %x, float %y) nounwind {
28 ; R32-LABEL: maxnum_f32_fast:
29 ; R32:       # %bb.0:
30 ; R32-NEXT:    addi sp, sp, -16
31 ; R32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
32 ; R32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
33 ; R32-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
34 ; R32-NEXT:    mv s1, a1
35 ; R32-NEXT:    mv s0, a0
36 ; R32-NEXT:    call __gtsf2@plt
37 ; R32-NEXT:    bgtz a0, .LBB1_2
38 ; R32-NEXT:  # %bb.1:
39 ; R32-NEXT:    mv s0, s1
40 ; R32-NEXT:  .LBB1_2:
41 ; R32-NEXT:    mv a0, s0
42 ; R32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
43 ; R32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
44 ; R32-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
45 ; R32-NEXT:    addi sp, sp, 16
46 ; R32-NEXT:    ret
48 ; R64-LABEL: maxnum_f32_fast:
49 ; R64:       # %bb.0:
50 ; R64-NEXT:    addi sp, sp, -32
51 ; R64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
52 ; R64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
53 ; R64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
54 ; R64-NEXT:    mv s1, a1
55 ; R64-NEXT:    mv s0, a0
56 ; R64-NEXT:    call __gtsf2@plt
57 ; R64-NEXT:    bgtz a0, .LBB1_2
58 ; R64-NEXT:  # %bb.1:
59 ; R64-NEXT:    mv s0, s1
60 ; R64-NEXT:  .LBB1_2:
61 ; R64-NEXT:    mv a0, s0
62 ; R64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
63 ; R64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
64 ; R64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
65 ; R64-NEXT:    addi sp, sp, 32
66 ; R64-NEXT:    ret
67   %r = call fast float @llvm.maxnum.f32(float %x, float %y)
68   ret float %r
71 define double @maxnum_f64(double %x, double %y) nounwind {
72 ; R32-LABEL: maxnum_f64:
73 ; R32:       # %bb.0:
74 ; R32-NEXT:    addi sp, sp, -16
75 ; R32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
76 ; R32-NEXT:    call fmax@plt
77 ; R32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
78 ; R32-NEXT:    addi sp, sp, 16
79 ; R32-NEXT:    ret
81 ; R64-LABEL: maxnum_f64:
82 ; R64:       # %bb.0:
83 ; R64-NEXT:    addi sp, sp, -16
84 ; R64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
85 ; R64-NEXT:    call fmax@plt
86 ; R64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
87 ; R64-NEXT:    addi sp, sp, 16
88 ; R64-NEXT:    ret
89   %r = call double @llvm.maxnum.f64(double %x, double %y)
90   ret double %r
93 define double @maxnum_f64_nnan(double %x, double %y) nounwind {
94 ; R32-LABEL: maxnum_f64_nnan:
95 ; R32:       # %bb.0:
96 ; R32-NEXT:    addi sp, sp, -32
97 ; R32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
98 ; R32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
99 ; R32-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
100 ; R32-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
101 ; R32-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
102 ; R32-NEXT:    mv s1, a3
103 ; R32-NEXT:    mv s2, a2
104 ; R32-NEXT:    mv s0, a1
105 ; R32-NEXT:    mv s3, a0
106 ; R32-NEXT:    call __gtdf2@plt
107 ; R32-NEXT:    mv a1, a0
108 ; R32-NEXT:    mv a0, s3
109 ; R32-NEXT:    bgtz a1, .LBB3_2
110 ; R32-NEXT:  # %bb.1:
111 ; R32-NEXT:    mv s3, s2
112 ; R32-NEXT:  .LBB3_2:
113 ; R32-NEXT:    mv a1, s0
114 ; R32-NEXT:    mv a2, s2
115 ; R32-NEXT:    mv a3, s1
116 ; R32-NEXT:    call __gtdf2@plt
117 ; R32-NEXT:    bgtz a0, .LBB3_4
118 ; R32-NEXT:  # %bb.3:
119 ; R32-NEXT:    mv s0, s1
120 ; R32-NEXT:  .LBB3_4:
121 ; R32-NEXT:    mv a0, s3
122 ; R32-NEXT:    mv a1, s0
123 ; R32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
124 ; R32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
125 ; R32-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
126 ; R32-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
127 ; R32-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
128 ; R32-NEXT:    addi sp, sp, 32
129 ; R32-NEXT:    ret
131 ; R64-LABEL: maxnum_f64_nnan:
132 ; R64:       # %bb.0:
133 ; R64-NEXT:    addi sp, sp, -32
134 ; R64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
135 ; R64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
136 ; R64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
137 ; R64-NEXT:    mv s1, a1
138 ; R64-NEXT:    mv s0, a0
139 ; R64-NEXT:    call __gtdf2@plt
140 ; R64-NEXT:    bgtz a0, .LBB3_2
141 ; R64-NEXT:  # %bb.1:
142 ; R64-NEXT:    mv s0, s1
143 ; R64-NEXT:  .LBB3_2:
144 ; R64-NEXT:    mv a0, s0
145 ; R64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
146 ; R64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
147 ; R64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
148 ; R64-NEXT:    addi sp, sp, 32
149 ; R64-NEXT:    ret
150   %r = call nnan double @llvm.maxnum.f64(double %x, double %y)
151   ret double %r
154 define float @minnum_f32(float %x, float %y) nounwind {
155 ; R32-LABEL: minnum_f32:
156 ; R32:       # %bb.0:
157 ; R32-NEXT:    addi sp, sp, -16
158 ; R32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
159 ; R32-NEXT:    call fminf@plt
160 ; R32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
161 ; R32-NEXT:    addi sp, sp, 16
162 ; R32-NEXT:    ret
164 ; R64-LABEL: minnum_f32:
165 ; R64:       # %bb.0:
166 ; R64-NEXT:    addi sp, sp, -16
167 ; R64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
168 ; R64-NEXT:    call fminf@plt
169 ; R64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
170 ; R64-NEXT:    addi sp, sp, 16
171 ; R64-NEXT:    ret
172   %r = call float @llvm.minnum.f32(float %x, float %y)
173   ret float %r
176 define float @minnum_f32_nnan(float %x, float %y) nounwind {
177 ; R32-LABEL: minnum_f32_nnan:
178 ; R32:       # %bb.0:
179 ; R32-NEXT:    addi sp, sp, -16
180 ; R32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
181 ; R32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
182 ; R32-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
183 ; R32-NEXT:    mv s1, a1
184 ; R32-NEXT:    mv s0, a0
185 ; R32-NEXT:    call __ltsf2@plt
186 ; R32-NEXT:    bltz a0, .LBB5_2
187 ; R32-NEXT:  # %bb.1:
188 ; R32-NEXT:    mv s0, s1
189 ; R32-NEXT:  .LBB5_2:
190 ; R32-NEXT:    mv a0, s0
191 ; R32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
192 ; R32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
193 ; R32-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
194 ; R32-NEXT:    addi sp, sp, 16
195 ; R32-NEXT:    ret
197 ; R64-LABEL: minnum_f32_nnan:
198 ; R64:       # %bb.0:
199 ; R64-NEXT:    addi sp, sp, -32
200 ; R64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
201 ; R64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
202 ; R64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
203 ; R64-NEXT:    mv s1, a1
204 ; R64-NEXT:    mv s0, a0
205 ; R64-NEXT:    call __ltsf2@plt
206 ; R64-NEXT:    bltz a0, .LBB5_2
207 ; R64-NEXT:  # %bb.1:
208 ; R64-NEXT:    mv s0, s1
209 ; R64-NEXT:  .LBB5_2:
210 ; R64-NEXT:    mv a0, s0
211 ; R64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
212 ; R64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
213 ; R64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
214 ; R64-NEXT:    addi sp, sp, 32
215 ; R64-NEXT:    ret
216   %r = call nnan float @llvm.minnum.f32(float %x, float %y)
217   ret float %r
220 define double @minnum_f64(double %x, double %y) nounwind {
221 ; R32-LABEL: minnum_f64:
222 ; R32:       # %bb.0:
223 ; R32-NEXT:    addi sp, sp, -16
224 ; R32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
225 ; R32-NEXT:    call fmin@plt
226 ; R32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
227 ; R32-NEXT:    addi sp, sp, 16
228 ; R32-NEXT:    ret
230 ; R64-LABEL: minnum_f64:
231 ; R64:       # %bb.0:
232 ; R64-NEXT:    addi sp, sp, -16
233 ; R64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
234 ; R64-NEXT:    call fmin@plt
235 ; R64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
236 ; R64-NEXT:    addi sp, sp, 16
237 ; R64-NEXT:    ret
238   %r = call double @llvm.minnum.f64(double %x, double %y)
239   ret double %r
242 define double @minnum_f64_fast(double %x, double %y) nounwind {
243 ; R32-LABEL: minnum_f64_fast:
244 ; R32:       # %bb.0:
245 ; R32-NEXT:    addi sp, sp, -32
246 ; R32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
247 ; R32-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
248 ; R32-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
249 ; R32-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
250 ; R32-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
251 ; R32-NEXT:    mv s1, a3
252 ; R32-NEXT:    mv s2, a2
253 ; R32-NEXT:    mv s0, a1
254 ; R32-NEXT:    mv s3, a0
255 ; R32-NEXT:    call __ltdf2@plt
256 ; R32-NEXT:    mv a1, a0
257 ; R32-NEXT:    mv a0, s3
258 ; R32-NEXT:    bltz a1, .LBB7_2
259 ; R32-NEXT:  # %bb.1:
260 ; R32-NEXT:    mv s3, s2
261 ; R32-NEXT:  .LBB7_2:
262 ; R32-NEXT:    mv a1, s0
263 ; R32-NEXT:    mv a2, s2
264 ; R32-NEXT:    mv a3, s1
265 ; R32-NEXT:    call __ltdf2@plt
266 ; R32-NEXT:    bltz a0, .LBB7_4
267 ; R32-NEXT:  # %bb.3:
268 ; R32-NEXT:    mv s0, s1
269 ; R32-NEXT:  .LBB7_4:
270 ; R32-NEXT:    mv a0, s3
271 ; R32-NEXT:    mv a1, s0
272 ; R32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
273 ; R32-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
274 ; R32-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
275 ; R32-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
276 ; R32-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
277 ; R32-NEXT:    addi sp, sp, 32
278 ; R32-NEXT:    ret
280 ; R64-LABEL: minnum_f64_fast:
281 ; R64:       # %bb.0:
282 ; R64-NEXT:    addi sp, sp, -32
283 ; R64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
284 ; R64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
285 ; R64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
286 ; R64-NEXT:    mv s1, a1
287 ; R64-NEXT:    mv s0, a0
288 ; R64-NEXT:    call __ltdf2@plt
289 ; R64-NEXT:    bltz a0, .LBB7_2
290 ; R64-NEXT:  # %bb.1:
291 ; R64-NEXT:    mv s0, s1
292 ; R64-NEXT:  .LBB7_2:
293 ; R64-NEXT:    mv a0, s0
294 ; R64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
295 ; R64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
296 ; R64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
297 ; R64-NEXT:    addi sp, sp, 32
298 ; R64-NEXT:    ret
299   %r = call fast double @llvm.minnum.f64(double %x, double %y)
300   ret double %r
303 declare float @llvm.maxnum.f32(float, float)
304 declare double @llvm.maxnum.f64(double, double)
305 declare float @llvm.minnum.f32(float, float)
306 declare double @llvm.minnum.f64(double, double)