xref: /llvm-project/llvm/test/CodeGen/LoongArch/fp-maximumnum-minimumnum.ll (revision fb9e685fc41b8abc87725f8509624b3a80330dee)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F
3; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D
4; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F
5; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D
6
7declare float @llvm.maximumnum.f32(float, float)
8declare double @llvm.maximumnum.f64(double, double)
9declare float @llvm.minimumnum.f32(float, float)
10declare double @llvm.minimumnum.f64(double, double)
11
12define float @maximumnum_float(float %x, float %y) {
13;
14; LA32F-LABEL: maximumnum_float:
15; LA32F:       # %bb.0:
16; LA32F-NEXT:    fmax.s $fa1, $fa1, $fa1
17; LA32F-NEXT:    fmax.s $fa0, $fa0, $fa0
18; LA32F-NEXT:    fmax.s $fa0, $fa0, $fa1
19; LA32F-NEXT:    ret
20;
21; LA32D-LABEL: maximumnum_float:
22; LA32D:       # %bb.0:
23; LA32D-NEXT:    fmax.s $fa1, $fa1, $fa1
24; LA32D-NEXT:    fmax.s $fa0, $fa0, $fa0
25; LA32D-NEXT:    fmax.s $fa0, $fa0, $fa1
26; LA32D-NEXT:    ret
27;
28; LA64F-LABEL: maximumnum_float:
29; LA64F:       # %bb.0:
30; LA64F-NEXT:    fmax.s $fa1, $fa1, $fa1
31; LA64F-NEXT:    fmax.s $fa0, $fa0, $fa0
32; LA64F-NEXT:    fmax.s $fa0, $fa0, $fa1
33; LA64F-NEXT:    ret
34;
35; LA64D-LABEL: maximumnum_float:
36; LA64D:       # %bb.0:
37; LA64D-NEXT:    fmax.s $fa1, $fa1, $fa1
38; LA64D-NEXT:    fmax.s $fa0, $fa0, $fa0
39; LA64D-NEXT:    fmax.s $fa0, $fa0, $fa1
40; LA64D-NEXT:    ret
41  %z = call float @llvm.maximumnum.f32(float %x, float %y)
42  ret float %z
43}
44
45define float @maximumnum_float_nsz(float %x, float %y) {
46;
47; LA32F-LABEL: maximumnum_float_nsz:
48; LA32F:       # %bb.0:
49; LA32F-NEXT:    fmax.s $fa1, $fa1, $fa1
50; LA32F-NEXT:    fmax.s $fa0, $fa0, $fa0
51; LA32F-NEXT:    fmax.s $fa0, $fa0, $fa1
52; LA32F-NEXT:    ret
53;
54; LA32D-LABEL: maximumnum_float_nsz:
55; LA32D:       # %bb.0:
56; LA32D-NEXT:    fmax.s $fa1, $fa1, $fa1
57; LA32D-NEXT:    fmax.s $fa0, $fa0, $fa0
58; LA32D-NEXT:    fmax.s $fa0, $fa0, $fa1
59; LA32D-NEXT:    ret
60;
61; LA64F-LABEL: maximumnum_float_nsz:
62; LA64F:       # %bb.0:
63; LA64F-NEXT:    fmax.s $fa1, $fa1, $fa1
64; LA64F-NEXT:    fmax.s $fa0, $fa0, $fa0
65; LA64F-NEXT:    fmax.s $fa0, $fa0, $fa1
66; LA64F-NEXT:    ret
67;
68; LA64D-LABEL: maximumnum_float_nsz:
69; LA64D:       # %bb.0:
70; LA64D-NEXT:    fmax.s $fa1, $fa1, $fa1
71; LA64D-NEXT:    fmax.s $fa0, $fa0, $fa0
72; LA64D-NEXT:    fmax.s $fa0, $fa0, $fa1
73; LA64D-NEXT:    ret
74  %z = call nsz float @llvm.maximumnum.f32(float %x, float %y)
75  ret float %z
76}
77
78define float @maximumnum_float_nnan(float %x, float %y) {
79;
80; LA32F-LABEL: maximumnum_float_nnan:
81; LA32F:       # %bb.0:
82; LA32F-NEXT:    fmax.s $fa0, $fa0, $fa1
83; LA32F-NEXT:    ret
84;
85; LA32D-LABEL: maximumnum_float_nnan:
86; LA32D:       # %bb.0:
87; LA32D-NEXT:    fmax.s $fa0, $fa0, $fa1
88; LA32D-NEXT:    ret
89;
90; LA64F-LABEL: maximumnum_float_nnan:
91; LA64F:       # %bb.0:
92; LA64F-NEXT:    fmax.s $fa0, $fa0, $fa1
93; LA64F-NEXT:    ret
94;
95; LA64D-LABEL: maximumnum_float_nnan:
96; LA64D:       # %bb.0:
97; LA64D-NEXT:    fmax.s $fa0, $fa0, $fa1
98; LA64D-NEXT:    ret
99  %z = call nnan float @llvm.maximumnum.f32(float %x, float %y)
100  ret float %z
101}
102
103
104define double @maximumnum_double(double %x, double %y) {
105;
106; LA32F-LABEL: maximumnum_double:
107; LA32F:       # %bb.0:
108; LA32F-NEXT:    addi.w $sp, $sp, -16
109; LA32F-NEXT:    .cfi_def_cfa_offset 16
110; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
111; LA32F-NEXT:    .cfi_offset 1, -4
112; LA32F-NEXT:    bl %plt(fmaximum_num)
113; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
114; LA32F-NEXT:    addi.w $sp, $sp, 16
115; LA32F-NEXT:    ret
116;
117; LA32D-LABEL: maximumnum_double:
118; LA32D:       # %bb.0:
119; LA32D-NEXT:    fmax.d $fa1, $fa1, $fa1
120; LA32D-NEXT:    fmax.d $fa0, $fa0, $fa0
121; LA32D-NEXT:    fmax.d $fa0, $fa0, $fa1
122; LA32D-NEXT:    ret
123;
124; LA64F-LABEL: maximumnum_double:
125; LA64F:       # %bb.0:
126; LA64F-NEXT:    addi.d $sp, $sp, -16
127; LA64F-NEXT:    .cfi_def_cfa_offset 16
128; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
129; LA64F-NEXT:    .cfi_offset 1, -8
130; LA64F-NEXT:    bl %plt(fmaximum_num)
131; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
132; LA64F-NEXT:    addi.d $sp, $sp, 16
133; LA64F-NEXT:    ret
134;
135; LA64D-LABEL: maximumnum_double:
136; LA64D:       # %bb.0:
137; LA64D-NEXT:    fmax.d $fa1, $fa1, $fa1
138; LA64D-NEXT:    fmax.d $fa0, $fa0, $fa0
139; LA64D-NEXT:    fmax.d $fa0, $fa0, $fa1
140; LA64D-NEXT:    ret
141  %z = call double @llvm.maximumnum.f64(double %x, double %y)
142  ret double %z
143}
144
145define double @maximumnum_double_nsz(double %x, double %y) {
146;
147; LA32F-LABEL: maximumnum_double_nsz:
148; LA32F:       # %bb.0:
149; LA32F-NEXT:    addi.w $sp, $sp, -16
150; LA32F-NEXT:    .cfi_def_cfa_offset 16
151; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
152; LA32F-NEXT:    .cfi_offset 1, -4
153; LA32F-NEXT:    bl %plt(fmaximum_num)
154; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
155; LA32F-NEXT:    addi.w $sp, $sp, 16
156; LA32F-NEXT:    ret
157;
158; LA32D-LABEL: maximumnum_double_nsz:
159; LA32D:       # %bb.0:
160; LA32D-NEXT:    fmax.d $fa1, $fa1, $fa1
161; LA32D-NEXT:    fmax.d $fa0, $fa0, $fa0
162; LA32D-NEXT:    fmax.d $fa0, $fa0, $fa1
163; LA32D-NEXT:    ret
164;
165; LA64F-LABEL: maximumnum_double_nsz:
166; LA64F:       # %bb.0:
167; LA64F-NEXT:    addi.d $sp, $sp, -16
168; LA64F-NEXT:    .cfi_def_cfa_offset 16
169; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
170; LA64F-NEXT:    .cfi_offset 1, -8
171; LA64F-NEXT:    bl %plt(fmaximum_num)
172; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
173; LA64F-NEXT:    addi.d $sp, $sp, 16
174; LA64F-NEXT:    ret
175;
176; LA64D-LABEL: maximumnum_double_nsz:
177; LA64D:       # %bb.0:
178; LA64D-NEXT:    fmax.d $fa1, $fa1, $fa1
179; LA64D-NEXT:    fmax.d $fa0, $fa0, $fa0
180; LA64D-NEXT:    fmax.d $fa0, $fa0, $fa1
181; LA64D-NEXT:    ret
182  %z = call nsz double @llvm.maximumnum.f64(double %x, double %y)
183  ret double %z
184}
185
186define double @maximumnum_double_nnan(double %x, double %y) {
187;
188; LA32F-LABEL: maximumnum_double_nnan:
189; LA32F:       # %bb.0:
190; LA32F-NEXT:    addi.w $sp, $sp, -16
191; LA32F-NEXT:    .cfi_def_cfa_offset 16
192; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
193; LA32F-NEXT:    .cfi_offset 1, -4
194; LA32F-NEXT:    bl %plt(fmaximum_num)
195; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
196; LA32F-NEXT:    addi.w $sp, $sp, 16
197; LA32F-NEXT:    ret
198;
199; LA32D-LABEL: maximumnum_double_nnan:
200; LA32D:       # %bb.0:
201; LA32D-NEXT:    fmax.d $fa0, $fa0, $fa1
202; LA32D-NEXT:    ret
203;
204; LA64F-LABEL: maximumnum_double_nnan:
205; LA64F:       # %bb.0:
206; LA64F-NEXT:    addi.d $sp, $sp, -16
207; LA64F-NEXT:    .cfi_def_cfa_offset 16
208; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
209; LA64F-NEXT:    .cfi_offset 1, -8
210; LA64F-NEXT:    bl %plt(fmaximum_num)
211; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
212; LA64F-NEXT:    addi.d $sp, $sp, 16
213; LA64F-NEXT:    ret
214;
215; LA64D-LABEL: maximumnum_double_nnan:
216; LA64D:       # %bb.0:
217; LA64D-NEXT:    fmax.d $fa0, $fa0, $fa1
218; LA64D-NEXT:    ret
219  %z = call nnan double @llvm.maximumnum.f64(double %x, double %y)
220  ret double %z
221}
222
223define float @minimumnum_float(float %x, float %y) {
224;
225; LA32F-LABEL: minimumnum_float:
226; LA32F:       # %bb.0:
227; LA32F-NEXT:    fmax.s $fa1, $fa1, $fa1
228; LA32F-NEXT:    fmax.s $fa0, $fa0, $fa0
229; LA32F-NEXT:    fmin.s $fa0, $fa0, $fa1
230; LA32F-NEXT:    ret
231;
232; LA32D-LABEL: minimumnum_float:
233; LA32D:       # %bb.0:
234; LA32D-NEXT:    fmax.s $fa1, $fa1, $fa1
235; LA32D-NEXT:    fmax.s $fa0, $fa0, $fa0
236; LA32D-NEXT:    fmin.s $fa0, $fa0, $fa1
237; LA32D-NEXT:    ret
238;
239; LA64F-LABEL: minimumnum_float:
240; LA64F:       # %bb.0:
241; LA64F-NEXT:    fmax.s $fa1, $fa1, $fa1
242; LA64F-NEXT:    fmax.s $fa0, $fa0, $fa0
243; LA64F-NEXT:    fmin.s $fa0, $fa0, $fa1
244; LA64F-NEXT:    ret
245;
246; LA64D-LABEL: minimumnum_float:
247; LA64D:       # %bb.0:
248; LA64D-NEXT:    fmax.s $fa1, $fa1, $fa1
249; LA64D-NEXT:    fmax.s $fa0, $fa0, $fa0
250; LA64D-NEXT:    fmin.s $fa0, $fa0, $fa1
251; LA64D-NEXT:    ret
252  %z = call float @llvm.minimumnum.f32(float %x, float %y)
253  ret float %z
254}
255
256define float @minimumnum_float_nsz(float %x, float %y) {
257;
258; LA32F-LABEL: minimumnum_float_nsz:
259; LA32F:       # %bb.0:
260; LA32F-NEXT:    fmax.s $fa1, $fa1, $fa1
261; LA32F-NEXT:    fmax.s $fa0, $fa0, $fa0
262; LA32F-NEXT:    fmin.s $fa0, $fa0, $fa1
263; LA32F-NEXT:    ret
264;
265; LA32D-LABEL: minimumnum_float_nsz:
266; LA32D:       # %bb.0:
267; LA32D-NEXT:    fmax.s $fa1, $fa1, $fa1
268; LA32D-NEXT:    fmax.s $fa0, $fa0, $fa0
269; LA32D-NEXT:    fmin.s $fa0, $fa0, $fa1
270; LA32D-NEXT:    ret
271;
272; LA64F-LABEL: minimumnum_float_nsz:
273; LA64F:       # %bb.0:
274; LA64F-NEXT:    fmax.s $fa1, $fa1, $fa1
275; LA64F-NEXT:    fmax.s $fa0, $fa0, $fa0
276; LA64F-NEXT:    fmin.s $fa0, $fa0, $fa1
277; LA64F-NEXT:    ret
278;
279; LA64D-LABEL: minimumnum_float_nsz:
280; LA64D:       # %bb.0:
281; LA64D-NEXT:    fmax.s $fa1, $fa1, $fa1
282; LA64D-NEXT:    fmax.s $fa0, $fa0, $fa0
283; LA64D-NEXT:    fmin.s $fa0, $fa0, $fa1
284; LA64D-NEXT:    ret
285  %z = call nsz float @llvm.minimumnum.f32(float %x, float %y)
286  ret float %z
287}
288
289define float @minimumnum_float_nnan(float %x, float %y) {
290;
291; LA32F-LABEL: minimumnum_float_nnan:
292; LA32F:       # %bb.0:
293; LA32F-NEXT:    fmin.s $fa0, $fa0, $fa1
294; LA32F-NEXT:    ret
295;
296; LA32D-LABEL: minimumnum_float_nnan:
297; LA32D:       # %bb.0:
298; LA32D-NEXT:    fmin.s $fa0, $fa0, $fa1
299; LA32D-NEXT:    ret
300;
301; LA64F-LABEL: minimumnum_float_nnan:
302; LA64F:       # %bb.0:
303; LA64F-NEXT:    fmin.s $fa0, $fa0, $fa1
304; LA64F-NEXT:    ret
305;
306; LA64D-LABEL: minimumnum_float_nnan:
307; LA64D:       # %bb.0:
308; LA64D-NEXT:    fmin.s $fa0, $fa0, $fa1
309; LA64D-NEXT:    ret
310  %z = call nnan float @llvm.minimumnum.f32(float %x, float %y)
311  ret float %z
312}
313
314define double @minimumnum_double(double %x, double %y) {
315;
316; LA32F-LABEL: minimumnum_double:
317; LA32F:       # %bb.0:
318; LA32F-NEXT:    addi.w $sp, $sp, -16
319; LA32F-NEXT:    .cfi_def_cfa_offset 16
320; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
321; LA32F-NEXT:    .cfi_offset 1, -4
322; LA32F-NEXT:    bl %plt(fminimum_num)
323; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
324; LA32F-NEXT:    addi.w $sp, $sp, 16
325; LA32F-NEXT:    ret
326;
327; LA32D-LABEL: minimumnum_double:
328; LA32D:       # %bb.0:
329; LA32D-NEXT:    fmax.d $fa1, $fa1, $fa1
330; LA32D-NEXT:    fmax.d $fa0, $fa0, $fa0
331; LA32D-NEXT:    fmin.d $fa0, $fa0, $fa1
332; LA32D-NEXT:    ret
333;
334; LA64F-LABEL: minimumnum_double:
335; LA64F:       # %bb.0:
336; LA64F-NEXT:    addi.d $sp, $sp, -16
337; LA64F-NEXT:    .cfi_def_cfa_offset 16
338; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
339; LA64F-NEXT:    .cfi_offset 1, -8
340; LA64F-NEXT:    bl %plt(fminimum_num)
341; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
342; LA64F-NEXT:    addi.d $sp, $sp, 16
343; LA64F-NEXT:    ret
344;
345; LA64D-LABEL: minimumnum_double:
346; LA64D:       # %bb.0:
347; LA64D-NEXT:    fmax.d $fa1, $fa1, $fa1
348; LA64D-NEXT:    fmax.d $fa0, $fa0, $fa0
349; LA64D-NEXT:    fmin.d $fa0, $fa0, $fa1
350; LA64D-NEXT:    ret
351  %z = call double @llvm.minimumnum.f64(double %x, double %y)
352  ret double %z
353}
354
355define double @minimumnum_double_nsz(double %x, double %y) {
356;
357; LA32F-LABEL: minimumnum_double_nsz:
358; LA32F:       # %bb.0:
359; LA32F-NEXT:    addi.w $sp, $sp, -16
360; LA32F-NEXT:    .cfi_def_cfa_offset 16
361; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
362; LA32F-NEXT:    .cfi_offset 1, -4
363; LA32F-NEXT:    bl %plt(fminimum_num)
364; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
365; LA32F-NEXT:    addi.w $sp, $sp, 16
366; LA32F-NEXT:    ret
367;
368; LA32D-LABEL: minimumnum_double_nsz:
369; LA32D:       # %bb.0:
370; LA32D-NEXT:    fmax.d $fa1, $fa1, $fa1
371; LA32D-NEXT:    fmax.d $fa0, $fa0, $fa0
372; LA32D-NEXT:    fmin.d $fa0, $fa0, $fa1
373; LA32D-NEXT:    ret
374;
375; LA64F-LABEL: minimumnum_double_nsz:
376; LA64F:       # %bb.0:
377; LA64F-NEXT:    addi.d $sp, $sp, -16
378; LA64F-NEXT:    .cfi_def_cfa_offset 16
379; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
380; LA64F-NEXT:    .cfi_offset 1, -8
381; LA64F-NEXT:    bl %plt(fminimum_num)
382; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
383; LA64F-NEXT:    addi.d $sp, $sp, 16
384; LA64F-NEXT:    ret
385;
386; LA64D-LABEL: minimumnum_double_nsz:
387; LA64D:       # %bb.0:
388; LA64D-NEXT:    fmax.d $fa1, $fa1, $fa1
389; LA64D-NEXT:    fmax.d $fa0, $fa0, $fa0
390; LA64D-NEXT:    fmin.d $fa0, $fa0, $fa1
391; LA64D-NEXT:    ret
392  %z = call nsz double @llvm.minimumnum.f64(double %x, double %y)
393  ret double %z
394}
395
396define double @minimumnum_double_nnan(double %x, double %y) {
397;
398; LA32F-LABEL: minimumnum_double_nnan:
399; LA32F:       # %bb.0:
400; LA32F-NEXT:    addi.w $sp, $sp, -16
401; LA32F-NEXT:    .cfi_def_cfa_offset 16
402; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
403; LA32F-NEXT:    .cfi_offset 1, -4
404; LA32F-NEXT:    bl %plt(fminimum_num)
405; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
406; LA32F-NEXT:    addi.w $sp, $sp, 16
407; LA32F-NEXT:    ret
408;
409; LA32D-LABEL: minimumnum_double_nnan:
410; LA32D:       # %bb.0:
411; LA32D-NEXT:    fmin.d $fa0, $fa0, $fa1
412; LA32D-NEXT:    ret
413;
414; LA64F-LABEL: minimumnum_double_nnan:
415; LA64F:       # %bb.0:
416; LA64F-NEXT:    addi.d $sp, $sp, -16
417; LA64F-NEXT:    .cfi_def_cfa_offset 16
418; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
419; LA64F-NEXT:    .cfi_offset 1, -8
420; LA64F-NEXT:    bl %plt(fminimum_num)
421; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
422; LA64F-NEXT:    addi.d $sp, $sp, 16
423; LA64F-NEXT:    ret
424;
425; LA64D-LABEL: minimumnum_double_nnan:
426; LA64D:       # %bb.0:
427; LA64D-NEXT:    fmin.d $fa0, $fa0, $fa1
428; LA64D-NEXT:    ret
429  %z = call nnan double @llvm.minimumnum.f64(double %x, double %y)
430  ret double %z
431}
432