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