[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / CodeGen / RISCV / fpclamptosat.ll
blobc5c3b199447a9a64c2e0df92536fc66ca0fb5a21
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32f | FileCheck -check-prefixes=RV32,RV32IF %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64f | FileCheck -check-prefixes=RV64,RV64IF %s
6 ; RUN: llc -mtriple=riscv32 -mattr=+f,+d -verify-machineinstrs < %s \
7 ; RUN:   -target-abi=ilp32d | FileCheck -check-prefixes=RV32,RV32IFD %s
8 ; RUN: llc -mtriple=riscv64 -mattr=+f,+d -verify-machineinstrs < %s \
9 ; RUN:   -target-abi=lp64d | FileCheck -check-prefixes=RV64,RV64IFD %s
11 ; i32 saturate
13 define i32 @stest_f64i32(double %x) {
14 ; RV32IF-LABEL: stest_f64i32:
15 ; RV32IF:       # %bb.0: # %entry
16 ; RV32IF-NEXT:    addi sp, sp, -16
17 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
18 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
19 ; RV32IF-NEXT:    .cfi_offset ra, -4
20 ; RV32IF-NEXT:    call __fixdfdi
21 ; RV32IF-NEXT:    lui a2, 524288
22 ; RV32IF-NEXT:    addi a3, a2, -1
23 ; RV32IF-NEXT:    beqz a1, .LBB0_2
24 ; RV32IF-NEXT:  # %bb.1: # %entry
25 ; RV32IF-NEXT:    slti a4, a1, 0
26 ; RV32IF-NEXT:    j .LBB0_3
27 ; RV32IF-NEXT:  .LBB0_2:
28 ; RV32IF-NEXT:    sltu a4, a0, a3
29 ; RV32IF-NEXT:  .LBB0_3: # %entry
30 ; RV32IF-NEXT:    neg a5, a4
31 ; RV32IF-NEXT:    and a1, a5, a1
32 ; RV32IF-NEXT:    bnez a4, .LBB0_5
33 ; RV32IF-NEXT:  # %bb.4: # %entry
34 ; RV32IF-NEXT:    mv a0, a3
35 ; RV32IF-NEXT:  .LBB0_5: # %entry
36 ; RV32IF-NEXT:    li a3, -1
37 ; RV32IF-NEXT:    beq a1, a3, .LBB0_7
38 ; RV32IF-NEXT:  # %bb.6: # %entry
39 ; RV32IF-NEXT:    slti a1, a1, 0
40 ; RV32IF-NEXT:    xori a1, a1, 1
41 ; RV32IF-NEXT:    beqz a1, .LBB0_8
42 ; RV32IF-NEXT:    j .LBB0_9
43 ; RV32IF-NEXT:  .LBB0_7:
44 ; RV32IF-NEXT:    sltu a1, a2, a0
45 ; RV32IF-NEXT:    bnez a1, .LBB0_9
46 ; RV32IF-NEXT:  .LBB0_8: # %entry
47 ; RV32IF-NEXT:    lui a0, 524288
48 ; RV32IF-NEXT:  .LBB0_9: # %entry
49 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
50 ; RV32IF-NEXT:    .cfi_restore ra
51 ; RV32IF-NEXT:    addi sp, sp, 16
52 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
53 ; RV32IF-NEXT:    ret
55 ; RV64IF-LABEL: stest_f64i32:
56 ; RV64IF:       # %bb.0: # %entry
57 ; RV64IF-NEXT:    addi sp, sp, -16
58 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
59 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
60 ; RV64IF-NEXT:    .cfi_offset ra, -8
61 ; RV64IF-NEXT:    call __fixdfdi
62 ; RV64IF-NEXT:    lui a1, 524288
63 ; RV64IF-NEXT:    addiw a2, a1, -1
64 ; RV64IF-NEXT:    blt a0, a2, .LBB0_2
65 ; RV64IF-NEXT:  # %bb.1: # %entry
66 ; RV64IF-NEXT:    mv a0, a2
67 ; RV64IF-NEXT:  .LBB0_2: # %entry
68 ; RV64IF-NEXT:    blt a1, a0, .LBB0_4
69 ; RV64IF-NEXT:  # %bb.3: # %entry
70 ; RV64IF-NEXT:    lui a0, 524288
71 ; RV64IF-NEXT:  .LBB0_4: # %entry
72 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
73 ; RV64IF-NEXT:    .cfi_restore ra
74 ; RV64IF-NEXT:    addi sp, sp, 16
75 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
76 ; RV64IF-NEXT:    ret
78 ; RV32IFD-LABEL: stest_f64i32:
79 ; RV32IFD:       # %bb.0: # %entry
80 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
81 ; RV32IFD-NEXT:    feq.d a1, fa0, fa0
82 ; RV32IFD-NEXT:    seqz a1, a1
83 ; RV32IFD-NEXT:    addi a1, a1, -1
84 ; RV32IFD-NEXT:    and a0, a1, a0
85 ; RV32IFD-NEXT:    ret
87 ; RV64IFD-LABEL: stest_f64i32:
88 ; RV64IFD:       # %bb.0: # %entry
89 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
90 ; RV64IFD-NEXT:    lui a1, 524288
91 ; RV64IFD-NEXT:    addiw a2, a1, -1
92 ; RV64IFD-NEXT:    bge a0, a2, .LBB0_3
93 ; RV64IFD-NEXT:  # %bb.1: # %entry
94 ; RV64IFD-NEXT:    bge a1, a0, .LBB0_4
95 ; RV64IFD-NEXT:  .LBB0_2: # %entry
96 ; RV64IFD-NEXT:    ret
97 ; RV64IFD-NEXT:  .LBB0_3: # %entry
98 ; RV64IFD-NEXT:    mv a0, a2
99 ; RV64IFD-NEXT:    blt a1, a2, .LBB0_2
100 ; RV64IFD-NEXT:  .LBB0_4: # %entry
101 ; RV64IFD-NEXT:    lui a0, 524288
102 ; RV64IFD-NEXT:    ret
103 entry:
104   %conv = fptosi double %x to i64
105   %0 = icmp slt i64 %conv, 2147483647
106   %spec.store.select = select i1 %0, i64 %conv, i64 2147483647
107   %1 = icmp sgt i64 %spec.store.select, -2147483648
108   %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648
109   %conv6 = trunc i64 %spec.store.select7 to i32
110   ret i32 %conv6
113 define i32 @utest_f64i32(double %x) {
114 ; RV32IF-LABEL: utest_f64i32:
115 ; RV32IF:       # %bb.0: # %entry
116 ; RV32IF-NEXT:    addi sp, sp, -16
117 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
118 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
119 ; RV32IF-NEXT:    .cfi_offset ra, -4
120 ; RV32IF-NEXT:    call __fixunsdfdi
121 ; RV32IF-NEXT:    sltiu a2, a0, -1
122 ; RV32IF-NEXT:    seqz a1, a1
123 ; RV32IF-NEXT:    and a1, a1, a2
124 ; RV32IF-NEXT:    addi a1, a1, -1
125 ; RV32IF-NEXT:    or a0, a1, a0
126 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
127 ; RV32IF-NEXT:    .cfi_restore ra
128 ; RV32IF-NEXT:    addi sp, sp, 16
129 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
130 ; RV32IF-NEXT:    ret
132 ; RV64IF-LABEL: utest_f64i32:
133 ; RV64IF:       # %bb.0: # %entry
134 ; RV64IF-NEXT:    addi sp, sp, -16
135 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
136 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
137 ; RV64IF-NEXT:    .cfi_offset ra, -8
138 ; RV64IF-NEXT:    call __fixunsdfdi
139 ; RV64IF-NEXT:    li a1, -1
140 ; RV64IF-NEXT:    srli a1, a1, 32
141 ; RV64IF-NEXT:    bltu a0, a1, .LBB1_2
142 ; RV64IF-NEXT:  # %bb.1: # %entry
143 ; RV64IF-NEXT:    mv a0, a1
144 ; RV64IF-NEXT:  .LBB1_2: # %entry
145 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
146 ; RV64IF-NEXT:    .cfi_restore ra
147 ; RV64IF-NEXT:    addi sp, sp, 16
148 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
149 ; RV64IF-NEXT:    ret
151 ; RV32IFD-LABEL: utest_f64i32:
152 ; RV32IFD:       # %bb.0: # %entry
153 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
154 ; RV32IFD-NEXT:    feq.d a1, fa0, fa0
155 ; RV32IFD-NEXT:    seqz a1, a1
156 ; RV32IFD-NEXT:    addi a1, a1, -1
157 ; RV32IFD-NEXT:    and a0, a1, a0
158 ; RV32IFD-NEXT:    ret
160 ; RV64IFD-LABEL: utest_f64i32:
161 ; RV64IFD:       # %bb.0: # %entry
162 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
163 ; RV64IFD-NEXT:    li a1, -1
164 ; RV64IFD-NEXT:    srli a1, a1, 32
165 ; RV64IFD-NEXT:    bltu a0, a1, .LBB1_2
166 ; RV64IFD-NEXT:  # %bb.1: # %entry
167 ; RV64IFD-NEXT:    mv a0, a1
168 ; RV64IFD-NEXT:  .LBB1_2: # %entry
169 ; RV64IFD-NEXT:    ret
170 entry:
171   %conv = fptoui double %x to i64
172   %0 = icmp ult i64 %conv, 4294967295
173   %spec.store.select = select i1 %0, i64 %conv, i64 4294967295
174   %conv6 = trunc i64 %spec.store.select to i32
175   ret i32 %conv6
178 define i32 @ustest_f64i32(double %x) {
179 ; RV32IF-LABEL: ustest_f64i32:
180 ; RV32IF:       # %bb.0: # %entry
181 ; RV32IF-NEXT:    addi sp, sp, -16
182 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
183 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
184 ; RV32IF-NEXT:    .cfi_offset ra, -4
185 ; RV32IF-NEXT:    call __fixdfdi
186 ; RV32IF-NEXT:    beqz a1, .LBB2_2
187 ; RV32IF-NEXT:  # %bb.1: # %entry
188 ; RV32IF-NEXT:    slti a2, a1, 0
189 ; RV32IF-NEXT:    j .LBB2_3
190 ; RV32IF-NEXT:  .LBB2_2:
191 ; RV32IF-NEXT:    sltiu a2, a0, -1
192 ; RV32IF-NEXT:  .LBB2_3: # %entry
193 ; RV32IF-NEXT:    addi a3, a2, -1
194 ; RV32IF-NEXT:    neg a2, a2
195 ; RV32IF-NEXT:    and a1, a2, a1
196 ; RV32IF-NEXT:    or a0, a3, a0
197 ; RV32IF-NEXT:    beqz a1, .LBB2_5
198 ; RV32IF-NEXT:  # %bb.4: # %entry
199 ; RV32IF-NEXT:    sgtz a1, a1
200 ; RV32IF-NEXT:    j .LBB2_6
201 ; RV32IF-NEXT:  .LBB2_5:
202 ; RV32IF-NEXT:    snez a1, a0
203 ; RV32IF-NEXT:  .LBB2_6: # %entry
204 ; RV32IF-NEXT:    neg a1, a1
205 ; RV32IF-NEXT:    and a0, a1, a0
206 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
207 ; RV32IF-NEXT:    .cfi_restore ra
208 ; RV32IF-NEXT:    addi sp, sp, 16
209 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
210 ; RV32IF-NEXT:    ret
212 ; RV64IF-LABEL: ustest_f64i32:
213 ; RV64IF:       # %bb.0: # %entry
214 ; RV64IF-NEXT:    addi sp, sp, -16
215 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
216 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
217 ; RV64IF-NEXT:    .cfi_offset ra, -8
218 ; RV64IF-NEXT:    call __fixdfdi
219 ; RV64IF-NEXT:    li a1, -1
220 ; RV64IF-NEXT:    srli a1, a1, 32
221 ; RV64IF-NEXT:    blt a0, a1, .LBB2_2
222 ; RV64IF-NEXT:  # %bb.1: # %entry
223 ; RV64IF-NEXT:    mv a0, a1
224 ; RV64IF-NEXT:  .LBB2_2: # %entry
225 ; RV64IF-NEXT:    sgtz a1, a0
226 ; RV64IF-NEXT:    neg a1, a1
227 ; RV64IF-NEXT:    and a0, a1, a0
228 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
229 ; RV64IF-NEXT:    .cfi_restore ra
230 ; RV64IF-NEXT:    addi sp, sp, 16
231 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
232 ; RV64IF-NEXT:    ret
234 ; RV32IFD-LABEL: ustest_f64i32:
235 ; RV32IFD:       # %bb.0: # %entry
236 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
237 ; RV32IFD-NEXT:    feq.d a1, fa0, fa0
238 ; RV32IFD-NEXT:    seqz a1, a1
239 ; RV32IFD-NEXT:    addi a1, a1, -1
240 ; RV32IFD-NEXT:    and a0, a1, a0
241 ; RV32IFD-NEXT:    ret
243 ; RV64IFD-LABEL: ustest_f64i32:
244 ; RV64IFD:       # %bb.0: # %entry
245 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
246 ; RV64IFD-NEXT:    li a1, -1
247 ; RV64IFD-NEXT:    srli a1, a1, 32
248 ; RV64IFD-NEXT:    blt a0, a1, .LBB2_2
249 ; RV64IFD-NEXT:  # %bb.1: # %entry
250 ; RV64IFD-NEXT:    mv a0, a1
251 ; RV64IFD-NEXT:  .LBB2_2: # %entry
252 ; RV64IFD-NEXT:    sgtz a1, a0
253 ; RV64IFD-NEXT:    neg a1, a1
254 ; RV64IFD-NEXT:    and a0, a1, a0
255 ; RV64IFD-NEXT:    ret
256 entry:
257   %conv = fptosi double %x to i64
258   %0 = icmp slt i64 %conv, 4294967295
259   %spec.store.select = select i1 %0, i64 %conv, i64 4294967295
260   %1 = icmp sgt i64 %spec.store.select, 0
261   %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0
262   %conv6 = trunc i64 %spec.store.select7 to i32
263   ret i32 %conv6
266 define i32 @stest_f32i32(float %x) {
267 ; RV32-LABEL: stest_f32i32:
268 ; RV32:       # %bb.0: # %entry
269 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
270 ; RV32-NEXT:    feq.s a1, fa0, fa0
271 ; RV32-NEXT:    seqz a1, a1
272 ; RV32-NEXT:    addi a1, a1, -1
273 ; RV32-NEXT:    and a0, a1, a0
274 ; RV32-NEXT:    ret
276 ; RV64-LABEL: stest_f32i32:
277 ; RV64:       # %bb.0: # %entry
278 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
279 ; RV64-NEXT:    lui a1, 524288
280 ; RV64-NEXT:    addiw a2, a1, -1
281 ; RV64-NEXT:    bge a0, a2, .LBB3_3
282 ; RV64-NEXT:  # %bb.1: # %entry
283 ; RV64-NEXT:    bge a1, a0, .LBB3_4
284 ; RV64-NEXT:  .LBB3_2: # %entry
285 ; RV64-NEXT:    ret
286 ; RV64-NEXT:  .LBB3_3: # %entry
287 ; RV64-NEXT:    mv a0, a2
288 ; RV64-NEXT:    blt a1, a2, .LBB3_2
289 ; RV64-NEXT:  .LBB3_4: # %entry
290 ; RV64-NEXT:    lui a0, 524288
291 ; RV64-NEXT:    ret
292 entry:
293   %conv = fptosi float %x to i64
294   %0 = icmp slt i64 %conv, 2147483647
295   %spec.store.select = select i1 %0, i64 %conv, i64 2147483647
296   %1 = icmp sgt i64 %spec.store.select, -2147483648
297   %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648
298   %conv6 = trunc i64 %spec.store.select7 to i32
299   ret i32 %conv6
302 define i32 @utest_f32i32(float %x) {
303 ; RV32-LABEL: utest_f32i32:
304 ; RV32:       # %bb.0: # %entry
305 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
306 ; RV32-NEXT:    feq.s a1, fa0, fa0
307 ; RV32-NEXT:    seqz a1, a1
308 ; RV32-NEXT:    addi a1, a1, -1
309 ; RV32-NEXT:    and a0, a1, a0
310 ; RV32-NEXT:    ret
312 ; RV64-LABEL: utest_f32i32:
313 ; RV64:       # %bb.0: # %entry
314 ; RV64-NEXT:    fcvt.lu.s a0, fa0, rtz
315 ; RV64-NEXT:    li a1, -1
316 ; RV64-NEXT:    srli a1, a1, 32
317 ; RV64-NEXT:    bltu a0, a1, .LBB4_2
318 ; RV64-NEXT:  # %bb.1: # %entry
319 ; RV64-NEXT:    mv a0, a1
320 ; RV64-NEXT:  .LBB4_2: # %entry
321 ; RV64-NEXT:    ret
322 entry:
323   %conv = fptoui float %x to i64
324   %0 = icmp ult i64 %conv, 4294967295
325   %spec.store.select = select i1 %0, i64 %conv, i64 4294967295
326   %conv6 = trunc i64 %spec.store.select to i32
327   ret i32 %conv6
330 define i32 @ustest_f32i32(float %x) {
331 ; RV32-LABEL: ustest_f32i32:
332 ; RV32:       # %bb.0: # %entry
333 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
334 ; RV32-NEXT:    feq.s a1, fa0, fa0
335 ; RV32-NEXT:    seqz a1, a1
336 ; RV32-NEXT:    addi a1, a1, -1
337 ; RV32-NEXT:    and a0, a1, a0
338 ; RV32-NEXT:    ret
340 ; RV64-LABEL: ustest_f32i32:
341 ; RV64:       # %bb.0: # %entry
342 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
343 ; RV64-NEXT:    li a1, -1
344 ; RV64-NEXT:    srli a1, a1, 32
345 ; RV64-NEXT:    blt a0, a1, .LBB5_2
346 ; RV64-NEXT:  # %bb.1: # %entry
347 ; RV64-NEXT:    mv a0, a1
348 ; RV64-NEXT:  .LBB5_2: # %entry
349 ; RV64-NEXT:    sgtz a1, a0
350 ; RV64-NEXT:    neg a1, a1
351 ; RV64-NEXT:    and a0, a1, a0
352 ; RV64-NEXT:    ret
353 entry:
354   %conv = fptosi float %x to i64
355   %0 = icmp slt i64 %conv, 4294967295
356   %spec.store.select = select i1 %0, i64 %conv, i64 4294967295
357   %1 = icmp sgt i64 %spec.store.select, 0
358   %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0
359   %conv6 = trunc i64 %spec.store.select7 to i32
360   ret i32 %conv6
363 define i32 @stest_f16i32(half %x) {
364 ; RV32-LABEL: stest_f16i32:
365 ; RV32:       # %bb.0: # %entry
366 ; RV32-NEXT:    addi sp, sp, -16
367 ; RV32-NEXT:    .cfi_def_cfa_offset 16
368 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
369 ; RV32-NEXT:    .cfi_offset ra, -4
370 ; RV32-NEXT:    call __extendhfsf2
371 ; RV32-NEXT:    call __fixsfdi
372 ; RV32-NEXT:    lui a2, 524288
373 ; RV32-NEXT:    addi a3, a2, -1
374 ; RV32-NEXT:    beqz a1, .LBB6_2
375 ; RV32-NEXT:  # %bb.1: # %entry
376 ; RV32-NEXT:    slti a4, a1, 0
377 ; RV32-NEXT:    j .LBB6_3
378 ; RV32-NEXT:  .LBB6_2:
379 ; RV32-NEXT:    sltu a4, a0, a3
380 ; RV32-NEXT:  .LBB6_3: # %entry
381 ; RV32-NEXT:    neg a5, a4
382 ; RV32-NEXT:    and a1, a5, a1
383 ; RV32-NEXT:    bnez a4, .LBB6_5
384 ; RV32-NEXT:  # %bb.4: # %entry
385 ; RV32-NEXT:    mv a0, a3
386 ; RV32-NEXT:  .LBB6_5: # %entry
387 ; RV32-NEXT:    li a3, -1
388 ; RV32-NEXT:    beq a1, a3, .LBB6_7
389 ; RV32-NEXT:  # %bb.6: # %entry
390 ; RV32-NEXT:    slti a1, a1, 0
391 ; RV32-NEXT:    xori a1, a1, 1
392 ; RV32-NEXT:    beqz a1, .LBB6_8
393 ; RV32-NEXT:    j .LBB6_9
394 ; RV32-NEXT:  .LBB6_7:
395 ; RV32-NEXT:    sltu a1, a2, a0
396 ; RV32-NEXT:    bnez a1, .LBB6_9
397 ; RV32-NEXT:  .LBB6_8: # %entry
398 ; RV32-NEXT:    lui a0, 524288
399 ; RV32-NEXT:  .LBB6_9: # %entry
400 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
401 ; RV32-NEXT:    .cfi_restore ra
402 ; RV32-NEXT:    addi sp, sp, 16
403 ; RV32-NEXT:    .cfi_def_cfa_offset 0
404 ; RV32-NEXT:    ret
406 ; RV64-LABEL: stest_f16i32:
407 ; RV64:       # %bb.0: # %entry
408 ; RV64-NEXT:    addi sp, sp, -16
409 ; RV64-NEXT:    .cfi_def_cfa_offset 16
410 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
411 ; RV64-NEXT:    .cfi_offset ra, -8
412 ; RV64-NEXT:    call __extendhfsf2
413 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
414 ; RV64-NEXT:    lui a1, 524288
415 ; RV64-NEXT:    addiw a2, a1, -1
416 ; RV64-NEXT:    blt a0, a2, .LBB6_2
417 ; RV64-NEXT:  # %bb.1: # %entry
418 ; RV64-NEXT:    mv a0, a2
419 ; RV64-NEXT:  .LBB6_2: # %entry
420 ; RV64-NEXT:    blt a1, a0, .LBB6_4
421 ; RV64-NEXT:  # %bb.3: # %entry
422 ; RV64-NEXT:    lui a0, 524288
423 ; RV64-NEXT:  .LBB6_4: # %entry
424 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
425 ; RV64-NEXT:    .cfi_restore ra
426 ; RV64-NEXT:    addi sp, sp, 16
427 ; RV64-NEXT:    .cfi_def_cfa_offset 0
428 ; RV64-NEXT:    ret
429 entry:
430   %conv = fptosi half %x to i64
431   %0 = icmp slt i64 %conv, 2147483647
432   %spec.store.select = select i1 %0, i64 %conv, i64 2147483647
433   %1 = icmp sgt i64 %spec.store.select, -2147483648
434   %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648
435   %conv6 = trunc i64 %spec.store.select7 to i32
436   ret i32 %conv6
439 define i32 @utesth_f16i32(half %x) {
440 ; RV32-LABEL: utesth_f16i32:
441 ; RV32:       # %bb.0: # %entry
442 ; RV32-NEXT:    addi sp, sp, -16
443 ; RV32-NEXT:    .cfi_def_cfa_offset 16
444 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
445 ; RV32-NEXT:    .cfi_offset ra, -4
446 ; RV32-NEXT:    call __extendhfsf2
447 ; RV32-NEXT:    call __fixunssfdi
448 ; RV32-NEXT:    sltiu a2, a0, -1
449 ; RV32-NEXT:    seqz a1, a1
450 ; RV32-NEXT:    and a1, a1, a2
451 ; RV32-NEXT:    addi a1, a1, -1
452 ; RV32-NEXT:    or a0, a1, a0
453 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
454 ; RV32-NEXT:    .cfi_restore ra
455 ; RV32-NEXT:    addi sp, sp, 16
456 ; RV32-NEXT:    .cfi_def_cfa_offset 0
457 ; RV32-NEXT:    ret
459 ; RV64-LABEL: utesth_f16i32:
460 ; RV64:       # %bb.0: # %entry
461 ; RV64-NEXT:    addi sp, sp, -16
462 ; RV64-NEXT:    .cfi_def_cfa_offset 16
463 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
464 ; RV64-NEXT:    .cfi_offset ra, -8
465 ; RV64-NEXT:    call __extendhfsf2
466 ; RV64-NEXT:    fcvt.lu.s a0, fa0, rtz
467 ; RV64-NEXT:    li a1, -1
468 ; RV64-NEXT:    srli a1, a1, 32
469 ; RV64-NEXT:    bltu a0, a1, .LBB7_2
470 ; RV64-NEXT:  # %bb.1: # %entry
471 ; RV64-NEXT:    mv a0, a1
472 ; RV64-NEXT:  .LBB7_2: # %entry
473 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
474 ; RV64-NEXT:    .cfi_restore ra
475 ; RV64-NEXT:    addi sp, sp, 16
476 ; RV64-NEXT:    .cfi_def_cfa_offset 0
477 ; RV64-NEXT:    ret
478 entry:
479   %conv = fptoui half %x to i64
480   %0 = icmp ult i64 %conv, 4294967295
481   %spec.store.select = select i1 %0, i64 %conv, i64 4294967295
482   %conv6 = trunc i64 %spec.store.select to i32
483   ret i32 %conv6
486 define i32 @ustest_f16i32(half %x) {
487 ; RV32-LABEL: ustest_f16i32:
488 ; RV32:       # %bb.0: # %entry
489 ; RV32-NEXT:    addi sp, sp, -16
490 ; RV32-NEXT:    .cfi_def_cfa_offset 16
491 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
492 ; RV32-NEXT:    .cfi_offset ra, -4
493 ; RV32-NEXT:    call __extendhfsf2
494 ; RV32-NEXT:    call __fixsfdi
495 ; RV32-NEXT:    beqz a1, .LBB8_2
496 ; RV32-NEXT:  # %bb.1: # %entry
497 ; RV32-NEXT:    slti a2, a1, 0
498 ; RV32-NEXT:    j .LBB8_3
499 ; RV32-NEXT:  .LBB8_2:
500 ; RV32-NEXT:    sltiu a2, a0, -1
501 ; RV32-NEXT:  .LBB8_3: # %entry
502 ; RV32-NEXT:    addi a3, a2, -1
503 ; RV32-NEXT:    neg a2, a2
504 ; RV32-NEXT:    and a1, a2, a1
505 ; RV32-NEXT:    or a0, a3, a0
506 ; RV32-NEXT:    beqz a1, .LBB8_5
507 ; RV32-NEXT:  # %bb.4: # %entry
508 ; RV32-NEXT:    sgtz a1, a1
509 ; RV32-NEXT:    j .LBB8_6
510 ; RV32-NEXT:  .LBB8_5:
511 ; RV32-NEXT:    snez a1, a0
512 ; RV32-NEXT:  .LBB8_6: # %entry
513 ; RV32-NEXT:    neg a1, a1
514 ; RV32-NEXT:    and a0, a1, a0
515 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
516 ; RV32-NEXT:    .cfi_restore ra
517 ; RV32-NEXT:    addi sp, sp, 16
518 ; RV32-NEXT:    .cfi_def_cfa_offset 0
519 ; RV32-NEXT:    ret
521 ; RV64-LABEL: ustest_f16i32:
522 ; RV64:       # %bb.0: # %entry
523 ; RV64-NEXT:    addi sp, sp, -16
524 ; RV64-NEXT:    .cfi_def_cfa_offset 16
525 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
526 ; RV64-NEXT:    .cfi_offset ra, -8
527 ; RV64-NEXT:    call __extendhfsf2
528 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
529 ; RV64-NEXT:    li a1, -1
530 ; RV64-NEXT:    srli a1, a1, 32
531 ; RV64-NEXT:    blt a0, a1, .LBB8_2
532 ; RV64-NEXT:  # %bb.1: # %entry
533 ; RV64-NEXT:    mv a0, a1
534 ; RV64-NEXT:  .LBB8_2: # %entry
535 ; RV64-NEXT:    sgtz a1, a0
536 ; RV64-NEXT:    neg a1, a1
537 ; RV64-NEXT:    and a0, a1, a0
538 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
539 ; RV64-NEXT:    .cfi_restore ra
540 ; RV64-NEXT:    addi sp, sp, 16
541 ; RV64-NEXT:    .cfi_def_cfa_offset 0
542 ; RV64-NEXT:    ret
543 entry:
544   %conv = fptosi half %x to i64
545   %0 = icmp slt i64 %conv, 4294967295
546   %spec.store.select = select i1 %0, i64 %conv, i64 4294967295
547   %1 = icmp sgt i64 %spec.store.select, 0
548   %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0
549   %conv6 = trunc i64 %spec.store.select7 to i32
550   ret i32 %conv6
553 ; i16 saturate
555 define i16 @stest_f64i16(double %x) {
556 ; RV32IF-LABEL: stest_f64i16:
557 ; RV32IF:       # %bb.0: # %entry
558 ; RV32IF-NEXT:    addi sp, sp, -16
559 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
560 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
561 ; RV32IF-NEXT:    .cfi_offset ra, -4
562 ; RV32IF-NEXT:    call __fixdfsi
563 ; RV32IF-NEXT:    lui a1, 8
564 ; RV32IF-NEXT:    addi a1, a1, -1
565 ; RV32IF-NEXT:    blt a0, a1, .LBB9_2
566 ; RV32IF-NEXT:  # %bb.1: # %entry
567 ; RV32IF-NEXT:    mv a0, a1
568 ; RV32IF-NEXT:  .LBB9_2: # %entry
569 ; RV32IF-NEXT:    lui a1, 1048568
570 ; RV32IF-NEXT:    blt a1, a0, .LBB9_4
571 ; RV32IF-NEXT:  # %bb.3: # %entry
572 ; RV32IF-NEXT:    lui a0, 1048568
573 ; RV32IF-NEXT:  .LBB9_4: # %entry
574 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
575 ; RV32IF-NEXT:    .cfi_restore ra
576 ; RV32IF-NEXT:    addi sp, sp, 16
577 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
578 ; RV32IF-NEXT:    ret
580 ; RV64IF-LABEL: stest_f64i16:
581 ; RV64IF:       # %bb.0: # %entry
582 ; RV64IF-NEXT:    addi sp, sp, -16
583 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
584 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
585 ; RV64IF-NEXT:    .cfi_offset ra, -8
586 ; RV64IF-NEXT:    call __fixdfsi
587 ; RV64IF-NEXT:    lui a1, 8
588 ; RV64IF-NEXT:    addiw a1, a1, -1
589 ; RV64IF-NEXT:    blt a0, a1, .LBB9_2
590 ; RV64IF-NEXT:  # %bb.1: # %entry
591 ; RV64IF-NEXT:    mv a0, a1
592 ; RV64IF-NEXT:  .LBB9_2: # %entry
593 ; RV64IF-NEXT:    lui a1, 1048568
594 ; RV64IF-NEXT:    blt a1, a0, .LBB9_4
595 ; RV64IF-NEXT:  # %bb.3: # %entry
596 ; RV64IF-NEXT:    lui a0, 1048568
597 ; RV64IF-NEXT:  .LBB9_4: # %entry
598 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
599 ; RV64IF-NEXT:    .cfi_restore ra
600 ; RV64IF-NEXT:    addi sp, sp, 16
601 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
602 ; RV64IF-NEXT:    ret
604 ; RV32IFD-LABEL: stest_f64i16:
605 ; RV32IFD:       # %bb.0: # %entry
606 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
607 ; RV32IFD-NEXT:    lui a1, 8
608 ; RV32IFD-NEXT:    addi a1, a1, -1
609 ; RV32IFD-NEXT:    bge a0, a1, .LBB9_3
610 ; RV32IFD-NEXT:  # %bb.1: # %entry
611 ; RV32IFD-NEXT:    lui a1, 1048568
612 ; RV32IFD-NEXT:    bge a1, a0, .LBB9_4
613 ; RV32IFD-NEXT:  .LBB9_2: # %entry
614 ; RV32IFD-NEXT:    ret
615 ; RV32IFD-NEXT:  .LBB9_3: # %entry
616 ; RV32IFD-NEXT:    mv a0, a1
617 ; RV32IFD-NEXT:    lui a1, 1048568
618 ; RV32IFD-NEXT:    blt a1, a0, .LBB9_2
619 ; RV32IFD-NEXT:  .LBB9_4: # %entry
620 ; RV32IFD-NEXT:    lui a0, 1048568
621 ; RV32IFD-NEXT:    ret
623 ; RV64IFD-LABEL: stest_f64i16:
624 ; RV64IFD:       # %bb.0: # %entry
625 ; RV64IFD-NEXT:    fcvt.w.d a0, fa0, rtz
626 ; RV64IFD-NEXT:    lui a1, 8
627 ; RV64IFD-NEXT:    addiw a1, a1, -1
628 ; RV64IFD-NEXT:    bge a0, a1, .LBB9_3
629 ; RV64IFD-NEXT:  # %bb.1: # %entry
630 ; RV64IFD-NEXT:    lui a1, 1048568
631 ; RV64IFD-NEXT:    bge a1, a0, .LBB9_4
632 ; RV64IFD-NEXT:  .LBB9_2: # %entry
633 ; RV64IFD-NEXT:    ret
634 ; RV64IFD-NEXT:  .LBB9_3: # %entry
635 ; RV64IFD-NEXT:    mv a0, a1
636 ; RV64IFD-NEXT:    lui a1, 1048568
637 ; RV64IFD-NEXT:    blt a1, a0, .LBB9_2
638 ; RV64IFD-NEXT:  .LBB9_4: # %entry
639 ; RV64IFD-NEXT:    lui a0, 1048568
640 ; RV64IFD-NEXT:    ret
641 entry:
642   %conv = fptosi double %x to i32
643   %0 = icmp slt i32 %conv, 32767
644   %spec.store.select = select i1 %0, i32 %conv, i32 32767
645   %1 = icmp sgt i32 %spec.store.select, -32768
646   %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768
647   %conv6 = trunc i32 %spec.store.select7 to i16
648   ret i16 %conv6
651 define i16 @utest_f64i16(double %x) {
652 ; RV32IF-LABEL: utest_f64i16:
653 ; RV32IF:       # %bb.0: # %entry
654 ; RV32IF-NEXT:    addi sp, sp, -16
655 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
656 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
657 ; RV32IF-NEXT:    .cfi_offset ra, -4
658 ; RV32IF-NEXT:    call __fixunsdfsi
659 ; RV32IF-NEXT:    lui a1, 16
660 ; RV32IF-NEXT:    addi a1, a1, -1
661 ; RV32IF-NEXT:    bltu a0, a1, .LBB10_2
662 ; RV32IF-NEXT:  # %bb.1: # %entry
663 ; RV32IF-NEXT:    mv a0, a1
664 ; RV32IF-NEXT:  .LBB10_2: # %entry
665 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
666 ; RV32IF-NEXT:    .cfi_restore ra
667 ; RV32IF-NEXT:    addi sp, sp, 16
668 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
669 ; RV32IF-NEXT:    ret
671 ; RV64IF-LABEL: utest_f64i16:
672 ; RV64IF:       # %bb.0: # %entry
673 ; RV64IF-NEXT:    addi sp, sp, -16
674 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
675 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
676 ; RV64IF-NEXT:    .cfi_offset ra, -8
677 ; RV64IF-NEXT:    call __fixunsdfsi
678 ; RV64IF-NEXT:    lui a1, 16
679 ; RV64IF-NEXT:    addiw a1, a1, -1
680 ; RV64IF-NEXT:    bltu a0, a1, .LBB10_2
681 ; RV64IF-NEXT:  # %bb.1: # %entry
682 ; RV64IF-NEXT:    mv a0, a1
683 ; RV64IF-NEXT:  .LBB10_2: # %entry
684 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
685 ; RV64IF-NEXT:    .cfi_restore ra
686 ; RV64IF-NEXT:    addi sp, sp, 16
687 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
688 ; RV64IF-NEXT:    ret
690 ; RV32IFD-LABEL: utest_f64i16:
691 ; RV32IFD:       # %bb.0: # %entry
692 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
693 ; RV32IFD-NEXT:    lui a1, 16
694 ; RV32IFD-NEXT:    addi a1, a1, -1
695 ; RV32IFD-NEXT:    bltu a0, a1, .LBB10_2
696 ; RV32IFD-NEXT:  # %bb.1: # %entry
697 ; RV32IFD-NEXT:    mv a0, a1
698 ; RV32IFD-NEXT:  .LBB10_2: # %entry
699 ; RV32IFD-NEXT:    ret
701 ; RV64IFD-LABEL: utest_f64i16:
702 ; RV64IFD:       # %bb.0: # %entry
703 ; RV64IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
704 ; RV64IFD-NEXT:    lui a1, 16
705 ; RV64IFD-NEXT:    addiw a1, a1, -1
706 ; RV64IFD-NEXT:    bltu a0, a1, .LBB10_2
707 ; RV64IFD-NEXT:  # %bb.1: # %entry
708 ; RV64IFD-NEXT:    mv a0, a1
709 ; RV64IFD-NEXT:  .LBB10_2: # %entry
710 ; RV64IFD-NEXT:    ret
711 entry:
712   %conv = fptoui double %x to i32
713   %0 = icmp ult i32 %conv, 65535
714   %spec.store.select = select i1 %0, i32 %conv, i32 65535
715   %conv6 = trunc i32 %spec.store.select to i16
716   ret i16 %conv6
719 define i16 @ustest_f64i16(double %x) {
720 ; RV32IF-LABEL: ustest_f64i16:
721 ; RV32IF:       # %bb.0: # %entry
722 ; RV32IF-NEXT:    addi sp, sp, -16
723 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
724 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
725 ; RV32IF-NEXT:    .cfi_offset ra, -4
726 ; RV32IF-NEXT:    call __fixdfsi
727 ; RV32IF-NEXT:    lui a1, 16
728 ; RV32IF-NEXT:    addi a1, a1, -1
729 ; RV32IF-NEXT:    blt a0, a1, .LBB11_2
730 ; RV32IF-NEXT:  # %bb.1: # %entry
731 ; RV32IF-NEXT:    mv a0, a1
732 ; RV32IF-NEXT:  .LBB11_2: # %entry
733 ; RV32IF-NEXT:    sgtz a1, a0
734 ; RV32IF-NEXT:    neg a1, a1
735 ; RV32IF-NEXT:    and a0, a1, a0
736 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
737 ; RV32IF-NEXT:    .cfi_restore ra
738 ; RV32IF-NEXT:    addi sp, sp, 16
739 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
740 ; RV32IF-NEXT:    ret
742 ; RV64IF-LABEL: ustest_f64i16:
743 ; RV64IF:       # %bb.0: # %entry
744 ; RV64IF-NEXT:    addi sp, sp, -16
745 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
746 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
747 ; RV64IF-NEXT:    .cfi_offset ra, -8
748 ; RV64IF-NEXT:    call __fixdfsi
749 ; RV64IF-NEXT:    lui a1, 16
750 ; RV64IF-NEXT:    addiw a1, a1, -1
751 ; RV64IF-NEXT:    blt a0, a1, .LBB11_2
752 ; RV64IF-NEXT:  # %bb.1: # %entry
753 ; RV64IF-NEXT:    mv a0, a1
754 ; RV64IF-NEXT:  .LBB11_2: # %entry
755 ; RV64IF-NEXT:    sgtz a1, a0
756 ; RV64IF-NEXT:    neg a1, a1
757 ; RV64IF-NEXT:    and a0, a1, a0
758 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
759 ; RV64IF-NEXT:    .cfi_restore ra
760 ; RV64IF-NEXT:    addi sp, sp, 16
761 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
762 ; RV64IF-NEXT:    ret
764 ; RV32IFD-LABEL: ustest_f64i16:
765 ; RV32IFD:       # %bb.0: # %entry
766 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
767 ; RV32IFD-NEXT:    lui a1, 16
768 ; RV32IFD-NEXT:    addi a1, a1, -1
769 ; RV32IFD-NEXT:    blt a0, a1, .LBB11_2
770 ; RV32IFD-NEXT:  # %bb.1: # %entry
771 ; RV32IFD-NEXT:    mv a0, a1
772 ; RV32IFD-NEXT:  .LBB11_2: # %entry
773 ; RV32IFD-NEXT:    sgtz a1, a0
774 ; RV32IFD-NEXT:    neg a1, a1
775 ; RV32IFD-NEXT:    and a0, a1, a0
776 ; RV32IFD-NEXT:    ret
778 ; RV64IFD-LABEL: ustest_f64i16:
779 ; RV64IFD:       # %bb.0: # %entry
780 ; RV64IFD-NEXT:    fcvt.w.d a0, fa0, rtz
781 ; RV64IFD-NEXT:    lui a1, 16
782 ; RV64IFD-NEXT:    addiw a1, a1, -1
783 ; RV64IFD-NEXT:    blt a0, a1, .LBB11_2
784 ; RV64IFD-NEXT:  # %bb.1: # %entry
785 ; RV64IFD-NEXT:    mv a0, a1
786 ; RV64IFD-NEXT:  .LBB11_2: # %entry
787 ; RV64IFD-NEXT:    sgtz a1, a0
788 ; RV64IFD-NEXT:    neg a1, a1
789 ; RV64IFD-NEXT:    and a0, a1, a0
790 ; RV64IFD-NEXT:    ret
791 entry:
792   %conv = fptosi double %x to i32
793   %0 = icmp slt i32 %conv, 65535
794   %spec.store.select = select i1 %0, i32 %conv, i32 65535
795   %1 = icmp sgt i32 %spec.store.select, 0
796   %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0
797   %conv6 = trunc i32 %spec.store.select7 to i16
798   ret i16 %conv6
801 define i16 @stest_f32i16(float %x) {
802 ; RV32-LABEL: stest_f32i16:
803 ; RV32:       # %bb.0: # %entry
804 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
805 ; RV32-NEXT:    lui a1, 8
806 ; RV32-NEXT:    addi a1, a1, -1
807 ; RV32-NEXT:    bge a0, a1, .LBB12_3
808 ; RV32-NEXT:  # %bb.1: # %entry
809 ; RV32-NEXT:    lui a1, 1048568
810 ; RV32-NEXT:    bge a1, a0, .LBB12_4
811 ; RV32-NEXT:  .LBB12_2: # %entry
812 ; RV32-NEXT:    ret
813 ; RV32-NEXT:  .LBB12_3: # %entry
814 ; RV32-NEXT:    mv a0, a1
815 ; RV32-NEXT:    lui a1, 1048568
816 ; RV32-NEXT:    blt a1, a0, .LBB12_2
817 ; RV32-NEXT:  .LBB12_4: # %entry
818 ; RV32-NEXT:    lui a0, 1048568
819 ; RV32-NEXT:    ret
821 ; RV64-LABEL: stest_f32i16:
822 ; RV64:       # %bb.0: # %entry
823 ; RV64-NEXT:    fcvt.w.s a0, fa0, rtz
824 ; RV64-NEXT:    lui a1, 8
825 ; RV64-NEXT:    addiw a1, a1, -1
826 ; RV64-NEXT:    bge a0, a1, .LBB12_3
827 ; RV64-NEXT:  # %bb.1: # %entry
828 ; RV64-NEXT:    lui a1, 1048568
829 ; RV64-NEXT:    bge a1, a0, .LBB12_4
830 ; RV64-NEXT:  .LBB12_2: # %entry
831 ; RV64-NEXT:    ret
832 ; RV64-NEXT:  .LBB12_3: # %entry
833 ; RV64-NEXT:    mv a0, a1
834 ; RV64-NEXT:    lui a1, 1048568
835 ; RV64-NEXT:    blt a1, a0, .LBB12_2
836 ; RV64-NEXT:  .LBB12_4: # %entry
837 ; RV64-NEXT:    lui a0, 1048568
838 ; RV64-NEXT:    ret
839 entry:
840   %conv = fptosi float %x to i32
841   %0 = icmp slt i32 %conv, 32767
842   %spec.store.select = select i1 %0, i32 %conv, i32 32767
843   %1 = icmp sgt i32 %spec.store.select, -32768
844   %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768
845   %conv6 = trunc i32 %spec.store.select7 to i16
846   ret i16 %conv6
849 define i16 @utest_f32i16(float %x) {
850 ; RV32-LABEL: utest_f32i16:
851 ; RV32:       # %bb.0: # %entry
852 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
853 ; RV32-NEXT:    lui a1, 16
854 ; RV32-NEXT:    addi a1, a1, -1
855 ; RV32-NEXT:    bltu a0, a1, .LBB13_2
856 ; RV32-NEXT:  # %bb.1: # %entry
857 ; RV32-NEXT:    mv a0, a1
858 ; RV32-NEXT:  .LBB13_2: # %entry
859 ; RV32-NEXT:    ret
861 ; RV64-LABEL: utest_f32i16:
862 ; RV64:       # %bb.0: # %entry
863 ; RV64-NEXT:    fcvt.wu.s a0, fa0, rtz
864 ; RV64-NEXT:    lui a1, 16
865 ; RV64-NEXT:    addiw a1, a1, -1
866 ; RV64-NEXT:    bltu a0, a1, .LBB13_2
867 ; RV64-NEXT:  # %bb.1: # %entry
868 ; RV64-NEXT:    mv a0, a1
869 ; RV64-NEXT:  .LBB13_2: # %entry
870 ; RV64-NEXT:    ret
871 entry:
872   %conv = fptoui float %x to i32
873   %0 = icmp ult i32 %conv, 65535
874   %spec.store.select = select i1 %0, i32 %conv, i32 65535
875   %conv6 = trunc i32 %spec.store.select to i16
876   ret i16 %conv6
879 define i16 @ustest_f32i16(float %x) {
880 ; RV32-LABEL: ustest_f32i16:
881 ; RV32:       # %bb.0: # %entry
882 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
883 ; RV32-NEXT:    lui a1, 16
884 ; RV32-NEXT:    addi a1, a1, -1
885 ; RV32-NEXT:    blt a0, a1, .LBB14_2
886 ; RV32-NEXT:  # %bb.1: # %entry
887 ; RV32-NEXT:    mv a0, a1
888 ; RV32-NEXT:  .LBB14_2: # %entry
889 ; RV32-NEXT:    sgtz a1, a0
890 ; RV32-NEXT:    neg a1, a1
891 ; RV32-NEXT:    and a0, a1, a0
892 ; RV32-NEXT:    ret
894 ; RV64-LABEL: ustest_f32i16:
895 ; RV64:       # %bb.0: # %entry
896 ; RV64-NEXT:    fcvt.w.s a0, fa0, rtz
897 ; RV64-NEXT:    lui a1, 16
898 ; RV64-NEXT:    addiw a1, a1, -1
899 ; RV64-NEXT:    blt a0, a1, .LBB14_2
900 ; RV64-NEXT:  # %bb.1: # %entry
901 ; RV64-NEXT:    mv a0, a1
902 ; RV64-NEXT:  .LBB14_2: # %entry
903 ; RV64-NEXT:    sgtz a1, a0
904 ; RV64-NEXT:    neg a1, a1
905 ; RV64-NEXT:    and a0, a1, a0
906 ; RV64-NEXT:    ret
907 entry:
908   %conv = fptosi float %x to i32
909   %0 = icmp slt i32 %conv, 65535
910   %spec.store.select = select i1 %0, i32 %conv, i32 65535
911   %1 = icmp sgt i32 %spec.store.select, 0
912   %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0
913   %conv6 = trunc i32 %spec.store.select7 to i16
914   ret i16 %conv6
917 define i16 @stest_f16i16(half %x) {
918 ; RV32-LABEL: stest_f16i16:
919 ; RV32:       # %bb.0: # %entry
920 ; RV32-NEXT:    addi sp, sp, -16
921 ; RV32-NEXT:    .cfi_def_cfa_offset 16
922 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
923 ; RV32-NEXT:    .cfi_offset ra, -4
924 ; RV32-NEXT:    call __extendhfsf2
925 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
926 ; RV32-NEXT:    lui a1, 8
927 ; RV32-NEXT:    addi a1, a1, -1
928 ; RV32-NEXT:    blt a0, a1, .LBB15_2
929 ; RV32-NEXT:  # %bb.1: # %entry
930 ; RV32-NEXT:    mv a0, a1
931 ; RV32-NEXT:  .LBB15_2: # %entry
932 ; RV32-NEXT:    lui a1, 1048568
933 ; RV32-NEXT:    blt a1, a0, .LBB15_4
934 ; RV32-NEXT:  # %bb.3: # %entry
935 ; RV32-NEXT:    lui a0, 1048568
936 ; RV32-NEXT:  .LBB15_4: # %entry
937 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
938 ; RV32-NEXT:    .cfi_restore ra
939 ; RV32-NEXT:    addi sp, sp, 16
940 ; RV32-NEXT:    .cfi_def_cfa_offset 0
941 ; RV32-NEXT:    ret
943 ; RV64-LABEL: stest_f16i16:
944 ; RV64:       # %bb.0: # %entry
945 ; RV64-NEXT:    addi sp, sp, -16
946 ; RV64-NEXT:    .cfi_def_cfa_offset 16
947 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
948 ; RV64-NEXT:    .cfi_offset ra, -8
949 ; RV64-NEXT:    call __extendhfsf2
950 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
951 ; RV64-NEXT:    lui a1, 8
952 ; RV64-NEXT:    addiw a1, a1, -1
953 ; RV64-NEXT:    blt a0, a1, .LBB15_2
954 ; RV64-NEXT:  # %bb.1: # %entry
955 ; RV64-NEXT:    mv a0, a1
956 ; RV64-NEXT:  .LBB15_2: # %entry
957 ; RV64-NEXT:    lui a1, 1048568
958 ; RV64-NEXT:    blt a1, a0, .LBB15_4
959 ; RV64-NEXT:  # %bb.3: # %entry
960 ; RV64-NEXT:    lui a0, 1048568
961 ; RV64-NEXT:  .LBB15_4: # %entry
962 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
963 ; RV64-NEXT:    .cfi_restore ra
964 ; RV64-NEXT:    addi sp, sp, 16
965 ; RV64-NEXT:    .cfi_def_cfa_offset 0
966 ; RV64-NEXT:    ret
967 entry:
968   %conv = fptosi half %x to i32
969   %0 = icmp slt i32 %conv, 32767
970   %spec.store.select = select i1 %0, i32 %conv, i32 32767
971   %1 = icmp sgt i32 %spec.store.select, -32768
972   %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768
973   %conv6 = trunc i32 %spec.store.select7 to i16
974   ret i16 %conv6
977 define i16 @utesth_f16i16(half %x) {
978 ; RV32-LABEL: utesth_f16i16:
979 ; RV32:       # %bb.0: # %entry
980 ; RV32-NEXT:    addi sp, sp, -16
981 ; RV32-NEXT:    .cfi_def_cfa_offset 16
982 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
983 ; RV32-NEXT:    .cfi_offset ra, -4
984 ; RV32-NEXT:    call __extendhfsf2
985 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
986 ; RV32-NEXT:    lui a1, 16
987 ; RV32-NEXT:    addi a1, a1, -1
988 ; RV32-NEXT:    bltu a0, a1, .LBB16_2
989 ; RV32-NEXT:  # %bb.1: # %entry
990 ; RV32-NEXT:    mv a0, a1
991 ; RV32-NEXT:  .LBB16_2: # %entry
992 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
993 ; RV32-NEXT:    .cfi_restore ra
994 ; RV32-NEXT:    addi sp, sp, 16
995 ; RV32-NEXT:    .cfi_def_cfa_offset 0
996 ; RV32-NEXT:    ret
998 ; RV64-LABEL: utesth_f16i16:
999 ; RV64:       # %bb.0: # %entry
1000 ; RV64-NEXT:    addi sp, sp, -16
1001 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1002 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1003 ; RV64-NEXT:    .cfi_offset ra, -8
1004 ; RV64-NEXT:    call __extendhfsf2
1005 ; RV64-NEXT:    fcvt.lu.s a0, fa0, rtz
1006 ; RV64-NEXT:    lui a1, 16
1007 ; RV64-NEXT:    addiw a1, a1, -1
1008 ; RV64-NEXT:    bltu a0, a1, .LBB16_2
1009 ; RV64-NEXT:  # %bb.1: # %entry
1010 ; RV64-NEXT:    mv a0, a1
1011 ; RV64-NEXT:  .LBB16_2: # %entry
1012 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1013 ; RV64-NEXT:    .cfi_restore ra
1014 ; RV64-NEXT:    addi sp, sp, 16
1015 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1016 ; RV64-NEXT:    ret
1017 entry:
1018   %conv = fptoui half %x to i32
1019   %0 = icmp ult i32 %conv, 65535
1020   %spec.store.select = select i1 %0, i32 %conv, i32 65535
1021   %conv6 = trunc i32 %spec.store.select to i16
1022   ret i16 %conv6
1025 define i16 @ustest_f16i16(half %x) {
1026 ; RV32-LABEL: ustest_f16i16:
1027 ; RV32:       # %bb.0: # %entry
1028 ; RV32-NEXT:    addi sp, sp, -16
1029 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1030 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1031 ; RV32-NEXT:    .cfi_offset ra, -4
1032 ; RV32-NEXT:    call __extendhfsf2
1033 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
1034 ; RV32-NEXT:    lui a1, 16
1035 ; RV32-NEXT:    addi a1, a1, -1
1036 ; RV32-NEXT:    blt a0, a1, .LBB17_2
1037 ; RV32-NEXT:  # %bb.1: # %entry
1038 ; RV32-NEXT:    mv a0, a1
1039 ; RV32-NEXT:  .LBB17_2: # %entry
1040 ; RV32-NEXT:    sgtz a1, a0
1041 ; RV32-NEXT:    neg a1, a1
1042 ; RV32-NEXT:    and a0, a1, a0
1043 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1044 ; RV32-NEXT:    .cfi_restore ra
1045 ; RV32-NEXT:    addi sp, sp, 16
1046 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1047 ; RV32-NEXT:    ret
1049 ; RV64-LABEL: ustest_f16i16:
1050 ; RV64:       # %bb.0: # %entry
1051 ; RV64-NEXT:    addi sp, sp, -16
1052 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1053 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1054 ; RV64-NEXT:    .cfi_offset ra, -8
1055 ; RV64-NEXT:    call __extendhfsf2
1056 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
1057 ; RV64-NEXT:    lui a1, 16
1058 ; RV64-NEXT:    addiw a1, a1, -1
1059 ; RV64-NEXT:    blt a0, a1, .LBB17_2
1060 ; RV64-NEXT:  # %bb.1: # %entry
1061 ; RV64-NEXT:    mv a0, a1
1062 ; RV64-NEXT:  .LBB17_2: # %entry
1063 ; RV64-NEXT:    sgtz a1, a0
1064 ; RV64-NEXT:    neg a1, a1
1065 ; RV64-NEXT:    and a0, a1, a0
1066 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1067 ; RV64-NEXT:    .cfi_restore ra
1068 ; RV64-NEXT:    addi sp, sp, 16
1069 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1070 ; RV64-NEXT:    ret
1071 entry:
1072   %conv = fptosi half %x to i32
1073   %0 = icmp slt i32 %conv, 65535
1074   %spec.store.select = select i1 %0, i32 %conv, i32 65535
1075   %1 = icmp sgt i32 %spec.store.select, 0
1076   %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0
1077   %conv6 = trunc i32 %spec.store.select7 to i16
1078   ret i16 %conv6
1081 ; i64 saturate
1083 define i64 @stest_f64i64(double %x) {
1084 ; RV32IF-LABEL: stest_f64i64:
1085 ; RV32IF:       # %bb.0: # %entry
1086 ; RV32IF-NEXT:    addi sp, sp, -32
1087 ; RV32IF-NEXT:    .cfi_def_cfa_offset 32
1088 ; RV32IF-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1089 ; RV32IF-NEXT:    .cfi_offset ra, -4
1090 ; RV32IF-NEXT:    mv a2, a1
1091 ; RV32IF-NEXT:    mv a1, a0
1092 ; RV32IF-NEXT:    addi a0, sp, 8
1093 ; RV32IF-NEXT:    call __fixdfti
1094 ; RV32IF-NEXT:    lw a3, 8(sp)
1095 ; RV32IF-NEXT:    lw a1, 12(sp)
1096 ; RV32IF-NEXT:    lw a2, 16(sp)
1097 ; RV32IF-NEXT:    lw a4, 20(sp)
1098 ; RV32IF-NEXT:    lui a0, 524288
1099 ; RV32IF-NEXT:    addi a5, a0, -1
1100 ; RV32IF-NEXT:    beq a1, a5, .LBB18_2
1101 ; RV32IF-NEXT:  # %bb.1: # %entry
1102 ; RV32IF-NEXT:    sltu a6, a1, a5
1103 ; RV32IF-NEXT:    or a7, a2, a4
1104 ; RV32IF-NEXT:    bnez a7, .LBB18_3
1105 ; RV32IF-NEXT:    j .LBB18_4
1106 ; RV32IF-NEXT:  .LBB18_2:
1107 ; RV32IF-NEXT:    sltiu a6, a3, -1
1108 ; RV32IF-NEXT:    or a7, a2, a4
1109 ; RV32IF-NEXT:    beqz a7, .LBB18_4
1110 ; RV32IF-NEXT:  .LBB18_3: # %entry
1111 ; RV32IF-NEXT:    slti a6, a4, 0
1112 ; RV32IF-NEXT:  .LBB18_4: # %entry
1113 ; RV32IF-NEXT:    addi a7, a6, -1
1114 ; RV32IF-NEXT:    neg t0, a6
1115 ; RV32IF-NEXT:    bnez a6, .LBB18_6
1116 ; RV32IF-NEXT:  # %bb.5: # %entry
1117 ; RV32IF-NEXT:    mv a1, a5
1118 ; RV32IF-NEXT:  .LBB18_6: # %entry
1119 ; RV32IF-NEXT:    or a3, a7, a3
1120 ; RV32IF-NEXT:    and a4, t0, a4
1121 ; RV32IF-NEXT:    and a2, t0, a2
1122 ; RV32IF-NEXT:    beq a1, a0, .LBB18_8
1123 ; RV32IF-NEXT:  # %bb.7: # %entry
1124 ; RV32IF-NEXT:    sltu a0, a0, a1
1125 ; RV32IF-NEXT:    j .LBB18_9
1126 ; RV32IF-NEXT:  .LBB18_8:
1127 ; RV32IF-NEXT:    snez a0, a3
1128 ; RV32IF-NEXT:  .LBB18_9: # %entry
1129 ; RV32IF-NEXT:    and a2, a2, a4
1130 ; RV32IF-NEXT:    li a5, -1
1131 ; RV32IF-NEXT:    beq a2, a5, .LBB18_11
1132 ; RV32IF-NEXT:  # %bb.10: # %entry
1133 ; RV32IF-NEXT:    slti a0, a4, 0
1134 ; RV32IF-NEXT:    xori a0, a0, 1
1135 ; RV32IF-NEXT:  .LBB18_11: # %entry
1136 ; RV32IF-NEXT:    bnez a0, .LBB18_13
1137 ; RV32IF-NEXT:  # %bb.12: # %entry
1138 ; RV32IF-NEXT:    lui a1, 524288
1139 ; RV32IF-NEXT:  .LBB18_13: # %entry
1140 ; RV32IF-NEXT:    neg a0, a0
1141 ; RV32IF-NEXT:    and a0, a0, a3
1142 ; RV32IF-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1143 ; RV32IF-NEXT:    .cfi_restore ra
1144 ; RV32IF-NEXT:    addi sp, sp, 32
1145 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
1146 ; RV32IF-NEXT:    ret
1148 ; RV64IF-LABEL: stest_f64i64:
1149 ; RV64IF:       # %bb.0: # %entry
1150 ; RV64IF-NEXT:    addi sp, sp, -16
1151 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
1152 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1153 ; RV64IF-NEXT:    .cfi_offset ra, -8
1154 ; RV64IF-NEXT:    call __fixdfti
1155 ; RV64IF-NEXT:    li a2, -1
1156 ; RV64IF-NEXT:    srli a3, a2, 1
1157 ; RV64IF-NEXT:    beqz a1, .LBB18_2
1158 ; RV64IF-NEXT:  # %bb.1: # %entry
1159 ; RV64IF-NEXT:    slti a4, a1, 0
1160 ; RV64IF-NEXT:    j .LBB18_3
1161 ; RV64IF-NEXT:  .LBB18_2:
1162 ; RV64IF-NEXT:    sltu a4, a0, a3
1163 ; RV64IF-NEXT:  .LBB18_3: # %entry
1164 ; RV64IF-NEXT:    neg a5, a4
1165 ; RV64IF-NEXT:    and a5, a5, a1
1166 ; RV64IF-NEXT:    bnez a4, .LBB18_5
1167 ; RV64IF-NEXT:  # %bb.4: # %entry
1168 ; RV64IF-NEXT:    mv a0, a3
1169 ; RV64IF-NEXT:  .LBB18_5: # %entry
1170 ; RV64IF-NEXT:    slli a1, a2, 63
1171 ; RV64IF-NEXT:    beq a5, a2, .LBB18_7
1172 ; RV64IF-NEXT:  # %bb.6: # %entry
1173 ; RV64IF-NEXT:    slti a2, a5, 0
1174 ; RV64IF-NEXT:    xori a2, a2, 1
1175 ; RV64IF-NEXT:    beqz a2, .LBB18_8
1176 ; RV64IF-NEXT:    j .LBB18_9
1177 ; RV64IF-NEXT:  .LBB18_7:
1178 ; RV64IF-NEXT:    sltu a2, a1, a0
1179 ; RV64IF-NEXT:    bnez a2, .LBB18_9
1180 ; RV64IF-NEXT:  .LBB18_8: # %entry
1181 ; RV64IF-NEXT:    mv a0, a1
1182 ; RV64IF-NEXT:  .LBB18_9: # %entry
1183 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1184 ; RV64IF-NEXT:    .cfi_restore ra
1185 ; RV64IF-NEXT:    addi sp, sp, 16
1186 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
1187 ; RV64IF-NEXT:    ret
1189 ; RV32IFD-LABEL: stest_f64i64:
1190 ; RV32IFD:       # %bb.0: # %entry
1191 ; RV32IFD-NEXT:    addi sp, sp, -32
1192 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 32
1193 ; RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1194 ; RV32IFD-NEXT:    .cfi_offset ra, -4
1195 ; RV32IFD-NEXT:    addi a0, sp, 8
1196 ; RV32IFD-NEXT:    call __fixdfti
1197 ; RV32IFD-NEXT:    lw a3, 8(sp)
1198 ; RV32IFD-NEXT:    lw a1, 12(sp)
1199 ; RV32IFD-NEXT:    lw a2, 16(sp)
1200 ; RV32IFD-NEXT:    lw a4, 20(sp)
1201 ; RV32IFD-NEXT:    lui a0, 524288
1202 ; RV32IFD-NEXT:    addi a5, a0, -1
1203 ; RV32IFD-NEXT:    beq a1, a5, .LBB18_2
1204 ; RV32IFD-NEXT:  # %bb.1: # %entry
1205 ; RV32IFD-NEXT:    sltu a6, a1, a5
1206 ; RV32IFD-NEXT:    or a7, a2, a4
1207 ; RV32IFD-NEXT:    bnez a7, .LBB18_3
1208 ; RV32IFD-NEXT:    j .LBB18_4
1209 ; RV32IFD-NEXT:  .LBB18_2:
1210 ; RV32IFD-NEXT:    sltiu a6, a3, -1
1211 ; RV32IFD-NEXT:    or a7, a2, a4
1212 ; RV32IFD-NEXT:    beqz a7, .LBB18_4
1213 ; RV32IFD-NEXT:  .LBB18_3: # %entry
1214 ; RV32IFD-NEXT:    slti a6, a4, 0
1215 ; RV32IFD-NEXT:  .LBB18_4: # %entry
1216 ; RV32IFD-NEXT:    addi a7, a6, -1
1217 ; RV32IFD-NEXT:    neg t0, a6
1218 ; RV32IFD-NEXT:    bnez a6, .LBB18_6
1219 ; RV32IFD-NEXT:  # %bb.5: # %entry
1220 ; RV32IFD-NEXT:    mv a1, a5
1221 ; RV32IFD-NEXT:  .LBB18_6: # %entry
1222 ; RV32IFD-NEXT:    or a3, a7, a3
1223 ; RV32IFD-NEXT:    and a4, t0, a4
1224 ; RV32IFD-NEXT:    and a2, t0, a2
1225 ; RV32IFD-NEXT:    beq a1, a0, .LBB18_8
1226 ; RV32IFD-NEXT:  # %bb.7: # %entry
1227 ; RV32IFD-NEXT:    sltu a0, a0, a1
1228 ; RV32IFD-NEXT:    j .LBB18_9
1229 ; RV32IFD-NEXT:  .LBB18_8:
1230 ; RV32IFD-NEXT:    snez a0, a3
1231 ; RV32IFD-NEXT:  .LBB18_9: # %entry
1232 ; RV32IFD-NEXT:    and a2, a2, a4
1233 ; RV32IFD-NEXT:    li a5, -1
1234 ; RV32IFD-NEXT:    beq a2, a5, .LBB18_11
1235 ; RV32IFD-NEXT:  # %bb.10: # %entry
1236 ; RV32IFD-NEXT:    slti a0, a4, 0
1237 ; RV32IFD-NEXT:    xori a0, a0, 1
1238 ; RV32IFD-NEXT:  .LBB18_11: # %entry
1239 ; RV32IFD-NEXT:    bnez a0, .LBB18_13
1240 ; RV32IFD-NEXT:  # %bb.12: # %entry
1241 ; RV32IFD-NEXT:    lui a1, 524288
1242 ; RV32IFD-NEXT:  .LBB18_13: # %entry
1243 ; RV32IFD-NEXT:    neg a0, a0
1244 ; RV32IFD-NEXT:    and a0, a0, a3
1245 ; RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1246 ; RV32IFD-NEXT:    .cfi_restore ra
1247 ; RV32IFD-NEXT:    addi sp, sp, 32
1248 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 0
1249 ; RV32IFD-NEXT:    ret
1251 ; RV64IFD-LABEL: stest_f64i64:
1252 ; RV64IFD:       # %bb.0: # %entry
1253 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
1254 ; RV64IFD-NEXT:    feq.d a1, fa0, fa0
1255 ; RV64IFD-NEXT:    seqz a1, a1
1256 ; RV64IFD-NEXT:    addi a1, a1, -1
1257 ; RV64IFD-NEXT:    and a0, a1, a0
1258 ; RV64IFD-NEXT:    ret
1259 entry:
1260   %conv = fptosi double %x to i128
1261   %0 = icmp slt i128 %conv, 9223372036854775807
1262   %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807
1263   %1 = icmp sgt i128 %spec.store.select, -9223372036854775808
1264   %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808
1265   %conv6 = trunc i128 %spec.store.select7 to i64
1266   ret i64 %conv6
1269 define i64 @utest_f64i64(double %x) {
1270 ; RV32IF-LABEL: utest_f64i64:
1271 ; RV32IF:       # %bb.0: # %entry
1272 ; RV32IF-NEXT:    addi sp, sp, -32
1273 ; RV32IF-NEXT:    .cfi_def_cfa_offset 32
1274 ; RV32IF-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1275 ; RV32IF-NEXT:    .cfi_offset ra, -4
1276 ; RV32IF-NEXT:    mv a2, a1
1277 ; RV32IF-NEXT:    mv a1, a0
1278 ; RV32IF-NEXT:    addi a0, sp, 8
1279 ; RV32IF-NEXT:    call __fixunsdfti
1280 ; RV32IF-NEXT:    lw a0, 16(sp)
1281 ; RV32IF-NEXT:    lw a1, 20(sp)
1282 ; RV32IF-NEXT:    lw a2, 12(sp)
1283 ; RV32IF-NEXT:    lw a3, 8(sp)
1284 ; RV32IF-NEXT:    or a4, a1, a0
1285 ; RV32IF-NEXT:    xori a0, a0, 1
1286 ; RV32IF-NEXT:    seqz a4, a4
1287 ; RV32IF-NEXT:    or a0, a0, a1
1288 ; RV32IF-NEXT:    seqz a0, a0
1289 ; RV32IF-NEXT:    addi a0, a0, -1
1290 ; RV32IF-NEXT:    and a0, a0, a4
1291 ; RV32IF-NEXT:    neg a1, a0
1292 ; RV32IF-NEXT:    and a0, a1, a3
1293 ; RV32IF-NEXT:    and a1, a1, a2
1294 ; RV32IF-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1295 ; RV32IF-NEXT:    .cfi_restore ra
1296 ; RV32IF-NEXT:    addi sp, sp, 32
1297 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
1298 ; RV32IF-NEXT:    ret
1300 ; RV64-LABEL: utest_f64i64:
1301 ; RV64:       # %bb.0: # %entry
1302 ; RV64-NEXT:    addi sp, sp, -16
1303 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1304 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1305 ; RV64-NEXT:    .cfi_offset ra, -8
1306 ; RV64-NEXT:    call __fixunsdfti
1307 ; RV64-NEXT:    snez a1, a1
1308 ; RV64-NEXT:    addi a1, a1, -1
1309 ; RV64-NEXT:    and a0, a1, a0
1310 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1311 ; RV64-NEXT:    .cfi_restore ra
1312 ; RV64-NEXT:    addi sp, sp, 16
1313 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1314 ; RV64-NEXT:    ret
1316 ; RV32IFD-LABEL: utest_f64i64:
1317 ; RV32IFD:       # %bb.0: # %entry
1318 ; RV32IFD-NEXT:    addi sp, sp, -32
1319 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 32
1320 ; RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1321 ; RV32IFD-NEXT:    .cfi_offset ra, -4
1322 ; RV32IFD-NEXT:    addi a0, sp, 8
1323 ; RV32IFD-NEXT:    call __fixunsdfti
1324 ; RV32IFD-NEXT:    lw a0, 16(sp)
1325 ; RV32IFD-NEXT:    lw a1, 20(sp)
1326 ; RV32IFD-NEXT:    lw a2, 12(sp)
1327 ; RV32IFD-NEXT:    lw a3, 8(sp)
1328 ; RV32IFD-NEXT:    or a4, a1, a0
1329 ; RV32IFD-NEXT:    xori a0, a0, 1
1330 ; RV32IFD-NEXT:    seqz a4, a4
1331 ; RV32IFD-NEXT:    or a0, a0, a1
1332 ; RV32IFD-NEXT:    seqz a0, a0
1333 ; RV32IFD-NEXT:    addi a0, a0, -1
1334 ; RV32IFD-NEXT:    and a0, a0, a4
1335 ; RV32IFD-NEXT:    neg a1, a0
1336 ; RV32IFD-NEXT:    and a0, a1, a3
1337 ; RV32IFD-NEXT:    and a1, a1, a2
1338 ; RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1339 ; RV32IFD-NEXT:    .cfi_restore ra
1340 ; RV32IFD-NEXT:    addi sp, sp, 32
1341 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 0
1342 ; RV32IFD-NEXT:    ret
1343 entry:
1344   %conv = fptoui double %x to i128
1345   %0 = icmp ult i128 %conv, 18446744073709551616
1346   %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616
1347   %conv6 = trunc i128 %spec.store.select to i64
1348   ret i64 %conv6
1351 define i64 @ustest_f64i64(double %x) {
1352 ; RV32IF-LABEL: ustest_f64i64:
1353 ; RV32IF:       # %bb.0: # %entry
1354 ; RV32IF-NEXT:    addi sp, sp, -32
1355 ; RV32IF-NEXT:    .cfi_def_cfa_offset 32
1356 ; RV32IF-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1357 ; RV32IF-NEXT:    .cfi_offset ra, -4
1358 ; RV32IF-NEXT:    mv a2, a1
1359 ; RV32IF-NEXT:    mv a1, a0
1360 ; RV32IF-NEXT:    addi a0, sp, 8
1361 ; RV32IF-NEXT:    call __fixdfti
1362 ; RV32IF-NEXT:    lw a1, 20(sp)
1363 ; RV32IF-NEXT:    lw a0, 16(sp)
1364 ; RV32IF-NEXT:    beqz a1, .LBB20_2
1365 ; RV32IF-NEXT:  # %bb.1: # %entry
1366 ; RV32IF-NEXT:    slti a2, a1, 0
1367 ; RV32IF-NEXT:    j .LBB20_3
1368 ; RV32IF-NEXT:  .LBB20_2:
1369 ; RV32IF-NEXT:    seqz a2, a0
1370 ; RV32IF-NEXT:  .LBB20_3: # %entry
1371 ; RV32IF-NEXT:    xori a3, a0, 1
1372 ; RV32IF-NEXT:    or a3, a3, a1
1373 ; RV32IF-NEXT:    seqz a3, a3
1374 ; RV32IF-NEXT:    addi a3, a3, -1
1375 ; RV32IF-NEXT:    and a3, a3, a2
1376 ; RV32IF-NEXT:    neg a2, a3
1377 ; RV32IF-NEXT:    bnez a3, .LBB20_5
1378 ; RV32IF-NEXT:  # %bb.4: # %entry
1379 ; RV32IF-NEXT:    li a0, 1
1380 ; RV32IF-NEXT:  .LBB20_5: # %entry
1381 ; RV32IF-NEXT:    lw a3, 8(sp)
1382 ; RV32IF-NEXT:    lw a4, 12(sp)
1383 ; RV32IF-NEXT:    and a5, a2, a1
1384 ; RV32IF-NEXT:    beqz a5, .LBB20_7
1385 ; RV32IF-NEXT:  # %bb.6: # %entry
1386 ; RV32IF-NEXT:    sgtz a1, a5
1387 ; RV32IF-NEXT:    j .LBB20_8
1388 ; RV32IF-NEXT:  .LBB20_7:
1389 ; RV32IF-NEXT:    snez a1, a0
1390 ; RV32IF-NEXT:  .LBB20_8: # %entry
1391 ; RV32IF-NEXT:    and a4, a2, a4
1392 ; RV32IF-NEXT:    or a0, a0, a5
1393 ; RV32IF-NEXT:    and a2, a2, a3
1394 ; RV32IF-NEXT:    bnez a0, .LBB20_10
1395 ; RV32IF-NEXT:  # %bb.9:
1396 ; RV32IF-NEXT:    or a0, a2, a4
1397 ; RV32IF-NEXT:    snez a1, a0
1398 ; RV32IF-NEXT:  .LBB20_10: # %entry
1399 ; RV32IF-NEXT:    neg a1, a1
1400 ; RV32IF-NEXT:    and a0, a1, a2
1401 ; RV32IF-NEXT:    and a1, a1, a4
1402 ; RV32IF-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1403 ; RV32IF-NEXT:    .cfi_restore ra
1404 ; RV32IF-NEXT:    addi sp, sp, 32
1405 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
1406 ; RV32IF-NEXT:    ret
1408 ; RV64-LABEL: ustest_f64i64:
1409 ; RV64:       # %bb.0: # %entry
1410 ; RV64-NEXT:    addi sp, sp, -16
1411 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1412 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1413 ; RV64-NEXT:    .cfi_offset ra, -8
1414 ; RV64-NEXT:    call __fixdfti
1415 ; RV64-NEXT:    slti a2, a1, 1
1416 ; RV64-NEXT:    blez a1, .LBB20_2
1417 ; RV64-NEXT:  # %bb.1: # %entry
1418 ; RV64-NEXT:    li a1, 1
1419 ; RV64-NEXT:  .LBB20_2: # %entry
1420 ; RV64-NEXT:    neg a2, a2
1421 ; RV64-NEXT:    and a0, a2, a0
1422 ; RV64-NEXT:    beqz a1, .LBB20_4
1423 ; RV64-NEXT:  # %bb.3: # %entry
1424 ; RV64-NEXT:    sgtz a1, a1
1425 ; RV64-NEXT:    j .LBB20_5
1426 ; RV64-NEXT:  .LBB20_4:
1427 ; RV64-NEXT:    snez a1, a0
1428 ; RV64-NEXT:  .LBB20_5: # %entry
1429 ; RV64-NEXT:    neg a1, a1
1430 ; RV64-NEXT:    and a0, a1, a0
1431 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1432 ; RV64-NEXT:    .cfi_restore ra
1433 ; RV64-NEXT:    addi sp, sp, 16
1434 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1435 ; RV64-NEXT:    ret
1437 ; RV32IFD-LABEL: ustest_f64i64:
1438 ; RV32IFD:       # %bb.0: # %entry
1439 ; RV32IFD-NEXT:    addi sp, sp, -32
1440 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 32
1441 ; RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1442 ; RV32IFD-NEXT:    .cfi_offset ra, -4
1443 ; RV32IFD-NEXT:    addi a0, sp, 8
1444 ; RV32IFD-NEXT:    call __fixdfti
1445 ; RV32IFD-NEXT:    lw a1, 20(sp)
1446 ; RV32IFD-NEXT:    lw a0, 16(sp)
1447 ; RV32IFD-NEXT:    beqz a1, .LBB20_2
1448 ; RV32IFD-NEXT:  # %bb.1: # %entry
1449 ; RV32IFD-NEXT:    slti a2, a1, 0
1450 ; RV32IFD-NEXT:    j .LBB20_3
1451 ; RV32IFD-NEXT:  .LBB20_2:
1452 ; RV32IFD-NEXT:    seqz a2, a0
1453 ; RV32IFD-NEXT:  .LBB20_3: # %entry
1454 ; RV32IFD-NEXT:    xori a3, a0, 1
1455 ; RV32IFD-NEXT:    or a3, a3, a1
1456 ; RV32IFD-NEXT:    seqz a3, a3
1457 ; RV32IFD-NEXT:    addi a3, a3, -1
1458 ; RV32IFD-NEXT:    and a3, a3, a2
1459 ; RV32IFD-NEXT:    neg a2, a3
1460 ; RV32IFD-NEXT:    bnez a3, .LBB20_5
1461 ; RV32IFD-NEXT:  # %bb.4: # %entry
1462 ; RV32IFD-NEXT:    li a0, 1
1463 ; RV32IFD-NEXT:  .LBB20_5: # %entry
1464 ; RV32IFD-NEXT:    lw a3, 8(sp)
1465 ; RV32IFD-NEXT:    lw a4, 12(sp)
1466 ; RV32IFD-NEXT:    and a5, a2, a1
1467 ; RV32IFD-NEXT:    beqz a5, .LBB20_7
1468 ; RV32IFD-NEXT:  # %bb.6: # %entry
1469 ; RV32IFD-NEXT:    sgtz a1, a5
1470 ; RV32IFD-NEXT:    j .LBB20_8
1471 ; RV32IFD-NEXT:  .LBB20_7:
1472 ; RV32IFD-NEXT:    snez a1, a0
1473 ; RV32IFD-NEXT:  .LBB20_8: # %entry
1474 ; RV32IFD-NEXT:    and a4, a2, a4
1475 ; RV32IFD-NEXT:    or a0, a0, a5
1476 ; RV32IFD-NEXT:    and a2, a2, a3
1477 ; RV32IFD-NEXT:    bnez a0, .LBB20_10
1478 ; RV32IFD-NEXT:  # %bb.9:
1479 ; RV32IFD-NEXT:    or a0, a2, a4
1480 ; RV32IFD-NEXT:    snez a1, a0
1481 ; RV32IFD-NEXT:  .LBB20_10: # %entry
1482 ; RV32IFD-NEXT:    neg a1, a1
1483 ; RV32IFD-NEXT:    and a0, a1, a2
1484 ; RV32IFD-NEXT:    and a1, a1, a4
1485 ; RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1486 ; RV32IFD-NEXT:    .cfi_restore ra
1487 ; RV32IFD-NEXT:    addi sp, sp, 32
1488 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 0
1489 ; RV32IFD-NEXT:    ret
1490 entry:
1491   %conv = fptosi double %x to i128
1492   %0 = icmp slt i128 %conv, 18446744073709551616
1493   %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616
1494   %1 = icmp sgt i128 %spec.store.select, 0
1495   %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0
1496   %conv6 = trunc i128 %spec.store.select7 to i64
1497   ret i64 %conv6
1500 define i64 @stest_f32i64(float %x) {
1501 ; RV32-LABEL: stest_f32i64:
1502 ; RV32:       # %bb.0: # %entry
1503 ; RV32-NEXT:    addi sp, sp, -32
1504 ; RV32-NEXT:    .cfi_def_cfa_offset 32
1505 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1506 ; RV32-NEXT:    .cfi_offset ra, -4
1507 ; RV32-NEXT:    addi a0, sp, 8
1508 ; RV32-NEXT:    call __fixsfti
1509 ; RV32-NEXT:    lw a3, 8(sp)
1510 ; RV32-NEXT:    lw a1, 12(sp)
1511 ; RV32-NEXT:    lw a2, 16(sp)
1512 ; RV32-NEXT:    lw a4, 20(sp)
1513 ; RV32-NEXT:    lui a0, 524288
1514 ; RV32-NEXT:    addi a5, a0, -1
1515 ; RV32-NEXT:    beq a1, a5, .LBB21_2
1516 ; RV32-NEXT:  # %bb.1: # %entry
1517 ; RV32-NEXT:    sltu a6, a1, a5
1518 ; RV32-NEXT:    or a7, a2, a4
1519 ; RV32-NEXT:    bnez a7, .LBB21_3
1520 ; RV32-NEXT:    j .LBB21_4
1521 ; RV32-NEXT:  .LBB21_2:
1522 ; RV32-NEXT:    sltiu a6, a3, -1
1523 ; RV32-NEXT:    or a7, a2, a4
1524 ; RV32-NEXT:    beqz a7, .LBB21_4
1525 ; RV32-NEXT:  .LBB21_3: # %entry
1526 ; RV32-NEXT:    slti a6, a4, 0
1527 ; RV32-NEXT:  .LBB21_4: # %entry
1528 ; RV32-NEXT:    addi a7, a6, -1
1529 ; RV32-NEXT:    neg t0, a6
1530 ; RV32-NEXT:    bnez a6, .LBB21_6
1531 ; RV32-NEXT:  # %bb.5: # %entry
1532 ; RV32-NEXT:    mv a1, a5
1533 ; RV32-NEXT:  .LBB21_6: # %entry
1534 ; RV32-NEXT:    or a3, a7, a3
1535 ; RV32-NEXT:    and a4, t0, a4
1536 ; RV32-NEXT:    and a2, t0, a2
1537 ; RV32-NEXT:    beq a1, a0, .LBB21_8
1538 ; RV32-NEXT:  # %bb.7: # %entry
1539 ; RV32-NEXT:    sltu a0, a0, a1
1540 ; RV32-NEXT:    j .LBB21_9
1541 ; RV32-NEXT:  .LBB21_8:
1542 ; RV32-NEXT:    snez a0, a3
1543 ; RV32-NEXT:  .LBB21_9: # %entry
1544 ; RV32-NEXT:    and a2, a2, a4
1545 ; RV32-NEXT:    li a5, -1
1546 ; RV32-NEXT:    beq a2, a5, .LBB21_11
1547 ; RV32-NEXT:  # %bb.10: # %entry
1548 ; RV32-NEXT:    slti a0, a4, 0
1549 ; RV32-NEXT:    xori a0, a0, 1
1550 ; RV32-NEXT:  .LBB21_11: # %entry
1551 ; RV32-NEXT:    bnez a0, .LBB21_13
1552 ; RV32-NEXT:  # %bb.12: # %entry
1553 ; RV32-NEXT:    lui a1, 524288
1554 ; RV32-NEXT:  .LBB21_13: # %entry
1555 ; RV32-NEXT:    neg a0, a0
1556 ; RV32-NEXT:    and a0, a0, a3
1557 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1558 ; RV32-NEXT:    .cfi_restore ra
1559 ; RV32-NEXT:    addi sp, sp, 32
1560 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1561 ; RV32-NEXT:    ret
1563 ; RV64-LABEL: stest_f32i64:
1564 ; RV64:       # %bb.0: # %entry
1565 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
1566 ; RV64-NEXT:    feq.s a1, fa0, fa0
1567 ; RV64-NEXT:    seqz a1, a1
1568 ; RV64-NEXT:    addi a1, a1, -1
1569 ; RV64-NEXT:    and a0, a1, a0
1570 ; RV64-NEXT:    ret
1571 entry:
1572   %conv = fptosi float %x to i128
1573   %0 = icmp slt i128 %conv, 9223372036854775807
1574   %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807
1575   %1 = icmp sgt i128 %spec.store.select, -9223372036854775808
1576   %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808
1577   %conv6 = trunc i128 %spec.store.select7 to i64
1578   ret i64 %conv6
1581 define i64 @utest_f32i64(float %x) {
1582 ; RV32-LABEL: utest_f32i64:
1583 ; RV32:       # %bb.0: # %entry
1584 ; RV32-NEXT:    addi sp, sp, -32
1585 ; RV32-NEXT:    .cfi_def_cfa_offset 32
1586 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1587 ; RV32-NEXT:    .cfi_offset ra, -4
1588 ; RV32-NEXT:    addi a0, sp, 8
1589 ; RV32-NEXT:    call __fixunssfti
1590 ; RV32-NEXT:    lw a0, 16(sp)
1591 ; RV32-NEXT:    lw a1, 20(sp)
1592 ; RV32-NEXT:    lw a2, 12(sp)
1593 ; RV32-NEXT:    lw a3, 8(sp)
1594 ; RV32-NEXT:    or a4, a1, a0
1595 ; RV32-NEXT:    xori a0, a0, 1
1596 ; RV32-NEXT:    seqz a4, a4
1597 ; RV32-NEXT:    or a0, a0, a1
1598 ; RV32-NEXT:    seqz a0, a0
1599 ; RV32-NEXT:    addi a0, a0, -1
1600 ; RV32-NEXT:    and a0, a0, a4
1601 ; RV32-NEXT:    neg a1, a0
1602 ; RV32-NEXT:    and a0, a1, a3
1603 ; RV32-NEXT:    and a1, a1, a2
1604 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1605 ; RV32-NEXT:    .cfi_restore ra
1606 ; RV32-NEXT:    addi sp, sp, 32
1607 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1608 ; RV32-NEXT:    ret
1610 ; RV64-LABEL: utest_f32i64:
1611 ; RV64:       # %bb.0: # %entry
1612 ; RV64-NEXT:    addi sp, sp, -16
1613 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1614 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1615 ; RV64-NEXT:    .cfi_offset ra, -8
1616 ; RV64-NEXT:    call __fixunssfti
1617 ; RV64-NEXT:    snez a1, a1
1618 ; RV64-NEXT:    addi a1, a1, -1
1619 ; RV64-NEXT:    and a0, a1, a0
1620 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1621 ; RV64-NEXT:    .cfi_restore ra
1622 ; RV64-NEXT:    addi sp, sp, 16
1623 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1624 ; RV64-NEXT:    ret
1625 entry:
1626   %conv = fptoui float %x to i128
1627   %0 = icmp ult i128 %conv, 18446744073709551616
1628   %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616
1629   %conv6 = trunc i128 %spec.store.select to i64
1630   ret i64 %conv6
1633 define i64 @ustest_f32i64(float %x) {
1634 ; RV32-LABEL: ustest_f32i64:
1635 ; RV32:       # %bb.0: # %entry
1636 ; RV32-NEXT:    addi sp, sp, -32
1637 ; RV32-NEXT:    .cfi_def_cfa_offset 32
1638 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1639 ; RV32-NEXT:    .cfi_offset ra, -4
1640 ; RV32-NEXT:    addi a0, sp, 8
1641 ; RV32-NEXT:    call __fixsfti
1642 ; RV32-NEXT:    lw a1, 20(sp)
1643 ; RV32-NEXT:    lw a0, 16(sp)
1644 ; RV32-NEXT:    beqz a1, .LBB23_2
1645 ; RV32-NEXT:  # %bb.1: # %entry
1646 ; RV32-NEXT:    slti a2, a1, 0
1647 ; RV32-NEXT:    j .LBB23_3
1648 ; RV32-NEXT:  .LBB23_2:
1649 ; RV32-NEXT:    seqz a2, a0
1650 ; RV32-NEXT:  .LBB23_3: # %entry
1651 ; RV32-NEXT:    xori a3, a0, 1
1652 ; RV32-NEXT:    or a3, a3, a1
1653 ; RV32-NEXT:    seqz a3, a3
1654 ; RV32-NEXT:    addi a3, a3, -1
1655 ; RV32-NEXT:    and a3, a3, a2
1656 ; RV32-NEXT:    neg a2, a3
1657 ; RV32-NEXT:    bnez a3, .LBB23_5
1658 ; RV32-NEXT:  # %bb.4: # %entry
1659 ; RV32-NEXT:    li a0, 1
1660 ; RV32-NEXT:  .LBB23_5: # %entry
1661 ; RV32-NEXT:    lw a3, 8(sp)
1662 ; RV32-NEXT:    lw a4, 12(sp)
1663 ; RV32-NEXT:    and a5, a2, a1
1664 ; RV32-NEXT:    beqz a5, .LBB23_7
1665 ; RV32-NEXT:  # %bb.6: # %entry
1666 ; RV32-NEXT:    sgtz a1, a5
1667 ; RV32-NEXT:    j .LBB23_8
1668 ; RV32-NEXT:  .LBB23_7:
1669 ; RV32-NEXT:    snez a1, a0
1670 ; RV32-NEXT:  .LBB23_8: # %entry
1671 ; RV32-NEXT:    and a4, a2, a4
1672 ; RV32-NEXT:    or a0, a0, a5
1673 ; RV32-NEXT:    and a2, a2, a3
1674 ; RV32-NEXT:    bnez a0, .LBB23_10
1675 ; RV32-NEXT:  # %bb.9:
1676 ; RV32-NEXT:    or a0, a2, a4
1677 ; RV32-NEXT:    snez a1, a0
1678 ; RV32-NEXT:  .LBB23_10: # %entry
1679 ; RV32-NEXT:    neg a1, a1
1680 ; RV32-NEXT:    and a0, a1, a2
1681 ; RV32-NEXT:    and a1, a1, a4
1682 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1683 ; RV32-NEXT:    .cfi_restore ra
1684 ; RV32-NEXT:    addi sp, sp, 32
1685 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1686 ; RV32-NEXT:    ret
1688 ; RV64-LABEL: ustest_f32i64:
1689 ; RV64:       # %bb.0: # %entry
1690 ; RV64-NEXT:    addi sp, sp, -16
1691 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1692 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1693 ; RV64-NEXT:    .cfi_offset ra, -8
1694 ; RV64-NEXT:    call __fixsfti
1695 ; RV64-NEXT:    slti a2, a1, 1
1696 ; RV64-NEXT:    blez a1, .LBB23_2
1697 ; RV64-NEXT:  # %bb.1: # %entry
1698 ; RV64-NEXT:    li a1, 1
1699 ; RV64-NEXT:  .LBB23_2: # %entry
1700 ; RV64-NEXT:    neg a2, a2
1701 ; RV64-NEXT:    and a0, a2, a0
1702 ; RV64-NEXT:    beqz a1, .LBB23_4
1703 ; RV64-NEXT:  # %bb.3: # %entry
1704 ; RV64-NEXT:    sgtz a1, a1
1705 ; RV64-NEXT:    j .LBB23_5
1706 ; RV64-NEXT:  .LBB23_4:
1707 ; RV64-NEXT:    snez a1, a0
1708 ; RV64-NEXT:  .LBB23_5: # %entry
1709 ; RV64-NEXT:    neg a1, a1
1710 ; RV64-NEXT:    and a0, a1, a0
1711 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1712 ; RV64-NEXT:    .cfi_restore ra
1713 ; RV64-NEXT:    addi sp, sp, 16
1714 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1715 ; RV64-NEXT:    ret
1716 entry:
1717   %conv = fptosi float %x to i128
1718   %0 = icmp slt i128 %conv, 18446744073709551616
1719   %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616
1720   %1 = icmp sgt i128 %spec.store.select, 0
1721   %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0
1722   %conv6 = trunc i128 %spec.store.select7 to i64
1723   ret i64 %conv6
1726 define i64 @stest_f16i64(half %x) {
1727 ; RV32-LABEL: stest_f16i64:
1728 ; RV32:       # %bb.0: # %entry
1729 ; RV32-NEXT:    addi sp, sp, -32
1730 ; RV32-NEXT:    .cfi_def_cfa_offset 32
1731 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1732 ; RV32-NEXT:    .cfi_offset ra, -4
1733 ; RV32-NEXT:    call __extendhfsf2
1734 ; RV32-NEXT:    addi a0, sp, 8
1735 ; RV32-NEXT:    call __fixsfti
1736 ; RV32-NEXT:    lw a3, 8(sp)
1737 ; RV32-NEXT:    lw a1, 12(sp)
1738 ; RV32-NEXT:    lw a2, 16(sp)
1739 ; RV32-NEXT:    lw a4, 20(sp)
1740 ; RV32-NEXT:    lui a0, 524288
1741 ; RV32-NEXT:    addi a5, a0, -1
1742 ; RV32-NEXT:    beq a1, a5, .LBB24_2
1743 ; RV32-NEXT:  # %bb.1: # %entry
1744 ; RV32-NEXT:    sltu a6, a1, a5
1745 ; RV32-NEXT:    or a7, a2, a4
1746 ; RV32-NEXT:    bnez a7, .LBB24_3
1747 ; RV32-NEXT:    j .LBB24_4
1748 ; RV32-NEXT:  .LBB24_2:
1749 ; RV32-NEXT:    sltiu a6, a3, -1
1750 ; RV32-NEXT:    or a7, a2, a4
1751 ; RV32-NEXT:    beqz a7, .LBB24_4
1752 ; RV32-NEXT:  .LBB24_3: # %entry
1753 ; RV32-NEXT:    slti a6, a4, 0
1754 ; RV32-NEXT:  .LBB24_4: # %entry
1755 ; RV32-NEXT:    addi a7, a6, -1
1756 ; RV32-NEXT:    neg t0, a6
1757 ; RV32-NEXT:    bnez a6, .LBB24_6
1758 ; RV32-NEXT:  # %bb.5: # %entry
1759 ; RV32-NEXT:    mv a1, a5
1760 ; RV32-NEXT:  .LBB24_6: # %entry
1761 ; RV32-NEXT:    or a3, a7, a3
1762 ; RV32-NEXT:    and a4, t0, a4
1763 ; RV32-NEXT:    and a2, t0, a2
1764 ; RV32-NEXT:    beq a1, a0, .LBB24_8
1765 ; RV32-NEXT:  # %bb.7: # %entry
1766 ; RV32-NEXT:    sltu a0, a0, a1
1767 ; RV32-NEXT:    j .LBB24_9
1768 ; RV32-NEXT:  .LBB24_8:
1769 ; RV32-NEXT:    snez a0, a3
1770 ; RV32-NEXT:  .LBB24_9: # %entry
1771 ; RV32-NEXT:    and a2, a2, a4
1772 ; RV32-NEXT:    li a5, -1
1773 ; RV32-NEXT:    beq a2, a5, .LBB24_11
1774 ; RV32-NEXT:  # %bb.10: # %entry
1775 ; RV32-NEXT:    slti a0, a4, 0
1776 ; RV32-NEXT:    xori a0, a0, 1
1777 ; RV32-NEXT:  .LBB24_11: # %entry
1778 ; RV32-NEXT:    bnez a0, .LBB24_13
1779 ; RV32-NEXT:  # %bb.12: # %entry
1780 ; RV32-NEXT:    lui a1, 524288
1781 ; RV32-NEXT:  .LBB24_13: # %entry
1782 ; RV32-NEXT:    neg a0, a0
1783 ; RV32-NEXT:    and a0, a0, a3
1784 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1785 ; RV32-NEXT:    .cfi_restore ra
1786 ; RV32-NEXT:    addi sp, sp, 32
1787 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1788 ; RV32-NEXT:    ret
1790 ; RV64-LABEL: stest_f16i64:
1791 ; RV64:       # %bb.0: # %entry
1792 ; RV64-NEXT:    addi sp, sp, -16
1793 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1794 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1795 ; RV64-NEXT:    .cfi_offset ra, -8
1796 ; RV64-NEXT:    call __extendhfsf2
1797 ; RV64-NEXT:    call __fixsfti
1798 ; RV64-NEXT:    li a2, -1
1799 ; RV64-NEXT:    srli a3, a2, 1
1800 ; RV64-NEXT:    beqz a1, .LBB24_2
1801 ; RV64-NEXT:  # %bb.1: # %entry
1802 ; RV64-NEXT:    slti a4, a1, 0
1803 ; RV64-NEXT:    j .LBB24_3
1804 ; RV64-NEXT:  .LBB24_2:
1805 ; RV64-NEXT:    sltu a4, a0, a3
1806 ; RV64-NEXT:  .LBB24_3: # %entry
1807 ; RV64-NEXT:    neg a5, a4
1808 ; RV64-NEXT:    and a5, a5, a1
1809 ; RV64-NEXT:    bnez a4, .LBB24_5
1810 ; RV64-NEXT:  # %bb.4: # %entry
1811 ; RV64-NEXT:    mv a0, a3
1812 ; RV64-NEXT:  .LBB24_5: # %entry
1813 ; RV64-NEXT:    slli a1, a2, 63
1814 ; RV64-NEXT:    beq a5, a2, .LBB24_7
1815 ; RV64-NEXT:  # %bb.6: # %entry
1816 ; RV64-NEXT:    slti a2, a5, 0
1817 ; RV64-NEXT:    xori a2, a2, 1
1818 ; RV64-NEXT:    beqz a2, .LBB24_8
1819 ; RV64-NEXT:    j .LBB24_9
1820 ; RV64-NEXT:  .LBB24_7:
1821 ; RV64-NEXT:    sltu a2, a1, a0
1822 ; RV64-NEXT:    bnez a2, .LBB24_9
1823 ; RV64-NEXT:  .LBB24_8: # %entry
1824 ; RV64-NEXT:    mv a0, a1
1825 ; RV64-NEXT:  .LBB24_9: # %entry
1826 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1827 ; RV64-NEXT:    .cfi_restore ra
1828 ; RV64-NEXT:    addi sp, sp, 16
1829 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1830 ; RV64-NEXT:    ret
1831 entry:
1832   %conv = fptosi half %x to i128
1833   %0 = icmp slt i128 %conv, 9223372036854775807
1834   %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807
1835   %1 = icmp sgt i128 %spec.store.select, -9223372036854775808
1836   %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808
1837   %conv6 = trunc i128 %spec.store.select7 to i64
1838   ret i64 %conv6
1841 define i64 @utesth_f16i64(half %x) {
1842 ; RV32-LABEL: utesth_f16i64:
1843 ; RV32:       # %bb.0: # %entry
1844 ; RV32-NEXT:    addi sp, sp, -32
1845 ; RV32-NEXT:    .cfi_def_cfa_offset 32
1846 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1847 ; RV32-NEXT:    .cfi_offset ra, -4
1848 ; RV32-NEXT:    call __extendhfsf2
1849 ; RV32-NEXT:    addi a0, sp, 8
1850 ; RV32-NEXT:    call __fixunssfti
1851 ; RV32-NEXT:    lw a0, 16(sp)
1852 ; RV32-NEXT:    lw a1, 20(sp)
1853 ; RV32-NEXT:    lw a2, 12(sp)
1854 ; RV32-NEXT:    lw a3, 8(sp)
1855 ; RV32-NEXT:    or a4, a1, a0
1856 ; RV32-NEXT:    xori a0, a0, 1
1857 ; RV32-NEXT:    seqz a4, a4
1858 ; RV32-NEXT:    or a0, a0, a1
1859 ; RV32-NEXT:    seqz a0, a0
1860 ; RV32-NEXT:    addi a0, a0, -1
1861 ; RV32-NEXT:    and a0, a0, a4
1862 ; RV32-NEXT:    neg a1, a0
1863 ; RV32-NEXT:    and a0, a1, a3
1864 ; RV32-NEXT:    and a1, a1, a2
1865 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1866 ; RV32-NEXT:    .cfi_restore ra
1867 ; RV32-NEXT:    addi sp, sp, 32
1868 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1869 ; RV32-NEXT:    ret
1871 ; RV64-LABEL: utesth_f16i64:
1872 ; RV64:       # %bb.0: # %entry
1873 ; RV64-NEXT:    addi sp, sp, -16
1874 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1875 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1876 ; RV64-NEXT:    .cfi_offset ra, -8
1877 ; RV64-NEXT:    call __extendhfsf2
1878 ; RV64-NEXT:    call __fixunssfti
1879 ; RV64-NEXT:    snez a1, a1
1880 ; RV64-NEXT:    addi a1, a1, -1
1881 ; RV64-NEXT:    and a0, a1, a0
1882 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1883 ; RV64-NEXT:    .cfi_restore ra
1884 ; RV64-NEXT:    addi sp, sp, 16
1885 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1886 ; RV64-NEXT:    ret
1887 entry:
1888   %conv = fptoui half %x to i128
1889   %0 = icmp ult i128 %conv, 18446744073709551616
1890   %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616
1891   %conv6 = trunc i128 %spec.store.select to i64
1892   ret i64 %conv6
1895 define i64 @ustest_f16i64(half %x) {
1896 ; RV32-LABEL: ustest_f16i64:
1897 ; RV32:       # %bb.0: # %entry
1898 ; RV32-NEXT:    addi sp, sp, -32
1899 ; RV32-NEXT:    .cfi_def_cfa_offset 32
1900 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1901 ; RV32-NEXT:    .cfi_offset ra, -4
1902 ; RV32-NEXT:    call __extendhfsf2
1903 ; RV32-NEXT:    addi a0, sp, 8
1904 ; RV32-NEXT:    call __fixsfti
1905 ; RV32-NEXT:    lw a1, 20(sp)
1906 ; RV32-NEXT:    lw a0, 16(sp)
1907 ; RV32-NEXT:    beqz a1, .LBB26_2
1908 ; RV32-NEXT:  # %bb.1: # %entry
1909 ; RV32-NEXT:    slti a2, a1, 0
1910 ; RV32-NEXT:    j .LBB26_3
1911 ; RV32-NEXT:  .LBB26_2:
1912 ; RV32-NEXT:    seqz a2, a0
1913 ; RV32-NEXT:  .LBB26_3: # %entry
1914 ; RV32-NEXT:    xori a3, a0, 1
1915 ; RV32-NEXT:    or a3, a3, a1
1916 ; RV32-NEXT:    seqz a3, a3
1917 ; RV32-NEXT:    addi a3, a3, -1
1918 ; RV32-NEXT:    and a3, a3, a2
1919 ; RV32-NEXT:    neg a2, a3
1920 ; RV32-NEXT:    bnez a3, .LBB26_5
1921 ; RV32-NEXT:  # %bb.4: # %entry
1922 ; RV32-NEXT:    li a0, 1
1923 ; RV32-NEXT:  .LBB26_5: # %entry
1924 ; RV32-NEXT:    lw a3, 8(sp)
1925 ; RV32-NEXT:    lw a4, 12(sp)
1926 ; RV32-NEXT:    and a5, a2, a1
1927 ; RV32-NEXT:    beqz a5, .LBB26_7
1928 ; RV32-NEXT:  # %bb.6: # %entry
1929 ; RV32-NEXT:    sgtz a1, a5
1930 ; RV32-NEXT:    j .LBB26_8
1931 ; RV32-NEXT:  .LBB26_7:
1932 ; RV32-NEXT:    snez a1, a0
1933 ; RV32-NEXT:  .LBB26_8: # %entry
1934 ; RV32-NEXT:    and a4, a2, a4
1935 ; RV32-NEXT:    or a0, a0, a5
1936 ; RV32-NEXT:    and a2, a2, a3
1937 ; RV32-NEXT:    bnez a0, .LBB26_10
1938 ; RV32-NEXT:  # %bb.9:
1939 ; RV32-NEXT:    or a0, a2, a4
1940 ; RV32-NEXT:    snez a1, a0
1941 ; RV32-NEXT:  .LBB26_10: # %entry
1942 ; RV32-NEXT:    neg a1, a1
1943 ; RV32-NEXT:    and a0, a1, a2
1944 ; RV32-NEXT:    and a1, a1, a4
1945 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1946 ; RV32-NEXT:    .cfi_restore ra
1947 ; RV32-NEXT:    addi sp, sp, 32
1948 ; RV32-NEXT:    .cfi_def_cfa_offset 0
1949 ; RV32-NEXT:    ret
1951 ; RV64-LABEL: ustest_f16i64:
1952 ; RV64:       # %bb.0: # %entry
1953 ; RV64-NEXT:    addi sp, sp, -16
1954 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1955 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1956 ; RV64-NEXT:    .cfi_offset ra, -8
1957 ; RV64-NEXT:    call __extendhfsf2
1958 ; RV64-NEXT:    call __fixsfti
1959 ; RV64-NEXT:    slti a2, a1, 1
1960 ; RV64-NEXT:    blez a1, .LBB26_2
1961 ; RV64-NEXT:  # %bb.1: # %entry
1962 ; RV64-NEXT:    li a1, 1
1963 ; RV64-NEXT:  .LBB26_2: # %entry
1964 ; RV64-NEXT:    neg a2, a2
1965 ; RV64-NEXT:    and a0, a2, a0
1966 ; RV64-NEXT:    beqz a1, .LBB26_4
1967 ; RV64-NEXT:  # %bb.3: # %entry
1968 ; RV64-NEXT:    sgtz a1, a1
1969 ; RV64-NEXT:    j .LBB26_5
1970 ; RV64-NEXT:  .LBB26_4:
1971 ; RV64-NEXT:    snez a1, a0
1972 ; RV64-NEXT:  .LBB26_5: # %entry
1973 ; RV64-NEXT:    neg a1, a1
1974 ; RV64-NEXT:    and a0, a1, a0
1975 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1976 ; RV64-NEXT:    .cfi_restore ra
1977 ; RV64-NEXT:    addi sp, sp, 16
1978 ; RV64-NEXT:    .cfi_def_cfa_offset 0
1979 ; RV64-NEXT:    ret
1980 entry:
1981   %conv = fptosi half %x to i128
1982   %0 = icmp slt i128 %conv, 18446744073709551616
1983   %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616
1984   %1 = icmp sgt i128 %spec.store.select, 0
1985   %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0
1986   %conv6 = trunc i128 %spec.store.select7 to i64
1987   ret i64 %conv6
1993 ; i32 saturate
1995 define i32 @stest_f64i32_mm(double %x) {
1996 ; RV32IF-LABEL: stest_f64i32_mm:
1997 ; RV32IF:       # %bb.0: # %entry
1998 ; RV32IF-NEXT:    addi sp, sp, -16
1999 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
2000 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2001 ; RV32IF-NEXT:    .cfi_offset ra, -4
2002 ; RV32IF-NEXT:    call __fixdfdi
2003 ; RV32IF-NEXT:    lui a2, 524288
2004 ; RV32IF-NEXT:    addi a3, a2, -1
2005 ; RV32IF-NEXT:    beqz a1, .LBB27_2
2006 ; RV32IF-NEXT:  # %bb.1: # %entry
2007 ; RV32IF-NEXT:    slti a4, a1, 0
2008 ; RV32IF-NEXT:    j .LBB27_3
2009 ; RV32IF-NEXT:  .LBB27_2:
2010 ; RV32IF-NEXT:    sltu a4, a0, a3
2011 ; RV32IF-NEXT:  .LBB27_3: # %entry
2012 ; RV32IF-NEXT:    neg a5, a4
2013 ; RV32IF-NEXT:    and a1, a5, a1
2014 ; RV32IF-NEXT:    bnez a4, .LBB27_5
2015 ; RV32IF-NEXT:  # %bb.4: # %entry
2016 ; RV32IF-NEXT:    mv a0, a3
2017 ; RV32IF-NEXT:  .LBB27_5: # %entry
2018 ; RV32IF-NEXT:    li a3, -1
2019 ; RV32IF-NEXT:    beq a1, a3, .LBB27_7
2020 ; RV32IF-NEXT:  # %bb.6: # %entry
2021 ; RV32IF-NEXT:    slti a1, a1, 0
2022 ; RV32IF-NEXT:    xori a1, a1, 1
2023 ; RV32IF-NEXT:    beqz a1, .LBB27_8
2024 ; RV32IF-NEXT:    j .LBB27_9
2025 ; RV32IF-NEXT:  .LBB27_7:
2026 ; RV32IF-NEXT:    sltu a1, a2, a0
2027 ; RV32IF-NEXT:    bnez a1, .LBB27_9
2028 ; RV32IF-NEXT:  .LBB27_8: # %entry
2029 ; RV32IF-NEXT:    lui a0, 524288
2030 ; RV32IF-NEXT:  .LBB27_9: # %entry
2031 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2032 ; RV32IF-NEXT:    .cfi_restore ra
2033 ; RV32IF-NEXT:    addi sp, sp, 16
2034 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
2035 ; RV32IF-NEXT:    ret
2037 ; RV64IF-LABEL: stest_f64i32_mm:
2038 ; RV64IF:       # %bb.0: # %entry
2039 ; RV64IF-NEXT:    addi sp, sp, -16
2040 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
2041 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2042 ; RV64IF-NEXT:    .cfi_offset ra, -8
2043 ; RV64IF-NEXT:    call __fixdfdi
2044 ; RV64IF-NEXT:    lui a1, 524288
2045 ; RV64IF-NEXT:    addiw a2, a1, -1
2046 ; RV64IF-NEXT:    blt a0, a2, .LBB27_2
2047 ; RV64IF-NEXT:  # %bb.1: # %entry
2048 ; RV64IF-NEXT:    mv a0, a2
2049 ; RV64IF-NEXT:  .LBB27_2: # %entry
2050 ; RV64IF-NEXT:    blt a1, a0, .LBB27_4
2051 ; RV64IF-NEXT:  # %bb.3: # %entry
2052 ; RV64IF-NEXT:    lui a0, 524288
2053 ; RV64IF-NEXT:  .LBB27_4: # %entry
2054 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2055 ; RV64IF-NEXT:    .cfi_restore ra
2056 ; RV64IF-NEXT:    addi sp, sp, 16
2057 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
2058 ; RV64IF-NEXT:    ret
2060 ; RV32IFD-LABEL: stest_f64i32_mm:
2061 ; RV32IFD:       # %bb.0: # %entry
2062 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
2063 ; RV32IFD-NEXT:    feq.d a1, fa0, fa0
2064 ; RV32IFD-NEXT:    seqz a1, a1
2065 ; RV32IFD-NEXT:    addi a1, a1, -1
2066 ; RV32IFD-NEXT:    and a0, a1, a0
2067 ; RV32IFD-NEXT:    ret
2069 ; RV64IFD-LABEL: stest_f64i32_mm:
2070 ; RV64IFD:       # %bb.0: # %entry
2071 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
2072 ; RV64IFD-NEXT:    lui a1, 524288
2073 ; RV64IFD-NEXT:    addiw a2, a1, -1
2074 ; RV64IFD-NEXT:    bge a0, a2, .LBB27_3
2075 ; RV64IFD-NEXT:  # %bb.1: # %entry
2076 ; RV64IFD-NEXT:    bge a1, a0, .LBB27_4
2077 ; RV64IFD-NEXT:  .LBB27_2: # %entry
2078 ; RV64IFD-NEXT:    ret
2079 ; RV64IFD-NEXT:  .LBB27_3: # %entry
2080 ; RV64IFD-NEXT:    mv a0, a2
2081 ; RV64IFD-NEXT:    blt a1, a2, .LBB27_2
2082 ; RV64IFD-NEXT:  .LBB27_4: # %entry
2083 ; RV64IFD-NEXT:    lui a0, 524288
2084 ; RV64IFD-NEXT:    ret
2085 entry:
2086   %conv = fptosi double %x to i64
2087   %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)
2088   %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)
2089   %conv6 = trunc i64 %spec.store.select7 to i32
2090   ret i32 %conv6
2093 define i32 @utest_f64i32_mm(double %x) {
2094 ; RV32IF-LABEL: utest_f64i32_mm:
2095 ; RV32IF:       # %bb.0: # %entry
2096 ; RV32IF-NEXT:    addi sp, sp, -16
2097 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
2098 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2099 ; RV32IF-NEXT:    .cfi_offset ra, -4
2100 ; RV32IF-NEXT:    call __fixunsdfdi
2101 ; RV32IF-NEXT:    seqz a1, a1
2102 ; RV32IF-NEXT:    addi a1, a1, -1
2103 ; RV32IF-NEXT:    or a0, a1, a0
2104 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2105 ; RV32IF-NEXT:    .cfi_restore ra
2106 ; RV32IF-NEXT:    addi sp, sp, 16
2107 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
2108 ; RV32IF-NEXT:    ret
2110 ; RV64IF-LABEL: utest_f64i32_mm:
2111 ; RV64IF:       # %bb.0: # %entry
2112 ; RV64IF-NEXT:    addi sp, sp, -16
2113 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
2114 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2115 ; RV64IF-NEXT:    .cfi_offset ra, -8
2116 ; RV64IF-NEXT:    call __fixunsdfdi
2117 ; RV64IF-NEXT:    li a1, -1
2118 ; RV64IF-NEXT:    srli a1, a1, 32
2119 ; RV64IF-NEXT:    bltu a0, a1, .LBB28_2
2120 ; RV64IF-NEXT:  # %bb.1: # %entry
2121 ; RV64IF-NEXT:    mv a0, a1
2122 ; RV64IF-NEXT:  .LBB28_2: # %entry
2123 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2124 ; RV64IF-NEXT:    .cfi_restore ra
2125 ; RV64IF-NEXT:    addi sp, sp, 16
2126 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
2127 ; RV64IF-NEXT:    ret
2129 ; RV32IFD-LABEL: utest_f64i32_mm:
2130 ; RV32IFD:       # %bb.0: # %entry
2131 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
2132 ; RV32IFD-NEXT:    feq.d a1, fa0, fa0
2133 ; RV32IFD-NEXT:    seqz a1, a1
2134 ; RV32IFD-NEXT:    addi a1, a1, -1
2135 ; RV32IFD-NEXT:    and a0, a1, a0
2136 ; RV32IFD-NEXT:    ret
2138 ; RV64IFD-LABEL: utest_f64i32_mm:
2139 ; RV64IFD:       # %bb.0: # %entry
2140 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
2141 ; RV64IFD-NEXT:    li a1, -1
2142 ; RV64IFD-NEXT:    srli a1, a1, 32
2143 ; RV64IFD-NEXT:    bltu a0, a1, .LBB28_2
2144 ; RV64IFD-NEXT:  # %bb.1: # %entry
2145 ; RV64IFD-NEXT:    mv a0, a1
2146 ; RV64IFD-NEXT:  .LBB28_2: # %entry
2147 ; RV64IFD-NEXT:    ret
2148 entry:
2149   %conv = fptoui double %x to i64
2150   %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)
2151   %conv6 = trunc i64 %spec.store.select to i32
2152   ret i32 %conv6
2155 define i32 @ustest_f64i32_mm(double %x) {
2156 ; RV32IF-LABEL: ustest_f64i32_mm:
2157 ; RV32IF:       # %bb.0: # %entry
2158 ; RV32IF-NEXT:    addi sp, sp, -16
2159 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
2160 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2161 ; RV32IF-NEXT:    .cfi_offset ra, -4
2162 ; RV32IF-NEXT:    call __fixdfdi
2163 ; RV32IF-NEXT:    bnez a1, .LBB29_2
2164 ; RV32IF-NEXT:  # %bb.1: # %entry
2165 ; RV32IF-NEXT:    li a2, 1
2166 ; RV32IF-NEXT:    j .LBB29_3
2167 ; RV32IF-NEXT:  .LBB29_2:
2168 ; RV32IF-NEXT:    slti a2, a1, 1
2169 ; RV32IF-NEXT:  .LBB29_3: # %entry
2170 ; RV32IF-NEXT:    addi a3, a2, -1
2171 ; RV32IF-NEXT:    neg a2, a2
2172 ; RV32IF-NEXT:    or a0, a3, a0
2173 ; RV32IF-NEXT:    and a1, a2, a1
2174 ; RV32IF-NEXT:    slti a1, a1, 0
2175 ; RV32IF-NEXT:    addi a1, a1, -1
2176 ; RV32IF-NEXT:    and a0, a1, a0
2177 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2178 ; RV32IF-NEXT:    .cfi_restore ra
2179 ; RV32IF-NEXT:    addi sp, sp, 16
2180 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
2181 ; RV32IF-NEXT:    ret
2183 ; RV64IF-LABEL: ustest_f64i32_mm:
2184 ; RV64IF:       # %bb.0: # %entry
2185 ; RV64IF-NEXT:    addi sp, sp, -16
2186 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
2187 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2188 ; RV64IF-NEXT:    .cfi_offset ra, -8
2189 ; RV64IF-NEXT:    call __fixdfdi
2190 ; RV64IF-NEXT:    li a1, -1
2191 ; RV64IF-NEXT:    srli a1, a1, 32
2192 ; RV64IF-NEXT:    blt a0, a1, .LBB29_2
2193 ; RV64IF-NEXT:  # %bb.1: # %entry
2194 ; RV64IF-NEXT:    mv a0, a1
2195 ; RV64IF-NEXT:  .LBB29_2: # %entry
2196 ; RV64IF-NEXT:    sgtz a1, a0
2197 ; RV64IF-NEXT:    neg a1, a1
2198 ; RV64IF-NEXT:    and a0, a1, a0
2199 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2200 ; RV64IF-NEXT:    .cfi_restore ra
2201 ; RV64IF-NEXT:    addi sp, sp, 16
2202 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
2203 ; RV64IF-NEXT:    ret
2205 ; RV32IFD-LABEL: ustest_f64i32_mm:
2206 ; RV32IFD:       # %bb.0: # %entry
2207 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
2208 ; RV32IFD-NEXT:    feq.d a1, fa0, fa0
2209 ; RV32IFD-NEXT:    seqz a1, a1
2210 ; RV32IFD-NEXT:    addi a1, a1, -1
2211 ; RV32IFD-NEXT:    and a0, a1, a0
2212 ; RV32IFD-NEXT:    ret
2214 ; RV64IFD-LABEL: ustest_f64i32_mm:
2215 ; RV64IFD:       # %bb.0: # %entry
2216 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
2217 ; RV64IFD-NEXT:    li a1, -1
2218 ; RV64IFD-NEXT:    srli a1, a1, 32
2219 ; RV64IFD-NEXT:    blt a0, a1, .LBB29_2
2220 ; RV64IFD-NEXT:  # %bb.1: # %entry
2221 ; RV64IFD-NEXT:    mv a0, a1
2222 ; RV64IFD-NEXT:  .LBB29_2: # %entry
2223 ; RV64IFD-NEXT:    sgtz a1, a0
2224 ; RV64IFD-NEXT:    neg a1, a1
2225 ; RV64IFD-NEXT:    and a0, a1, a0
2226 ; RV64IFD-NEXT:    ret
2227 entry:
2228   %conv = fptosi double %x to i64
2229   %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)
2230   %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)
2231   %conv6 = trunc i64 %spec.store.select7 to i32
2232   ret i32 %conv6
2235 define i32 @stest_f32i32_mm(float %x) {
2236 ; RV32-LABEL: stest_f32i32_mm:
2237 ; RV32:       # %bb.0: # %entry
2238 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
2239 ; RV32-NEXT:    feq.s a1, fa0, fa0
2240 ; RV32-NEXT:    seqz a1, a1
2241 ; RV32-NEXT:    addi a1, a1, -1
2242 ; RV32-NEXT:    and a0, a1, a0
2243 ; RV32-NEXT:    ret
2245 ; RV64-LABEL: stest_f32i32_mm:
2246 ; RV64:       # %bb.0: # %entry
2247 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
2248 ; RV64-NEXT:    lui a1, 524288
2249 ; RV64-NEXT:    addiw a2, a1, -1
2250 ; RV64-NEXT:    bge a0, a2, .LBB30_3
2251 ; RV64-NEXT:  # %bb.1: # %entry
2252 ; RV64-NEXT:    bge a1, a0, .LBB30_4
2253 ; RV64-NEXT:  .LBB30_2: # %entry
2254 ; RV64-NEXT:    ret
2255 ; RV64-NEXT:  .LBB30_3: # %entry
2256 ; RV64-NEXT:    mv a0, a2
2257 ; RV64-NEXT:    blt a1, a2, .LBB30_2
2258 ; RV64-NEXT:  .LBB30_4: # %entry
2259 ; RV64-NEXT:    lui a0, 524288
2260 ; RV64-NEXT:    ret
2261 entry:
2262   %conv = fptosi float %x to i64
2263   %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)
2264   %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)
2265   %conv6 = trunc i64 %spec.store.select7 to i32
2266   ret i32 %conv6
2269 define i32 @utest_f32i32_mm(float %x) {
2270 ; RV32-LABEL: utest_f32i32_mm:
2271 ; RV32:       # %bb.0: # %entry
2272 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
2273 ; RV32-NEXT:    feq.s a1, fa0, fa0
2274 ; RV32-NEXT:    seqz a1, a1
2275 ; RV32-NEXT:    addi a1, a1, -1
2276 ; RV32-NEXT:    and a0, a1, a0
2277 ; RV32-NEXT:    ret
2279 ; RV64-LABEL: utest_f32i32_mm:
2280 ; RV64:       # %bb.0: # %entry
2281 ; RV64-NEXT:    fcvt.lu.s a0, fa0, rtz
2282 ; RV64-NEXT:    li a1, -1
2283 ; RV64-NEXT:    srli a1, a1, 32
2284 ; RV64-NEXT:    bltu a0, a1, .LBB31_2
2285 ; RV64-NEXT:  # %bb.1: # %entry
2286 ; RV64-NEXT:    mv a0, a1
2287 ; RV64-NEXT:  .LBB31_2: # %entry
2288 ; RV64-NEXT:    ret
2289 entry:
2290   %conv = fptoui float %x to i64
2291   %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)
2292   %conv6 = trunc i64 %spec.store.select to i32
2293   ret i32 %conv6
2296 define i32 @ustest_f32i32_mm(float %x) {
2297 ; RV32-LABEL: ustest_f32i32_mm:
2298 ; RV32:       # %bb.0: # %entry
2299 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
2300 ; RV32-NEXT:    feq.s a1, fa0, fa0
2301 ; RV32-NEXT:    seqz a1, a1
2302 ; RV32-NEXT:    addi a1, a1, -1
2303 ; RV32-NEXT:    and a0, a1, a0
2304 ; RV32-NEXT:    ret
2306 ; RV64-LABEL: ustest_f32i32_mm:
2307 ; RV64:       # %bb.0: # %entry
2308 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
2309 ; RV64-NEXT:    li a1, -1
2310 ; RV64-NEXT:    srli a1, a1, 32
2311 ; RV64-NEXT:    blt a0, a1, .LBB32_2
2312 ; RV64-NEXT:  # %bb.1: # %entry
2313 ; RV64-NEXT:    mv a0, a1
2314 ; RV64-NEXT:  .LBB32_2: # %entry
2315 ; RV64-NEXT:    sgtz a1, a0
2316 ; RV64-NEXT:    neg a1, a1
2317 ; RV64-NEXT:    and a0, a1, a0
2318 ; RV64-NEXT:    ret
2319 entry:
2320   %conv = fptosi float %x to i64
2321   %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)
2322   %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)
2323   %conv6 = trunc i64 %spec.store.select7 to i32
2324   ret i32 %conv6
2327 define i32 @stest_f16i32_mm(half %x) {
2328 ; RV32-LABEL: stest_f16i32_mm:
2329 ; RV32:       # %bb.0: # %entry
2330 ; RV32-NEXT:    addi sp, sp, -16
2331 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2332 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2333 ; RV32-NEXT:    .cfi_offset ra, -4
2334 ; RV32-NEXT:    call __extendhfsf2
2335 ; RV32-NEXT:    call __fixsfdi
2336 ; RV32-NEXT:    lui a2, 524288
2337 ; RV32-NEXT:    addi a3, a2, -1
2338 ; RV32-NEXT:    beqz a1, .LBB33_2
2339 ; RV32-NEXT:  # %bb.1: # %entry
2340 ; RV32-NEXT:    slti a4, a1, 0
2341 ; RV32-NEXT:    j .LBB33_3
2342 ; RV32-NEXT:  .LBB33_2:
2343 ; RV32-NEXT:    sltu a4, a0, a3
2344 ; RV32-NEXT:  .LBB33_3: # %entry
2345 ; RV32-NEXT:    neg a5, a4
2346 ; RV32-NEXT:    and a1, a5, a1
2347 ; RV32-NEXT:    bnez a4, .LBB33_5
2348 ; RV32-NEXT:  # %bb.4: # %entry
2349 ; RV32-NEXT:    mv a0, a3
2350 ; RV32-NEXT:  .LBB33_5: # %entry
2351 ; RV32-NEXT:    li a3, -1
2352 ; RV32-NEXT:    beq a1, a3, .LBB33_7
2353 ; RV32-NEXT:  # %bb.6: # %entry
2354 ; RV32-NEXT:    slti a1, a1, 0
2355 ; RV32-NEXT:    xori a1, a1, 1
2356 ; RV32-NEXT:    beqz a1, .LBB33_8
2357 ; RV32-NEXT:    j .LBB33_9
2358 ; RV32-NEXT:  .LBB33_7:
2359 ; RV32-NEXT:    sltu a1, a2, a0
2360 ; RV32-NEXT:    bnez a1, .LBB33_9
2361 ; RV32-NEXT:  .LBB33_8: # %entry
2362 ; RV32-NEXT:    lui a0, 524288
2363 ; RV32-NEXT:  .LBB33_9: # %entry
2364 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2365 ; RV32-NEXT:    .cfi_restore ra
2366 ; RV32-NEXT:    addi sp, sp, 16
2367 ; RV32-NEXT:    .cfi_def_cfa_offset 0
2368 ; RV32-NEXT:    ret
2370 ; RV64-LABEL: stest_f16i32_mm:
2371 ; RV64:       # %bb.0: # %entry
2372 ; RV64-NEXT:    addi sp, sp, -16
2373 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2374 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2375 ; RV64-NEXT:    .cfi_offset ra, -8
2376 ; RV64-NEXT:    call __extendhfsf2
2377 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
2378 ; RV64-NEXT:    lui a1, 524288
2379 ; RV64-NEXT:    addiw a2, a1, -1
2380 ; RV64-NEXT:    blt a0, a2, .LBB33_2
2381 ; RV64-NEXT:  # %bb.1: # %entry
2382 ; RV64-NEXT:    mv a0, a2
2383 ; RV64-NEXT:  .LBB33_2: # %entry
2384 ; RV64-NEXT:    blt a1, a0, .LBB33_4
2385 ; RV64-NEXT:  # %bb.3: # %entry
2386 ; RV64-NEXT:    lui a0, 524288
2387 ; RV64-NEXT:  .LBB33_4: # %entry
2388 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2389 ; RV64-NEXT:    .cfi_restore ra
2390 ; RV64-NEXT:    addi sp, sp, 16
2391 ; RV64-NEXT:    .cfi_def_cfa_offset 0
2392 ; RV64-NEXT:    ret
2393 entry:
2394   %conv = fptosi half %x to i64
2395   %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)
2396   %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)
2397   %conv6 = trunc i64 %spec.store.select7 to i32
2398   ret i32 %conv6
2401 define i32 @utesth_f16i32_mm(half %x) {
2402 ; RV32-LABEL: utesth_f16i32_mm:
2403 ; RV32:       # %bb.0: # %entry
2404 ; RV32-NEXT:    addi sp, sp, -16
2405 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2406 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2407 ; RV32-NEXT:    .cfi_offset ra, -4
2408 ; RV32-NEXT:    call __extendhfsf2
2409 ; RV32-NEXT:    call __fixunssfdi
2410 ; RV32-NEXT:    seqz a1, a1
2411 ; RV32-NEXT:    addi a1, a1, -1
2412 ; RV32-NEXT:    or a0, a1, a0
2413 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2414 ; RV32-NEXT:    .cfi_restore ra
2415 ; RV32-NEXT:    addi sp, sp, 16
2416 ; RV32-NEXT:    .cfi_def_cfa_offset 0
2417 ; RV32-NEXT:    ret
2419 ; RV64-LABEL: utesth_f16i32_mm:
2420 ; RV64:       # %bb.0: # %entry
2421 ; RV64-NEXT:    addi sp, sp, -16
2422 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2423 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2424 ; RV64-NEXT:    .cfi_offset ra, -8
2425 ; RV64-NEXT:    call __extendhfsf2
2426 ; RV64-NEXT:    fcvt.lu.s a0, fa0, rtz
2427 ; RV64-NEXT:    li a1, -1
2428 ; RV64-NEXT:    srli a1, a1, 32
2429 ; RV64-NEXT:    bltu a0, a1, .LBB34_2
2430 ; RV64-NEXT:  # %bb.1: # %entry
2431 ; RV64-NEXT:    mv a0, a1
2432 ; RV64-NEXT:  .LBB34_2: # %entry
2433 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2434 ; RV64-NEXT:    .cfi_restore ra
2435 ; RV64-NEXT:    addi sp, sp, 16
2436 ; RV64-NEXT:    .cfi_def_cfa_offset 0
2437 ; RV64-NEXT:    ret
2438 entry:
2439   %conv = fptoui half %x to i64
2440   %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)
2441   %conv6 = trunc i64 %spec.store.select to i32
2442   ret i32 %conv6
2445 define i32 @ustest_f16i32_mm(half %x) {
2446 ; RV32-LABEL: ustest_f16i32_mm:
2447 ; RV32:       # %bb.0: # %entry
2448 ; RV32-NEXT:    addi sp, sp, -16
2449 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2450 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2451 ; RV32-NEXT:    .cfi_offset ra, -4
2452 ; RV32-NEXT:    call __extendhfsf2
2453 ; RV32-NEXT:    call __fixsfdi
2454 ; RV32-NEXT:    bnez a1, .LBB35_2
2455 ; RV32-NEXT:  # %bb.1: # %entry
2456 ; RV32-NEXT:    li a2, 1
2457 ; RV32-NEXT:    j .LBB35_3
2458 ; RV32-NEXT:  .LBB35_2:
2459 ; RV32-NEXT:    slti a2, a1, 1
2460 ; RV32-NEXT:  .LBB35_3: # %entry
2461 ; RV32-NEXT:    addi a3, a2, -1
2462 ; RV32-NEXT:    neg a2, a2
2463 ; RV32-NEXT:    or a0, a3, a0
2464 ; RV32-NEXT:    and a1, a2, a1
2465 ; RV32-NEXT:    slti a1, a1, 0
2466 ; RV32-NEXT:    addi a1, a1, -1
2467 ; RV32-NEXT:    and a0, a1, a0
2468 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2469 ; RV32-NEXT:    .cfi_restore ra
2470 ; RV32-NEXT:    addi sp, sp, 16
2471 ; RV32-NEXT:    .cfi_def_cfa_offset 0
2472 ; RV32-NEXT:    ret
2474 ; RV64-LABEL: ustest_f16i32_mm:
2475 ; RV64:       # %bb.0: # %entry
2476 ; RV64-NEXT:    addi sp, sp, -16
2477 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2478 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2479 ; RV64-NEXT:    .cfi_offset ra, -8
2480 ; RV64-NEXT:    call __extendhfsf2
2481 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
2482 ; RV64-NEXT:    li a1, -1
2483 ; RV64-NEXT:    srli a1, a1, 32
2484 ; RV64-NEXT:    blt a0, a1, .LBB35_2
2485 ; RV64-NEXT:  # %bb.1: # %entry
2486 ; RV64-NEXT:    mv a0, a1
2487 ; RV64-NEXT:  .LBB35_2: # %entry
2488 ; RV64-NEXT:    sgtz a1, a0
2489 ; RV64-NEXT:    neg a1, a1
2490 ; RV64-NEXT:    and a0, a1, a0
2491 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2492 ; RV64-NEXT:    .cfi_restore ra
2493 ; RV64-NEXT:    addi sp, sp, 16
2494 ; RV64-NEXT:    .cfi_def_cfa_offset 0
2495 ; RV64-NEXT:    ret
2496 entry:
2497   %conv = fptosi half %x to i64
2498   %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)
2499   %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)
2500   %conv6 = trunc i64 %spec.store.select7 to i32
2501   ret i32 %conv6
2504 ; i16 saturate
2506 define i16 @stest_f64i16_mm(double %x) {
2507 ; RV32IF-LABEL: stest_f64i16_mm:
2508 ; RV32IF:       # %bb.0: # %entry
2509 ; RV32IF-NEXT:    addi sp, sp, -16
2510 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
2511 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2512 ; RV32IF-NEXT:    .cfi_offset ra, -4
2513 ; RV32IF-NEXT:    call __fixdfsi
2514 ; RV32IF-NEXT:    lui a1, 8
2515 ; RV32IF-NEXT:    addi a1, a1, -1
2516 ; RV32IF-NEXT:    blt a0, a1, .LBB36_2
2517 ; RV32IF-NEXT:  # %bb.1: # %entry
2518 ; RV32IF-NEXT:    mv a0, a1
2519 ; RV32IF-NEXT:  .LBB36_2: # %entry
2520 ; RV32IF-NEXT:    lui a1, 1048568
2521 ; RV32IF-NEXT:    blt a1, a0, .LBB36_4
2522 ; RV32IF-NEXT:  # %bb.3: # %entry
2523 ; RV32IF-NEXT:    lui a0, 1048568
2524 ; RV32IF-NEXT:  .LBB36_4: # %entry
2525 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2526 ; RV32IF-NEXT:    .cfi_restore ra
2527 ; RV32IF-NEXT:    addi sp, sp, 16
2528 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
2529 ; RV32IF-NEXT:    ret
2531 ; RV64IF-LABEL: stest_f64i16_mm:
2532 ; RV64IF:       # %bb.0: # %entry
2533 ; RV64IF-NEXT:    addi sp, sp, -16
2534 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
2535 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2536 ; RV64IF-NEXT:    .cfi_offset ra, -8
2537 ; RV64IF-NEXT:    call __fixdfsi
2538 ; RV64IF-NEXT:    lui a1, 8
2539 ; RV64IF-NEXT:    addiw a1, a1, -1
2540 ; RV64IF-NEXT:    blt a0, a1, .LBB36_2
2541 ; RV64IF-NEXT:  # %bb.1: # %entry
2542 ; RV64IF-NEXT:    mv a0, a1
2543 ; RV64IF-NEXT:  .LBB36_2: # %entry
2544 ; RV64IF-NEXT:    lui a1, 1048568
2545 ; RV64IF-NEXT:    blt a1, a0, .LBB36_4
2546 ; RV64IF-NEXT:  # %bb.3: # %entry
2547 ; RV64IF-NEXT:    lui a0, 1048568
2548 ; RV64IF-NEXT:  .LBB36_4: # %entry
2549 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2550 ; RV64IF-NEXT:    .cfi_restore ra
2551 ; RV64IF-NEXT:    addi sp, sp, 16
2552 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
2553 ; RV64IF-NEXT:    ret
2555 ; RV32IFD-LABEL: stest_f64i16_mm:
2556 ; RV32IFD:       # %bb.0: # %entry
2557 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
2558 ; RV32IFD-NEXT:    lui a1, 8
2559 ; RV32IFD-NEXT:    addi a1, a1, -1
2560 ; RV32IFD-NEXT:    bge a0, a1, .LBB36_3
2561 ; RV32IFD-NEXT:  # %bb.1: # %entry
2562 ; RV32IFD-NEXT:    lui a1, 1048568
2563 ; RV32IFD-NEXT:    bge a1, a0, .LBB36_4
2564 ; RV32IFD-NEXT:  .LBB36_2: # %entry
2565 ; RV32IFD-NEXT:    ret
2566 ; RV32IFD-NEXT:  .LBB36_3: # %entry
2567 ; RV32IFD-NEXT:    mv a0, a1
2568 ; RV32IFD-NEXT:    lui a1, 1048568
2569 ; RV32IFD-NEXT:    blt a1, a0, .LBB36_2
2570 ; RV32IFD-NEXT:  .LBB36_4: # %entry
2571 ; RV32IFD-NEXT:    lui a0, 1048568
2572 ; RV32IFD-NEXT:    ret
2574 ; RV64IFD-LABEL: stest_f64i16_mm:
2575 ; RV64IFD:       # %bb.0: # %entry
2576 ; RV64IFD-NEXT:    fcvt.w.d a0, fa0, rtz
2577 ; RV64IFD-NEXT:    lui a1, 8
2578 ; RV64IFD-NEXT:    addiw a1, a1, -1
2579 ; RV64IFD-NEXT:    bge a0, a1, .LBB36_3
2580 ; RV64IFD-NEXT:  # %bb.1: # %entry
2581 ; RV64IFD-NEXT:    lui a1, 1048568
2582 ; RV64IFD-NEXT:    bge a1, a0, .LBB36_4
2583 ; RV64IFD-NEXT:  .LBB36_2: # %entry
2584 ; RV64IFD-NEXT:    ret
2585 ; RV64IFD-NEXT:  .LBB36_3: # %entry
2586 ; RV64IFD-NEXT:    mv a0, a1
2587 ; RV64IFD-NEXT:    lui a1, 1048568
2588 ; RV64IFD-NEXT:    blt a1, a0, .LBB36_2
2589 ; RV64IFD-NEXT:  .LBB36_4: # %entry
2590 ; RV64IFD-NEXT:    lui a0, 1048568
2591 ; RV64IFD-NEXT:    ret
2592 entry:
2593   %conv = fptosi double %x to i32
2594   %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)
2595   %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)
2596   %conv6 = trunc i32 %spec.store.select7 to i16
2597   ret i16 %conv6
2600 define i16 @utest_f64i16_mm(double %x) {
2601 ; RV32IF-LABEL: utest_f64i16_mm:
2602 ; RV32IF:       # %bb.0: # %entry
2603 ; RV32IF-NEXT:    addi sp, sp, -16
2604 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
2605 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2606 ; RV32IF-NEXT:    .cfi_offset ra, -4
2607 ; RV32IF-NEXT:    call __fixunsdfsi
2608 ; RV32IF-NEXT:    lui a1, 16
2609 ; RV32IF-NEXT:    addi a1, a1, -1
2610 ; RV32IF-NEXT:    bltu a0, a1, .LBB37_2
2611 ; RV32IF-NEXT:  # %bb.1: # %entry
2612 ; RV32IF-NEXT:    mv a0, a1
2613 ; RV32IF-NEXT:  .LBB37_2: # %entry
2614 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2615 ; RV32IF-NEXT:    .cfi_restore ra
2616 ; RV32IF-NEXT:    addi sp, sp, 16
2617 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
2618 ; RV32IF-NEXT:    ret
2620 ; RV64IF-LABEL: utest_f64i16_mm:
2621 ; RV64IF:       # %bb.0: # %entry
2622 ; RV64IF-NEXT:    addi sp, sp, -16
2623 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
2624 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2625 ; RV64IF-NEXT:    .cfi_offset ra, -8
2626 ; RV64IF-NEXT:    call __fixunsdfsi
2627 ; RV64IF-NEXT:    lui a1, 16
2628 ; RV64IF-NEXT:    addiw a1, a1, -1
2629 ; RV64IF-NEXT:    bltu a0, a1, .LBB37_2
2630 ; RV64IF-NEXT:  # %bb.1: # %entry
2631 ; RV64IF-NEXT:    mv a0, a1
2632 ; RV64IF-NEXT:  .LBB37_2: # %entry
2633 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2634 ; RV64IF-NEXT:    .cfi_restore ra
2635 ; RV64IF-NEXT:    addi sp, sp, 16
2636 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
2637 ; RV64IF-NEXT:    ret
2639 ; RV32IFD-LABEL: utest_f64i16_mm:
2640 ; RV32IFD:       # %bb.0: # %entry
2641 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
2642 ; RV32IFD-NEXT:    lui a1, 16
2643 ; RV32IFD-NEXT:    addi a1, a1, -1
2644 ; RV32IFD-NEXT:    bltu a0, a1, .LBB37_2
2645 ; RV32IFD-NEXT:  # %bb.1: # %entry
2646 ; RV32IFD-NEXT:    mv a0, a1
2647 ; RV32IFD-NEXT:  .LBB37_2: # %entry
2648 ; RV32IFD-NEXT:    ret
2650 ; RV64IFD-LABEL: utest_f64i16_mm:
2651 ; RV64IFD:       # %bb.0: # %entry
2652 ; RV64IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
2653 ; RV64IFD-NEXT:    lui a1, 16
2654 ; RV64IFD-NEXT:    addiw a1, a1, -1
2655 ; RV64IFD-NEXT:    bltu a0, a1, .LBB37_2
2656 ; RV64IFD-NEXT:  # %bb.1: # %entry
2657 ; RV64IFD-NEXT:    mv a0, a1
2658 ; RV64IFD-NEXT:  .LBB37_2: # %entry
2659 ; RV64IFD-NEXT:    ret
2660 entry:
2661   %conv = fptoui double %x to i32
2662   %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)
2663   %conv6 = trunc i32 %spec.store.select to i16
2664   ret i16 %conv6
2667 define i16 @ustest_f64i16_mm(double %x) {
2668 ; RV32IF-LABEL: ustest_f64i16_mm:
2669 ; RV32IF:       # %bb.0: # %entry
2670 ; RV32IF-NEXT:    addi sp, sp, -16
2671 ; RV32IF-NEXT:    .cfi_def_cfa_offset 16
2672 ; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2673 ; RV32IF-NEXT:    .cfi_offset ra, -4
2674 ; RV32IF-NEXT:    call __fixdfsi
2675 ; RV32IF-NEXT:    lui a1, 16
2676 ; RV32IF-NEXT:    addi a1, a1, -1
2677 ; RV32IF-NEXT:    blt a0, a1, .LBB38_2
2678 ; RV32IF-NEXT:  # %bb.1: # %entry
2679 ; RV32IF-NEXT:    mv a0, a1
2680 ; RV32IF-NEXT:  .LBB38_2: # %entry
2681 ; RV32IF-NEXT:    sgtz a1, a0
2682 ; RV32IF-NEXT:    neg a1, a1
2683 ; RV32IF-NEXT:    and a0, a1, a0
2684 ; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2685 ; RV32IF-NEXT:    .cfi_restore ra
2686 ; RV32IF-NEXT:    addi sp, sp, 16
2687 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
2688 ; RV32IF-NEXT:    ret
2690 ; RV64IF-LABEL: ustest_f64i16_mm:
2691 ; RV64IF:       # %bb.0: # %entry
2692 ; RV64IF-NEXT:    addi sp, sp, -16
2693 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
2694 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2695 ; RV64IF-NEXT:    .cfi_offset ra, -8
2696 ; RV64IF-NEXT:    call __fixdfsi
2697 ; RV64IF-NEXT:    lui a1, 16
2698 ; RV64IF-NEXT:    addiw a1, a1, -1
2699 ; RV64IF-NEXT:    blt a0, a1, .LBB38_2
2700 ; RV64IF-NEXT:  # %bb.1: # %entry
2701 ; RV64IF-NEXT:    mv a0, a1
2702 ; RV64IF-NEXT:  .LBB38_2: # %entry
2703 ; RV64IF-NEXT:    sgtz a1, a0
2704 ; RV64IF-NEXT:    neg a1, a1
2705 ; RV64IF-NEXT:    and a0, a1, a0
2706 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2707 ; RV64IF-NEXT:    .cfi_restore ra
2708 ; RV64IF-NEXT:    addi sp, sp, 16
2709 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
2710 ; RV64IF-NEXT:    ret
2712 ; RV32IFD-LABEL: ustest_f64i16_mm:
2713 ; RV32IFD:       # %bb.0: # %entry
2714 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
2715 ; RV32IFD-NEXT:    lui a1, 16
2716 ; RV32IFD-NEXT:    addi a1, a1, -1
2717 ; RV32IFD-NEXT:    blt a0, a1, .LBB38_2
2718 ; RV32IFD-NEXT:  # %bb.1: # %entry
2719 ; RV32IFD-NEXT:    mv a0, a1
2720 ; RV32IFD-NEXT:  .LBB38_2: # %entry
2721 ; RV32IFD-NEXT:    sgtz a1, a0
2722 ; RV32IFD-NEXT:    neg a1, a1
2723 ; RV32IFD-NEXT:    and a0, a1, a0
2724 ; RV32IFD-NEXT:    ret
2726 ; RV64IFD-LABEL: ustest_f64i16_mm:
2727 ; RV64IFD:       # %bb.0: # %entry
2728 ; RV64IFD-NEXT:    fcvt.w.d a0, fa0, rtz
2729 ; RV64IFD-NEXT:    lui a1, 16
2730 ; RV64IFD-NEXT:    addiw a1, a1, -1
2731 ; RV64IFD-NEXT:    blt a0, a1, .LBB38_2
2732 ; RV64IFD-NEXT:  # %bb.1: # %entry
2733 ; RV64IFD-NEXT:    mv a0, a1
2734 ; RV64IFD-NEXT:  .LBB38_2: # %entry
2735 ; RV64IFD-NEXT:    sgtz a1, a0
2736 ; RV64IFD-NEXT:    neg a1, a1
2737 ; RV64IFD-NEXT:    and a0, a1, a0
2738 ; RV64IFD-NEXT:    ret
2739 entry:
2740   %conv = fptosi double %x to i32
2741   %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)
2742   %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)
2743   %conv6 = trunc i32 %spec.store.select7 to i16
2744   ret i16 %conv6
2747 define i16 @stest_f32i16_mm(float %x) {
2748 ; RV32-LABEL: stest_f32i16_mm:
2749 ; RV32:       # %bb.0: # %entry
2750 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
2751 ; RV32-NEXT:    lui a1, 8
2752 ; RV32-NEXT:    addi a1, a1, -1
2753 ; RV32-NEXT:    bge a0, a1, .LBB39_3
2754 ; RV32-NEXT:  # %bb.1: # %entry
2755 ; RV32-NEXT:    lui a1, 1048568
2756 ; RV32-NEXT:    bge a1, a0, .LBB39_4
2757 ; RV32-NEXT:  .LBB39_2: # %entry
2758 ; RV32-NEXT:    ret
2759 ; RV32-NEXT:  .LBB39_3: # %entry
2760 ; RV32-NEXT:    mv a0, a1
2761 ; RV32-NEXT:    lui a1, 1048568
2762 ; RV32-NEXT:    blt a1, a0, .LBB39_2
2763 ; RV32-NEXT:  .LBB39_4: # %entry
2764 ; RV32-NEXT:    lui a0, 1048568
2765 ; RV32-NEXT:    ret
2767 ; RV64-LABEL: stest_f32i16_mm:
2768 ; RV64:       # %bb.0: # %entry
2769 ; RV64-NEXT:    fcvt.w.s a0, fa0, rtz
2770 ; RV64-NEXT:    lui a1, 8
2771 ; RV64-NEXT:    addiw a1, a1, -1
2772 ; RV64-NEXT:    bge a0, a1, .LBB39_3
2773 ; RV64-NEXT:  # %bb.1: # %entry
2774 ; RV64-NEXT:    lui a1, 1048568
2775 ; RV64-NEXT:    bge a1, a0, .LBB39_4
2776 ; RV64-NEXT:  .LBB39_2: # %entry
2777 ; RV64-NEXT:    ret
2778 ; RV64-NEXT:  .LBB39_3: # %entry
2779 ; RV64-NEXT:    mv a0, a1
2780 ; RV64-NEXT:    lui a1, 1048568
2781 ; RV64-NEXT:    blt a1, a0, .LBB39_2
2782 ; RV64-NEXT:  .LBB39_4: # %entry
2783 ; RV64-NEXT:    lui a0, 1048568
2784 ; RV64-NEXT:    ret
2785 entry:
2786   %conv = fptosi float %x to i32
2787   %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)
2788   %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)
2789   %conv6 = trunc i32 %spec.store.select7 to i16
2790   ret i16 %conv6
2793 define i16 @utest_f32i16_mm(float %x) {
2794 ; RV32-LABEL: utest_f32i16_mm:
2795 ; RV32:       # %bb.0: # %entry
2796 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
2797 ; RV32-NEXT:    lui a1, 16
2798 ; RV32-NEXT:    addi a1, a1, -1
2799 ; RV32-NEXT:    bltu a0, a1, .LBB40_2
2800 ; RV32-NEXT:  # %bb.1: # %entry
2801 ; RV32-NEXT:    mv a0, a1
2802 ; RV32-NEXT:  .LBB40_2: # %entry
2803 ; RV32-NEXT:    ret
2805 ; RV64-LABEL: utest_f32i16_mm:
2806 ; RV64:       # %bb.0: # %entry
2807 ; RV64-NEXT:    fcvt.wu.s a0, fa0, rtz
2808 ; RV64-NEXT:    lui a1, 16
2809 ; RV64-NEXT:    addiw a1, a1, -1
2810 ; RV64-NEXT:    bltu a0, a1, .LBB40_2
2811 ; RV64-NEXT:  # %bb.1: # %entry
2812 ; RV64-NEXT:    mv a0, a1
2813 ; RV64-NEXT:  .LBB40_2: # %entry
2814 ; RV64-NEXT:    ret
2815 entry:
2816   %conv = fptoui float %x to i32
2817   %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)
2818   %conv6 = trunc i32 %spec.store.select to i16
2819   ret i16 %conv6
2822 define i16 @ustest_f32i16_mm(float %x) {
2823 ; RV32-LABEL: ustest_f32i16_mm:
2824 ; RV32:       # %bb.0: # %entry
2825 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
2826 ; RV32-NEXT:    lui a1, 16
2827 ; RV32-NEXT:    addi a1, a1, -1
2828 ; RV32-NEXT:    blt a0, a1, .LBB41_2
2829 ; RV32-NEXT:  # %bb.1: # %entry
2830 ; RV32-NEXT:    mv a0, a1
2831 ; RV32-NEXT:  .LBB41_2: # %entry
2832 ; RV32-NEXT:    sgtz a1, a0
2833 ; RV32-NEXT:    neg a1, a1
2834 ; RV32-NEXT:    and a0, a1, a0
2835 ; RV32-NEXT:    ret
2837 ; RV64-LABEL: ustest_f32i16_mm:
2838 ; RV64:       # %bb.0: # %entry
2839 ; RV64-NEXT:    fcvt.w.s a0, fa0, rtz
2840 ; RV64-NEXT:    lui a1, 16
2841 ; RV64-NEXT:    addiw a1, a1, -1
2842 ; RV64-NEXT:    blt a0, a1, .LBB41_2
2843 ; RV64-NEXT:  # %bb.1: # %entry
2844 ; RV64-NEXT:    mv a0, a1
2845 ; RV64-NEXT:  .LBB41_2: # %entry
2846 ; RV64-NEXT:    sgtz a1, a0
2847 ; RV64-NEXT:    neg a1, a1
2848 ; RV64-NEXT:    and a0, a1, a0
2849 ; RV64-NEXT:    ret
2850 entry:
2851   %conv = fptosi float %x to i32
2852   %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)
2853   %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)
2854   %conv6 = trunc i32 %spec.store.select7 to i16
2855   ret i16 %conv6
2858 define i16 @stest_f16i16_mm(half %x) {
2859 ; RV32-LABEL: stest_f16i16_mm:
2860 ; RV32:       # %bb.0: # %entry
2861 ; RV32-NEXT:    addi sp, sp, -16
2862 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2863 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2864 ; RV32-NEXT:    .cfi_offset ra, -4
2865 ; RV32-NEXT:    call __extendhfsf2
2866 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
2867 ; RV32-NEXT:    lui a1, 8
2868 ; RV32-NEXT:    addi a1, a1, -1
2869 ; RV32-NEXT:    blt a0, a1, .LBB42_2
2870 ; RV32-NEXT:  # %bb.1: # %entry
2871 ; RV32-NEXT:    mv a0, a1
2872 ; RV32-NEXT:  .LBB42_2: # %entry
2873 ; RV32-NEXT:    lui a1, 1048568
2874 ; RV32-NEXT:    blt a1, a0, .LBB42_4
2875 ; RV32-NEXT:  # %bb.3: # %entry
2876 ; RV32-NEXT:    lui a0, 1048568
2877 ; RV32-NEXT:  .LBB42_4: # %entry
2878 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2879 ; RV32-NEXT:    .cfi_restore ra
2880 ; RV32-NEXT:    addi sp, sp, 16
2881 ; RV32-NEXT:    .cfi_def_cfa_offset 0
2882 ; RV32-NEXT:    ret
2884 ; RV64-LABEL: stest_f16i16_mm:
2885 ; RV64:       # %bb.0: # %entry
2886 ; RV64-NEXT:    addi sp, sp, -16
2887 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2888 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2889 ; RV64-NEXT:    .cfi_offset ra, -8
2890 ; RV64-NEXT:    call __extendhfsf2
2891 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
2892 ; RV64-NEXT:    lui a1, 8
2893 ; RV64-NEXT:    addiw a1, a1, -1
2894 ; RV64-NEXT:    blt a0, a1, .LBB42_2
2895 ; RV64-NEXT:  # %bb.1: # %entry
2896 ; RV64-NEXT:    mv a0, a1
2897 ; RV64-NEXT:  .LBB42_2: # %entry
2898 ; RV64-NEXT:    lui a1, 1048568
2899 ; RV64-NEXT:    blt a1, a0, .LBB42_4
2900 ; RV64-NEXT:  # %bb.3: # %entry
2901 ; RV64-NEXT:    lui a0, 1048568
2902 ; RV64-NEXT:  .LBB42_4: # %entry
2903 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2904 ; RV64-NEXT:    .cfi_restore ra
2905 ; RV64-NEXT:    addi sp, sp, 16
2906 ; RV64-NEXT:    .cfi_def_cfa_offset 0
2907 ; RV64-NEXT:    ret
2908 entry:
2909   %conv = fptosi half %x to i32
2910   %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)
2911   %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)
2912   %conv6 = trunc i32 %spec.store.select7 to i16
2913   ret i16 %conv6
2916 define i16 @utesth_f16i16_mm(half %x) {
2917 ; RV32-LABEL: utesth_f16i16_mm:
2918 ; RV32:       # %bb.0: # %entry
2919 ; RV32-NEXT:    addi sp, sp, -16
2920 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2921 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2922 ; RV32-NEXT:    .cfi_offset ra, -4
2923 ; RV32-NEXT:    call __extendhfsf2
2924 ; RV32-NEXT:    fcvt.wu.s a0, fa0, rtz
2925 ; RV32-NEXT:    lui a1, 16
2926 ; RV32-NEXT:    addi a1, a1, -1
2927 ; RV32-NEXT:    bltu a0, a1, .LBB43_2
2928 ; RV32-NEXT:  # %bb.1: # %entry
2929 ; RV32-NEXT:    mv a0, a1
2930 ; RV32-NEXT:  .LBB43_2: # %entry
2931 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2932 ; RV32-NEXT:    .cfi_restore ra
2933 ; RV32-NEXT:    addi sp, sp, 16
2934 ; RV32-NEXT:    .cfi_def_cfa_offset 0
2935 ; RV32-NEXT:    ret
2937 ; RV64-LABEL: utesth_f16i16_mm:
2938 ; RV64:       # %bb.0: # %entry
2939 ; RV64-NEXT:    addi sp, sp, -16
2940 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2941 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2942 ; RV64-NEXT:    .cfi_offset ra, -8
2943 ; RV64-NEXT:    call __extendhfsf2
2944 ; RV64-NEXT:    fcvt.lu.s a0, fa0, rtz
2945 ; RV64-NEXT:    lui a1, 16
2946 ; RV64-NEXT:    addiw a1, a1, -1
2947 ; RV64-NEXT:    bltu a0, a1, .LBB43_2
2948 ; RV64-NEXT:  # %bb.1: # %entry
2949 ; RV64-NEXT:    mv a0, a1
2950 ; RV64-NEXT:  .LBB43_2: # %entry
2951 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
2952 ; RV64-NEXT:    .cfi_restore ra
2953 ; RV64-NEXT:    addi sp, sp, 16
2954 ; RV64-NEXT:    .cfi_def_cfa_offset 0
2955 ; RV64-NEXT:    ret
2956 entry:
2957   %conv = fptoui half %x to i32
2958   %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)
2959   %conv6 = trunc i32 %spec.store.select to i16
2960   ret i16 %conv6
2963 define i16 @ustest_f16i16_mm(half %x) {
2964 ; RV32-LABEL: ustest_f16i16_mm:
2965 ; RV32:       # %bb.0: # %entry
2966 ; RV32-NEXT:    addi sp, sp, -16
2967 ; RV32-NEXT:    .cfi_def_cfa_offset 16
2968 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2969 ; RV32-NEXT:    .cfi_offset ra, -4
2970 ; RV32-NEXT:    call __extendhfsf2
2971 ; RV32-NEXT:    fcvt.w.s a0, fa0, rtz
2972 ; RV32-NEXT:    lui a1, 16
2973 ; RV32-NEXT:    addi a1, a1, -1
2974 ; RV32-NEXT:    blt a0, a1, .LBB44_2
2975 ; RV32-NEXT:  # %bb.1: # %entry
2976 ; RV32-NEXT:    mv a0, a1
2977 ; RV32-NEXT:  .LBB44_2: # %entry
2978 ; RV32-NEXT:    sgtz a1, a0
2979 ; RV32-NEXT:    neg a1, a1
2980 ; RV32-NEXT:    and a0, a1, a0
2981 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2982 ; RV32-NEXT:    .cfi_restore ra
2983 ; RV32-NEXT:    addi sp, sp, 16
2984 ; RV32-NEXT:    .cfi_def_cfa_offset 0
2985 ; RV32-NEXT:    ret
2987 ; RV64-LABEL: ustest_f16i16_mm:
2988 ; RV64:       # %bb.0: # %entry
2989 ; RV64-NEXT:    addi sp, sp, -16
2990 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2991 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
2992 ; RV64-NEXT:    .cfi_offset ra, -8
2993 ; RV64-NEXT:    call __extendhfsf2
2994 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
2995 ; RV64-NEXT:    lui a1, 16
2996 ; RV64-NEXT:    addiw a1, a1, -1
2997 ; RV64-NEXT:    blt a0, a1, .LBB44_2
2998 ; RV64-NEXT:  # %bb.1: # %entry
2999 ; RV64-NEXT:    mv a0, a1
3000 ; RV64-NEXT:  .LBB44_2: # %entry
3001 ; RV64-NEXT:    sgtz a1, a0
3002 ; RV64-NEXT:    neg a1, a1
3003 ; RV64-NEXT:    and a0, a1, a0
3004 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3005 ; RV64-NEXT:    .cfi_restore ra
3006 ; RV64-NEXT:    addi sp, sp, 16
3007 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3008 ; RV64-NEXT:    ret
3009 entry:
3010   %conv = fptosi half %x to i32
3011   %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)
3012   %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)
3013   %conv6 = trunc i32 %spec.store.select7 to i16
3014   ret i16 %conv6
3017 ; i64 saturate
3019 define i64 @stest_f64i64_mm(double %x) {
3020 ; RV32IF-LABEL: stest_f64i64_mm:
3021 ; RV32IF:       # %bb.0: # %entry
3022 ; RV32IF-NEXT:    addi sp, sp, -32
3023 ; RV32IF-NEXT:    .cfi_def_cfa_offset 32
3024 ; RV32IF-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3025 ; RV32IF-NEXT:    .cfi_offset ra, -4
3026 ; RV32IF-NEXT:    mv a2, a1
3027 ; RV32IF-NEXT:    mv a1, a0
3028 ; RV32IF-NEXT:    addi a0, sp, 8
3029 ; RV32IF-NEXT:    call __fixdfti
3030 ; RV32IF-NEXT:    lw a3, 8(sp)
3031 ; RV32IF-NEXT:    lw a1, 12(sp)
3032 ; RV32IF-NEXT:    lw a2, 16(sp)
3033 ; RV32IF-NEXT:    lw a4, 20(sp)
3034 ; RV32IF-NEXT:    lui a0, 524288
3035 ; RV32IF-NEXT:    addi a5, a0, -1
3036 ; RV32IF-NEXT:    beq a1, a5, .LBB45_2
3037 ; RV32IF-NEXT:  # %bb.1: # %entry
3038 ; RV32IF-NEXT:    sltu a6, a1, a5
3039 ; RV32IF-NEXT:    or a7, a2, a4
3040 ; RV32IF-NEXT:    bnez a7, .LBB45_3
3041 ; RV32IF-NEXT:    j .LBB45_4
3042 ; RV32IF-NEXT:  .LBB45_2:
3043 ; RV32IF-NEXT:    sltiu a6, a3, -1
3044 ; RV32IF-NEXT:    or a7, a2, a4
3045 ; RV32IF-NEXT:    beqz a7, .LBB45_4
3046 ; RV32IF-NEXT:  .LBB45_3: # %entry
3047 ; RV32IF-NEXT:    slti a6, a4, 0
3048 ; RV32IF-NEXT:  .LBB45_4: # %entry
3049 ; RV32IF-NEXT:    addi a7, a6, -1
3050 ; RV32IF-NEXT:    neg t0, a6
3051 ; RV32IF-NEXT:    bnez a6, .LBB45_6
3052 ; RV32IF-NEXT:  # %bb.5: # %entry
3053 ; RV32IF-NEXT:    mv a1, a5
3054 ; RV32IF-NEXT:  .LBB45_6: # %entry
3055 ; RV32IF-NEXT:    or a3, a7, a3
3056 ; RV32IF-NEXT:    and a4, t0, a4
3057 ; RV32IF-NEXT:    and a2, t0, a2
3058 ; RV32IF-NEXT:    beq a1, a0, .LBB45_8
3059 ; RV32IF-NEXT:  # %bb.7: # %entry
3060 ; RV32IF-NEXT:    sltu a0, a0, a1
3061 ; RV32IF-NEXT:    j .LBB45_9
3062 ; RV32IF-NEXT:  .LBB45_8:
3063 ; RV32IF-NEXT:    snez a0, a3
3064 ; RV32IF-NEXT:  .LBB45_9: # %entry
3065 ; RV32IF-NEXT:    and a2, a2, a4
3066 ; RV32IF-NEXT:    li a5, -1
3067 ; RV32IF-NEXT:    beq a2, a5, .LBB45_11
3068 ; RV32IF-NEXT:  # %bb.10: # %entry
3069 ; RV32IF-NEXT:    slti a0, a4, 0
3070 ; RV32IF-NEXT:    xori a0, a0, 1
3071 ; RV32IF-NEXT:  .LBB45_11: # %entry
3072 ; RV32IF-NEXT:    bnez a0, .LBB45_13
3073 ; RV32IF-NEXT:  # %bb.12: # %entry
3074 ; RV32IF-NEXT:    lui a1, 524288
3075 ; RV32IF-NEXT:  .LBB45_13: # %entry
3076 ; RV32IF-NEXT:    neg a0, a0
3077 ; RV32IF-NEXT:    and a0, a0, a3
3078 ; RV32IF-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3079 ; RV32IF-NEXT:    .cfi_restore ra
3080 ; RV32IF-NEXT:    addi sp, sp, 32
3081 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
3082 ; RV32IF-NEXT:    ret
3084 ; RV64IF-LABEL: stest_f64i64_mm:
3085 ; RV64IF:       # %bb.0: # %entry
3086 ; RV64IF-NEXT:    addi sp, sp, -16
3087 ; RV64IF-NEXT:    .cfi_def_cfa_offset 16
3088 ; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3089 ; RV64IF-NEXT:    .cfi_offset ra, -8
3090 ; RV64IF-NEXT:    call __fixdfti
3091 ; RV64IF-NEXT:    li a2, -1
3092 ; RV64IF-NEXT:    srli a3, a2, 1
3093 ; RV64IF-NEXT:    beqz a1, .LBB45_2
3094 ; RV64IF-NEXT:  # %bb.1: # %entry
3095 ; RV64IF-NEXT:    slti a4, a1, 0
3096 ; RV64IF-NEXT:    j .LBB45_3
3097 ; RV64IF-NEXT:  .LBB45_2:
3098 ; RV64IF-NEXT:    sltu a4, a0, a3
3099 ; RV64IF-NEXT:  .LBB45_3: # %entry
3100 ; RV64IF-NEXT:    neg a5, a4
3101 ; RV64IF-NEXT:    and a5, a5, a1
3102 ; RV64IF-NEXT:    bnez a4, .LBB45_5
3103 ; RV64IF-NEXT:  # %bb.4: # %entry
3104 ; RV64IF-NEXT:    mv a0, a3
3105 ; RV64IF-NEXT:  .LBB45_5: # %entry
3106 ; RV64IF-NEXT:    slli a1, a2, 63
3107 ; RV64IF-NEXT:    beq a5, a2, .LBB45_7
3108 ; RV64IF-NEXT:  # %bb.6: # %entry
3109 ; RV64IF-NEXT:    slti a2, a5, 0
3110 ; RV64IF-NEXT:    xori a2, a2, 1
3111 ; RV64IF-NEXT:    beqz a2, .LBB45_8
3112 ; RV64IF-NEXT:    j .LBB45_9
3113 ; RV64IF-NEXT:  .LBB45_7:
3114 ; RV64IF-NEXT:    sltu a2, a1, a0
3115 ; RV64IF-NEXT:    bnez a2, .LBB45_9
3116 ; RV64IF-NEXT:  .LBB45_8: # %entry
3117 ; RV64IF-NEXT:    mv a0, a1
3118 ; RV64IF-NEXT:  .LBB45_9: # %entry
3119 ; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3120 ; RV64IF-NEXT:    .cfi_restore ra
3121 ; RV64IF-NEXT:    addi sp, sp, 16
3122 ; RV64IF-NEXT:    .cfi_def_cfa_offset 0
3123 ; RV64IF-NEXT:    ret
3125 ; RV32IFD-LABEL: stest_f64i64_mm:
3126 ; RV32IFD:       # %bb.0: # %entry
3127 ; RV32IFD-NEXT:    addi sp, sp, -32
3128 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 32
3129 ; RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3130 ; RV32IFD-NEXT:    .cfi_offset ra, -4
3131 ; RV32IFD-NEXT:    addi a0, sp, 8
3132 ; RV32IFD-NEXT:    call __fixdfti
3133 ; RV32IFD-NEXT:    lw a3, 8(sp)
3134 ; RV32IFD-NEXT:    lw a1, 12(sp)
3135 ; RV32IFD-NEXT:    lw a2, 16(sp)
3136 ; RV32IFD-NEXT:    lw a4, 20(sp)
3137 ; RV32IFD-NEXT:    lui a0, 524288
3138 ; RV32IFD-NEXT:    addi a5, a0, -1
3139 ; RV32IFD-NEXT:    beq a1, a5, .LBB45_2
3140 ; RV32IFD-NEXT:  # %bb.1: # %entry
3141 ; RV32IFD-NEXT:    sltu a6, a1, a5
3142 ; RV32IFD-NEXT:    or a7, a2, a4
3143 ; RV32IFD-NEXT:    bnez a7, .LBB45_3
3144 ; RV32IFD-NEXT:    j .LBB45_4
3145 ; RV32IFD-NEXT:  .LBB45_2:
3146 ; RV32IFD-NEXT:    sltiu a6, a3, -1
3147 ; RV32IFD-NEXT:    or a7, a2, a4
3148 ; RV32IFD-NEXT:    beqz a7, .LBB45_4
3149 ; RV32IFD-NEXT:  .LBB45_3: # %entry
3150 ; RV32IFD-NEXT:    slti a6, a4, 0
3151 ; RV32IFD-NEXT:  .LBB45_4: # %entry
3152 ; RV32IFD-NEXT:    addi a7, a6, -1
3153 ; RV32IFD-NEXT:    neg t0, a6
3154 ; RV32IFD-NEXT:    bnez a6, .LBB45_6
3155 ; RV32IFD-NEXT:  # %bb.5: # %entry
3156 ; RV32IFD-NEXT:    mv a1, a5
3157 ; RV32IFD-NEXT:  .LBB45_6: # %entry
3158 ; RV32IFD-NEXT:    or a3, a7, a3
3159 ; RV32IFD-NEXT:    and a4, t0, a4
3160 ; RV32IFD-NEXT:    and a2, t0, a2
3161 ; RV32IFD-NEXT:    beq a1, a0, .LBB45_8
3162 ; RV32IFD-NEXT:  # %bb.7: # %entry
3163 ; RV32IFD-NEXT:    sltu a0, a0, a1
3164 ; RV32IFD-NEXT:    j .LBB45_9
3165 ; RV32IFD-NEXT:  .LBB45_8:
3166 ; RV32IFD-NEXT:    snez a0, a3
3167 ; RV32IFD-NEXT:  .LBB45_9: # %entry
3168 ; RV32IFD-NEXT:    and a2, a2, a4
3169 ; RV32IFD-NEXT:    li a5, -1
3170 ; RV32IFD-NEXT:    beq a2, a5, .LBB45_11
3171 ; RV32IFD-NEXT:  # %bb.10: # %entry
3172 ; RV32IFD-NEXT:    slti a0, a4, 0
3173 ; RV32IFD-NEXT:    xori a0, a0, 1
3174 ; RV32IFD-NEXT:  .LBB45_11: # %entry
3175 ; RV32IFD-NEXT:    bnez a0, .LBB45_13
3176 ; RV32IFD-NEXT:  # %bb.12: # %entry
3177 ; RV32IFD-NEXT:    lui a1, 524288
3178 ; RV32IFD-NEXT:  .LBB45_13: # %entry
3179 ; RV32IFD-NEXT:    neg a0, a0
3180 ; RV32IFD-NEXT:    and a0, a0, a3
3181 ; RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3182 ; RV32IFD-NEXT:    .cfi_restore ra
3183 ; RV32IFD-NEXT:    addi sp, sp, 32
3184 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 0
3185 ; RV32IFD-NEXT:    ret
3187 ; RV64IFD-LABEL: stest_f64i64_mm:
3188 ; RV64IFD:       # %bb.0: # %entry
3189 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
3190 ; RV64IFD-NEXT:    feq.d a1, fa0, fa0
3191 ; RV64IFD-NEXT:    seqz a1, a1
3192 ; RV64IFD-NEXT:    addi a1, a1, -1
3193 ; RV64IFD-NEXT:    and a0, a1, a0
3194 ; RV64IFD-NEXT:    ret
3195 entry:
3196   %conv = fptosi double %x to i128
3197   %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)
3198   %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)
3199   %conv6 = trunc i128 %spec.store.select7 to i64
3200   ret i64 %conv6
3203 define i64 @utest_f64i64_mm(double %x) {
3204 ; RV32IF-LABEL: utest_f64i64_mm:
3205 ; RV32IF:       # %bb.0: # %entry
3206 ; RV32IF-NEXT:    addi sp, sp, -32
3207 ; RV32IF-NEXT:    .cfi_def_cfa_offset 32
3208 ; RV32IF-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3209 ; RV32IF-NEXT:    .cfi_offset ra, -4
3210 ; RV32IF-NEXT:    mv a2, a1
3211 ; RV32IF-NEXT:    mv a1, a0
3212 ; RV32IF-NEXT:    addi a0, sp, 8
3213 ; RV32IF-NEXT:    call __fixunsdfti
3214 ; RV32IF-NEXT:    lw a0, 16(sp)
3215 ; RV32IF-NEXT:    lw a1, 20(sp)
3216 ; RV32IF-NEXT:    lw a2, 12(sp)
3217 ; RV32IF-NEXT:    lw a3, 8(sp)
3218 ; RV32IF-NEXT:    or a4, a1, a0
3219 ; RV32IF-NEXT:    xori a0, a0, 1
3220 ; RV32IF-NEXT:    seqz a4, a4
3221 ; RV32IF-NEXT:    or a0, a0, a1
3222 ; RV32IF-NEXT:    seqz a0, a0
3223 ; RV32IF-NEXT:    addi a0, a0, -1
3224 ; RV32IF-NEXT:    and a0, a0, a4
3225 ; RV32IF-NEXT:    neg a1, a0
3226 ; RV32IF-NEXT:    and a0, a1, a3
3227 ; RV32IF-NEXT:    and a1, a1, a2
3228 ; RV32IF-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3229 ; RV32IF-NEXT:    .cfi_restore ra
3230 ; RV32IF-NEXT:    addi sp, sp, 32
3231 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
3232 ; RV32IF-NEXT:    ret
3234 ; RV64-LABEL: utest_f64i64_mm:
3235 ; RV64:       # %bb.0: # %entry
3236 ; RV64-NEXT:    addi sp, sp, -16
3237 ; RV64-NEXT:    .cfi_def_cfa_offset 16
3238 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3239 ; RV64-NEXT:    .cfi_offset ra, -8
3240 ; RV64-NEXT:    call __fixunsdfti
3241 ; RV64-NEXT:    snez a1, a1
3242 ; RV64-NEXT:    addi a1, a1, -1
3243 ; RV64-NEXT:    and a0, a1, a0
3244 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3245 ; RV64-NEXT:    .cfi_restore ra
3246 ; RV64-NEXT:    addi sp, sp, 16
3247 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3248 ; RV64-NEXT:    ret
3250 ; RV32IFD-LABEL: utest_f64i64_mm:
3251 ; RV32IFD:       # %bb.0: # %entry
3252 ; RV32IFD-NEXT:    addi sp, sp, -32
3253 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 32
3254 ; RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3255 ; RV32IFD-NEXT:    .cfi_offset ra, -4
3256 ; RV32IFD-NEXT:    addi a0, sp, 8
3257 ; RV32IFD-NEXT:    call __fixunsdfti
3258 ; RV32IFD-NEXT:    lw a0, 16(sp)
3259 ; RV32IFD-NEXT:    lw a1, 20(sp)
3260 ; RV32IFD-NEXT:    lw a2, 12(sp)
3261 ; RV32IFD-NEXT:    lw a3, 8(sp)
3262 ; RV32IFD-NEXT:    or a4, a1, a0
3263 ; RV32IFD-NEXT:    xori a0, a0, 1
3264 ; RV32IFD-NEXT:    seqz a4, a4
3265 ; RV32IFD-NEXT:    or a0, a0, a1
3266 ; RV32IFD-NEXT:    seqz a0, a0
3267 ; RV32IFD-NEXT:    addi a0, a0, -1
3268 ; RV32IFD-NEXT:    and a0, a0, a4
3269 ; RV32IFD-NEXT:    neg a1, a0
3270 ; RV32IFD-NEXT:    and a0, a1, a3
3271 ; RV32IFD-NEXT:    and a1, a1, a2
3272 ; RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3273 ; RV32IFD-NEXT:    .cfi_restore ra
3274 ; RV32IFD-NEXT:    addi sp, sp, 32
3275 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 0
3276 ; RV32IFD-NEXT:    ret
3277 entry:
3278   %conv = fptoui double %x to i128
3279   %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)
3280   %conv6 = trunc i128 %spec.store.select to i64
3281   ret i64 %conv6
3284 define i64 @ustest_f64i64_mm(double %x) {
3285 ; RV32IF-LABEL: ustest_f64i64_mm:
3286 ; RV32IF:       # %bb.0: # %entry
3287 ; RV32IF-NEXT:    addi sp, sp, -32
3288 ; RV32IF-NEXT:    .cfi_def_cfa_offset 32
3289 ; RV32IF-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3290 ; RV32IF-NEXT:    .cfi_offset ra, -4
3291 ; RV32IF-NEXT:    mv a2, a1
3292 ; RV32IF-NEXT:    mv a1, a0
3293 ; RV32IF-NEXT:    addi a0, sp, 8
3294 ; RV32IF-NEXT:    call __fixdfti
3295 ; RV32IF-NEXT:    lw a0, 20(sp)
3296 ; RV32IF-NEXT:    lw a1, 8(sp)
3297 ; RV32IF-NEXT:    lw a2, 12(sp)
3298 ; RV32IF-NEXT:    lw a3, 16(sp)
3299 ; RV32IF-NEXT:    beqz a0, .LBB47_2
3300 ; RV32IF-NEXT:  # %bb.1: # %entry
3301 ; RV32IF-NEXT:    slti a4, a0, 0
3302 ; RV32IF-NEXT:    j .LBB47_3
3303 ; RV32IF-NEXT:  .LBB47_2:
3304 ; RV32IF-NEXT:    seqz a4, a3
3305 ; RV32IF-NEXT:  .LBB47_3: # %entry
3306 ; RV32IF-NEXT:    xori a3, a3, 1
3307 ; RV32IF-NEXT:    or a3, a3, a0
3308 ; RV32IF-NEXT:    seqz a3, a3
3309 ; RV32IF-NEXT:    addi a3, a3, -1
3310 ; RV32IF-NEXT:    and a3, a3, a4
3311 ; RV32IF-NEXT:    neg a3, a3
3312 ; RV32IF-NEXT:    and a2, a3, a2
3313 ; RV32IF-NEXT:    and a1, a3, a1
3314 ; RV32IF-NEXT:    and a0, a3, a0
3315 ; RV32IF-NEXT:    slti a0, a0, 0
3316 ; RV32IF-NEXT:    addi a3, a0, -1
3317 ; RV32IF-NEXT:    and a0, a3, a1
3318 ; RV32IF-NEXT:    and a1, a3, a2
3319 ; RV32IF-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3320 ; RV32IF-NEXT:    .cfi_restore ra
3321 ; RV32IF-NEXT:    addi sp, sp, 32
3322 ; RV32IF-NEXT:    .cfi_def_cfa_offset 0
3323 ; RV32IF-NEXT:    ret
3325 ; RV64-LABEL: ustest_f64i64_mm:
3326 ; RV64:       # %bb.0: # %entry
3327 ; RV64-NEXT:    addi sp, sp, -16
3328 ; RV64-NEXT:    .cfi_def_cfa_offset 16
3329 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3330 ; RV64-NEXT:    .cfi_offset ra, -8
3331 ; RV64-NEXT:    call __fixdfti
3332 ; RV64-NEXT:    mv a2, a1
3333 ; RV64-NEXT:    blez a1, .LBB47_2
3334 ; RV64-NEXT:  # %bb.1: # %entry
3335 ; RV64-NEXT:    li a2, 1
3336 ; RV64-NEXT:  .LBB47_2: # %entry
3337 ; RV64-NEXT:    slti a1, a1, 1
3338 ; RV64-NEXT:    slti a2, a2, 0
3339 ; RV64-NEXT:    neg a1, a1
3340 ; RV64-NEXT:    and a0, a1, a0
3341 ; RV64-NEXT:    addi a2, a2, -1
3342 ; RV64-NEXT:    and a0, a2, a0
3343 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3344 ; RV64-NEXT:    .cfi_restore ra
3345 ; RV64-NEXT:    addi sp, sp, 16
3346 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3347 ; RV64-NEXT:    ret
3349 ; RV32IFD-LABEL: ustest_f64i64_mm:
3350 ; RV32IFD:       # %bb.0: # %entry
3351 ; RV32IFD-NEXT:    addi sp, sp, -32
3352 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 32
3353 ; RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3354 ; RV32IFD-NEXT:    .cfi_offset ra, -4
3355 ; RV32IFD-NEXT:    addi a0, sp, 8
3356 ; RV32IFD-NEXT:    call __fixdfti
3357 ; RV32IFD-NEXT:    lw a0, 20(sp)
3358 ; RV32IFD-NEXT:    lw a1, 8(sp)
3359 ; RV32IFD-NEXT:    lw a2, 12(sp)
3360 ; RV32IFD-NEXT:    lw a3, 16(sp)
3361 ; RV32IFD-NEXT:    beqz a0, .LBB47_2
3362 ; RV32IFD-NEXT:  # %bb.1: # %entry
3363 ; RV32IFD-NEXT:    slti a4, a0, 0
3364 ; RV32IFD-NEXT:    j .LBB47_3
3365 ; RV32IFD-NEXT:  .LBB47_2:
3366 ; RV32IFD-NEXT:    seqz a4, a3
3367 ; RV32IFD-NEXT:  .LBB47_3: # %entry
3368 ; RV32IFD-NEXT:    xori a3, a3, 1
3369 ; RV32IFD-NEXT:    or a3, a3, a0
3370 ; RV32IFD-NEXT:    seqz a3, a3
3371 ; RV32IFD-NEXT:    addi a3, a3, -1
3372 ; RV32IFD-NEXT:    and a3, a3, a4
3373 ; RV32IFD-NEXT:    neg a3, a3
3374 ; RV32IFD-NEXT:    and a2, a3, a2
3375 ; RV32IFD-NEXT:    and a1, a3, a1
3376 ; RV32IFD-NEXT:    and a0, a3, a0
3377 ; RV32IFD-NEXT:    slti a0, a0, 0
3378 ; RV32IFD-NEXT:    addi a3, a0, -1
3379 ; RV32IFD-NEXT:    and a0, a3, a1
3380 ; RV32IFD-NEXT:    and a1, a3, a2
3381 ; RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3382 ; RV32IFD-NEXT:    .cfi_restore ra
3383 ; RV32IFD-NEXT:    addi sp, sp, 32
3384 ; RV32IFD-NEXT:    .cfi_def_cfa_offset 0
3385 ; RV32IFD-NEXT:    ret
3386 entry:
3387   %conv = fptosi double %x to i128
3388   %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)
3389   %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)
3390   %conv6 = trunc i128 %spec.store.select7 to i64
3391   ret i64 %conv6
3394 define i64 @stest_f32i64_mm(float %x) {
3395 ; RV32-LABEL: stest_f32i64_mm:
3396 ; RV32:       # %bb.0: # %entry
3397 ; RV32-NEXT:    addi sp, sp, -32
3398 ; RV32-NEXT:    .cfi_def_cfa_offset 32
3399 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3400 ; RV32-NEXT:    .cfi_offset ra, -4
3401 ; RV32-NEXT:    addi a0, sp, 8
3402 ; RV32-NEXT:    call __fixsfti
3403 ; RV32-NEXT:    lw a3, 8(sp)
3404 ; RV32-NEXT:    lw a1, 12(sp)
3405 ; RV32-NEXT:    lw a2, 16(sp)
3406 ; RV32-NEXT:    lw a4, 20(sp)
3407 ; RV32-NEXT:    lui a0, 524288
3408 ; RV32-NEXT:    addi a5, a0, -1
3409 ; RV32-NEXT:    beq a1, a5, .LBB48_2
3410 ; RV32-NEXT:  # %bb.1: # %entry
3411 ; RV32-NEXT:    sltu a6, a1, a5
3412 ; RV32-NEXT:    or a7, a2, a4
3413 ; RV32-NEXT:    bnez a7, .LBB48_3
3414 ; RV32-NEXT:    j .LBB48_4
3415 ; RV32-NEXT:  .LBB48_2:
3416 ; RV32-NEXT:    sltiu a6, a3, -1
3417 ; RV32-NEXT:    or a7, a2, a4
3418 ; RV32-NEXT:    beqz a7, .LBB48_4
3419 ; RV32-NEXT:  .LBB48_3: # %entry
3420 ; RV32-NEXT:    slti a6, a4, 0
3421 ; RV32-NEXT:  .LBB48_4: # %entry
3422 ; RV32-NEXT:    addi a7, a6, -1
3423 ; RV32-NEXT:    neg t0, a6
3424 ; RV32-NEXT:    bnez a6, .LBB48_6
3425 ; RV32-NEXT:  # %bb.5: # %entry
3426 ; RV32-NEXT:    mv a1, a5
3427 ; RV32-NEXT:  .LBB48_6: # %entry
3428 ; RV32-NEXT:    or a3, a7, a3
3429 ; RV32-NEXT:    and a4, t0, a4
3430 ; RV32-NEXT:    and a2, t0, a2
3431 ; RV32-NEXT:    beq a1, a0, .LBB48_8
3432 ; RV32-NEXT:  # %bb.7: # %entry
3433 ; RV32-NEXT:    sltu a0, a0, a1
3434 ; RV32-NEXT:    j .LBB48_9
3435 ; RV32-NEXT:  .LBB48_8:
3436 ; RV32-NEXT:    snez a0, a3
3437 ; RV32-NEXT:  .LBB48_9: # %entry
3438 ; RV32-NEXT:    and a2, a2, a4
3439 ; RV32-NEXT:    li a5, -1
3440 ; RV32-NEXT:    beq a2, a5, .LBB48_11
3441 ; RV32-NEXT:  # %bb.10: # %entry
3442 ; RV32-NEXT:    slti a0, a4, 0
3443 ; RV32-NEXT:    xori a0, a0, 1
3444 ; RV32-NEXT:  .LBB48_11: # %entry
3445 ; RV32-NEXT:    bnez a0, .LBB48_13
3446 ; RV32-NEXT:  # %bb.12: # %entry
3447 ; RV32-NEXT:    lui a1, 524288
3448 ; RV32-NEXT:  .LBB48_13: # %entry
3449 ; RV32-NEXT:    neg a0, a0
3450 ; RV32-NEXT:    and a0, a0, a3
3451 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3452 ; RV32-NEXT:    .cfi_restore ra
3453 ; RV32-NEXT:    addi sp, sp, 32
3454 ; RV32-NEXT:    .cfi_def_cfa_offset 0
3455 ; RV32-NEXT:    ret
3457 ; RV64-LABEL: stest_f32i64_mm:
3458 ; RV64:       # %bb.0: # %entry
3459 ; RV64-NEXT:    fcvt.l.s a0, fa0, rtz
3460 ; RV64-NEXT:    feq.s a1, fa0, fa0
3461 ; RV64-NEXT:    seqz a1, a1
3462 ; RV64-NEXT:    addi a1, a1, -1
3463 ; RV64-NEXT:    and a0, a1, a0
3464 ; RV64-NEXT:    ret
3465 entry:
3466   %conv = fptosi float %x to i128
3467   %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)
3468   %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)
3469   %conv6 = trunc i128 %spec.store.select7 to i64
3470   ret i64 %conv6
3473 define i64 @utest_f32i64_mm(float %x) {
3474 ; RV32-LABEL: utest_f32i64_mm:
3475 ; RV32:       # %bb.0: # %entry
3476 ; RV32-NEXT:    addi sp, sp, -32
3477 ; RV32-NEXT:    .cfi_def_cfa_offset 32
3478 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3479 ; RV32-NEXT:    .cfi_offset ra, -4
3480 ; RV32-NEXT:    addi a0, sp, 8
3481 ; RV32-NEXT:    call __fixunssfti
3482 ; RV32-NEXT:    lw a0, 16(sp)
3483 ; RV32-NEXT:    lw a1, 20(sp)
3484 ; RV32-NEXT:    lw a2, 12(sp)
3485 ; RV32-NEXT:    lw a3, 8(sp)
3486 ; RV32-NEXT:    or a4, a1, a0
3487 ; RV32-NEXT:    xori a0, a0, 1
3488 ; RV32-NEXT:    seqz a4, a4
3489 ; RV32-NEXT:    or a0, a0, a1
3490 ; RV32-NEXT:    seqz a0, a0
3491 ; RV32-NEXT:    addi a0, a0, -1
3492 ; RV32-NEXT:    and a0, a0, a4
3493 ; RV32-NEXT:    neg a1, a0
3494 ; RV32-NEXT:    and a0, a1, a3
3495 ; RV32-NEXT:    and a1, a1, a2
3496 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3497 ; RV32-NEXT:    .cfi_restore ra
3498 ; RV32-NEXT:    addi sp, sp, 32
3499 ; RV32-NEXT:    .cfi_def_cfa_offset 0
3500 ; RV32-NEXT:    ret
3502 ; RV64-LABEL: utest_f32i64_mm:
3503 ; RV64:       # %bb.0: # %entry
3504 ; RV64-NEXT:    addi sp, sp, -16
3505 ; RV64-NEXT:    .cfi_def_cfa_offset 16
3506 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3507 ; RV64-NEXT:    .cfi_offset ra, -8
3508 ; RV64-NEXT:    call __fixunssfti
3509 ; RV64-NEXT:    snez a1, a1
3510 ; RV64-NEXT:    addi a1, a1, -1
3511 ; RV64-NEXT:    and a0, a1, a0
3512 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3513 ; RV64-NEXT:    .cfi_restore ra
3514 ; RV64-NEXT:    addi sp, sp, 16
3515 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3516 ; RV64-NEXT:    ret
3517 entry:
3518   %conv = fptoui float %x to i128
3519   %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)
3520   %conv6 = trunc i128 %spec.store.select to i64
3521   ret i64 %conv6
3524 define i64 @ustest_f32i64_mm(float %x) {
3525 ; RV32-LABEL: ustest_f32i64_mm:
3526 ; RV32:       # %bb.0: # %entry
3527 ; RV32-NEXT:    addi sp, sp, -32
3528 ; RV32-NEXT:    .cfi_def_cfa_offset 32
3529 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3530 ; RV32-NEXT:    .cfi_offset ra, -4
3531 ; RV32-NEXT:    addi a0, sp, 8
3532 ; RV32-NEXT:    call __fixsfti
3533 ; RV32-NEXT:    lw a0, 20(sp)
3534 ; RV32-NEXT:    lw a1, 8(sp)
3535 ; RV32-NEXT:    lw a2, 12(sp)
3536 ; RV32-NEXT:    lw a3, 16(sp)
3537 ; RV32-NEXT:    beqz a0, .LBB50_2
3538 ; RV32-NEXT:  # %bb.1: # %entry
3539 ; RV32-NEXT:    slti a4, a0, 0
3540 ; RV32-NEXT:    j .LBB50_3
3541 ; RV32-NEXT:  .LBB50_2:
3542 ; RV32-NEXT:    seqz a4, a3
3543 ; RV32-NEXT:  .LBB50_3: # %entry
3544 ; RV32-NEXT:    xori a3, a3, 1
3545 ; RV32-NEXT:    or a3, a3, a0
3546 ; RV32-NEXT:    seqz a3, a3
3547 ; RV32-NEXT:    addi a3, a3, -1
3548 ; RV32-NEXT:    and a3, a3, a4
3549 ; RV32-NEXT:    neg a3, a3
3550 ; RV32-NEXT:    and a2, a3, a2
3551 ; RV32-NEXT:    and a1, a3, a1
3552 ; RV32-NEXT:    and a0, a3, a0
3553 ; RV32-NEXT:    slti a0, a0, 0
3554 ; RV32-NEXT:    addi a3, a0, -1
3555 ; RV32-NEXT:    and a0, a3, a1
3556 ; RV32-NEXT:    and a1, a3, a2
3557 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3558 ; RV32-NEXT:    .cfi_restore ra
3559 ; RV32-NEXT:    addi sp, sp, 32
3560 ; RV32-NEXT:    .cfi_def_cfa_offset 0
3561 ; RV32-NEXT:    ret
3563 ; RV64-LABEL: ustest_f32i64_mm:
3564 ; RV64:       # %bb.0: # %entry
3565 ; RV64-NEXT:    addi sp, sp, -16
3566 ; RV64-NEXT:    .cfi_def_cfa_offset 16
3567 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3568 ; RV64-NEXT:    .cfi_offset ra, -8
3569 ; RV64-NEXT:    call __fixsfti
3570 ; RV64-NEXT:    mv a2, a1
3571 ; RV64-NEXT:    blez a1, .LBB50_2
3572 ; RV64-NEXT:  # %bb.1: # %entry
3573 ; RV64-NEXT:    li a2, 1
3574 ; RV64-NEXT:  .LBB50_2: # %entry
3575 ; RV64-NEXT:    slti a1, a1, 1
3576 ; RV64-NEXT:    slti a2, a2, 0
3577 ; RV64-NEXT:    neg a1, a1
3578 ; RV64-NEXT:    and a0, a1, a0
3579 ; RV64-NEXT:    addi a2, a2, -1
3580 ; RV64-NEXT:    and a0, a2, a0
3581 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3582 ; RV64-NEXT:    .cfi_restore ra
3583 ; RV64-NEXT:    addi sp, sp, 16
3584 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3585 ; RV64-NEXT:    ret
3586 entry:
3587   %conv = fptosi float %x to i128
3588   %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)
3589   %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)
3590   %conv6 = trunc i128 %spec.store.select7 to i64
3591   ret i64 %conv6
3594 define i64 @stest_f16i64_mm(half %x) {
3595 ; RV32-LABEL: stest_f16i64_mm:
3596 ; RV32:       # %bb.0: # %entry
3597 ; RV32-NEXT:    addi sp, sp, -32
3598 ; RV32-NEXT:    .cfi_def_cfa_offset 32
3599 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3600 ; RV32-NEXT:    .cfi_offset ra, -4
3601 ; RV32-NEXT:    call __extendhfsf2
3602 ; RV32-NEXT:    addi a0, sp, 8
3603 ; RV32-NEXT:    call __fixsfti
3604 ; RV32-NEXT:    lw a3, 8(sp)
3605 ; RV32-NEXT:    lw a1, 12(sp)
3606 ; RV32-NEXT:    lw a2, 16(sp)
3607 ; RV32-NEXT:    lw a4, 20(sp)
3608 ; RV32-NEXT:    lui a0, 524288
3609 ; RV32-NEXT:    addi a5, a0, -1
3610 ; RV32-NEXT:    beq a1, a5, .LBB51_2
3611 ; RV32-NEXT:  # %bb.1: # %entry
3612 ; RV32-NEXT:    sltu a6, a1, a5
3613 ; RV32-NEXT:    or a7, a2, a4
3614 ; RV32-NEXT:    bnez a7, .LBB51_3
3615 ; RV32-NEXT:    j .LBB51_4
3616 ; RV32-NEXT:  .LBB51_2:
3617 ; RV32-NEXT:    sltiu a6, a3, -1
3618 ; RV32-NEXT:    or a7, a2, a4
3619 ; RV32-NEXT:    beqz a7, .LBB51_4
3620 ; RV32-NEXT:  .LBB51_3: # %entry
3621 ; RV32-NEXT:    slti a6, a4, 0
3622 ; RV32-NEXT:  .LBB51_4: # %entry
3623 ; RV32-NEXT:    addi a7, a6, -1
3624 ; RV32-NEXT:    neg t0, a6
3625 ; RV32-NEXT:    bnez a6, .LBB51_6
3626 ; RV32-NEXT:  # %bb.5: # %entry
3627 ; RV32-NEXT:    mv a1, a5
3628 ; RV32-NEXT:  .LBB51_6: # %entry
3629 ; RV32-NEXT:    or a3, a7, a3
3630 ; RV32-NEXT:    and a4, t0, a4
3631 ; RV32-NEXT:    and a2, t0, a2
3632 ; RV32-NEXT:    beq a1, a0, .LBB51_8
3633 ; RV32-NEXT:  # %bb.7: # %entry
3634 ; RV32-NEXT:    sltu a0, a0, a1
3635 ; RV32-NEXT:    j .LBB51_9
3636 ; RV32-NEXT:  .LBB51_8:
3637 ; RV32-NEXT:    snez a0, a3
3638 ; RV32-NEXT:  .LBB51_9: # %entry
3639 ; RV32-NEXT:    and a2, a2, a4
3640 ; RV32-NEXT:    li a5, -1
3641 ; RV32-NEXT:    beq a2, a5, .LBB51_11
3642 ; RV32-NEXT:  # %bb.10: # %entry
3643 ; RV32-NEXT:    slti a0, a4, 0
3644 ; RV32-NEXT:    xori a0, a0, 1
3645 ; RV32-NEXT:  .LBB51_11: # %entry
3646 ; RV32-NEXT:    bnez a0, .LBB51_13
3647 ; RV32-NEXT:  # %bb.12: # %entry
3648 ; RV32-NEXT:    lui a1, 524288
3649 ; RV32-NEXT:  .LBB51_13: # %entry
3650 ; RV32-NEXT:    neg a0, a0
3651 ; RV32-NEXT:    and a0, a0, a3
3652 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3653 ; RV32-NEXT:    .cfi_restore ra
3654 ; RV32-NEXT:    addi sp, sp, 32
3655 ; RV32-NEXT:    .cfi_def_cfa_offset 0
3656 ; RV32-NEXT:    ret
3658 ; RV64-LABEL: stest_f16i64_mm:
3659 ; RV64:       # %bb.0: # %entry
3660 ; RV64-NEXT:    addi sp, sp, -16
3661 ; RV64-NEXT:    .cfi_def_cfa_offset 16
3662 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3663 ; RV64-NEXT:    .cfi_offset ra, -8
3664 ; RV64-NEXT:    call __extendhfsf2
3665 ; RV64-NEXT:    call __fixsfti
3666 ; RV64-NEXT:    li a2, -1
3667 ; RV64-NEXT:    srli a3, a2, 1
3668 ; RV64-NEXT:    beqz a1, .LBB51_2
3669 ; RV64-NEXT:  # %bb.1: # %entry
3670 ; RV64-NEXT:    slti a4, a1, 0
3671 ; RV64-NEXT:    j .LBB51_3
3672 ; RV64-NEXT:  .LBB51_2:
3673 ; RV64-NEXT:    sltu a4, a0, a3
3674 ; RV64-NEXT:  .LBB51_3: # %entry
3675 ; RV64-NEXT:    neg a5, a4
3676 ; RV64-NEXT:    and a5, a5, a1
3677 ; RV64-NEXT:    bnez a4, .LBB51_5
3678 ; RV64-NEXT:  # %bb.4: # %entry
3679 ; RV64-NEXT:    mv a0, a3
3680 ; RV64-NEXT:  .LBB51_5: # %entry
3681 ; RV64-NEXT:    slli a1, a2, 63
3682 ; RV64-NEXT:    beq a5, a2, .LBB51_7
3683 ; RV64-NEXT:  # %bb.6: # %entry
3684 ; RV64-NEXT:    slti a2, a5, 0
3685 ; RV64-NEXT:    xori a2, a2, 1
3686 ; RV64-NEXT:    beqz a2, .LBB51_8
3687 ; RV64-NEXT:    j .LBB51_9
3688 ; RV64-NEXT:  .LBB51_7:
3689 ; RV64-NEXT:    sltu a2, a1, a0
3690 ; RV64-NEXT:    bnez a2, .LBB51_9
3691 ; RV64-NEXT:  .LBB51_8: # %entry
3692 ; RV64-NEXT:    mv a0, a1
3693 ; RV64-NEXT:  .LBB51_9: # %entry
3694 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3695 ; RV64-NEXT:    .cfi_restore ra
3696 ; RV64-NEXT:    addi sp, sp, 16
3697 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3698 ; RV64-NEXT:    ret
3699 entry:
3700   %conv = fptosi half %x to i128
3701   %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)
3702   %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)
3703   %conv6 = trunc i128 %spec.store.select7 to i64
3704   ret i64 %conv6
3707 define i64 @utesth_f16i64_mm(half %x) {
3708 ; RV32-LABEL: utesth_f16i64_mm:
3709 ; RV32:       # %bb.0: # %entry
3710 ; RV32-NEXT:    addi sp, sp, -32
3711 ; RV32-NEXT:    .cfi_def_cfa_offset 32
3712 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3713 ; RV32-NEXT:    .cfi_offset ra, -4
3714 ; RV32-NEXT:    call __extendhfsf2
3715 ; RV32-NEXT:    addi a0, sp, 8
3716 ; RV32-NEXT:    call __fixunssfti
3717 ; RV32-NEXT:    lw a0, 16(sp)
3718 ; RV32-NEXT:    lw a1, 20(sp)
3719 ; RV32-NEXT:    lw a2, 12(sp)
3720 ; RV32-NEXT:    lw a3, 8(sp)
3721 ; RV32-NEXT:    or a4, a1, a0
3722 ; RV32-NEXT:    xori a0, a0, 1
3723 ; RV32-NEXT:    seqz a4, a4
3724 ; RV32-NEXT:    or a0, a0, a1
3725 ; RV32-NEXT:    seqz a0, a0
3726 ; RV32-NEXT:    addi a0, a0, -1
3727 ; RV32-NEXT:    and a0, a0, a4
3728 ; RV32-NEXT:    neg a1, a0
3729 ; RV32-NEXT:    and a0, a1, a3
3730 ; RV32-NEXT:    and a1, a1, a2
3731 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3732 ; RV32-NEXT:    .cfi_restore ra
3733 ; RV32-NEXT:    addi sp, sp, 32
3734 ; RV32-NEXT:    .cfi_def_cfa_offset 0
3735 ; RV32-NEXT:    ret
3737 ; RV64-LABEL: utesth_f16i64_mm:
3738 ; RV64:       # %bb.0: # %entry
3739 ; RV64-NEXT:    addi sp, sp, -16
3740 ; RV64-NEXT:    .cfi_def_cfa_offset 16
3741 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3742 ; RV64-NEXT:    .cfi_offset ra, -8
3743 ; RV64-NEXT:    call __extendhfsf2
3744 ; RV64-NEXT:    call __fixunssfti
3745 ; RV64-NEXT:    snez a1, a1
3746 ; RV64-NEXT:    addi a1, a1, -1
3747 ; RV64-NEXT:    and a0, a1, a0
3748 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3749 ; RV64-NEXT:    .cfi_restore ra
3750 ; RV64-NEXT:    addi sp, sp, 16
3751 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3752 ; RV64-NEXT:    ret
3753 entry:
3754   %conv = fptoui half %x to i128
3755   %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)
3756   %conv6 = trunc i128 %spec.store.select to i64
3757   ret i64 %conv6
3760 define i64 @ustest_f16i64_mm(half %x) {
3761 ; RV32-LABEL: ustest_f16i64_mm:
3762 ; RV32:       # %bb.0: # %entry
3763 ; RV32-NEXT:    addi sp, sp, -32
3764 ; RV32-NEXT:    .cfi_def_cfa_offset 32
3765 ; RV32-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
3766 ; RV32-NEXT:    .cfi_offset ra, -4
3767 ; RV32-NEXT:    call __extendhfsf2
3768 ; RV32-NEXT:    addi a0, sp, 8
3769 ; RV32-NEXT:    call __fixsfti
3770 ; RV32-NEXT:    lw a0, 20(sp)
3771 ; RV32-NEXT:    lw a1, 8(sp)
3772 ; RV32-NEXT:    lw a2, 12(sp)
3773 ; RV32-NEXT:    lw a3, 16(sp)
3774 ; RV32-NEXT:    beqz a0, .LBB53_2
3775 ; RV32-NEXT:  # %bb.1: # %entry
3776 ; RV32-NEXT:    slti a4, a0, 0
3777 ; RV32-NEXT:    j .LBB53_3
3778 ; RV32-NEXT:  .LBB53_2:
3779 ; RV32-NEXT:    seqz a4, a3
3780 ; RV32-NEXT:  .LBB53_3: # %entry
3781 ; RV32-NEXT:    xori a3, a3, 1
3782 ; RV32-NEXT:    or a3, a3, a0
3783 ; RV32-NEXT:    seqz a3, a3
3784 ; RV32-NEXT:    addi a3, a3, -1
3785 ; RV32-NEXT:    and a3, a3, a4
3786 ; RV32-NEXT:    neg a3, a3
3787 ; RV32-NEXT:    and a2, a3, a2
3788 ; RV32-NEXT:    and a1, a3, a1
3789 ; RV32-NEXT:    and a0, a3, a0
3790 ; RV32-NEXT:    slti a0, a0, 0
3791 ; RV32-NEXT:    addi a3, a0, -1
3792 ; RV32-NEXT:    and a0, a3, a1
3793 ; RV32-NEXT:    and a1, a3, a2
3794 ; RV32-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
3795 ; RV32-NEXT:    .cfi_restore ra
3796 ; RV32-NEXT:    addi sp, sp, 32
3797 ; RV32-NEXT:    .cfi_def_cfa_offset 0
3798 ; RV32-NEXT:    ret
3800 ; RV64-LABEL: ustest_f16i64_mm:
3801 ; RV64:       # %bb.0: # %entry
3802 ; RV64-NEXT:    addi sp, sp, -16
3803 ; RV64-NEXT:    .cfi_def_cfa_offset 16
3804 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
3805 ; RV64-NEXT:    .cfi_offset ra, -8
3806 ; RV64-NEXT:    call __extendhfsf2
3807 ; RV64-NEXT:    call __fixsfti
3808 ; RV64-NEXT:    mv a2, a1
3809 ; RV64-NEXT:    blez a1, .LBB53_2
3810 ; RV64-NEXT:  # %bb.1: # %entry
3811 ; RV64-NEXT:    li a2, 1
3812 ; RV64-NEXT:  .LBB53_2: # %entry
3813 ; RV64-NEXT:    slti a1, a1, 1
3814 ; RV64-NEXT:    slti a2, a2, 0
3815 ; RV64-NEXT:    neg a1, a1
3816 ; RV64-NEXT:    and a0, a1, a0
3817 ; RV64-NEXT:    addi a2, a2, -1
3818 ; RV64-NEXT:    and a0, a2, a0
3819 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
3820 ; RV64-NEXT:    .cfi_restore ra
3821 ; RV64-NEXT:    addi sp, sp, 16
3822 ; RV64-NEXT:    .cfi_def_cfa_offset 0
3823 ; RV64-NEXT:    ret
3824 entry:
3825   %conv = fptosi half %x to i128
3826   %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)
3827   %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)
3828   %conv6 = trunc i128 %spec.store.select7 to i64
3829   ret i64 %conv6
3832 declare i32 @llvm.smin.i32(i32, i32)
3833 declare i32 @llvm.smax.i32(i32, i32)
3834 declare i32 @llvm.umin.i32(i32, i32)
3835 declare i64 @llvm.smin.i64(i64, i64)
3836 declare i64 @llvm.smax.i64(i64, i64)
3837 declare i64 @llvm.umin.i64(i64, i64)
3838 declare i128 @llvm.smin.i128(i128, i128)
3839 declare i128 @llvm.smax.i128(i128, i128)
3840 declare i128 @llvm.umin.i128(i128, i128)