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