blob: 20248415468a0702223433a781d22b5126abb327 [file] [log] [blame]
Alex Bradbury52c27782018-11-02 19:50:38 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \
3; RUN: | FileCheck -check-prefix=RV32IF %s
4; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
5; RUN: | FileCheck -check-prefix=RV32IF %s
Alex Bradbury32b77382019-02-01 03:46:28 +00006; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \
7; RUN: | FileCheck -check-prefix=RV64IF %s
8; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \
9; RUN: | FileCheck -check-prefix=RV64IF %s
Alex Bradbury52c27782018-11-02 19:50:38 +000010
11declare float @llvm.sqrt.f32(float)
12
Alex Bradbury919f5fb2018-12-13 10:49:05 +000013define float @sqrt_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +000014; RV32IF-LABEL: sqrt_f32:
15; RV32IF: # %bb.0:
16; RV32IF-NEXT: fmv.w.x ft0, a0
17; RV32IF-NEXT: fsqrt.s ft0, ft0
18; RV32IF-NEXT: fmv.x.w a0, ft0
19; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +000020;
21; RV64IF-LABEL: sqrt_f32:
22; RV64IF: # %bb.0:
23; RV64IF-NEXT: fmv.w.x ft0, a0
24; RV64IF-NEXT: fsqrt.s ft0, ft0
25; RV64IF-NEXT: fmv.x.w a0, ft0
26; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +000027 %1 = call float @llvm.sqrt.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +000028 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +000029}
30
31declare float @llvm.powi.f32(float, i32)
32
Alex Bradbury919f5fb2018-12-13 10:49:05 +000033define float @powi_f32(float %a, i32 %b) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +000034; RV32IF-LABEL: powi_f32:
35; RV32IF: # %bb.0:
36; RV32IF-NEXT: addi sp, sp, -16
37; RV32IF-NEXT: sw ra, 12(sp)
38; RV32IF-NEXT: call __powisf2
39; RV32IF-NEXT: lw ra, 12(sp)
40; RV32IF-NEXT: addi sp, sp, 16
41; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +000042;
43; RV64IF-LABEL: powi_f32:
44; RV64IF: # %bb.0:
45; RV64IF-NEXT: addi sp, sp, -16
46; RV64IF-NEXT: sd ra, 8(sp)
47; RV64IF-NEXT: sext.w a1, a1
48; RV64IF-NEXT: call __powisf2
49; RV64IF-NEXT: ld ra, 8(sp)
50; RV64IF-NEXT: addi sp, sp, 16
51; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +000052 %1 = call float @llvm.powi.f32(float %a, i32 %b)
Alex Bradbury919f5fb2018-12-13 10:49:05 +000053 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +000054}
55
56declare float @llvm.sin.f32(float)
57
Alex Bradbury919f5fb2018-12-13 10:49:05 +000058define float @sin_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +000059; RV32IF-LABEL: sin_f32:
60; RV32IF: # %bb.0:
61; RV32IF-NEXT: addi sp, sp, -16
62; RV32IF-NEXT: sw ra, 12(sp)
63; RV32IF-NEXT: call sinf
64; RV32IF-NEXT: lw ra, 12(sp)
65; RV32IF-NEXT: addi sp, sp, 16
66; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +000067;
68; RV64IF-LABEL: sin_f32:
69; RV64IF: # %bb.0:
70; RV64IF-NEXT: addi sp, sp, -16
71; RV64IF-NEXT: sd ra, 8(sp)
72; RV64IF-NEXT: call sinf
73; RV64IF-NEXT: ld ra, 8(sp)
74; RV64IF-NEXT: addi sp, sp, 16
75; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +000076 %1 = call float @llvm.sin.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +000077 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +000078}
79
80declare float @llvm.cos.f32(float)
81
Alex Bradbury919f5fb2018-12-13 10:49:05 +000082define float @cos_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +000083; RV32IF-LABEL: cos_f32:
84; RV32IF: # %bb.0:
85; RV32IF-NEXT: addi sp, sp, -16
86; RV32IF-NEXT: sw ra, 12(sp)
87; RV32IF-NEXT: call cosf
88; RV32IF-NEXT: lw ra, 12(sp)
89; RV32IF-NEXT: addi sp, sp, 16
90; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +000091;
92; RV64IF-LABEL: cos_f32:
93; RV64IF: # %bb.0:
94; RV64IF-NEXT: addi sp, sp, -16
95; RV64IF-NEXT: sd ra, 8(sp)
96; RV64IF-NEXT: call cosf
97; RV64IF-NEXT: ld ra, 8(sp)
98; RV64IF-NEXT: addi sp, sp, 16
99; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000100 %1 = call float @llvm.cos.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000101 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000102}
103
104; The sin+cos combination results in an FSINCOS SelectionDAG node.
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000105define float @sincos_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000106; RV32IF-LABEL: sincos_f32:
107; RV32IF: # %bb.0:
108; RV32IF-NEXT: addi sp, sp, -16
109; RV32IF-NEXT: sw ra, 12(sp)
110; RV32IF-NEXT: sw s1, 8(sp)
111; RV32IF-NEXT: sw s2, 4(sp)
112; RV32IF-NEXT: mv s1, a0
113; RV32IF-NEXT: call sinf
114; RV32IF-NEXT: mv s2, a0
115; RV32IF-NEXT: mv a0, s1
116; RV32IF-NEXT: call cosf
117; RV32IF-NEXT: fmv.w.x ft0, a0
118; RV32IF-NEXT: fmv.w.x ft1, s2
119; RV32IF-NEXT: fadd.s ft0, ft1, ft0
120; RV32IF-NEXT: fmv.x.w a0, ft0
121; RV32IF-NEXT: lw s2, 4(sp)
122; RV32IF-NEXT: lw s1, 8(sp)
123; RV32IF-NEXT: lw ra, 12(sp)
124; RV32IF-NEXT: addi sp, sp, 16
125; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000126;
127; RV64IF-LABEL: sincos_f32:
128; RV64IF: # %bb.0:
129; RV64IF-NEXT: addi sp, sp, -32
130; RV64IF-NEXT: sd ra, 24(sp)
131; RV64IF-NEXT: sd s1, 16(sp)
132; RV64IF-NEXT: sd s2, 8(sp)
133; RV64IF-NEXT: mv s1, a0
134; RV64IF-NEXT: call sinf
135; RV64IF-NEXT: mv s2, a0
136; RV64IF-NEXT: mv a0, s1
137; RV64IF-NEXT: call cosf
138; RV64IF-NEXT: fmv.w.x ft0, a0
139; RV64IF-NEXT: fmv.w.x ft1, s2
140; RV64IF-NEXT: fadd.s ft0, ft1, ft0
141; RV64IF-NEXT: fmv.x.w a0, ft0
142; RV64IF-NEXT: ld s2, 8(sp)
143; RV64IF-NEXT: ld s1, 16(sp)
144; RV64IF-NEXT: ld ra, 24(sp)
145; RV64IF-NEXT: addi sp, sp, 32
146; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000147 %1 = call float @llvm.sin.f32(float %a)
148 %2 = call float @llvm.cos.f32(float %a)
149 %3 = fadd float %1, %2
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000150 ret float %3
Alex Bradbury52c27782018-11-02 19:50:38 +0000151}
152
153declare float @llvm.pow.f32(float, float)
154
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000155define float @pow_f32(float %a, float %b) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000156; RV32IF-LABEL: pow_f32:
157; RV32IF: # %bb.0:
158; RV32IF-NEXT: addi sp, sp, -16
159; RV32IF-NEXT: sw ra, 12(sp)
160; RV32IF-NEXT: call powf
161; RV32IF-NEXT: lw ra, 12(sp)
162; RV32IF-NEXT: addi sp, sp, 16
163; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000164;
165; RV64IF-LABEL: pow_f32:
166; RV64IF: # %bb.0:
167; RV64IF-NEXT: addi sp, sp, -16
168; RV64IF-NEXT: sd ra, 8(sp)
169; RV64IF-NEXT: call powf
170; RV64IF-NEXT: ld ra, 8(sp)
171; RV64IF-NEXT: addi sp, sp, 16
172; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000173 %1 = call float @llvm.pow.f32(float %a, float %b)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000174 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000175}
176
177declare float @llvm.exp.f32(float)
178
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000179define float @exp_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000180; RV32IF-LABEL: exp_f32:
181; RV32IF: # %bb.0:
182; RV32IF-NEXT: addi sp, sp, -16
183; RV32IF-NEXT: sw ra, 12(sp)
184; RV32IF-NEXT: call expf
185; RV32IF-NEXT: lw ra, 12(sp)
186; RV32IF-NEXT: addi sp, sp, 16
187; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000188;
189; RV64IF-LABEL: exp_f32:
190; RV64IF: # %bb.0:
191; RV64IF-NEXT: addi sp, sp, -16
192; RV64IF-NEXT: sd ra, 8(sp)
193; RV64IF-NEXT: call expf
194; RV64IF-NEXT: ld ra, 8(sp)
195; RV64IF-NEXT: addi sp, sp, 16
196; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000197 %1 = call float @llvm.exp.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000198 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000199}
200
201declare float @llvm.exp2.f32(float)
202
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000203define float @exp2_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000204; RV32IF-LABEL: exp2_f32:
205; RV32IF: # %bb.0:
206; RV32IF-NEXT: addi sp, sp, -16
207; RV32IF-NEXT: sw ra, 12(sp)
208; RV32IF-NEXT: call exp2f
209; RV32IF-NEXT: lw ra, 12(sp)
210; RV32IF-NEXT: addi sp, sp, 16
211; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000212;
213; RV64IF-LABEL: exp2_f32:
214; RV64IF: # %bb.0:
215; RV64IF-NEXT: addi sp, sp, -16
216; RV64IF-NEXT: sd ra, 8(sp)
217; RV64IF-NEXT: call exp2f
218; RV64IF-NEXT: ld ra, 8(sp)
219; RV64IF-NEXT: addi sp, sp, 16
220; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000221 %1 = call float @llvm.exp2.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000222 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000223}
224
225declare float @llvm.log.f32(float)
226
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000227define float @log_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000228; RV32IF-LABEL: log_f32:
229; RV32IF: # %bb.0:
230; RV32IF-NEXT: addi sp, sp, -16
231; RV32IF-NEXT: sw ra, 12(sp)
232; RV32IF-NEXT: call logf
233; RV32IF-NEXT: lw ra, 12(sp)
234; RV32IF-NEXT: addi sp, sp, 16
235; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000236;
237; RV64IF-LABEL: log_f32:
238; RV64IF: # %bb.0:
239; RV64IF-NEXT: addi sp, sp, -16
240; RV64IF-NEXT: sd ra, 8(sp)
241; RV64IF-NEXT: call logf
242; RV64IF-NEXT: ld ra, 8(sp)
243; RV64IF-NEXT: addi sp, sp, 16
244; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000245 %1 = call float @llvm.log.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000246 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000247}
248
249declare float @llvm.log10.f32(float)
250
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000251define float @log10_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000252; RV32IF-LABEL: log10_f32:
253; RV32IF: # %bb.0:
254; RV32IF-NEXT: addi sp, sp, -16
255; RV32IF-NEXT: sw ra, 12(sp)
256; RV32IF-NEXT: call log10f
257; RV32IF-NEXT: lw ra, 12(sp)
258; RV32IF-NEXT: addi sp, sp, 16
259; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000260;
261; RV64IF-LABEL: log10_f32:
262; RV64IF: # %bb.0:
263; RV64IF-NEXT: addi sp, sp, -16
264; RV64IF-NEXT: sd ra, 8(sp)
265; RV64IF-NEXT: call log10f
266; RV64IF-NEXT: ld ra, 8(sp)
267; RV64IF-NEXT: addi sp, sp, 16
268; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000269 %1 = call float @llvm.log10.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000270 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000271}
272
273declare float @llvm.log2.f32(float)
274
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000275define float @log2_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000276; RV32IF-LABEL: log2_f32:
277; RV32IF: # %bb.0:
278; RV32IF-NEXT: addi sp, sp, -16
279; RV32IF-NEXT: sw ra, 12(sp)
280; RV32IF-NEXT: call log2f
281; RV32IF-NEXT: lw ra, 12(sp)
282; RV32IF-NEXT: addi sp, sp, 16
283; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000284;
285; RV64IF-LABEL: log2_f32:
286; RV64IF: # %bb.0:
287; RV64IF-NEXT: addi sp, sp, -16
288; RV64IF-NEXT: sd ra, 8(sp)
289; RV64IF-NEXT: call log2f
290; RV64IF-NEXT: ld ra, 8(sp)
291; RV64IF-NEXT: addi sp, sp, 16
292; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000293 %1 = call float @llvm.log2.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000294 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000295}
296
297declare float @llvm.fma.f32(float, float, float)
298
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000299define float @fma_f32(float %a, float %b, float %c) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000300; RV32IF-LABEL: fma_f32:
301; RV32IF: # %bb.0:
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000302; RV32IF-NEXT: fmv.w.x ft0, a2
303; RV32IF-NEXT: fmv.w.x ft1, a1
304; RV32IF-NEXT: fmv.w.x ft2, a0
305; RV32IF-NEXT: fmadd.s ft0, ft2, ft1, ft0
306; RV32IF-NEXT: fmv.x.w a0, ft0
Alex Bradbury52c27782018-11-02 19:50:38 +0000307; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000308;
309; RV64IF-LABEL: fma_f32:
310; RV64IF: # %bb.0:
311; RV64IF-NEXT: fmv.w.x ft0, a2
312; RV64IF-NEXT: fmv.w.x ft1, a1
313; RV64IF-NEXT: fmv.w.x ft2, a0
314; RV64IF-NEXT: fmadd.s ft0, ft2, ft1, ft0
315; RV64IF-NEXT: fmv.x.w a0, ft0
316; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000317 %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000318 ret float %1
319}
320
321declare float @llvm.fmuladd.f32(float, float, float)
322
323define float @fmuladd_f32(float %a, float %b, float %c) nounwind {
324; Use of fmadd depends on TargetLowering::isFMAFasterthanFMulAndFAdd
325; RV32IF-LABEL: fmuladd_f32:
326; RV32IF: # %bb.0:
327; RV32IF-NEXT: fmv.w.x ft0, a1
328; RV32IF-NEXT: fmv.w.x ft1, a0
329; RV32IF-NEXT: fmul.s ft0, ft1, ft0
330; RV32IF-NEXT: fmv.w.x ft1, a2
331; RV32IF-NEXT: fadd.s ft0, ft0, ft1
332; RV32IF-NEXT: fmv.x.w a0, ft0
333; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000334;
335; RV64IF-LABEL: fmuladd_f32:
336; RV64IF: # %bb.0:
337; RV64IF-NEXT: fmv.w.x ft0, a1
338; RV64IF-NEXT: fmv.w.x ft1, a0
339; RV64IF-NEXT: fmul.s ft0, ft1, ft0
340; RV64IF-NEXT: fmv.w.x ft1, a2
341; RV64IF-NEXT: fadd.s ft0, ft0, ft1
342; RV64IF-NEXT: fmv.x.w a0, ft0
343; RV64IF-NEXT: ret
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000344 %1 = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
345 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000346}
347
348declare float @llvm.fabs.f32(float)
349
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000350define float @fabs_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000351; RV32IF-LABEL: fabs_f32:
352; RV32IF: # %bb.0:
353; RV32IF-NEXT: lui a1, 524288
354; RV32IF-NEXT: addi a1, a1, -1
355; RV32IF-NEXT: and a0, a0, a1
356; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000357;
358; RV64IF-LABEL: fabs_f32:
359; RV64IF: # %bb.0:
360; RV64IF-NEXT: lui a1, 524288
361; RV64IF-NEXT: addiw a1, a1, -1
362; RV64IF-NEXT: and a0, a0, a1
363; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000364 %1 = call float @llvm.fabs.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000365 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000366}
367
368declare float @llvm.minnum.f32(float, float)
369
370define float @minnum_f32(float %a, float %b) nounwind {
371; RV32IF-LABEL: minnum_f32:
372; RV32IF: # %bb.0:
373; RV32IF-NEXT: fmv.w.x ft0, a1
374; RV32IF-NEXT: fmv.w.x ft1, a0
375; RV32IF-NEXT: fmin.s ft0, ft1, ft0
376; RV32IF-NEXT: fmv.x.w a0, ft0
377; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000378;
379; RV64IF-LABEL: minnum_f32:
380; RV64IF: # %bb.0:
381; RV64IF-NEXT: fmv.w.x ft0, a1
382; RV64IF-NEXT: fmv.w.x ft1, a0
383; RV64IF-NEXT: fmin.s ft0, ft1, ft0
384; RV64IF-NEXT: fmv.x.w a0, ft0
385; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000386 %1 = call float @llvm.minnum.f32(float %a, float %b)
387 ret float %1
388}
389
390declare float @llvm.maxnum.f32(float, float)
391
392define float @maxnum_f32(float %a, float %b) nounwind {
393; RV32IF-LABEL: maxnum_f32:
394; RV32IF: # %bb.0:
395; RV32IF-NEXT: fmv.w.x ft0, a1
396; RV32IF-NEXT: fmv.w.x ft1, a0
397; RV32IF-NEXT: fmax.s ft0, ft1, ft0
398; RV32IF-NEXT: fmv.x.w a0, ft0
399; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000400;
401; RV64IF-LABEL: maxnum_f32:
402; RV64IF: # %bb.0:
403; RV64IF-NEXT: fmv.w.x ft0, a1
404; RV64IF-NEXT: fmv.w.x ft1, a0
405; RV64IF-NEXT: fmax.s ft0, ft1, ft0
406; RV64IF-NEXT: fmv.x.w a0, ft0
407; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000408 %1 = call float @llvm.maxnum.f32(float %a, float %b)
409 ret float %1
410}
411
412; TODO: FMINNAN and FMAXNAN aren't handled in
413; SelectionDAGLegalize::ExpandNode.
414
415; declare float @llvm.minimum.f32(float, float)
416
417; define float @fminimum_f32(float %a, float %b) nounwind {
418; %1 = call float @llvm.minimum.f32(float %a, float %b)
419; ret float %1
420; }
421
422; declare float @llvm.maximum.f32(float, float)
423
424; define float @fmaximum_f32(float %a, float %b) nounwind {
425; %1 = call float @llvm.maximum.f32(float %a, float %b)
426; ret float %1
427; }
428
429declare float @llvm.copysign.f32(float, float)
430
431define float @copysign_f32(float %a, float %b) nounwind {
432; RV32IF-LABEL: copysign_f32:
433; RV32IF: # %bb.0:
434; RV32IF-NEXT: fmv.w.x ft0, a1
435; RV32IF-NEXT: fmv.w.x ft1, a0
436; RV32IF-NEXT: fsgnj.s ft0, ft1, ft0
437; RV32IF-NEXT: fmv.x.w a0, ft0
438; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000439;
440; RV64IF-LABEL: copysign_f32:
441; RV64IF: # %bb.0:
442; RV64IF-NEXT: fmv.w.x ft0, a1
443; RV64IF-NEXT: fmv.w.x ft1, a0
444; RV64IF-NEXT: fsgnj.s ft0, ft1, ft0
445; RV64IF-NEXT: fmv.x.w a0, ft0
446; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000447 %1 = call float @llvm.copysign.f32(float %a, float %b)
448 ret float %1
449}
450
451declare float @llvm.floor.f32(float)
452
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000453define float @floor_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000454; RV32IF-LABEL: floor_f32:
455; RV32IF: # %bb.0:
456; RV32IF-NEXT: addi sp, sp, -16
457; RV32IF-NEXT: sw ra, 12(sp)
458; RV32IF-NEXT: call floorf
459; RV32IF-NEXT: lw ra, 12(sp)
460; RV32IF-NEXT: addi sp, sp, 16
461; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000462;
463; RV64IF-LABEL: floor_f32:
464; RV64IF: # %bb.0:
465; RV64IF-NEXT: addi sp, sp, -16
466; RV64IF-NEXT: sd ra, 8(sp)
467; RV64IF-NEXT: call floorf
468; RV64IF-NEXT: ld ra, 8(sp)
469; RV64IF-NEXT: addi sp, sp, 16
470; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000471 %1 = call float @llvm.floor.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000472 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000473}
474
475declare float @llvm.ceil.f32(float)
476
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000477define float @ceil_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000478; RV32IF-LABEL: ceil_f32:
479; RV32IF: # %bb.0:
480; RV32IF-NEXT: addi sp, sp, -16
481; RV32IF-NEXT: sw ra, 12(sp)
482; RV32IF-NEXT: call ceilf
483; RV32IF-NEXT: lw ra, 12(sp)
484; RV32IF-NEXT: addi sp, sp, 16
485; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000486;
487; RV64IF-LABEL: ceil_f32:
488; RV64IF: # %bb.0:
489; RV64IF-NEXT: addi sp, sp, -16
490; RV64IF-NEXT: sd ra, 8(sp)
491; RV64IF-NEXT: call ceilf
492; RV64IF-NEXT: ld ra, 8(sp)
493; RV64IF-NEXT: addi sp, sp, 16
494; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000495 %1 = call float @llvm.ceil.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000496 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000497}
498
499declare float @llvm.trunc.f32(float)
500
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000501define float @trunc_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000502; RV32IF-LABEL: trunc_f32:
503; RV32IF: # %bb.0:
504; RV32IF-NEXT: addi sp, sp, -16
505; RV32IF-NEXT: sw ra, 12(sp)
506; RV32IF-NEXT: call truncf
507; RV32IF-NEXT: lw ra, 12(sp)
508; RV32IF-NEXT: addi sp, sp, 16
509; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000510;
511; RV64IF-LABEL: trunc_f32:
512; RV64IF: # %bb.0:
513; RV64IF-NEXT: addi sp, sp, -16
514; RV64IF-NEXT: sd ra, 8(sp)
515; RV64IF-NEXT: call truncf
516; RV64IF-NEXT: ld ra, 8(sp)
517; RV64IF-NEXT: addi sp, sp, 16
518; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000519 %1 = call float @llvm.trunc.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000520 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000521}
522
523declare float @llvm.rint.f32(float)
524
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000525define float @rint_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000526; RV32IF-LABEL: rint_f32:
527; RV32IF: # %bb.0:
528; RV32IF-NEXT: addi sp, sp, -16
529; RV32IF-NEXT: sw ra, 12(sp)
530; RV32IF-NEXT: call rintf
531; RV32IF-NEXT: lw ra, 12(sp)
532; RV32IF-NEXT: addi sp, sp, 16
533; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000534;
535; RV64IF-LABEL: rint_f32:
536; RV64IF: # %bb.0:
537; RV64IF-NEXT: addi sp, sp, -16
538; RV64IF-NEXT: sd ra, 8(sp)
539; RV64IF-NEXT: call rintf
540; RV64IF-NEXT: ld ra, 8(sp)
541; RV64IF-NEXT: addi sp, sp, 16
542; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000543 %1 = call float @llvm.rint.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000544 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000545}
546
547declare float @llvm.nearbyint.f32(float)
548
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000549define float @nearbyint_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000550; RV32IF-LABEL: nearbyint_f32:
551; RV32IF: # %bb.0:
552; RV32IF-NEXT: addi sp, sp, -16
553; RV32IF-NEXT: sw ra, 12(sp)
554; RV32IF-NEXT: call nearbyintf
555; RV32IF-NEXT: lw ra, 12(sp)
556; RV32IF-NEXT: addi sp, sp, 16
557; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000558;
559; RV64IF-LABEL: nearbyint_f32:
560; RV64IF: # %bb.0:
561; RV64IF-NEXT: addi sp, sp, -16
562; RV64IF-NEXT: sd ra, 8(sp)
563; RV64IF-NEXT: call nearbyintf
564; RV64IF-NEXT: ld ra, 8(sp)
565; RV64IF-NEXT: addi sp, sp, 16
566; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000567 %1 = call float @llvm.nearbyint.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000568 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000569}
570
571declare float @llvm.round.f32(float)
572
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000573define float @round_f32(float %a) nounwind {
Alex Bradbury52c27782018-11-02 19:50:38 +0000574; RV32IF-LABEL: round_f32:
575; RV32IF: # %bb.0:
576; RV32IF-NEXT: addi sp, sp, -16
577; RV32IF-NEXT: sw ra, 12(sp)
578; RV32IF-NEXT: call roundf
579; RV32IF-NEXT: lw ra, 12(sp)
580; RV32IF-NEXT: addi sp, sp, 16
581; RV32IF-NEXT: ret
Alex Bradbury32b77382019-02-01 03:46:28 +0000582;
583; RV64IF-LABEL: round_f32:
584; RV64IF: # %bb.0:
585; RV64IF-NEXT: addi sp, sp, -16
586; RV64IF-NEXT: sd ra, 8(sp)
587; RV64IF-NEXT: call roundf
588; RV64IF-NEXT: ld ra, 8(sp)
589; RV64IF-NEXT: addi sp, sp, 16
590; RV64IF-NEXT: ret
Alex Bradbury52c27782018-11-02 19:50:38 +0000591 %1 = call float @llvm.round.f32(float %a)
Alex Bradbury919f5fb2018-12-13 10:49:05 +0000592 ret float %1
Alex Bradbury52c27782018-11-02 19:50:38 +0000593}