xref: /llvm-project/llvm/test/CodeGen/RISCV/fp-fcanonicalize.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; FIXME: @llvm.canonicalize doesn't support soft-float abi yet.
3; RUN: llc --mtriple=riscv64 --mattr=+d,+zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-FP16-RV64
4; RUN: llc --mtriple=riscv64 --mattr=+d,-zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16-RV64
5; RUN: llc --mtriple=riscv32 --mattr=+d,+zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-FP16-RV32
6; RUN: llc --mtriple=riscv32 --mattr=+d,-zfh < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16-RV32
7
8declare half @llvm.fcanonicalize.f16(half)
9declare float @llvm.fcanonicalize.f32(float)
10declare double @llvm.fcanonicalize.f64(double)
11
12define half @fcanonicalize_f16(half %x) {
13; CHECK-FP16-RV64-LABEL: fcanonicalize_f16:
14; CHECK-FP16-RV64:       # %bb.0:
15; CHECK-FP16-RV64-NEXT:    fmin.h fa0, fa0, fa0
16; CHECK-FP16-RV64-NEXT:    ret
17;
18; CHECK-NOFP16-RV64-LABEL: fcanonicalize_f16:
19; CHECK-NOFP16-RV64:       # %bb.0:
20; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -16
21; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 16
22; CHECK-NOFP16-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
23; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
24; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
25; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
26; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
27; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a0, fa0
28; CHECK-NOFP16-RV64-NEXT:    lui a1, 1048560
29; CHECK-NOFP16-RV64-NEXT:    or a0, a0, a1
30; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a0
31; CHECK-NOFP16-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
32; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
33; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 16
34; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
35; CHECK-NOFP16-RV64-NEXT:    ret
36;
37; CHECK-FP16-RV32-LABEL: fcanonicalize_f16:
38; CHECK-FP16-RV32:       # %bb.0:
39; CHECK-FP16-RV32-NEXT:    fmin.h fa0, fa0, fa0
40; CHECK-FP16-RV32-NEXT:    ret
41;
42; CHECK-NOFP16-RV32-LABEL: fcanonicalize_f16:
43; CHECK-NOFP16-RV32:       # %bb.0:
44; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -16
45; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 16
46; CHECK-NOFP16-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
47; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
48; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
49; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
50; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
51; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a0, fa0
52; CHECK-NOFP16-RV32-NEXT:    lui a1, 1048560
53; CHECK-NOFP16-RV32-NEXT:    or a0, a0, a1
54; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a0
55; CHECK-NOFP16-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
56; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
57; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 16
58; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
59; CHECK-NOFP16-RV32-NEXT:    ret
60  %z = call half @llvm.canonicalize.f16(half %x)
61  ret half %z
62}
63
64define half @fcanonicalize_f16_nnan(half %x) {
65; CHECK-FP16-RV64-LABEL: fcanonicalize_f16_nnan:
66; CHECK-FP16-RV64:       # %bb.0:
67; CHECK-FP16-RV64-NEXT:    fmin.h fa0, fa0, fa0
68; CHECK-FP16-RV64-NEXT:    ret
69;
70; CHECK-NOFP16-RV64-LABEL: fcanonicalize_f16_nnan:
71; CHECK-NOFP16-RV64:       # %bb.0:
72; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -16
73; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 16
74; CHECK-NOFP16-RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
75; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
76; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
77; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
78; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
79; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a0, fa0
80; CHECK-NOFP16-RV64-NEXT:    lui a1, 1048560
81; CHECK-NOFP16-RV64-NEXT:    or a0, a0, a1
82; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a0
83; CHECK-NOFP16-RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
84; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
85; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 16
86; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
87; CHECK-NOFP16-RV64-NEXT:    ret
88;
89; CHECK-FP16-RV32-LABEL: fcanonicalize_f16_nnan:
90; CHECK-FP16-RV32:       # %bb.0:
91; CHECK-FP16-RV32-NEXT:    fmin.h fa0, fa0, fa0
92; CHECK-FP16-RV32-NEXT:    ret
93;
94; CHECK-NOFP16-RV32-LABEL: fcanonicalize_f16_nnan:
95; CHECK-NOFP16-RV32:       # %bb.0:
96; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -16
97; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 16
98; CHECK-NOFP16-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
99; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
100; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
101; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
102; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
103; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a0, fa0
104; CHECK-NOFP16-RV32-NEXT:    lui a1, 1048560
105; CHECK-NOFP16-RV32-NEXT:    or a0, a0, a1
106; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a0
107; CHECK-NOFP16-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
108; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
109; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 16
110; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
111; CHECK-NOFP16-RV32-NEXT:    ret
112  %z = call nnan half @llvm.canonicalize.f16(half %x)
113  ret half %z
114}
115
116define <2 x half> @fcanonicalize_v2f16(<2 x half> %x) {
117; CHECK-FP16-RV64-LABEL: fcanonicalize_v2f16:
118; CHECK-FP16-RV64:       # %bb.0:
119; CHECK-FP16-RV64-NEXT:    fmin.h fa0, fa0, fa0
120; CHECK-FP16-RV64-NEXT:    fmin.h fa1, fa1, fa1
121; CHECK-FP16-RV64-NEXT:    ret
122;
123; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v2f16:
124; CHECK-NOFP16-RV64:       # %bb.0:
125; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -32
126; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 32
127; CHECK-NOFP16-RV64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
128; CHECK-NOFP16-RV64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
129; CHECK-NOFP16-RV64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
130; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
131; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s0, -16
132; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s1, -24
133; CHECK-NOFP16-RV64-NEXT:    mv s0, a1
134; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a0
135; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
136; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
137; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
138; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s1, fa0
139; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s0
140; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
141; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
142; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
143; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a1, fa0
144; CHECK-NOFP16-RV64-NEXT:    mv a0, s1
145; CHECK-NOFP16-RV64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
146; CHECK-NOFP16-RV64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
147; CHECK-NOFP16-RV64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
148; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
149; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s0
150; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s1
151; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 32
152; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
153; CHECK-NOFP16-RV64-NEXT:    ret
154;
155; CHECK-FP16-RV32-LABEL: fcanonicalize_v2f16:
156; CHECK-FP16-RV32:       # %bb.0:
157; CHECK-FP16-RV32-NEXT:    fmin.h fa0, fa0, fa0
158; CHECK-FP16-RV32-NEXT:    fmin.h fa1, fa1, fa1
159; CHECK-FP16-RV32-NEXT:    ret
160;
161; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v2f16:
162; CHECK-NOFP16-RV32:       # %bb.0:
163; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -16
164; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 16
165; CHECK-NOFP16-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
166; CHECK-NOFP16-RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
167; CHECK-NOFP16-RV32-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
168; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
169; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s0, -8
170; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs0, -16
171; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs0, a1
172; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a0
173; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
174; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
175; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
176; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s0, fa0
177; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs0
178; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
179; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
180; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
181; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a1, fa0
182; CHECK-NOFP16-RV32-NEXT:    mv a0, s0
183; CHECK-NOFP16-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
184; CHECK-NOFP16-RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
185; CHECK-NOFP16-RV32-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
186; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
187; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s0
188; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs0
189; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 16
190; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
191; CHECK-NOFP16-RV32-NEXT:    ret
192  %z = call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x)
193  ret <2 x half> %z
194}
195
196define <2 x half> @fcanonicalize_v2f16_nnan(<2 x half> %x) {
197; CHECK-FP16-RV64-LABEL: fcanonicalize_v2f16_nnan:
198; CHECK-FP16-RV64:       # %bb.0:
199; CHECK-FP16-RV64-NEXT:    fmin.h fa0, fa0, fa0
200; CHECK-FP16-RV64-NEXT:    fmin.h fa1, fa1, fa1
201; CHECK-FP16-RV64-NEXT:    ret
202;
203; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v2f16_nnan:
204; CHECK-NOFP16-RV64:       # %bb.0:
205; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -32
206; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 32
207; CHECK-NOFP16-RV64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
208; CHECK-NOFP16-RV64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
209; CHECK-NOFP16-RV64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
210; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
211; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s0, -16
212; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s1, -24
213; CHECK-NOFP16-RV64-NEXT:    mv s0, a1
214; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a0
215; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
216; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
217; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
218; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s1, fa0
219; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s0
220; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
221; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
222; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
223; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a1, fa0
224; CHECK-NOFP16-RV64-NEXT:    mv a0, s1
225; CHECK-NOFP16-RV64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
226; CHECK-NOFP16-RV64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
227; CHECK-NOFP16-RV64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
228; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
229; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s0
230; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s1
231; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 32
232; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
233; CHECK-NOFP16-RV64-NEXT:    ret
234;
235; CHECK-FP16-RV32-LABEL: fcanonicalize_v2f16_nnan:
236; CHECK-FP16-RV32:       # %bb.0:
237; CHECK-FP16-RV32-NEXT:    fmin.h fa0, fa0, fa0
238; CHECK-FP16-RV32-NEXT:    fmin.h fa1, fa1, fa1
239; CHECK-FP16-RV32-NEXT:    ret
240;
241; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v2f16_nnan:
242; CHECK-NOFP16-RV32:       # %bb.0:
243; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -16
244; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 16
245; CHECK-NOFP16-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
246; CHECK-NOFP16-RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
247; CHECK-NOFP16-RV32-NEXT:    fsd fs0, 0(sp) # 8-byte Folded Spill
248; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
249; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s0, -8
250; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs0, -16
251; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs0, a1
252; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a0
253; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
254; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
255; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
256; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s0, fa0
257; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs0
258; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
259; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
260; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
261; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a1, fa0
262; CHECK-NOFP16-RV32-NEXT:    mv a0, s0
263; CHECK-NOFP16-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
264; CHECK-NOFP16-RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
265; CHECK-NOFP16-RV32-NEXT:    fld fs0, 0(sp) # 8-byte Folded Reload
266; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
267; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s0
268; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs0
269; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 16
270; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
271; CHECK-NOFP16-RV32-NEXT:    ret
272  %z = call nnan <2 x half> @llvm.canonicalize.v2f16(<2 x half> %x)
273  ret <2 x half> %z
274}
275
276define <4 x half> @fcanonicalize_v4f16(<4 x half> %x) {
277; CHECK-FP16-RV64-LABEL: fcanonicalize_v4f16:
278; CHECK-FP16-RV64:       # %bb.0:
279; CHECK-FP16-RV64-NEXT:    fmin.h fa5, fa0, fa0
280; CHECK-FP16-RV64-NEXT:    fmin.h fa4, fa1, fa1
281; CHECK-FP16-RV64-NEXT:    fmin.h fa2, fa2, fa2
282; CHECK-FP16-RV64-NEXT:    fmin.h fa3, fa3, fa3
283; CHECK-FP16-RV64-NEXT:    fsh fa5, 0(a0)
284; CHECK-FP16-RV64-NEXT:    fsh fa4, 2(a0)
285; CHECK-FP16-RV64-NEXT:    fsh fa2, 4(a0)
286; CHECK-FP16-RV64-NEXT:    fsh fa3, 6(a0)
287; CHECK-FP16-RV64-NEXT:    ret
288;
289; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v4f16:
290; CHECK-NOFP16-RV64:       # %bb.0:
291; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -64
292; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 64
293; CHECK-NOFP16-RV64-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill
294; CHECK-NOFP16-RV64-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill
295; CHECK-NOFP16-RV64-NEXT:    sd s1, 40(sp) # 8-byte Folded Spill
296; CHECK-NOFP16-RV64-NEXT:    sd s2, 32(sp) # 8-byte Folded Spill
297; CHECK-NOFP16-RV64-NEXT:    sd s3, 24(sp) # 8-byte Folded Spill
298; CHECK-NOFP16-RV64-NEXT:    fsd fs0, 16(sp) # 8-byte Folded Spill
299; CHECK-NOFP16-RV64-NEXT:    fsd fs1, 8(sp) # 8-byte Folded Spill
300; CHECK-NOFP16-RV64-NEXT:    fsd fs2, 0(sp) # 8-byte Folded Spill
301; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
302; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s0, -16
303; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s1, -24
304; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s2, -32
305; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s3, -40
306; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs0, -48
307; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs1, -56
308; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs2, -64
309; CHECK-NOFP16-RV64-NEXT:    lhu s1, 0(a1)
310; CHECK-NOFP16-RV64-NEXT:    lhu s2, 8(a1)
311; CHECK-NOFP16-RV64-NEXT:    lhu s3, 16(a1)
312; CHECK-NOFP16-RV64-NEXT:    lhu a1, 24(a1)
313; CHECK-NOFP16-RV64-NEXT:    mv s0, a0
314; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a1
315; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
316; CHECK-NOFP16-RV64-NEXT:    fmv.s fs0, fa0
317; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s3
318; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
319; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
320; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
321; CHECK-NOFP16-RV64-NEXT:    fmv.s fs1, fa0
322; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s2
323; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
324; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
325; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
326; CHECK-NOFP16-RV64-NEXT:    fmv.s fs2, fa0
327; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s1
328; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
329; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
330; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
331; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s1, fa0
332; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s2, fs2
333; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fs0, fs0
334; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s3, fs1
335; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
336; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a0, fa0
337; CHECK-NOFP16-RV64-NEXT:    sh s1, 0(s0)
338; CHECK-NOFP16-RV64-NEXT:    sh s2, 2(s0)
339; CHECK-NOFP16-RV64-NEXT:    sh s3, 4(s0)
340; CHECK-NOFP16-RV64-NEXT:    sh a0, 6(s0)
341; CHECK-NOFP16-RV64-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload
342; CHECK-NOFP16-RV64-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload
343; CHECK-NOFP16-RV64-NEXT:    ld s1, 40(sp) # 8-byte Folded Reload
344; CHECK-NOFP16-RV64-NEXT:    ld s2, 32(sp) # 8-byte Folded Reload
345; CHECK-NOFP16-RV64-NEXT:    ld s3, 24(sp) # 8-byte Folded Reload
346; CHECK-NOFP16-RV64-NEXT:    fld fs0, 16(sp) # 8-byte Folded Reload
347; CHECK-NOFP16-RV64-NEXT:    fld fs1, 8(sp) # 8-byte Folded Reload
348; CHECK-NOFP16-RV64-NEXT:    fld fs2, 0(sp) # 8-byte Folded Reload
349; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
350; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s0
351; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s1
352; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s2
353; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s3
354; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs0
355; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs1
356; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs2
357; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 64
358; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
359; CHECK-NOFP16-RV64-NEXT:    ret
360;
361; CHECK-FP16-RV32-LABEL: fcanonicalize_v4f16:
362; CHECK-FP16-RV32:       # %bb.0:
363; CHECK-FP16-RV32-NEXT:    fmin.h fa5, fa0, fa0
364; CHECK-FP16-RV32-NEXT:    fmin.h fa4, fa1, fa1
365; CHECK-FP16-RV32-NEXT:    fmin.h fa2, fa2, fa2
366; CHECK-FP16-RV32-NEXT:    fmin.h fa3, fa3, fa3
367; CHECK-FP16-RV32-NEXT:    fsh fa5, 0(a0)
368; CHECK-FP16-RV32-NEXT:    fsh fa4, 2(a0)
369; CHECK-FP16-RV32-NEXT:    fsh fa2, 4(a0)
370; CHECK-FP16-RV32-NEXT:    fsh fa3, 6(a0)
371; CHECK-FP16-RV32-NEXT:    ret
372;
373; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v4f16:
374; CHECK-NOFP16-RV32:       # %bb.0:
375; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -64
376; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 64
377; CHECK-NOFP16-RV32-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
378; CHECK-NOFP16-RV32-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
379; CHECK-NOFP16-RV32-NEXT:    sw s1, 52(sp) # 4-byte Folded Spill
380; CHECK-NOFP16-RV32-NEXT:    sw s2, 48(sp) # 4-byte Folded Spill
381; CHECK-NOFP16-RV32-NEXT:    sw s3, 44(sp) # 4-byte Folded Spill
382; CHECK-NOFP16-RV32-NEXT:    fsd fs0, 32(sp) # 8-byte Folded Spill
383; CHECK-NOFP16-RV32-NEXT:    fsd fs1, 24(sp) # 8-byte Folded Spill
384; CHECK-NOFP16-RV32-NEXT:    fsd fs2, 16(sp) # 8-byte Folded Spill
385; CHECK-NOFP16-RV32-NEXT:    fsd fs3, 8(sp) # 8-byte Folded Spill
386; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
387; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s0, -8
388; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s1, -12
389; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s2, -16
390; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s3, -20
391; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs0, -32
392; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs1, -40
393; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs2, -48
394; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs3, -56
395; CHECK-NOFP16-RV32-NEXT:    mv s0, a0
396; CHECK-NOFP16-RV32-NEXT:    lhu a0, 0(a1)
397; CHECK-NOFP16-RV32-NEXT:    lhu a2, 4(a1)
398; CHECK-NOFP16-RV32-NEXT:    lhu a3, 8(a1)
399; CHECK-NOFP16-RV32-NEXT:    lhu a1, 12(a1)
400; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs0, a0
401; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs1, a2
402; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs2, a3
403; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a1
404; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
405; CHECK-NOFP16-RV32-NEXT:    fmv.s fs3, fa0
406; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs2
407; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
408; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
409; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
410; CHECK-NOFP16-RV32-NEXT:    fmv.s fs2, fa0
411; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs1
412; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
413; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
414; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
415; CHECK-NOFP16-RV32-NEXT:    fmv.s fs1, fa0
416; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs0
417; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
418; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
419; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
420; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s1, fa0
421; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s2, fs1
422; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fs3, fs3
423; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s3, fs2
424; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
425; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a0, fa0
426; CHECK-NOFP16-RV32-NEXT:    sh s1, 0(s0)
427; CHECK-NOFP16-RV32-NEXT:    sh s2, 2(s0)
428; CHECK-NOFP16-RV32-NEXT:    sh s3, 4(s0)
429; CHECK-NOFP16-RV32-NEXT:    sh a0, 6(s0)
430; CHECK-NOFP16-RV32-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
431; CHECK-NOFP16-RV32-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
432; CHECK-NOFP16-RV32-NEXT:    lw s1, 52(sp) # 4-byte Folded Reload
433; CHECK-NOFP16-RV32-NEXT:    lw s2, 48(sp) # 4-byte Folded Reload
434; CHECK-NOFP16-RV32-NEXT:    lw s3, 44(sp) # 4-byte Folded Reload
435; CHECK-NOFP16-RV32-NEXT:    fld fs0, 32(sp) # 8-byte Folded Reload
436; CHECK-NOFP16-RV32-NEXT:    fld fs1, 24(sp) # 8-byte Folded Reload
437; CHECK-NOFP16-RV32-NEXT:    fld fs2, 16(sp) # 8-byte Folded Reload
438; CHECK-NOFP16-RV32-NEXT:    fld fs3, 8(sp) # 8-byte Folded Reload
439; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
440; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s0
441; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s1
442; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s2
443; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s3
444; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs0
445; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs1
446; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs2
447; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs3
448; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 64
449; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
450; CHECK-NOFP16-RV32-NEXT:    ret
451  %z = call <4 x half> @llvm.canonicalize.v4f16(<4 x half> %x)
452  ret <4 x half> %z
453}
454
455define <4 x half> @fcanonicalize_v4f16_nnan(<4 x half> %x) {
456; CHECK-FP16-RV64-LABEL: fcanonicalize_v4f16_nnan:
457; CHECK-FP16-RV64:       # %bb.0:
458; CHECK-FP16-RV64-NEXT:    fmin.h fa5, fa0, fa0
459; CHECK-FP16-RV64-NEXT:    fmin.h fa4, fa1, fa1
460; CHECK-FP16-RV64-NEXT:    fmin.h fa2, fa2, fa2
461; CHECK-FP16-RV64-NEXT:    fmin.h fa3, fa3, fa3
462; CHECK-FP16-RV64-NEXT:    fsh fa5, 0(a0)
463; CHECK-FP16-RV64-NEXT:    fsh fa4, 2(a0)
464; CHECK-FP16-RV64-NEXT:    fsh fa2, 4(a0)
465; CHECK-FP16-RV64-NEXT:    fsh fa3, 6(a0)
466; CHECK-FP16-RV64-NEXT:    ret
467;
468; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v4f16_nnan:
469; CHECK-NOFP16-RV64:       # %bb.0:
470; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -64
471; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 64
472; CHECK-NOFP16-RV64-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill
473; CHECK-NOFP16-RV64-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill
474; CHECK-NOFP16-RV64-NEXT:    sd s1, 40(sp) # 8-byte Folded Spill
475; CHECK-NOFP16-RV64-NEXT:    sd s2, 32(sp) # 8-byte Folded Spill
476; CHECK-NOFP16-RV64-NEXT:    sd s3, 24(sp) # 8-byte Folded Spill
477; CHECK-NOFP16-RV64-NEXT:    fsd fs0, 16(sp) # 8-byte Folded Spill
478; CHECK-NOFP16-RV64-NEXT:    fsd fs1, 8(sp) # 8-byte Folded Spill
479; CHECK-NOFP16-RV64-NEXT:    fsd fs2, 0(sp) # 8-byte Folded Spill
480; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
481; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s0, -16
482; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s1, -24
483; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s2, -32
484; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s3, -40
485; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs0, -48
486; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs1, -56
487; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs2, -64
488; CHECK-NOFP16-RV64-NEXT:    lhu s1, 0(a1)
489; CHECK-NOFP16-RV64-NEXT:    lhu s2, 8(a1)
490; CHECK-NOFP16-RV64-NEXT:    lhu s3, 16(a1)
491; CHECK-NOFP16-RV64-NEXT:    lhu a1, 24(a1)
492; CHECK-NOFP16-RV64-NEXT:    mv s0, a0
493; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a1
494; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
495; CHECK-NOFP16-RV64-NEXT:    fmv.s fs0, fa0
496; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s3
497; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
498; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
499; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
500; CHECK-NOFP16-RV64-NEXT:    fmv.s fs1, fa0
501; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s2
502; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
503; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
504; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
505; CHECK-NOFP16-RV64-NEXT:    fmv.s fs2, fa0
506; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s1
507; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
508; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
509; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
510; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s1, fa0
511; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s2, fs2
512; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fs0, fs0
513; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s3, fs1
514; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
515; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a0, fa0
516; CHECK-NOFP16-RV64-NEXT:    sh s1, 0(s0)
517; CHECK-NOFP16-RV64-NEXT:    sh s2, 2(s0)
518; CHECK-NOFP16-RV64-NEXT:    sh s3, 4(s0)
519; CHECK-NOFP16-RV64-NEXT:    sh a0, 6(s0)
520; CHECK-NOFP16-RV64-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload
521; CHECK-NOFP16-RV64-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload
522; CHECK-NOFP16-RV64-NEXT:    ld s1, 40(sp) # 8-byte Folded Reload
523; CHECK-NOFP16-RV64-NEXT:    ld s2, 32(sp) # 8-byte Folded Reload
524; CHECK-NOFP16-RV64-NEXT:    ld s3, 24(sp) # 8-byte Folded Reload
525; CHECK-NOFP16-RV64-NEXT:    fld fs0, 16(sp) # 8-byte Folded Reload
526; CHECK-NOFP16-RV64-NEXT:    fld fs1, 8(sp) # 8-byte Folded Reload
527; CHECK-NOFP16-RV64-NEXT:    fld fs2, 0(sp) # 8-byte Folded Reload
528; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
529; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s0
530; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s1
531; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s2
532; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s3
533; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs0
534; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs1
535; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs2
536; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 64
537; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
538; CHECK-NOFP16-RV64-NEXT:    ret
539;
540; CHECK-FP16-RV32-LABEL: fcanonicalize_v4f16_nnan:
541; CHECK-FP16-RV32:       # %bb.0:
542; CHECK-FP16-RV32-NEXT:    fmin.h fa5, fa0, fa0
543; CHECK-FP16-RV32-NEXT:    fmin.h fa4, fa1, fa1
544; CHECK-FP16-RV32-NEXT:    fmin.h fa2, fa2, fa2
545; CHECK-FP16-RV32-NEXT:    fmin.h fa3, fa3, fa3
546; CHECK-FP16-RV32-NEXT:    fsh fa5, 0(a0)
547; CHECK-FP16-RV32-NEXT:    fsh fa4, 2(a0)
548; CHECK-FP16-RV32-NEXT:    fsh fa2, 4(a0)
549; CHECK-FP16-RV32-NEXT:    fsh fa3, 6(a0)
550; CHECK-FP16-RV32-NEXT:    ret
551;
552; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v4f16_nnan:
553; CHECK-NOFP16-RV32:       # %bb.0:
554; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -64
555; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 64
556; CHECK-NOFP16-RV32-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
557; CHECK-NOFP16-RV32-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
558; CHECK-NOFP16-RV32-NEXT:    sw s1, 52(sp) # 4-byte Folded Spill
559; CHECK-NOFP16-RV32-NEXT:    sw s2, 48(sp) # 4-byte Folded Spill
560; CHECK-NOFP16-RV32-NEXT:    sw s3, 44(sp) # 4-byte Folded Spill
561; CHECK-NOFP16-RV32-NEXT:    fsd fs0, 32(sp) # 8-byte Folded Spill
562; CHECK-NOFP16-RV32-NEXT:    fsd fs1, 24(sp) # 8-byte Folded Spill
563; CHECK-NOFP16-RV32-NEXT:    fsd fs2, 16(sp) # 8-byte Folded Spill
564; CHECK-NOFP16-RV32-NEXT:    fsd fs3, 8(sp) # 8-byte Folded Spill
565; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
566; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s0, -8
567; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s1, -12
568; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s2, -16
569; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s3, -20
570; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs0, -32
571; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs1, -40
572; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs2, -48
573; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs3, -56
574; CHECK-NOFP16-RV32-NEXT:    mv s0, a0
575; CHECK-NOFP16-RV32-NEXT:    lhu a0, 0(a1)
576; CHECK-NOFP16-RV32-NEXT:    lhu a2, 4(a1)
577; CHECK-NOFP16-RV32-NEXT:    lhu a3, 8(a1)
578; CHECK-NOFP16-RV32-NEXT:    lhu a1, 12(a1)
579; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs0, a0
580; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs1, a2
581; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs2, a3
582; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a1
583; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
584; CHECK-NOFP16-RV32-NEXT:    fmv.s fs3, fa0
585; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs2
586; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
587; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
588; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
589; CHECK-NOFP16-RV32-NEXT:    fmv.s fs2, fa0
590; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs1
591; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
592; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
593; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
594; CHECK-NOFP16-RV32-NEXT:    fmv.s fs1, fa0
595; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs0
596; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
597; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
598; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
599; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s1, fa0
600; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s2, fs1
601; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fs3, fs3
602; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s3, fs2
603; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
604; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a0, fa0
605; CHECK-NOFP16-RV32-NEXT:    sh s1, 0(s0)
606; CHECK-NOFP16-RV32-NEXT:    sh s2, 2(s0)
607; CHECK-NOFP16-RV32-NEXT:    sh s3, 4(s0)
608; CHECK-NOFP16-RV32-NEXT:    sh a0, 6(s0)
609; CHECK-NOFP16-RV32-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
610; CHECK-NOFP16-RV32-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
611; CHECK-NOFP16-RV32-NEXT:    lw s1, 52(sp) # 4-byte Folded Reload
612; CHECK-NOFP16-RV32-NEXT:    lw s2, 48(sp) # 4-byte Folded Reload
613; CHECK-NOFP16-RV32-NEXT:    lw s3, 44(sp) # 4-byte Folded Reload
614; CHECK-NOFP16-RV32-NEXT:    fld fs0, 32(sp) # 8-byte Folded Reload
615; CHECK-NOFP16-RV32-NEXT:    fld fs1, 24(sp) # 8-byte Folded Reload
616; CHECK-NOFP16-RV32-NEXT:    fld fs2, 16(sp) # 8-byte Folded Reload
617; CHECK-NOFP16-RV32-NEXT:    fld fs3, 8(sp) # 8-byte Folded Reload
618; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
619; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s0
620; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s1
621; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s2
622; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s3
623; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs0
624; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs1
625; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs2
626; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs3
627; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 64
628; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
629; CHECK-NOFP16-RV32-NEXT:    ret
630  %z = call nnan <4 x half> @llvm.canonicalize.v4f16(<4 x half> %x)
631  ret <4 x half> %z
632}
633
634define <8 x half> @fcanonicalize_v8f16(<8 x half> %x) {
635; CHECK-FP16-RV64-LABEL: fcanonicalize_v8f16:
636; CHECK-FP16-RV64:       # %bb.0:
637; CHECK-FP16-RV64-NEXT:    fmin.h fa0, fa0, fa0
638; CHECK-FP16-RV64-NEXT:    fmin.h fa1, fa1, fa1
639; CHECK-FP16-RV64-NEXT:    fmin.h fa2, fa2, fa2
640; CHECK-FP16-RV64-NEXT:    fmin.h fa3, fa3, fa3
641; CHECK-FP16-RV64-NEXT:    fmin.h fa4, fa4, fa4
642; CHECK-FP16-RV64-NEXT:    fmin.h fa5, fa5, fa5
643; CHECK-FP16-RV64-NEXT:    fmin.h ft0, fa6, fa6
644; CHECK-FP16-RV64-NEXT:    fmin.h ft1, fa7, fa7
645; CHECK-FP16-RV64-NEXT:    fsh fa4, 8(a0)
646; CHECK-FP16-RV64-NEXT:    fsh fa5, 10(a0)
647; CHECK-FP16-RV64-NEXT:    fsh ft0, 12(a0)
648; CHECK-FP16-RV64-NEXT:    fsh ft1, 14(a0)
649; CHECK-FP16-RV64-NEXT:    fsh fa0, 0(a0)
650; CHECK-FP16-RV64-NEXT:    fsh fa1, 2(a0)
651; CHECK-FP16-RV64-NEXT:    fsh fa2, 4(a0)
652; CHECK-FP16-RV64-NEXT:    fsh fa3, 6(a0)
653; CHECK-FP16-RV64-NEXT:    ret
654;
655; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v8f16:
656; CHECK-NOFP16-RV64:       # %bb.0:
657; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -128
658; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 128
659; CHECK-NOFP16-RV64-NEXT:    sd ra, 120(sp) # 8-byte Folded Spill
660; CHECK-NOFP16-RV64-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
661; CHECK-NOFP16-RV64-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
662; CHECK-NOFP16-RV64-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
663; CHECK-NOFP16-RV64-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
664; CHECK-NOFP16-RV64-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
665; CHECK-NOFP16-RV64-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
666; CHECK-NOFP16-RV64-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
667; CHECK-NOFP16-RV64-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
668; CHECK-NOFP16-RV64-NEXT:    fsd fs0, 48(sp) # 8-byte Folded Spill
669; CHECK-NOFP16-RV64-NEXT:    fsd fs1, 40(sp) # 8-byte Folded Spill
670; CHECK-NOFP16-RV64-NEXT:    fsd fs2, 32(sp) # 8-byte Folded Spill
671; CHECK-NOFP16-RV64-NEXT:    fsd fs3, 24(sp) # 8-byte Folded Spill
672; CHECK-NOFP16-RV64-NEXT:    fsd fs4, 16(sp) # 8-byte Folded Spill
673; CHECK-NOFP16-RV64-NEXT:    fsd fs5, 8(sp) # 8-byte Folded Spill
674; CHECK-NOFP16-RV64-NEXT:    fsd fs6, 0(sp) # 8-byte Folded Spill
675; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
676; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s0, -16
677; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s1, -24
678; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s2, -32
679; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s3, -40
680; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s4, -48
681; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s5, -56
682; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s6, -64
683; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s7, -72
684; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs0, -80
685; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs1, -88
686; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs2, -96
687; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs3, -104
688; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs4, -112
689; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs5, -120
690; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs6, -128
691; CHECK-NOFP16-RV64-NEXT:    lhu s1, 0(a1)
692; CHECK-NOFP16-RV64-NEXT:    lhu s2, 8(a1)
693; CHECK-NOFP16-RV64-NEXT:    lhu s3, 16(a1)
694; CHECK-NOFP16-RV64-NEXT:    lhu s4, 24(a1)
695; CHECK-NOFP16-RV64-NEXT:    lhu s5, 32(a1)
696; CHECK-NOFP16-RV64-NEXT:    lhu s6, 40(a1)
697; CHECK-NOFP16-RV64-NEXT:    lhu s7, 48(a1)
698; CHECK-NOFP16-RV64-NEXT:    lhu a1, 56(a1)
699; CHECK-NOFP16-RV64-NEXT:    mv s0, a0
700; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a1
701; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
702; CHECK-NOFP16-RV64-NEXT:    fmv.s fs0, fa0
703; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s7
704; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
705; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
706; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
707; CHECK-NOFP16-RV64-NEXT:    fmv.s fs1, fa0
708; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s6
709; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
710; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
711; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
712; CHECK-NOFP16-RV64-NEXT:    fmv.s fs2, fa0
713; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s5
714; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
715; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
716; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
717; CHECK-NOFP16-RV64-NEXT:    fmv.s fs3, fa0
718; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s4
719; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
720; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
721; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
722; CHECK-NOFP16-RV64-NEXT:    fmv.s fs4, fa0
723; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s3
724; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
725; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
726; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
727; CHECK-NOFP16-RV64-NEXT:    fmv.s fs5, fa0
728; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s2
729; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
730; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
731; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
732; CHECK-NOFP16-RV64-NEXT:    fmv.s fs6, fa0
733; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s1
734; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
735; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
736; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
737; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s1, fa0
738; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s2, fs6
739; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s3, fs5
740; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s4, fs4
741; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s5, fs3
742; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s6, fs2
743; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fs0, fs0
744; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s7, fs1
745; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
746; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a0, fa0
747; CHECK-NOFP16-RV64-NEXT:    sh s5, 8(s0)
748; CHECK-NOFP16-RV64-NEXT:    sh s6, 10(s0)
749; CHECK-NOFP16-RV64-NEXT:    sh s7, 12(s0)
750; CHECK-NOFP16-RV64-NEXT:    sh a0, 14(s0)
751; CHECK-NOFP16-RV64-NEXT:    sh s1, 0(s0)
752; CHECK-NOFP16-RV64-NEXT:    sh s2, 2(s0)
753; CHECK-NOFP16-RV64-NEXT:    sh s3, 4(s0)
754; CHECK-NOFP16-RV64-NEXT:    sh s4, 6(s0)
755; CHECK-NOFP16-RV64-NEXT:    ld ra, 120(sp) # 8-byte Folded Reload
756; CHECK-NOFP16-RV64-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
757; CHECK-NOFP16-RV64-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
758; CHECK-NOFP16-RV64-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
759; CHECK-NOFP16-RV64-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
760; CHECK-NOFP16-RV64-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
761; CHECK-NOFP16-RV64-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
762; CHECK-NOFP16-RV64-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
763; CHECK-NOFP16-RV64-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
764; CHECK-NOFP16-RV64-NEXT:    fld fs0, 48(sp) # 8-byte Folded Reload
765; CHECK-NOFP16-RV64-NEXT:    fld fs1, 40(sp) # 8-byte Folded Reload
766; CHECK-NOFP16-RV64-NEXT:    fld fs2, 32(sp) # 8-byte Folded Reload
767; CHECK-NOFP16-RV64-NEXT:    fld fs3, 24(sp) # 8-byte Folded Reload
768; CHECK-NOFP16-RV64-NEXT:    fld fs4, 16(sp) # 8-byte Folded Reload
769; CHECK-NOFP16-RV64-NEXT:    fld fs5, 8(sp) # 8-byte Folded Reload
770; CHECK-NOFP16-RV64-NEXT:    fld fs6, 0(sp) # 8-byte Folded Reload
771; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
772; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s0
773; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s1
774; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s2
775; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s3
776; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s4
777; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s5
778; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s6
779; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s7
780; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs0
781; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs1
782; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs2
783; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs3
784; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs4
785; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs5
786; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs6
787; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 128
788; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
789; CHECK-NOFP16-RV64-NEXT:    ret
790;
791; CHECK-FP16-RV32-LABEL: fcanonicalize_v8f16:
792; CHECK-FP16-RV32:       # %bb.0:
793; CHECK-FP16-RV32-NEXT:    fmin.h fa0, fa0, fa0
794; CHECK-FP16-RV32-NEXT:    fmin.h fa1, fa1, fa1
795; CHECK-FP16-RV32-NEXT:    fmin.h fa2, fa2, fa2
796; CHECK-FP16-RV32-NEXT:    fmin.h fa3, fa3, fa3
797; CHECK-FP16-RV32-NEXT:    fmin.h fa4, fa4, fa4
798; CHECK-FP16-RV32-NEXT:    fmin.h fa5, fa5, fa5
799; CHECK-FP16-RV32-NEXT:    fmin.h ft0, fa6, fa6
800; CHECK-FP16-RV32-NEXT:    fmin.h ft1, fa7, fa7
801; CHECK-FP16-RV32-NEXT:    fsh fa4, 8(a0)
802; CHECK-FP16-RV32-NEXT:    fsh fa5, 10(a0)
803; CHECK-FP16-RV32-NEXT:    fsh ft0, 12(a0)
804; CHECK-FP16-RV32-NEXT:    fsh ft1, 14(a0)
805; CHECK-FP16-RV32-NEXT:    fsh fa0, 0(a0)
806; CHECK-FP16-RV32-NEXT:    fsh fa1, 2(a0)
807; CHECK-FP16-RV32-NEXT:    fsh fa2, 4(a0)
808; CHECK-FP16-RV32-NEXT:    fsh fa3, 6(a0)
809; CHECK-FP16-RV32-NEXT:    ret
810;
811; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v8f16:
812; CHECK-NOFP16-RV32:       # %bb.0:
813; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -112
814; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 112
815; CHECK-NOFP16-RV32-NEXT:    sw ra, 108(sp) # 4-byte Folded Spill
816; CHECK-NOFP16-RV32-NEXT:    sw s0, 104(sp) # 4-byte Folded Spill
817; CHECK-NOFP16-RV32-NEXT:    sw s1, 100(sp) # 4-byte Folded Spill
818; CHECK-NOFP16-RV32-NEXT:    sw s2, 96(sp) # 4-byte Folded Spill
819; CHECK-NOFP16-RV32-NEXT:    sw s3, 92(sp) # 4-byte Folded Spill
820; CHECK-NOFP16-RV32-NEXT:    sw s4, 88(sp) # 4-byte Folded Spill
821; CHECK-NOFP16-RV32-NEXT:    sw s5, 84(sp) # 4-byte Folded Spill
822; CHECK-NOFP16-RV32-NEXT:    sw s6, 80(sp) # 4-byte Folded Spill
823; CHECK-NOFP16-RV32-NEXT:    sw s7, 76(sp) # 4-byte Folded Spill
824; CHECK-NOFP16-RV32-NEXT:    fsd fs0, 64(sp) # 8-byte Folded Spill
825; CHECK-NOFP16-RV32-NEXT:    fsd fs1, 56(sp) # 8-byte Folded Spill
826; CHECK-NOFP16-RV32-NEXT:    fsd fs2, 48(sp) # 8-byte Folded Spill
827; CHECK-NOFP16-RV32-NEXT:    fsd fs3, 40(sp) # 8-byte Folded Spill
828; CHECK-NOFP16-RV32-NEXT:    fsd fs4, 32(sp) # 8-byte Folded Spill
829; CHECK-NOFP16-RV32-NEXT:    fsd fs5, 24(sp) # 8-byte Folded Spill
830; CHECK-NOFP16-RV32-NEXT:    fsd fs6, 16(sp) # 8-byte Folded Spill
831; CHECK-NOFP16-RV32-NEXT:    fsd fs7, 8(sp) # 8-byte Folded Spill
832; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
833; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s0, -8
834; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s1, -12
835; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s2, -16
836; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s3, -20
837; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s4, -24
838; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s5, -28
839; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s6, -32
840; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s7, -36
841; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs0, -48
842; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs1, -56
843; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs2, -64
844; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs3, -72
845; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs4, -80
846; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs5, -88
847; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs6, -96
848; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs7, -104
849; CHECK-NOFP16-RV32-NEXT:    mv s0, a0
850; CHECK-NOFP16-RV32-NEXT:    lhu a0, 0(a1)
851; CHECK-NOFP16-RV32-NEXT:    lhu a2, 4(a1)
852; CHECK-NOFP16-RV32-NEXT:    lhu a3, 8(a1)
853; CHECK-NOFP16-RV32-NEXT:    lhu a4, 12(a1)
854; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs0, a0
855; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs2, a2
856; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs4, a3
857; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs5, a4
858; CHECK-NOFP16-RV32-NEXT:    lhu a0, 16(a1)
859; CHECK-NOFP16-RV32-NEXT:    lhu a2, 20(a1)
860; CHECK-NOFP16-RV32-NEXT:    lhu a3, 24(a1)
861; CHECK-NOFP16-RV32-NEXT:    lhu a1, 28(a1)
862; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs6, a0
863; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs7, a2
864; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs3, a3
865; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a1
866; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
867; CHECK-NOFP16-RV32-NEXT:    fmv.s fs1, fa0
868; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs3
869; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
870; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
871; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
872; CHECK-NOFP16-RV32-NEXT:    fmv.s fs3, fa0
873; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs7
874; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
875; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
876; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
877; CHECK-NOFP16-RV32-NEXT:    fmv.s fs7, fa0
878; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs6
879; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
880; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
881; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
882; CHECK-NOFP16-RV32-NEXT:    fmv.s fs6, fa0
883; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs5
884; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
885; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
886; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
887; CHECK-NOFP16-RV32-NEXT:    fmv.s fs5, fa0
888; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs4
889; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
890; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
891; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
892; CHECK-NOFP16-RV32-NEXT:    fmv.s fs4, fa0
893; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs2
894; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
895; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
896; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
897; CHECK-NOFP16-RV32-NEXT:    fmv.s fs2, fa0
898; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs0
899; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
900; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
901; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
902; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s1, fa0
903; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s2, fs2
904; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s3, fs4
905; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s4, fs5
906; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s5, fs6
907; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s6, fs7
908; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fs1, fs1
909; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s7, fs3
910; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
911; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a0, fa0
912; CHECK-NOFP16-RV32-NEXT:    sh s5, 8(s0)
913; CHECK-NOFP16-RV32-NEXT:    sh s6, 10(s0)
914; CHECK-NOFP16-RV32-NEXT:    sh s7, 12(s0)
915; CHECK-NOFP16-RV32-NEXT:    sh a0, 14(s0)
916; CHECK-NOFP16-RV32-NEXT:    sh s1, 0(s0)
917; CHECK-NOFP16-RV32-NEXT:    sh s2, 2(s0)
918; CHECK-NOFP16-RV32-NEXT:    sh s3, 4(s0)
919; CHECK-NOFP16-RV32-NEXT:    sh s4, 6(s0)
920; CHECK-NOFP16-RV32-NEXT:    lw ra, 108(sp) # 4-byte Folded Reload
921; CHECK-NOFP16-RV32-NEXT:    lw s0, 104(sp) # 4-byte Folded Reload
922; CHECK-NOFP16-RV32-NEXT:    lw s1, 100(sp) # 4-byte Folded Reload
923; CHECK-NOFP16-RV32-NEXT:    lw s2, 96(sp) # 4-byte Folded Reload
924; CHECK-NOFP16-RV32-NEXT:    lw s3, 92(sp) # 4-byte Folded Reload
925; CHECK-NOFP16-RV32-NEXT:    lw s4, 88(sp) # 4-byte Folded Reload
926; CHECK-NOFP16-RV32-NEXT:    lw s5, 84(sp) # 4-byte Folded Reload
927; CHECK-NOFP16-RV32-NEXT:    lw s6, 80(sp) # 4-byte Folded Reload
928; CHECK-NOFP16-RV32-NEXT:    lw s7, 76(sp) # 4-byte Folded Reload
929; CHECK-NOFP16-RV32-NEXT:    fld fs0, 64(sp) # 8-byte Folded Reload
930; CHECK-NOFP16-RV32-NEXT:    fld fs1, 56(sp) # 8-byte Folded Reload
931; CHECK-NOFP16-RV32-NEXT:    fld fs2, 48(sp) # 8-byte Folded Reload
932; CHECK-NOFP16-RV32-NEXT:    fld fs3, 40(sp) # 8-byte Folded Reload
933; CHECK-NOFP16-RV32-NEXT:    fld fs4, 32(sp) # 8-byte Folded Reload
934; CHECK-NOFP16-RV32-NEXT:    fld fs5, 24(sp) # 8-byte Folded Reload
935; CHECK-NOFP16-RV32-NEXT:    fld fs6, 16(sp) # 8-byte Folded Reload
936; CHECK-NOFP16-RV32-NEXT:    fld fs7, 8(sp) # 8-byte Folded Reload
937; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
938; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s0
939; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s1
940; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s2
941; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s3
942; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s4
943; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s5
944; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s6
945; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s7
946; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs0
947; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs1
948; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs2
949; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs3
950; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs4
951; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs5
952; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs6
953; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs7
954; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 112
955; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
956; CHECK-NOFP16-RV32-NEXT:    ret
957  %z = call <8 x half> @llvm.canonicalize.v8f16(<8 x half> %x)
958  ret <8 x half> %z
959}
960
961define <8 x half> @fcanonicalize_v8f16_nnan(<8 x half> %x) {
962; CHECK-FP16-RV64-LABEL: fcanonicalize_v8f16_nnan:
963; CHECK-FP16-RV64:       # %bb.0:
964; CHECK-FP16-RV64-NEXT:    fmin.h fa0, fa0, fa0
965; CHECK-FP16-RV64-NEXT:    fmin.h fa1, fa1, fa1
966; CHECK-FP16-RV64-NEXT:    fmin.h fa2, fa2, fa2
967; CHECK-FP16-RV64-NEXT:    fmin.h fa3, fa3, fa3
968; CHECK-FP16-RV64-NEXT:    fmin.h fa4, fa4, fa4
969; CHECK-FP16-RV64-NEXT:    fmin.h fa5, fa5, fa5
970; CHECK-FP16-RV64-NEXT:    fmin.h ft0, fa6, fa6
971; CHECK-FP16-RV64-NEXT:    fmin.h ft1, fa7, fa7
972; CHECK-FP16-RV64-NEXT:    fsh fa4, 8(a0)
973; CHECK-FP16-RV64-NEXT:    fsh fa5, 10(a0)
974; CHECK-FP16-RV64-NEXT:    fsh ft0, 12(a0)
975; CHECK-FP16-RV64-NEXT:    fsh ft1, 14(a0)
976; CHECK-FP16-RV64-NEXT:    fsh fa0, 0(a0)
977; CHECK-FP16-RV64-NEXT:    fsh fa1, 2(a0)
978; CHECK-FP16-RV64-NEXT:    fsh fa2, 4(a0)
979; CHECK-FP16-RV64-NEXT:    fsh fa3, 6(a0)
980; CHECK-FP16-RV64-NEXT:    ret
981;
982; CHECK-NOFP16-RV64-LABEL: fcanonicalize_v8f16_nnan:
983; CHECK-NOFP16-RV64:       # %bb.0:
984; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, -128
985; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 128
986; CHECK-NOFP16-RV64-NEXT:    sd ra, 120(sp) # 8-byte Folded Spill
987; CHECK-NOFP16-RV64-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
988; CHECK-NOFP16-RV64-NEXT:    sd s1, 104(sp) # 8-byte Folded Spill
989; CHECK-NOFP16-RV64-NEXT:    sd s2, 96(sp) # 8-byte Folded Spill
990; CHECK-NOFP16-RV64-NEXT:    sd s3, 88(sp) # 8-byte Folded Spill
991; CHECK-NOFP16-RV64-NEXT:    sd s4, 80(sp) # 8-byte Folded Spill
992; CHECK-NOFP16-RV64-NEXT:    sd s5, 72(sp) # 8-byte Folded Spill
993; CHECK-NOFP16-RV64-NEXT:    sd s6, 64(sp) # 8-byte Folded Spill
994; CHECK-NOFP16-RV64-NEXT:    sd s7, 56(sp) # 8-byte Folded Spill
995; CHECK-NOFP16-RV64-NEXT:    fsd fs0, 48(sp) # 8-byte Folded Spill
996; CHECK-NOFP16-RV64-NEXT:    fsd fs1, 40(sp) # 8-byte Folded Spill
997; CHECK-NOFP16-RV64-NEXT:    fsd fs2, 32(sp) # 8-byte Folded Spill
998; CHECK-NOFP16-RV64-NEXT:    fsd fs3, 24(sp) # 8-byte Folded Spill
999; CHECK-NOFP16-RV64-NEXT:    fsd fs4, 16(sp) # 8-byte Folded Spill
1000; CHECK-NOFP16-RV64-NEXT:    fsd fs5, 8(sp) # 8-byte Folded Spill
1001; CHECK-NOFP16-RV64-NEXT:    fsd fs6, 0(sp) # 8-byte Folded Spill
1002; CHECK-NOFP16-RV64-NEXT:    .cfi_offset ra, -8
1003; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s0, -16
1004; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s1, -24
1005; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s2, -32
1006; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s3, -40
1007; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s4, -48
1008; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s5, -56
1009; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s6, -64
1010; CHECK-NOFP16-RV64-NEXT:    .cfi_offset s7, -72
1011; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs0, -80
1012; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs1, -88
1013; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs2, -96
1014; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs3, -104
1015; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs4, -112
1016; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs5, -120
1017; CHECK-NOFP16-RV64-NEXT:    .cfi_offset fs6, -128
1018; CHECK-NOFP16-RV64-NEXT:    lhu s1, 0(a1)
1019; CHECK-NOFP16-RV64-NEXT:    lhu s2, 8(a1)
1020; CHECK-NOFP16-RV64-NEXT:    lhu s3, 16(a1)
1021; CHECK-NOFP16-RV64-NEXT:    lhu s4, 24(a1)
1022; CHECK-NOFP16-RV64-NEXT:    lhu s5, 32(a1)
1023; CHECK-NOFP16-RV64-NEXT:    lhu s6, 40(a1)
1024; CHECK-NOFP16-RV64-NEXT:    lhu s7, 48(a1)
1025; CHECK-NOFP16-RV64-NEXT:    lhu a1, 56(a1)
1026; CHECK-NOFP16-RV64-NEXT:    mv s0, a0
1027; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, a1
1028; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1029; CHECK-NOFP16-RV64-NEXT:    fmv.s fs0, fa0
1030; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s7
1031; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1032; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
1033; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1034; CHECK-NOFP16-RV64-NEXT:    fmv.s fs1, fa0
1035; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s6
1036; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1037; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
1038; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1039; CHECK-NOFP16-RV64-NEXT:    fmv.s fs2, fa0
1040; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s5
1041; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1042; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
1043; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1044; CHECK-NOFP16-RV64-NEXT:    fmv.s fs3, fa0
1045; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s4
1046; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1047; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
1048; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1049; CHECK-NOFP16-RV64-NEXT:    fmv.s fs4, fa0
1050; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s3
1051; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1052; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
1053; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1054; CHECK-NOFP16-RV64-NEXT:    fmv.s fs5, fa0
1055; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s2
1056; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1057; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
1058; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1059; CHECK-NOFP16-RV64-NEXT:    fmv.s fs6, fa0
1060; CHECK-NOFP16-RV64-NEXT:    fmv.w.x fa0, s1
1061; CHECK-NOFP16-RV64-NEXT:    call __extendhfsf2
1062; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fa0, fa0
1063; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1064; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s1, fa0
1065; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s2, fs6
1066; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s3, fs5
1067; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s4, fs4
1068; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s5, fs3
1069; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s6, fs2
1070; CHECK-NOFP16-RV64-NEXT:    fmin.s fa0, fs0, fs0
1071; CHECK-NOFP16-RV64-NEXT:    fmv.x.w s7, fs1
1072; CHECK-NOFP16-RV64-NEXT:    call __truncsfhf2
1073; CHECK-NOFP16-RV64-NEXT:    fmv.x.w a0, fa0
1074; CHECK-NOFP16-RV64-NEXT:    sh s5, 8(s0)
1075; CHECK-NOFP16-RV64-NEXT:    sh s6, 10(s0)
1076; CHECK-NOFP16-RV64-NEXT:    sh s7, 12(s0)
1077; CHECK-NOFP16-RV64-NEXT:    sh a0, 14(s0)
1078; CHECK-NOFP16-RV64-NEXT:    sh s1, 0(s0)
1079; CHECK-NOFP16-RV64-NEXT:    sh s2, 2(s0)
1080; CHECK-NOFP16-RV64-NEXT:    sh s3, 4(s0)
1081; CHECK-NOFP16-RV64-NEXT:    sh s4, 6(s0)
1082; CHECK-NOFP16-RV64-NEXT:    ld ra, 120(sp) # 8-byte Folded Reload
1083; CHECK-NOFP16-RV64-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
1084; CHECK-NOFP16-RV64-NEXT:    ld s1, 104(sp) # 8-byte Folded Reload
1085; CHECK-NOFP16-RV64-NEXT:    ld s2, 96(sp) # 8-byte Folded Reload
1086; CHECK-NOFP16-RV64-NEXT:    ld s3, 88(sp) # 8-byte Folded Reload
1087; CHECK-NOFP16-RV64-NEXT:    ld s4, 80(sp) # 8-byte Folded Reload
1088; CHECK-NOFP16-RV64-NEXT:    ld s5, 72(sp) # 8-byte Folded Reload
1089; CHECK-NOFP16-RV64-NEXT:    ld s6, 64(sp) # 8-byte Folded Reload
1090; CHECK-NOFP16-RV64-NEXT:    ld s7, 56(sp) # 8-byte Folded Reload
1091; CHECK-NOFP16-RV64-NEXT:    fld fs0, 48(sp) # 8-byte Folded Reload
1092; CHECK-NOFP16-RV64-NEXT:    fld fs1, 40(sp) # 8-byte Folded Reload
1093; CHECK-NOFP16-RV64-NEXT:    fld fs2, 32(sp) # 8-byte Folded Reload
1094; CHECK-NOFP16-RV64-NEXT:    fld fs3, 24(sp) # 8-byte Folded Reload
1095; CHECK-NOFP16-RV64-NEXT:    fld fs4, 16(sp) # 8-byte Folded Reload
1096; CHECK-NOFP16-RV64-NEXT:    fld fs5, 8(sp) # 8-byte Folded Reload
1097; CHECK-NOFP16-RV64-NEXT:    fld fs6, 0(sp) # 8-byte Folded Reload
1098; CHECK-NOFP16-RV64-NEXT:    .cfi_restore ra
1099; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s0
1100; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s1
1101; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s2
1102; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s3
1103; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s4
1104; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s5
1105; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s6
1106; CHECK-NOFP16-RV64-NEXT:    .cfi_restore s7
1107; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs0
1108; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs1
1109; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs2
1110; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs3
1111; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs4
1112; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs5
1113; CHECK-NOFP16-RV64-NEXT:    .cfi_restore fs6
1114; CHECK-NOFP16-RV64-NEXT:    addi sp, sp, 128
1115; CHECK-NOFP16-RV64-NEXT:    .cfi_def_cfa_offset 0
1116; CHECK-NOFP16-RV64-NEXT:    ret
1117;
1118; CHECK-FP16-RV32-LABEL: fcanonicalize_v8f16_nnan:
1119; CHECK-FP16-RV32:       # %bb.0:
1120; CHECK-FP16-RV32-NEXT:    fmin.h fa0, fa0, fa0
1121; CHECK-FP16-RV32-NEXT:    fmin.h fa1, fa1, fa1
1122; CHECK-FP16-RV32-NEXT:    fmin.h fa2, fa2, fa2
1123; CHECK-FP16-RV32-NEXT:    fmin.h fa3, fa3, fa3
1124; CHECK-FP16-RV32-NEXT:    fmin.h fa4, fa4, fa4
1125; CHECK-FP16-RV32-NEXT:    fmin.h fa5, fa5, fa5
1126; CHECK-FP16-RV32-NEXT:    fmin.h ft0, fa6, fa6
1127; CHECK-FP16-RV32-NEXT:    fmin.h ft1, fa7, fa7
1128; CHECK-FP16-RV32-NEXT:    fsh fa4, 8(a0)
1129; CHECK-FP16-RV32-NEXT:    fsh fa5, 10(a0)
1130; CHECK-FP16-RV32-NEXT:    fsh ft0, 12(a0)
1131; CHECK-FP16-RV32-NEXT:    fsh ft1, 14(a0)
1132; CHECK-FP16-RV32-NEXT:    fsh fa0, 0(a0)
1133; CHECK-FP16-RV32-NEXT:    fsh fa1, 2(a0)
1134; CHECK-FP16-RV32-NEXT:    fsh fa2, 4(a0)
1135; CHECK-FP16-RV32-NEXT:    fsh fa3, 6(a0)
1136; CHECK-FP16-RV32-NEXT:    ret
1137;
1138; CHECK-NOFP16-RV32-LABEL: fcanonicalize_v8f16_nnan:
1139; CHECK-NOFP16-RV32:       # %bb.0:
1140; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, -112
1141; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 112
1142; CHECK-NOFP16-RV32-NEXT:    sw ra, 108(sp) # 4-byte Folded Spill
1143; CHECK-NOFP16-RV32-NEXT:    sw s0, 104(sp) # 4-byte Folded Spill
1144; CHECK-NOFP16-RV32-NEXT:    sw s1, 100(sp) # 4-byte Folded Spill
1145; CHECK-NOFP16-RV32-NEXT:    sw s2, 96(sp) # 4-byte Folded Spill
1146; CHECK-NOFP16-RV32-NEXT:    sw s3, 92(sp) # 4-byte Folded Spill
1147; CHECK-NOFP16-RV32-NEXT:    sw s4, 88(sp) # 4-byte Folded Spill
1148; CHECK-NOFP16-RV32-NEXT:    sw s5, 84(sp) # 4-byte Folded Spill
1149; CHECK-NOFP16-RV32-NEXT:    sw s6, 80(sp) # 4-byte Folded Spill
1150; CHECK-NOFP16-RV32-NEXT:    sw s7, 76(sp) # 4-byte Folded Spill
1151; CHECK-NOFP16-RV32-NEXT:    fsd fs0, 64(sp) # 8-byte Folded Spill
1152; CHECK-NOFP16-RV32-NEXT:    fsd fs1, 56(sp) # 8-byte Folded Spill
1153; CHECK-NOFP16-RV32-NEXT:    fsd fs2, 48(sp) # 8-byte Folded Spill
1154; CHECK-NOFP16-RV32-NEXT:    fsd fs3, 40(sp) # 8-byte Folded Spill
1155; CHECK-NOFP16-RV32-NEXT:    fsd fs4, 32(sp) # 8-byte Folded Spill
1156; CHECK-NOFP16-RV32-NEXT:    fsd fs5, 24(sp) # 8-byte Folded Spill
1157; CHECK-NOFP16-RV32-NEXT:    fsd fs6, 16(sp) # 8-byte Folded Spill
1158; CHECK-NOFP16-RV32-NEXT:    fsd fs7, 8(sp) # 8-byte Folded Spill
1159; CHECK-NOFP16-RV32-NEXT:    .cfi_offset ra, -4
1160; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s0, -8
1161; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s1, -12
1162; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s2, -16
1163; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s3, -20
1164; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s4, -24
1165; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s5, -28
1166; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s6, -32
1167; CHECK-NOFP16-RV32-NEXT:    .cfi_offset s7, -36
1168; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs0, -48
1169; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs1, -56
1170; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs2, -64
1171; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs3, -72
1172; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs4, -80
1173; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs5, -88
1174; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs6, -96
1175; CHECK-NOFP16-RV32-NEXT:    .cfi_offset fs7, -104
1176; CHECK-NOFP16-RV32-NEXT:    mv s0, a0
1177; CHECK-NOFP16-RV32-NEXT:    lhu a0, 0(a1)
1178; CHECK-NOFP16-RV32-NEXT:    lhu a2, 4(a1)
1179; CHECK-NOFP16-RV32-NEXT:    lhu a3, 8(a1)
1180; CHECK-NOFP16-RV32-NEXT:    lhu a4, 12(a1)
1181; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs0, a0
1182; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs2, a2
1183; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs4, a3
1184; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs5, a4
1185; CHECK-NOFP16-RV32-NEXT:    lhu a0, 16(a1)
1186; CHECK-NOFP16-RV32-NEXT:    lhu a2, 20(a1)
1187; CHECK-NOFP16-RV32-NEXT:    lhu a3, 24(a1)
1188; CHECK-NOFP16-RV32-NEXT:    lhu a1, 28(a1)
1189; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs6, a0
1190; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs7, a2
1191; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fs3, a3
1192; CHECK-NOFP16-RV32-NEXT:    fmv.w.x fa0, a1
1193; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1194; CHECK-NOFP16-RV32-NEXT:    fmv.s fs1, fa0
1195; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs3
1196; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1197; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
1198; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1199; CHECK-NOFP16-RV32-NEXT:    fmv.s fs3, fa0
1200; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs7
1201; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1202; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
1203; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1204; CHECK-NOFP16-RV32-NEXT:    fmv.s fs7, fa0
1205; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs6
1206; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1207; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
1208; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1209; CHECK-NOFP16-RV32-NEXT:    fmv.s fs6, fa0
1210; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs5
1211; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1212; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
1213; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1214; CHECK-NOFP16-RV32-NEXT:    fmv.s fs5, fa0
1215; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs4
1216; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1217; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
1218; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1219; CHECK-NOFP16-RV32-NEXT:    fmv.s fs4, fa0
1220; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs2
1221; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1222; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
1223; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1224; CHECK-NOFP16-RV32-NEXT:    fmv.s fs2, fa0
1225; CHECK-NOFP16-RV32-NEXT:    fmv.s fa0, fs0
1226; CHECK-NOFP16-RV32-NEXT:    call __extendhfsf2
1227; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fa0, fa0
1228; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1229; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s1, fa0
1230; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s2, fs2
1231; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s3, fs4
1232; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s4, fs5
1233; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s5, fs6
1234; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s6, fs7
1235; CHECK-NOFP16-RV32-NEXT:    fmin.s fa0, fs1, fs1
1236; CHECK-NOFP16-RV32-NEXT:    fmv.x.w s7, fs3
1237; CHECK-NOFP16-RV32-NEXT:    call __truncsfhf2
1238; CHECK-NOFP16-RV32-NEXT:    fmv.x.w a0, fa0
1239; CHECK-NOFP16-RV32-NEXT:    sh s5, 8(s0)
1240; CHECK-NOFP16-RV32-NEXT:    sh s6, 10(s0)
1241; CHECK-NOFP16-RV32-NEXT:    sh s7, 12(s0)
1242; CHECK-NOFP16-RV32-NEXT:    sh a0, 14(s0)
1243; CHECK-NOFP16-RV32-NEXT:    sh s1, 0(s0)
1244; CHECK-NOFP16-RV32-NEXT:    sh s2, 2(s0)
1245; CHECK-NOFP16-RV32-NEXT:    sh s3, 4(s0)
1246; CHECK-NOFP16-RV32-NEXT:    sh s4, 6(s0)
1247; CHECK-NOFP16-RV32-NEXT:    lw ra, 108(sp) # 4-byte Folded Reload
1248; CHECK-NOFP16-RV32-NEXT:    lw s0, 104(sp) # 4-byte Folded Reload
1249; CHECK-NOFP16-RV32-NEXT:    lw s1, 100(sp) # 4-byte Folded Reload
1250; CHECK-NOFP16-RV32-NEXT:    lw s2, 96(sp) # 4-byte Folded Reload
1251; CHECK-NOFP16-RV32-NEXT:    lw s3, 92(sp) # 4-byte Folded Reload
1252; CHECK-NOFP16-RV32-NEXT:    lw s4, 88(sp) # 4-byte Folded Reload
1253; CHECK-NOFP16-RV32-NEXT:    lw s5, 84(sp) # 4-byte Folded Reload
1254; CHECK-NOFP16-RV32-NEXT:    lw s6, 80(sp) # 4-byte Folded Reload
1255; CHECK-NOFP16-RV32-NEXT:    lw s7, 76(sp) # 4-byte Folded Reload
1256; CHECK-NOFP16-RV32-NEXT:    fld fs0, 64(sp) # 8-byte Folded Reload
1257; CHECK-NOFP16-RV32-NEXT:    fld fs1, 56(sp) # 8-byte Folded Reload
1258; CHECK-NOFP16-RV32-NEXT:    fld fs2, 48(sp) # 8-byte Folded Reload
1259; CHECK-NOFP16-RV32-NEXT:    fld fs3, 40(sp) # 8-byte Folded Reload
1260; CHECK-NOFP16-RV32-NEXT:    fld fs4, 32(sp) # 8-byte Folded Reload
1261; CHECK-NOFP16-RV32-NEXT:    fld fs5, 24(sp) # 8-byte Folded Reload
1262; CHECK-NOFP16-RV32-NEXT:    fld fs6, 16(sp) # 8-byte Folded Reload
1263; CHECK-NOFP16-RV32-NEXT:    fld fs7, 8(sp) # 8-byte Folded Reload
1264; CHECK-NOFP16-RV32-NEXT:    .cfi_restore ra
1265; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s0
1266; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s1
1267; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s2
1268; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s3
1269; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s4
1270; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s5
1271; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s6
1272; CHECK-NOFP16-RV32-NEXT:    .cfi_restore s7
1273; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs0
1274; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs1
1275; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs2
1276; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs3
1277; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs4
1278; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs5
1279; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs6
1280; CHECK-NOFP16-RV32-NEXT:    .cfi_restore fs7
1281; CHECK-NOFP16-RV32-NEXT:    addi sp, sp, 112
1282; CHECK-NOFP16-RV32-NEXT:    .cfi_def_cfa_offset 0
1283; CHECK-NOFP16-RV32-NEXT:    ret
1284  %z = call nnan <8 x half> @llvm.canonicalize.v8f16(<8 x half> %x)
1285  ret <8 x half> %z
1286}
1287
1288define float @fcanonicalize_f32(float %x) {
1289; CHECK-LABEL: fcanonicalize_f32:
1290; CHECK:       # %bb.0:
1291; CHECK-NEXT:    fmin.s fa0, fa0, fa0
1292; CHECK-NEXT:    ret
1293  %z = call float @llvm.canonicalize.f32(float %x)
1294  ret float %z
1295}
1296
1297define float @fcanonicalize_f32_nnan(float %x) {
1298; CHECK-LABEL: fcanonicalize_f32_nnan:
1299; CHECK:       # %bb.0:
1300; CHECK-NEXT:    fmin.s fa0, fa0, fa0
1301; CHECK-NEXT:    ret
1302  %z = call nnan float @llvm.canonicalize.f32(float %x)
1303  ret float %z
1304}
1305
1306define <2 x float> @fcanonicalize_v2f32(<2 x float> %x) {
1307; CHECK-LABEL: fcanonicalize_v2f32:
1308; CHECK:       # %bb.0:
1309; CHECK-NEXT:    fmin.s fa0, fa0, fa0
1310; CHECK-NEXT:    fmin.s fa1, fa1, fa1
1311; CHECK-NEXT:    ret
1312  %z = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
1313  ret <2 x float> %z
1314}
1315
1316define <2 x float> @fcanonicalize_v2f32_nnan(<2 x float> %x) {
1317; CHECK-LABEL: fcanonicalize_v2f32_nnan:
1318; CHECK:       # %bb.0:
1319; CHECK-NEXT:    fmin.s fa0, fa0, fa0
1320; CHECK-NEXT:    fmin.s fa1, fa1, fa1
1321; CHECK-NEXT:    ret
1322  %z = call nnan <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
1323  ret <2 x float> %z
1324}
1325
1326define <4 x float> @fcanonicalize_v4f32(<4 x float> %x) {
1327; CHECK-LABEL: fcanonicalize_v4f32:
1328; CHECK:       # %bb.0:
1329; CHECK-NEXT:    fmin.s fa5, fa0, fa0
1330; CHECK-NEXT:    fmin.s fa4, fa1, fa1
1331; CHECK-NEXT:    fmin.s fa2, fa2, fa2
1332; CHECK-NEXT:    fmin.s fa3, fa3, fa3
1333; CHECK-NEXT:    fsw fa5, 0(a0)
1334; CHECK-NEXT:    fsw fa4, 4(a0)
1335; CHECK-NEXT:    fsw fa2, 8(a0)
1336; CHECK-NEXT:    fsw fa3, 12(a0)
1337; CHECK-NEXT:    ret
1338  %z = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %x)
1339  ret <4 x float> %z
1340}
1341
1342define <4 x float> @fcanonicalize_v4f32_nnan(<4 x float> %x) {
1343; CHECK-LABEL: fcanonicalize_v4f32_nnan:
1344; CHECK:       # %bb.0:
1345; CHECK-NEXT:    fmin.s fa5, fa0, fa0
1346; CHECK-NEXT:    fmin.s fa4, fa1, fa1
1347; CHECK-NEXT:    fmin.s fa2, fa2, fa2
1348; CHECK-NEXT:    fmin.s fa3, fa3, fa3
1349; CHECK-NEXT:    fsw fa5, 0(a0)
1350; CHECK-NEXT:    fsw fa4, 4(a0)
1351; CHECK-NEXT:    fsw fa2, 8(a0)
1352; CHECK-NEXT:    fsw fa3, 12(a0)
1353; CHECK-NEXT:    ret
1354  %z = call nnan <4 x float> @llvm.canonicalize.v4f32(<4 x float> %x)
1355  ret <4 x float> %z
1356}
1357
1358define double @fcanonicalize_f64(double %x) {
1359; CHECK-LABEL: fcanonicalize_f64:
1360; CHECK:       # %bb.0:
1361; CHECK-NEXT:    fmin.d fa0, fa0, fa0
1362; CHECK-NEXT:    ret
1363  %z = call double @llvm.canonicalize.f64(double %x)
1364  ret double %z
1365}
1366
1367define double @fcanonicalize_f64_nnan(double %x) {
1368; CHECK-LABEL: fcanonicalize_f64_nnan:
1369; CHECK:       # %bb.0:
1370; CHECK-NEXT:    fmin.d fa0, fa0, fa0
1371; CHECK-NEXT:    ret
1372  %z = call nnan double @llvm.canonicalize.f64(double %x)
1373  ret double %z
1374}
1375
1376define <2 x double> @fcanonicalize_v2f64(<2 x double> %x) {
1377; CHECK-LABEL: fcanonicalize_v2f64:
1378; CHECK:       # %bb.0:
1379; CHECK-NEXT:    fmin.d fa0, fa0, fa0
1380; CHECK-NEXT:    fmin.d fa1, fa1, fa1
1381; CHECK-NEXT:    ret
1382  %z = call <2 x double> @llvm.canonicalize.v2f64(<2 x double> %x)
1383  ret <2 x double> %z
1384}
1385
1386define <2 x double> @fcanonicalize_v2f64_nnan(<2 x double> %x) {
1387; CHECK-LABEL: fcanonicalize_v2f64_nnan:
1388; CHECK:       # %bb.0:
1389; CHECK-NEXT:    fmin.d fa0, fa0, fa0
1390; CHECK-NEXT:    fmin.d fa1, fa1, fa1
1391; CHECK-NEXT:    ret
1392  %z = call nnan <2 x double> @llvm.canonicalize.v2f64(<2 x double> %x)
1393  ret <2 x double> %z
1394}
1395