blob: 4a5239f4f01e2a46f91207b6a36ace931a00e753 [file] [log] [blame]
Alex Bradbury8f296472018-04-12 05:36:44 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
3; RUN: | FileCheck -check-prefix=RV32IFD %s
4
Alex Bradbury52c27782018-11-02 19:50:38 +00005declare double @llvm.sqrt.f64(double)
6
7define double @sqrt_f64(double %a) {
8; RV32IFD-LABEL: sqrt_f64:
9; RV32IFD: # %bb.0:
10; RV32IFD-NEXT: addi sp, sp, -16
11; RV32IFD-NEXT: sw a0, 8(sp)
12; RV32IFD-NEXT: sw a1, 12(sp)
13; RV32IFD-NEXT: fld ft0, 8(sp)
14; RV32IFD-NEXT: fsqrt.d ft0, ft0
15; RV32IFD-NEXT: fsd ft0, 8(sp)
16; RV32IFD-NEXT: lw a0, 8(sp)
17; RV32IFD-NEXT: lw a1, 12(sp)
18; RV32IFD-NEXT: addi sp, sp, 16
19; RV32IFD-NEXT: ret
20 %1 = call double @llvm.sqrt.f64(double %a)
21 ret double %1
22}
23
24declare double @llvm.powi.f64(double, i32)
25
26define double @powi_f64(double %a, i32 %b) {
27; RV32IFD-LABEL: powi_f64:
28; RV32IFD: # %bb.0:
29; RV32IFD-NEXT: addi sp, sp, -16
30; RV32IFD-NEXT: sw ra, 12(sp)
31; RV32IFD-NEXT: call __powidf2
32; RV32IFD-NEXT: lw ra, 12(sp)
33; RV32IFD-NEXT: addi sp, sp, 16
34; RV32IFD-NEXT: ret
35 %1 = call double @llvm.powi.f64(double %a, i32 %b)
36 ret double %1
37}
38
39declare double @llvm.sin.f64(double)
40
41define double @sin_f64(double %a) {
42; RV32IFD-LABEL: sin_f64:
43; RV32IFD: # %bb.0:
44; RV32IFD-NEXT: addi sp, sp, -16
45; RV32IFD-NEXT: sw ra, 12(sp)
46; RV32IFD-NEXT: call sin
47; RV32IFD-NEXT: lw ra, 12(sp)
48; RV32IFD-NEXT: addi sp, sp, 16
49; RV32IFD-NEXT: ret
50 %1 = call double @llvm.sin.f64(double %a)
51 ret double %1
52}
53
54declare double @llvm.cos.f64(double)
55
56define double @cos_f64(double %a) {
57; RV32IFD-LABEL: cos_f64:
58; RV32IFD: # %bb.0:
59; RV32IFD-NEXT: addi sp, sp, -16
60; RV32IFD-NEXT: sw ra, 12(sp)
61; RV32IFD-NEXT: call cos
62; RV32IFD-NEXT: lw ra, 12(sp)
63; RV32IFD-NEXT: addi sp, sp, 16
64; RV32IFD-NEXT: ret
65 %1 = call double @llvm.cos.f64(double %a)
66 ret double %1
67}
68
69; The sin+cos combination results in an FSINCOS SelectionDAG node.
70define double @sincos_f64(double %a) {
71; RV32IFD-LABEL: sincos_f64:
72; RV32IFD: # %bb.0:
73; RV32IFD-NEXT: addi sp, sp, -32
74; RV32IFD-NEXT: sw ra, 28(sp)
75; RV32IFD-NEXT: sw s1, 24(sp)
76; RV32IFD-NEXT: sw s2, 20(sp)
77; RV32IFD-NEXT: sw s3, 16(sp)
78; RV32IFD-NEXT: sw s4, 12(sp)
79; RV32IFD-NEXT: mv s2, a1
80; RV32IFD-NEXT: mv s1, a0
81; RV32IFD-NEXT: call sin
82; RV32IFD-NEXT: mv s3, a0
83; RV32IFD-NEXT: mv s4, a1
84; RV32IFD-NEXT: mv a0, s1
85; RV32IFD-NEXT: mv a1, s2
86; RV32IFD-NEXT: call cos
87; RV32IFD-NEXT: sw a0, 0(sp)
88; RV32IFD-NEXT: sw a1, 4(sp)
89; RV32IFD-NEXT: fld ft0, 0(sp)
90; RV32IFD-NEXT: sw s3, 0(sp)
91; RV32IFD-NEXT: sw s4, 4(sp)
92; RV32IFD-NEXT: fld ft1, 0(sp)
93; RV32IFD-NEXT: fadd.d ft0, ft1, ft0
94; RV32IFD-NEXT: fsd ft0, 0(sp)
95; RV32IFD-NEXT: lw a0, 0(sp)
96; RV32IFD-NEXT: lw a1, 4(sp)
97; RV32IFD-NEXT: lw s4, 12(sp)
98; RV32IFD-NEXT: lw s3, 16(sp)
99; RV32IFD-NEXT: lw s2, 20(sp)
100; RV32IFD-NEXT: lw s1, 24(sp)
101; RV32IFD-NEXT: lw ra, 28(sp)
102; RV32IFD-NEXT: addi sp, sp, 32
103; RV32IFD-NEXT: ret
104 %1 = call double @llvm.sin.f64(double %a)
105 %2 = call double @llvm.cos.f64(double %a)
106 %3 = fadd double %1, %2
107 ret double %3
108}
109
110declare double @llvm.pow.f64(double, double)
111
112define double @pow_f64(double %a, double %b) {
113; RV32IFD-LABEL: pow_f64:
114; RV32IFD: # %bb.0:
115; RV32IFD-NEXT: addi sp, sp, -16
116; RV32IFD-NEXT: sw ra, 12(sp)
117; RV32IFD-NEXT: call pow
118; RV32IFD-NEXT: lw ra, 12(sp)
119; RV32IFD-NEXT: addi sp, sp, 16
120; RV32IFD-NEXT: ret
121 %1 = call double @llvm.pow.f64(double %a, double %b)
122 ret double %1
123}
124
125declare double @llvm.exp.f64(double)
126
127define double @exp_f64(double %a) {
128; RV32IFD-LABEL: exp_f64:
129; RV32IFD: # %bb.0:
130; RV32IFD-NEXT: addi sp, sp, -16
131; RV32IFD-NEXT: sw ra, 12(sp)
132; RV32IFD-NEXT: call exp
133; RV32IFD-NEXT: lw ra, 12(sp)
134; RV32IFD-NEXT: addi sp, sp, 16
135; RV32IFD-NEXT: ret
136 %1 = call double @llvm.exp.f64(double %a)
137 ret double %1
138}
139
140declare double @llvm.exp2.f64(double)
141
142define double @exp2_f64(double %a) {
143; RV32IFD-LABEL: exp2_f64:
144; RV32IFD: # %bb.0:
145; RV32IFD-NEXT: addi sp, sp, -16
146; RV32IFD-NEXT: sw ra, 12(sp)
147; RV32IFD-NEXT: call exp2
148; RV32IFD-NEXT: lw ra, 12(sp)
149; RV32IFD-NEXT: addi sp, sp, 16
150; RV32IFD-NEXT: ret
151 %1 = call double @llvm.exp2.f64(double %a)
152 ret double %1
153}
154
155declare double @llvm.log.f64(double)
156
157define double @log_f64(double %a) {
158; RV32IFD-LABEL: log_f64:
159; RV32IFD: # %bb.0:
160; RV32IFD-NEXT: addi sp, sp, -16
161; RV32IFD-NEXT: sw ra, 12(sp)
162; RV32IFD-NEXT: call log
163; RV32IFD-NEXT: lw ra, 12(sp)
164; RV32IFD-NEXT: addi sp, sp, 16
165; RV32IFD-NEXT: ret
166 %1 = call double @llvm.log.f64(double %a)
167 ret double %1
168}
169
170declare double @llvm.log10.f64(double)
171
172define double @log10_f64(double %a) {
173; RV32IFD-LABEL: log10_f64:
174; RV32IFD: # %bb.0:
175; RV32IFD-NEXT: addi sp, sp, -16
176; RV32IFD-NEXT: sw ra, 12(sp)
177; RV32IFD-NEXT: call log10
178; RV32IFD-NEXT: lw ra, 12(sp)
179; RV32IFD-NEXT: addi sp, sp, 16
180; RV32IFD-NEXT: ret
181 %1 = call double @llvm.log10.f64(double %a)
182 ret double %1
183}
184
185declare double @llvm.log2.f64(double)
186
187define double @log2_f64(double %a) {
188; RV32IFD-LABEL: log2_f64:
189; RV32IFD: # %bb.0:
190; RV32IFD-NEXT: addi sp, sp, -16
191; RV32IFD-NEXT: sw ra, 12(sp)
192; RV32IFD-NEXT: call log2
193; RV32IFD-NEXT: lw ra, 12(sp)
194; RV32IFD-NEXT: addi sp, sp, 16
195; RV32IFD-NEXT: ret
196 %1 = call double @llvm.log2.f64(double %a)
197 ret double %1
198}
199
200declare double @llvm.fma.f64(double, double, double)
201
202; TODO: Select RISC-V FMA instruction.
203define double @fma_f64(double %a, double %b, double %c) {
204; RV32IFD-LABEL: fma_f64:
205; RV32IFD: # %bb.0:
206; RV32IFD-NEXT: addi sp, sp, -16
207; RV32IFD-NEXT: sw ra, 12(sp)
208; RV32IFD-NEXT: call fma
209; RV32IFD-NEXT: lw ra, 12(sp)
210; RV32IFD-NEXT: addi sp, sp, 16
211; RV32IFD-NEXT: ret
212 %1 = call double @llvm.fma.f64(double %a, double %b, double %c)
213 ret double %1
214}
215
216declare double @llvm.fabs.f64(double)
217
218define double @fabs_f64(double %a) {
219; RV32IFD-LABEL: fabs_f64:
220; RV32IFD: # %bb.0:
221; RV32IFD-NEXT: addi sp, sp, -16
222; RV32IFD-NEXT: sw a0, 8(sp)
223; RV32IFD-NEXT: sw a1, 12(sp)
224; RV32IFD-NEXT: fld ft0, 8(sp)
225; RV32IFD-NEXT: fabs.d ft0, ft0
226; RV32IFD-NEXT: fsd ft0, 8(sp)
227; RV32IFD-NEXT: lw a0, 8(sp)
228; RV32IFD-NEXT: lw a1, 12(sp)
229; RV32IFD-NEXT: addi sp, sp, 16
230; RV32IFD-NEXT: ret
231 %1 = call double @llvm.fabs.f64(double %a)
232 ret double %1
233}
234
235declare double @llvm.minnum.f64(double, double)
236
237define double @minnum_f64(double %a, double %b) nounwind {
238; RV32IFD-LABEL: minnum_f64:
239; RV32IFD: # %bb.0:
240; RV32IFD-NEXT: addi sp, sp, -16
241; RV32IFD-NEXT: sw a2, 8(sp)
242; RV32IFD-NEXT: sw a3, 12(sp)
243; RV32IFD-NEXT: fld ft0, 8(sp)
244; RV32IFD-NEXT: sw a0, 8(sp)
245; RV32IFD-NEXT: sw a1, 12(sp)
246; RV32IFD-NEXT: fld ft1, 8(sp)
247; RV32IFD-NEXT: fmin.d ft0, ft1, ft0
248; RV32IFD-NEXT: fsd ft0, 8(sp)
249; RV32IFD-NEXT: lw a0, 8(sp)
250; RV32IFD-NEXT: lw a1, 12(sp)
251; RV32IFD-NEXT: addi sp, sp, 16
252; RV32IFD-NEXT: ret
253 %1 = call double @llvm.minnum.f64(double %a, double %b)
254 ret double %1
255}
256
257declare double @llvm.maxnum.f64(double, double)
258
259define double @maxnum_f64(double %a, double %b) nounwind {
260; RV32IFD-LABEL: maxnum_f64:
261; RV32IFD: # %bb.0:
262; RV32IFD-NEXT: addi sp, sp, -16
263; RV32IFD-NEXT: sw a2, 8(sp)
264; RV32IFD-NEXT: sw a3, 12(sp)
265; RV32IFD-NEXT: fld ft0, 8(sp)
266; RV32IFD-NEXT: sw a0, 8(sp)
267; RV32IFD-NEXT: sw a1, 12(sp)
268; RV32IFD-NEXT: fld ft1, 8(sp)
269; RV32IFD-NEXT: fmax.d ft0, ft1, ft0
270; RV32IFD-NEXT: fsd ft0, 8(sp)
271; RV32IFD-NEXT: lw a0, 8(sp)
272; RV32IFD-NEXT: lw a1, 12(sp)
273; RV32IFD-NEXT: addi sp, sp, 16
274; RV32IFD-NEXT: ret
275 %1 = call double @llvm.maxnum.f64(double %a, double %b)
276 ret double %1
277}
278
279; TODO: FMINNAN and FMAXNAN aren't handled in
280; SelectionDAGLegalize::ExpandNode.
281
282; declare double @llvm.minimum.f64(double, double)
283
284; define double @fminimum_f64(double %a, double %b) nounwind {
285; %1 = call double @llvm.minimum.f64(double %a, double %b)
286; ret double %1
287; }
288
289; declare double @llvm.maximum.f64(double, double)
290
291; define double @fmaximum_f64(double %a, double %b) nounwind {
292; %1 = call double @llvm.maximum.f64(double %a, double %b)
293; ret double %1
294; }
295
296declare double @llvm.copysign.f64(double, double)
297
298define double @copysign_f64(double %a, double %b) nounwind {
299; RV32IFD-LABEL: copysign_f64:
300; RV32IFD: # %bb.0:
301; RV32IFD-NEXT: addi sp, sp, -16
302; RV32IFD-NEXT: sw a2, 8(sp)
303; RV32IFD-NEXT: sw a3, 12(sp)
304; RV32IFD-NEXT: fld ft0, 8(sp)
305; RV32IFD-NEXT: sw a0, 8(sp)
306; RV32IFD-NEXT: sw a1, 12(sp)
307; RV32IFD-NEXT: fld ft1, 8(sp)
308; RV32IFD-NEXT: fsgnj.d ft0, ft1, ft0
309; RV32IFD-NEXT: fsd ft0, 8(sp)
310; RV32IFD-NEXT: lw a0, 8(sp)
311; RV32IFD-NEXT: lw a1, 12(sp)
312; RV32IFD-NEXT: addi sp, sp, 16
313; RV32IFD-NEXT: ret
314 %1 = call double @llvm.copysign.f64(double %a, double %b)
315 ret double %1
316}
317
Alex Bradbury8f296472018-04-12 05:36:44 +0000318declare double @llvm.floor.f64(double)
319
Alex Bradbury52c27782018-11-02 19:50:38 +0000320define double @floor_f64(double %a) {
321; RV32IFD-LABEL: floor_f64:
Alex Bradbury8f296472018-04-12 05:36:44 +0000322; RV32IFD: # %bb.0:
323; RV32IFD-NEXT: addi sp, sp, -16
324; RV32IFD-NEXT: sw ra, 12(sp)
Shiva Chend58bd8d2018-04-25 14:19:12 +0000325; RV32IFD-NEXT: call floor
Alex Bradbury8f296472018-04-12 05:36:44 +0000326; RV32IFD-NEXT: lw ra, 12(sp)
327; RV32IFD-NEXT: addi sp, sp, 16
328; RV32IFD-NEXT: ret
329 %1 = call double @llvm.floor.f64(double %a)
Alex Bradbury52c27782018-11-02 19:50:38 +0000330 ret double %1
331}
332
333declare double @llvm.ceil.f64(double)
334
335define double @ceil_f64(double %a) {
336; RV32IFD-LABEL: ceil_f64:
337; RV32IFD: # %bb.0:
338; RV32IFD-NEXT: addi sp, sp, -16
339; RV32IFD-NEXT: sw ra, 12(sp)
340; RV32IFD-NEXT: call ceil
341; RV32IFD-NEXT: lw ra, 12(sp)
342; RV32IFD-NEXT: addi sp, sp, 16
343; RV32IFD-NEXT: ret
344 %1 = call double @llvm.ceil.f64(double %a)
345 ret double %1
346}
347
348declare double @llvm.trunc.f64(double)
349
350define double @trunc_f64(double %a) {
351; RV32IFD-LABEL: trunc_f64:
352; RV32IFD: # %bb.0:
353; RV32IFD-NEXT: addi sp, sp, -16
354; RV32IFD-NEXT: sw ra, 12(sp)
355; RV32IFD-NEXT: call trunc
356; RV32IFD-NEXT: lw ra, 12(sp)
357; RV32IFD-NEXT: addi sp, sp, 16
358; RV32IFD-NEXT: ret
359 %1 = call double @llvm.trunc.f64(double %a)
360 ret double %1
361}
362
363declare double @llvm.rint.f64(double)
364
365define double @rint_f64(double %a) {
366; RV32IFD-LABEL: rint_f64:
367; RV32IFD: # %bb.0:
368; RV32IFD-NEXT: addi sp, sp, -16
369; RV32IFD-NEXT: sw ra, 12(sp)
370; RV32IFD-NEXT: call rint
371; RV32IFD-NEXT: lw ra, 12(sp)
372; RV32IFD-NEXT: addi sp, sp, 16
373; RV32IFD-NEXT: ret
374 %1 = call double @llvm.rint.f64(double %a)
375 ret double %1
376}
377
378declare double @llvm.nearbyint.f64(double)
379
380define double @nearbyint_f64(double %a) {
381; RV32IFD-LABEL: nearbyint_f64:
382; RV32IFD: # %bb.0:
383; RV32IFD-NEXT: addi sp, sp, -16
384; RV32IFD-NEXT: sw ra, 12(sp)
385; RV32IFD-NEXT: call nearbyint
386; RV32IFD-NEXT: lw ra, 12(sp)
387; RV32IFD-NEXT: addi sp, sp, 16
388; RV32IFD-NEXT: ret
389 %1 = call double @llvm.nearbyint.f64(double %a)
390 ret double %1
391}
392
393declare double @llvm.round.f64(double)
394
395define double @round_f64(double %a) {
396; RV32IFD-LABEL: round_f64:
397; RV32IFD: # %bb.0:
398; RV32IFD-NEXT: addi sp, sp, -16
399; RV32IFD-NEXT: sw ra, 12(sp)
400; RV32IFD-NEXT: call round
401; RV32IFD-NEXT: lw ra, 12(sp)
402; RV32IFD-NEXT: addi sp, sp, 16
403; RV32IFD-NEXT: ret
404 %1 = call double @llvm.round.f64(double %a)
405 ret double %1
Alex Bradbury8f296472018-04-12 05:36:44 +0000406}