1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr7 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
3; RUN:   -mtriple=powerpc64-unknown-unknown -verify-machineinstrs < %s | \
4; RUN:   FileCheck %s --check-prefix=BE
5; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
6; RUN:   -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs < %s | \
7; RUN:   FileCheck %s
8; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
9; RUN:   -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs < %s \
10; RUN:   --enable-unsafe-fp-math | FileCheck %s --check-prefix=FAST
11define dso_local i64 @test_lrint(double %d) local_unnamed_addr {
12; BE-LABEL: test_lrint:
13; BE:       # %bb.0: # %entry
14; BE-NEXT:    mflr r0
15; BE-NEXT:    std r0, 16(r1)
16; BE-NEXT:    stdu r1, -112(r1)
17; BE-NEXT:    .cfi_def_cfa_offset 112
18; BE-NEXT:    .cfi_offset lr, 16
19; BE-NEXT:    bl lrint
20; BE-NEXT:    nop
21; BE-NEXT:    addi r1, r1, 112
22; BE-NEXT:    ld r0, 16(r1)
23; BE-NEXT:    mtlr r0
24; BE-NEXT:    blr
25;
26; CHECK-LABEL: test_lrint:
27; CHECK:       # %bb.0: # %entry
28; CHECK-NEXT:    mflr r0
29; CHECK-NEXT:    std r0, 16(r1)
30; CHECK-NEXT:    stdu r1, -32(r1)
31; CHECK-NEXT:    .cfi_def_cfa_offset 32
32; CHECK-NEXT:    .cfi_offset lr, 16
33; CHECK-NEXT:    bl lrint
34; CHECK-NEXT:    nop
35; CHECK-NEXT:    addi r1, r1, 32
36; CHECK-NEXT:    ld r0, 16(r1)
37; CHECK-NEXT:    mtlr r0
38; CHECK-NEXT:    blr
39;
40; FAST-LABEL: test_lrint:
41; FAST:       # %bb.0: # %entry
42; FAST-NEXT:    fctid f0, f1
43; FAST-NEXT:    mffprd r3, f0
44; FAST-NEXT:    blr
45entry:
46  %0 = tail call i64 @llvm.lrint.i64.f64(double %d)
47  ret i64 %0
48}
49
50declare i64 @llvm.lrint.i64.f64(double)
51
52define dso_local i64 @test_lrintf(float %f) local_unnamed_addr {
53; BE-LABEL: test_lrintf:
54; BE:       # %bb.0: # %entry
55; BE-NEXT:    mflr r0
56; BE-NEXT:    std r0, 16(r1)
57; BE-NEXT:    stdu r1, -112(r1)
58; BE-NEXT:    .cfi_def_cfa_offset 112
59; BE-NEXT:    .cfi_offset lr, 16
60; BE-NEXT:    bl lrintf
61; BE-NEXT:    nop
62; BE-NEXT:    addi r1, r1, 112
63; BE-NEXT:    ld r0, 16(r1)
64; BE-NEXT:    mtlr r0
65; BE-NEXT:    blr
66;
67; CHECK-LABEL: test_lrintf:
68; CHECK:       # %bb.0: # %entry
69; CHECK-NEXT:    mflr r0
70; CHECK-NEXT:    std r0, 16(r1)
71; CHECK-NEXT:    stdu r1, -32(r1)
72; CHECK-NEXT:    .cfi_def_cfa_offset 32
73; CHECK-NEXT:    .cfi_offset lr, 16
74; CHECK-NEXT:    bl lrintf
75; CHECK-NEXT:    nop
76; CHECK-NEXT:    addi r1, r1, 32
77; CHECK-NEXT:    ld r0, 16(r1)
78; CHECK-NEXT:    mtlr r0
79; CHECK-NEXT:    blr
80;
81; FAST-LABEL: test_lrintf:
82; FAST:       # %bb.0: # %entry
83; FAST-NEXT:    fctid f0, f1
84; FAST-NEXT:    mffprd r3, f0
85; FAST-NEXT:    blr
86entry:
87  %0 = tail call i64 @llvm.lrint.i64.f32(float %f)
88  ret i64 %0
89}
90
91declare i64 @llvm.lrint.i64.f32(float)
92
93define dso_local i64 @test_llrint(double %d) local_unnamed_addr {
94; BE-LABEL: test_llrint:
95; BE:       # %bb.0: # %entry
96; BE-NEXT:    mflr r0
97; BE-NEXT:    std r0, 16(r1)
98; BE-NEXT:    stdu r1, -112(r1)
99; BE-NEXT:    .cfi_def_cfa_offset 112
100; BE-NEXT:    .cfi_offset lr, 16
101; BE-NEXT:    bl llrint
102; BE-NEXT:    nop
103; BE-NEXT:    addi r1, r1, 112
104; BE-NEXT:    ld r0, 16(r1)
105; BE-NEXT:    mtlr r0
106; BE-NEXT:    blr
107;
108; CHECK-LABEL: test_llrint:
109; CHECK:       # %bb.0: # %entry
110; CHECK-NEXT:    mflr r0
111; CHECK-NEXT:    std r0, 16(r1)
112; CHECK-NEXT:    stdu r1, -32(r1)
113; CHECK-NEXT:    .cfi_def_cfa_offset 32
114; CHECK-NEXT:    .cfi_offset lr, 16
115; CHECK-NEXT:    bl llrint
116; CHECK-NEXT:    nop
117; CHECK-NEXT:    addi r1, r1, 32
118; CHECK-NEXT:    ld r0, 16(r1)
119; CHECK-NEXT:    mtlr r0
120; CHECK-NEXT:    blr
121;
122; FAST-LABEL: test_llrint:
123; FAST:       # %bb.0: # %entry
124; FAST-NEXT:    fctid f0, f1
125; FAST-NEXT:    mffprd r3, f0
126; FAST-NEXT:    blr
127entry:
128  %0 = tail call i64 @llvm.llrint.i64.f64(double %d)
129  ret i64 %0
130}
131
132declare i64 @llvm.llrint.i64.f64(double)
133
134define dso_local i64 @test_llrintf(float %f) local_unnamed_addr {
135; BE-LABEL: test_llrintf:
136; BE:       # %bb.0: # %entry
137; BE-NEXT:    mflr r0
138; BE-NEXT:    std r0, 16(r1)
139; BE-NEXT:    stdu r1, -112(r1)
140; BE-NEXT:    .cfi_def_cfa_offset 112
141; BE-NEXT:    .cfi_offset lr, 16
142; BE-NEXT:    bl llrintf
143; BE-NEXT:    nop
144; BE-NEXT:    addi r1, r1, 112
145; BE-NEXT:    ld r0, 16(r1)
146; BE-NEXT:    mtlr r0
147; BE-NEXT:    blr
148;
149; CHECK-LABEL: test_llrintf:
150; CHECK:       # %bb.0: # %entry
151; CHECK-NEXT:    mflr r0
152; CHECK-NEXT:    std r0, 16(r1)
153; CHECK-NEXT:    stdu r1, -32(r1)
154; CHECK-NEXT:    .cfi_def_cfa_offset 32
155; CHECK-NEXT:    .cfi_offset lr, 16
156; CHECK-NEXT:    bl llrintf
157; CHECK-NEXT:    nop
158; CHECK-NEXT:    addi r1, r1, 32
159; CHECK-NEXT:    ld r0, 16(r1)
160; CHECK-NEXT:    mtlr r0
161; CHECK-NEXT:    blr
162;
163; FAST-LABEL: test_llrintf:
164; FAST:       # %bb.0: # %entry
165; FAST-NEXT:    fctid f0, f1
166; FAST-NEXT:    mffprd r3, f0
167; FAST-NEXT:    blr
168entry:
169  %0 = tail call i64 @llvm.llrint.i64.f32(float %f)
170  ret i64 %0
171}
172
173declare i64 @llvm.llrint.i64.f32(float)
174
175define dso_local i64 @test_lround(double %d) local_unnamed_addr {
176; BE-LABEL: test_lround:
177; BE:       # %bb.0: # %entry
178; BE-NEXT:    mflr r0
179; BE-NEXT:    std r0, 16(r1)
180; BE-NEXT:    stdu r1, -112(r1)
181; BE-NEXT:    .cfi_def_cfa_offset 112
182; BE-NEXT:    .cfi_offset lr, 16
183; BE-NEXT:    bl lround
184; BE-NEXT:    nop
185; BE-NEXT:    addi r1, r1, 112
186; BE-NEXT:    ld r0, 16(r1)
187; BE-NEXT:    mtlr r0
188; BE-NEXT:    blr
189;
190; CHECK-LABEL: test_lround:
191; CHECK:       # %bb.0: # %entry
192; CHECK-NEXT:    mflr r0
193; CHECK-NEXT:    std r0, 16(r1)
194; CHECK-NEXT:    stdu r1, -32(r1)
195; CHECK-NEXT:    .cfi_def_cfa_offset 32
196; CHECK-NEXT:    .cfi_offset lr, 16
197; CHECK-NEXT:    bl lround
198; CHECK-NEXT:    nop
199; CHECK-NEXT:    addi r1, r1, 32
200; CHECK-NEXT:    ld r0, 16(r1)
201; CHECK-NEXT:    mtlr r0
202; CHECK-NEXT:    blr
203;
204; FAST-LABEL: test_lround:
205; FAST:       # %bb.0: # %entry
206; FAST-NEXT:    xsrdpi f0, f1
207; FAST-NEXT:    fctid f0, f0
208; FAST-NEXT:    mffprd r3, f0
209; FAST-NEXT:    blr
210entry:
211  %0 = tail call i64 @llvm.lround.i64.f64(double %d)
212  ret i64 %0
213}
214
215declare i64 @llvm.lround.i64.f64(double)
216
217define dso_local i64 @test_lroundf(float %f) local_unnamed_addr {
218; BE-LABEL: test_lroundf:
219; BE:       # %bb.0: # %entry
220; BE-NEXT:    mflr r0
221; BE-NEXT:    std r0, 16(r1)
222; BE-NEXT:    stdu r1, -112(r1)
223; BE-NEXT:    .cfi_def_cfa_offset 112
224; BE-NEXT:    .cfi_offset lr, 16
225; BE-NEXT:    bl lroundf
226; BE-NEXT:    nop
227; BE-NEXT:    addi r1, r1, 112
228; BE-NEXT:    ld r0, 16(r1)
229; BE-NEXT:    mtlr r0
230; BE-NEXT:    blr
231;
232; CHECK-LABEL: test_lroundf:
233; CHECK:       # %bb.0: # %entry
234; CHECK-NEXT:    mflr r0
235; CHECK-NEXT:    std r0, 16(r1)
236; CHECK-NEXT:    stdu r1, -32(r1)
237; CHECK-NEXT:    .cfi_def_cfa_offset 32
238; CHECK-NEXT:    .cfi_offset lr, 16
239; CHECK-NEXT:    bl lroundf
240; CHECK-NEXT:    nop
241; CHECK-NEXT:    addi r1, r1, 32
242; CHECK-NEXT:    ld r0, 16(r1)
243; CHECK-NEXT:    mtlr r0
244; CHECK-NEXT:    blr
245;
246; FAST-LABEL: test_lroundf:
247; FAST:       # %bb.0: # %entry
248; FAST-NEXT:    xsrdpi f0, f1
249; FAST-NEXT:    fctid f0, f0
250; FAST-NEXT:    mffprd r3, f0
251; FAST-NEXT:    blr
252entry:
253  %0 = tail call i64 @llvm.lround.i64.f32(float %f)
254  ret i64 %0
255}
256
257declare i64 @llvm.lround.i64.f32(float)
258
259define dso_local i64 @test_llround(double %d) local_unnamed_addr {
260; BE-LABEL: test_llround:
261; BE:       # %bb.0: # %entry
262; BE-NEXT:    mflr r0
263; BE-NEXT:    std r0, 16(r1)
264; BE-NEXT:    stdu r1, -112(r1)
265; BE-NEXT:    .cfi_def_cfa_offset 112
266; BE-NEXT:    .cfi_offset lr, 16
267; BE-NEXT:    bl llround
268; BE-NEXT:    nop
269; BE-NEXT:    addi r1, r1, 112
270; BE-NEXT:    ld r0, 16(r1)
271; BE-NEXT:    mtlr r0
272; BE-NEXT:    blr
273;
274; CHECK-LABEL: test_llround:
275; CHECK:       # %bb.0: # %entry
276; CHECK-NEXT:    mflr r0
277; CHECK-NEXT:    std r0, 16(r1)
278; CHECK-NEXT:    stdu r1, -32(r1)
279; CHECK-NEXT:    .cfi_def_cfa_offset 32
280; CHECK-NEXT:    .cfi_offset lr, 16
281; CHECK-NEXT:    bl llround
282; CHECK-NEXT:    nop
283; CHECK-NEXT:    addi r1, r1, 32
284; CHECK-NEXT:    ld r0, 16(r1)
285; CHECK-NEXT:    mtlr r0
286; CHECK-NEXT:    blr
287;
288; FAST-LABEL: test_llround:
289; FAST:       # %bb.0: # %entry
290; FAST-NEXT:    xsrdpi f0, f1
291; FAST-NEXT:    fctid f0, f0
292; FAST-NEXT:    mffprd r3, f0
293; FAST-NEXT:    blr
294entry:
295  %0 = tail call i64 @llvm.llround.i64.f64(double %d)
296  ret i64 %0
297}
298
299declare i64 @llvm.llround.i64.f64(double)
300
301define dso_local i64 @test_llroundf(float %f) local_unnamed_addr {
302; BE-LABEL: test_llroundf:
303; BE:       # %bb.0: # %entry
304; BE-NEXT:    mflr r0
305; BE-NEXT:    std r0, 16(r1)
306; BE-NEXT:    stdu r1, -112(r1)
307; BE-NEXT:    .cfi_def_cfa_offset 112
308; BE-NEXT:    .cfi_offset lr, 16
309; BE-NEXT:    bl llroundf
310; BE-NEXT:    nop
311; BE-NEXT:    addi r1, r1, 112
312; BE-NEXT:    ld r0, 16(r1)
313; BE-NEXT:    mtlr r0
314; BE-NEXT:    blr
315;
316; CHECK-LABEL: test_llroundf:
317; CHECK:       # %bb.0: # %entry
318; CHECK-NEXT:    mflr r0
319; CHECK-NEXT:    std r0, 16(r1)
320; CHECK-NEXT:    stdu r1, -32(r1)
321; CHECK-NEXT:    .cfi_def_cfa_offset 32
322; CHECK-NEXT:    .cfi_offset lr, 16
323; CHECK-NEXT:    bl llroundf
324; CHECK-NEXT:    nop
325; CHECK-NEXT:    addi r1, r1, 32
326; CHECK-NEXT:    ld r0, 16(r1)
327; CHECK-NEXT:    mtlr r0
328; CHECK-NEXT:    blr
329;
330; FAST-LABEL: test_llroundf:
331; FAST:       # %bb.0: # %entry
332; FAST-NEXT:    xsrdpi f0, f1
333; FAST-NEXT:    fctid f0, f0
334; FAST-NEXT:    mffprd r3, f0
335; FAST-NEXT:    blr
336entry:
337  %0 = tail call i64 @llvm.llround.i64.f32(float %f)
338  ret i64 %0
339}
340
341declare i64 @llvm.llround.i64.f32(float)
342
343define dso_local double @test_nearbyint(double %d) local_unnamed_addr {
344; BE-LABEL: test_nearbyint:
345; BE:    # %bb.0: # %entry
346; BE:    bl nearbyint
347; BE:    blr
348;
349; CHECK-LABEL: test_nearbyint:
350; CHECK:    # %bb.0: # %entry
351; CHECK:    bl nearbyint
352; CHECK:    blr
353;
354; FAST-LABEL: test_nearbyint:
355; FAST:       # %bb.0: # %entry
356; FAST-NEXT:    xsrdpic f1, f1
357; FAST-NEXT:    blr
358entry:
359  %0 = tail call double @llvm.nearbyint.f64(double %d)
360  ret double %0
361}
362
363declare double @llvm.nearbyint.f64(double)
364
365define dso_local float @test_nearbyintf(float %f) local_unnamed_addr {
366; BE-LABEL: test_nearbyintf:
367; BE:    # %bb.0: # %entry
368; BE:    bl nearbyint
369; BE:    blr
370;
371; CHECK-LABEL: test_nearbyintf:
372; CHECK:    # %bb.0: # %entry
373; CHECK:    bl nearbyintf
374; CHECK:    blr
375;
376; FAST-LABEL: test_nearbyintf:
377; FAST:       # %bb.0: # %entry
378; FAST-NEXT:    xsrdpic f1, f1
379; FAST-NEXT:    blr
380entry:
381  %0 = tail call float @llvm.nearbyint.f32(float %f)
382  ret float %0
383}
384
385declare float @llvm.nearbyint.f32(float)
386
387define dso_local double @test_round(double %d) local_unnamed_addr {
388; BE-LABEL: test_round:
389; BE:       # %bb.0: # %entry
390; BE-NEXT:    xsrdpi f1, f1
391; BE-NEXT:    blr
392;
393; CHECK-LABEL: test_round:
394; CHECK:       # %bb.0: # %entry
395; CHECK-NEXT:    xsrdpi f1, f1
396; CHECK-NEXT:    blr
397;
398; FAST-LABEL: test_round:
399; FAST:       # %bb.0: # %entry
400; FAST-NEXT:    xsrdpi f1, f1
401; FAST-NEXT:    blr
402entry:
403  %0 = tail call double @llvm.round.f64(double %d)
404  ret double %0
405}
406
407declare double @llvm.round.f64(double)
408
409define dso_local float @test_roundf(float %f) local_unnamed_addr {
410; BE-LABEL: test_roundf:
411; BE:       # %bb.0: # %entry
412; BE-NEXT:    xsrdpi f1, f1
413; BE-NEXT:    blr
414;
415; CHECK-LABEL: test_roundf:
416; CHECK:       # %bb.0: # %entry
417; CHECK-NEXT:    xsrdpi f1, f1
418; CHECK-NEXT:    blr
419;
420; FAST-LABEL: test_roundf:
421; FAST:       # %bb.0: # %entry
422; FAST-NEXT:    xsrdpi f1, f1
423; FAST-NEXT:    blr
424entry:
425  %0 = tail call float @llvm.round.f32(float %f)
426  ret float %0
427}
428
429declare float @llvm.round.f32(float)
430
431define dso_local double @test_trunc(double %d) local_unnamed_addr {
432; BE-LABEL: test_trunc:
433; BE:       # %bb.0: # %entry
434; BE-NEXT:    xsrdpiz f1, f1
435; BE-NEXT:    blr
436;
437; CHECK-LABEL: test_trunc:
438; CHECK:       # %bb.0: # %entry
439; CHECK-NEXT:    xsrdpiz f1, f1
440; CHECK-NEXT:    blr
441;
442; FAST-LABEL: test_trunc:
443; FAST:       # %bb.0: # %entry
444; FAST-NEXT:    xsrdpiz f1, f1
445; FAST-NEXT:    blr
446entry:
447  %0 = tail call double @llvm.trunc.f64(double %d)
448  ret double %0
449}
450
451declare double @llvm.trunc.f64(double)
452
453define dso_local float @test_truncf(float %f) local_unnamed_addr {
454; BE-LABEL: test_truncf:
455; BE:       # %bb.0: # %entry
456; BE-NEXT:    xsrdpiz f1, f1
457; BE-NEXT:    blr
458;
459; CHECK-LABEL: test_truncf:
460; CHECK:       # %bb.0: # %entry
461; CHECK-NEXT:    xsrdpiz f1, f1
462; CHECK-NEXT:    blr
463;
464; FAST-LABEL: test_truncf:
465; FAST:       # %bb.0: # %entry
466; FAST-NEXT:    xsrdpiz f1, f1
467; FAST-NEXT:    blr
468entry:
469  %0 = tail call float @llvm.trunc.f32(float %f)
470  ret float %0
471}
472
473declare float @llvm.trunc.f32(float)
474
475define dso_local double @test_floor(double %d) local_unnamed_addr {
476; BE-LABEL: test_floor:
477; BE:       # %bb.0: # %entry
478; BE-NEXT:    xsrdpim f1, f1
479; BE-NEXT:    blr
480;
481; CHECK-LABEL: test_floor:
482; CHECK:       # %bb.0: # %entry
483; CHECK-NEXT:    xsrdpim f1, f1
484; CHECK-NEXT:    blr
485;
486; FAST-LABEL: test_floor:
487; FAST:       # %bb.0: # %entry
488; FAST-NEXT:    xsrdpim f1, f1
489; FAST-NEXT:    blr
490entry:
491  %0 = tail call double @llvm.floor.f64(double %d)
492  ret double %0
493}
494
495declare double @llvm.floor.f64(double)
496
497define dso_local float @test_floorf(float %f) local_unnamed_addr {
498; BE-LABEL: test_floorf:
499; BE:       # %bb.0: # %entry
500; BE-NEXT:    xsrdpim f1, f1
501; BE-NEXT:    blr
502;
503; CHECK-LABEL: test_floorf:
504; CHECK:       # %bb.0: # %entry
505; CHECK-NEXT:    xsrdpim f1, f1
506; CHECK-NEXT:    blr
507;
508; FAST-LABEL: test_floorf:
509; FAST:       # %bb.0: # %entry
510; FAST-NEXT:    xsrdpim f1, f1
511; FAST-NEXT:    blr
512entry:
513  %0 = tail call float @llvm.floor.f32(float %f)
514  ret float %0
515}
516
517declare float @llvm.floor.f32(float)
518
519define dso_local double @test_ceil(double %d) local_unnamed_addr {
520; BE-LABEL: test_ceil:
521; BE:       # %bb.0: # %entry
522; BE-NEXT:    xsrdpip f1, f1
523; BE-NEXT:    blr
524;
525; CHECK-LABEL: test_ceil:
526; CHECK:       # %bb.0: # %entry
527; CHECK-NEXT:    xsrdpip f1, f1
528; CHECK-NEXT:    blr
529;
530; FAST-LABEL: test_ceil:
531; FAST:       # %bb.0: # %entry
532; FAST-NEXT:    xsrdpip f1, f1
533; FAST-NEXT:    blr
534entry:
535  %0 = tail call double @llvm.ceil.f64(double %d)
536  ret double %0
537}
538
539declare double @llvm.ceil.f64(double)
540
541define dso_local float @test_ceilf(float %f) local_unnamed_addr {
542; BE-LABEL: test_ceilf:
543; BE:       # %bb.0: # %entry
544; BE-NEXT:    xsrdpip f1, f1
545; BE-NEXT:    blr
546;
547; CHECK-LABEL: test_ceilf:
548; CHECK:       # %bb.0: # %entry
549; CHECK-NEXT:    xsrdpip f1, f1
550; CHECK-NEXT:    blr
551;
552; FAST-LABEL: test_ceilf:
553; FAST:       # %bb.0: # %entry
554; FAST-NEXT:    xsrdpip f1, f1
555; FAST-NEXT:    blr
556entry:
557  %0 = tail call float @llvm.ceil.f32(float %f)
558  ret float %0
559}
560
561declare float @llvm.ceil.f32(float)
562