blob: 1da644f5f9e1508fa43d376d31d9cf826c128edb [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
6
7declare float @llvm.sqrt.f32(float)
8
9define float @sqrt_f32(float %a) {
10; RV32IF-LABEL: sqrt_f32:
11; RV32IF: # %bb.0:
12; RV32IF-NEXT: fmv.w.x ft0, a0
13; RV32IF-NEXT: fsqrt.s ft0, ft0
14; RV32IF-NEXT: fmv.x.w a0, ft0
15; RV32IF-NEXT: ret
16 %1 = call float @llvm.sqrt.f32(float %a)
17 ret float %1
18}
19
20declare float @llvm.powi.f32(float, i32)
21
22define float @powi_f32(float %a, i32 %b) {
23; RV32IF-LABEL: powi_f32:
24; RV32IF: # %bb.0:
25; RV32IF-NEXT: addi sp, sp, -16
26; RV32IF-NEXT: sw ra, 12(sp)
27; RV32IF-NEXT: call __powisf2
28; RV32IF-NEXT: lw ra, 12(sp)
29; RV32IF-NEXT: addi sp, sp, 16
30; RV32IF-NEXT: ret
31 %1 = call float @llvm.powi.f32(float %a, i32 %b)
32 ret float %1
33}
34
35declare float @llvm.sin.f32(float)
36
37define float @sin_f32(float %a) {
38; RV32IF-LABEL: sin_f32:
39; RV32IF: # %bb.0:
40; RV32IF-NEXT: addi sp, sp, -16
41; RV32IF-NEXT: sw ra, 12(sp)
42; RV32IF-NEXT: call sinf
43; RV32IF-NEXT: lw ra, 12(sp)
44; RV32IF-NEXT: addi sp, sp, 16
45; RV32IF-NEXT: ret
46 %1 = call float @llvm.sin.f32(float %a)
47 ret float %1
48}
49
50declare float @llvm.cos.f32(float)
51
52define float @cos_f32(float %a) {
53; RV32IF-LABEL: cos_f32:
54; RV32IF: # %bb.0:
55; RV32IF-NEXT: addi sp, sp, -16
56; RV32IF-NEXT: sw ra, 12(sp)
57; RV32IF-NEXT: call cosf
58; RV32IF-NEXT: lw ra, 12(sp)
59; RV32IF-NEXT: addi sp, sp, 16
60; RV32IF-NEXT: ret
61 %1 = call float @llvm.cos.f32(float %a)
62 ret float %1
63}
64
65; The sin+cos combination results in an FSINCOS SelectionDAG node.
66define float @sincos_f32(float %a) {
67; RV32IF-LABEL: sincos_f32:
68; RV32IF: # %bb.0:
69; RV32IF-NEXT: addi sp, sp, -16
70; RV32IF-NEXT: sw ra, 12(sp)
71; RV32IF-NEXT: sw s1, 8(sp)
72; RV32IF-NEXT: sw s2, 4(sp)
73; RV32IF-NEXT: mv s1, a0
74; RV32IF-NEXT: call sinf
75; RV32IF-NEXT: mv s2, a0
76; RV32IF-NEXT: mv a0, s1
77; RV32IF-NEXT: call cosf
78; RV32IF-NEXT: fmv.w.x ft0, a0
79; RV32IF-NEXT: fmv.w.x ft1, s2
80; RV32IF-NEXT: fadd.s ft0, ft1, ft0
81; RV32IF-NEXT: fmv.x.w a0, ft0
82; RV32IF-NEXT: lw s2, 4(sp)
83; RV32IF-NEXT: lw s1, 8(sp)
84; RV32IF-NEXT: lw ra, 12(sp)
85; RV32IF-NEXT: addi sp, sp, 16
86; RV32IF-NEXT: ret
87 %1 = call float @llvm.sin.f32(float %a)
88 %2 = call float @llvm.cos.f32(float %a)
89 %3 = fadd float %1, %2
90 ret float %3
91}
92
93declare float @llvm.pow.f32(float, float)
94
95define float @pow_f32(float %a, float %b) {
96; RV32IF-LABEL: pow_f32:
97; RV32IF: # %bb.0:
98; RV32IF-NEXT: addi sp, sp, -16
99; RV32IF-NEXT: sw ra, 12(sp)
100; RV32IF-NEXT: call powf
101; RV32IF-NEXT: lw ra, 12(sp)
102; RV32IF-NEXT: addi sp, sp, 16
103; RV32IF-NEXT: ret
104 %1 = call float @llvm.pow.f32(float %a, float %b)
105 ret float %1
106}
107
108declare float @llvm.exp.f32(float)
109
110define float @exp_f32(float %a) {
111; RV32IF-LABEL: exp_f32:
112; RV32IF: # %bb.0:
113; RV32IF-NEXT: addi sp, sp, -16
114; RV32IF-NEXT: sw ra, 12(sp)
115; RV32IF-NEXT: call expf
116; RV32IF-NEXT: lw ra, 12(sp)
117; RV32IF-NEXT: addi sp, sp, 16
118; RV32IF-NEXT: ret
119 %1 = call float @llvm.exp.f32(float %a)
120 ret float %1
121}
122
123declare float @llvm.exp2.f32(float)
124
125define float @exp2_f32(float %a) {
126; RV32IF-LABEL: exp2_f32:
127; RV32IF: # %bb.0:
128; RV32IF-NEXT: addi sp, sp, -16
129; RV32IF-NEXT: sw ra, 12(sp)
130; RV32IF-NEXT: call exp2f
131; RV32IF-NEXT: lw ra, 12(sp)
132; RV32IF-NEXT: addi sp, sp, 16
133; RV32IF-NEXT: ret
134 %1 = call float @llvm.exp2.f32(float %a)
135 ret float %1
136}
137
138declare float @llvm.log.f32(float)
139
140define float @log_f32(float %a) {
141; RV32IF-LABEL: log_f32:
142; RV32IF: # %bb.0:
143; RV32IF-NEXT: addi sp, sp, -16
144; RV32IF-NEXT: sw ra, 12(sp)
145; RV32IF-NEXT: call logf
146; RV32IF-NEXT: lw ra, 12(sp)
147; RV32IF-NEXT: addi sp, sp, 16
148; RV32IF-NEXT: ret
149 %1 = call float @llvm.log.f32(float %a)
150 ret float %1
151}
152
153declare float @llvm.log10.f32(float)
154
155define float @log10_f32(float %a) {
156; RV32IF-LABEL: log10_f32:
157; RV32IF: # %bb.0:
158; RV32IF-NEXT: addi sp, sp, -16
159; RV32IF-NEXT: sw ra, 12(sp)
160; RV32IF-NEXT: call log10f
161; RV32IF-NEXT: lw ra, 12(sp)
162; RV32IF-NEXT: addi sp, sp, 16
163; RV32IF-NEXT: ret
164 %1 = call float @llvm.log10.f32(float %a)
165 ret float %1
166}
167
168declare float @llvm.log2.f32(float)
169
170define float @log2_f32(float %a) {
171; RV32IF-LABEL: log2_f32:
172; RV32IF: # %bb.0:
173; RV32IF-NEXT: addi sp, sp, -16
174; RV32IF-NEXT: sw ra, 12(sp)
175; RV32IF-NEXT: call log2f
176; RV32IF-NEXT: lw ra, 12(sp)
177; RV32IF-NEXT: addi sp, sp, 16
178; RV32IF-NEXT: ret
179 %1 = call float @llvm.log2.f32(float %a)
180 ret float %1
181}
182
183declare float @llvm.fma.f32(float, float, float)
184
185; TODO: Select RISC-V FMA instruction.
186define float @fma_f32(float %a, float %b, float %c) {
187; RV32IF-LABEL: fma_f32:
188; RV32IF: # %bb.0:
189; RV32IF-NEXT: addi sp, sp, -16
190; RV32IF-NEXT: sw ra, 12(sp)
191; RV32IF-NEXT: call fmaf
192; RV32IF-NEXT: lw ra, 12(sp)
193; RV32IF-NEXT: addi sp, sp, 16
194; RV32IF-NEXT: ret
195 %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
196 ret float %1
197}
198
199declare float @llvm.fabs.f32(float)
200
201define float @fabs_f32(float %a) {
202; RV32IF-LABEL: fabs_f32:
203; RV32IF: # %bb.0:
204; RV32IF-NEXT: lui a1, 524288
205; RV32IF-NEXT: addi a1, a1, -1
206; RV32IF-NEXT: and a0, a0, a1
207; RV32IF-NEXT: ret
208 %1 = call float @llvm.fabs.f32(float %a)
209 ret float %1
210}
211
212declare float @llvm.minnum.f32(float, float)
213
214define float @minnum_f32(float %a, float %b) nounwind {
215; RV32IF-LABEL: minnum_f32:
216; RV32IF: # %bb.0:
217; RV32IF-NEXT: fmv.w.x ft0, a1
218; RV32IF-NEXT: fmv.w.x ft1, a0
219; RV32IF-NEXT: fmin.s ft0, ft1, ft0
220; RV32IF-NEXT: fmv.x.w a0, ft0
221; RV32IF-NEXT: ret
222 %1 = call float @llvm.minnum.f32(float %a, float %b)
223 ret float %1
224}
225
226declare float @llvm.maxnum.f32(float, float)
227
228define float @maxnum_f32(float %a, float %b) nounwind {
229; RV32IF-LABEL: maxnum_f32:
230; RV32IF: # %bb.0:
231; RV32IF-NEXT: fmv.w.x ft0, a1
232; RV32IF-NEXT: fmv.w.x ft1, a0
233; RV32IF-NEXT: fmax.s ft0, ft1, ft0
234; RV32IF-NEXT: fmv.x.w a0, ft0
235; RV32IF-NEXT: ret
236 %1 = call float @llvm.maxnum.f32(float %a, float %b)
237 ret float %1
238}
239
240; TODO: FMINNAN and FMAXNAN aren't handled in
241; SelectionDAGLegalize::ExpandNode.
242
243; declare float @llvm.minimum.f32(float, float)
244
245; define float @fminimum_f32(float %a, float %b) nounwind {
246; %1 = call float @llvm.minimum.f32(float %a, float %b)
247; ret float %1
248; }
249
250; declare float @llvm.maximum.f32(float, float)
251
252; define float @fmaximum_f32(float %a, float %b) nounwind {
253; %1 = call float @llvm.maximum.f32(float %a, float %b)
254; ret float %1
255; }
256
257declare float @llvm.copysign.f32(float, float)
258
259define float @copysign_f32(float %a, float %b) nounwind {
260; RV32IF-LABEL: copysign_f32:
261; RV32IF: # %bb.0:
262; RV32IF-NEXT: fmv.w.x ft0, a1
263; RV32IF-NEXT: fmv.w.x ft1, a0
264; RV32IF-NEXT: fsgnj.s ft0, ft1, ft0
265; RV32IF-NEXT: fmv.x.w a0, ft0
266; RV32IF-NEXT: ret
267 %1 = call float @llvm.copysign.f32(float %a, float %b)
268 ret float %1
269}
270
271declare float @llvm.floor.f32(float)
272
273define float @floor_f32(float %a) {
274; RV32IF-LABEL: floor_f32:
275; RV32IF: # %bb.0:
276; RV32IF-NEXT: addi sp, sp, -16
277; RV32IF-NEXT: sw ra, 12(sp)
278; RV32IF-NEXT: call floorf
279; RV32IF-NEXT: lw ra, 12(sp)
280; RV32IF-NEXT: addi sp, sp, 16
281; RV32IF-NEXT: ret
282 %1 = call float @llvm.floor.f32(float %a)
283 ret float %1
284}
285
286declare float @llvm.ceil.f32(float)
287
288define float @ceil_f32(float %a) {
289; RV32IF-LABEL: ceil_f32:
290; RV32IF: # %bb.0:
291; RV32IF-NEXT: addi sp, sp, -16
292; RV32IF-NEXT: sw ra, 12(sp)
293; RV32IF-NEXT: call ceilf
294; RV32IF-NEXT: lw ra, 12(sp)
295; RV32IF-NEXT: addi sp, sp, 16
296; RV32IF-NEXT: ret
297 %1 = call float @llvm.ceil.f32(float %a)
298 ret float %1
299}
300
301declare float @llvm.trunc.f32(float)
302
303define float @trunc_f32(float %a) {
304; RV32IF-LABEL: trunc_f32:
305; RV32IF: # %bb.0:
306; RV32IF-NEXT: addi sp, sp, -16
307; RV32IF-NEXT: sw ra, 12(sp)
308; RV32IF-NEXT: call truncf
309; RV32IF-NEXT: lw ra, 12(sp)
310; RV32IF-NEXT: addi sp, sp, 16
311; RV32IF-NEXT: ret
312 %1 = call float @llvm.trunc.f32(float %a)
313 ret float %1
314}
315
316declare float @llvm.rint.f32(float)
317
318define float @rint_f32(float %a) {
319; RV32IF-LABEL: rint_f32:
320; RV32IF: # %bb.0:
321; RV32IF-NEXT: addi sp, sp, -16
322; RV32IF-NEXT: sw ra, 12(sp)
323; RV32IF-NEXT: call rintf
324; RV32IF-NEXT: lw ra, 12(sp)
325; RV32IF-NEXT: addi sp, sp, 16
326; RV32IF-NEXT: ret
327 %1 = call float @llvm.rint.f32(float %a)
328 ret float %1
329}
330
331declare float @llvm.nearbyint.f32(float)
332
333define float @nearbyint_f32(float %a) {
334; RV32IF-LABEL: nearbyint_f32:
335; RV32IF: # %bb.0:
336; RV32IF-NEXT: addi sp, sp, -16
337; RV32IF-NEXT: sw ra, 12(sp)
338; RV32IF-NEXT: call nearbyintf
339; RV32IF-NEXT: lw ra, 12(sp)
340; RV32IF-NEXT: addi sp, sp, 16
341; RV32IF-NEXT: ret
342 %1 = call float @llvm.nearbyint.f32(float %a)
343 ret float %1
344}
345
346declare float @llvm.round.f32(float)
347
348define float @round_f32(float %a) {
349; RV32IF-LABEL: round_f32:
350; RV32IF: # %bb.0:
351; RV32IF-NEXT: addi sp, sp, -16
352; RV32IF-NEXT: sw ra, 12(sp)
353; RV32IF-NEXT: call roundf
354; RV32IF-NEXT: lw ra, 12(sp)
355; RV32IF-NEXT: addi sp, sp, 16
356; RV32IF-NEXT: ret
357 %1 = call float @llvm.round.f32(float %a)
358 ret float %1
359}