1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
3; RUN:   -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s
4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \
5; RUN:   -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s \
6; RUN:   -check-prefix=CHECK-P8
7
8define void @qp_trunc(fp128* nocapture readonly %a, fp128* nocapture %res) {
9; CHECK-LABEL: qp_trunc:
10; CHECK:       # %bb.0: # %entry
11; CHECK-NEXT:    lxv v2, 0(r3)
12; CHECK-NEXT:    xsrqpi 1, v2, v2, 1
13; CHECK-NEXT:    stxv v2, 0(r4)
14; CHECK-NEXT:    blr
15;
16; CHECK-P8-LABEL: qp_trunc:
17; CHECK-P8:       # %bb.0: # %entry
18; CHECK-P8-NEXT:    mflr r0
19; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
20; CHECK-P8-NEXT:    .cfi_offset lr, 16
21; CHECK-P8-NEXT:    .cfi_offset r30, -16
22; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
23; CHECK-P8-NEXT:    std r0, 16(r1)
24; CHECK-P8-NEXT:    stdu r1, -48(r1)
25; CHECK-P8-NEXT:    lvx v2, 0, r3
26; CHECK-P8-NEXT:    mr r30, r4
27; CHECK-P8-NEXT:    bl truncf128
28; CHECK-P8-NEXT:    nop
29; CHECK-P8-NEXT:    stvx v2, 0, r30
30; CHECK-P8-NEXT:    addi r1, r1, 48
31; CHECK-P8-NEXT:    ld r0, 16(r1)
32; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
33; CHECK-P8-NEXT:    mtlr r0
34; CHECK-P8-NEXT:    blr
35entry:
36  %0 = load fp128, fp128* %a, align 16
37  %1 = tail call fp128 @llvm.trunc.f128(fp128 %0)
38  store fp128 %1, fp128* %res, align 16
39  ret void
40}
41declare fp128     @llvm.trunc.f128(fp128 %Val)
42
43define void @qp_rint(fp128* nocapture readonly %a, fp128* nocapture %res) {
44; CHECK-LABEL: qp_rint:
45; CHECK:       # %bb.0: # %entry
46; CHECK-NEXT:    lxv v2, 0(r3)
47; CHECK-NEXT:    xsrqpix 0, v2, v2, 3
48; CHECK-NEXT:    stxv v2, 0(r4)
49; CHECK-NEXT:    blr
50;
51; CHECK-P8-LABEL: qp_rint:
52; CHECK-P8:       # %bb.0: # %entry
53; CHECK-P8-NEXT:    mflr r0
54; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
55; CHECK-P8-NEXT:    .cfi_offset lr, 16
56; CHECK-P8-NEXT:    .cfi_offset r30, -16
57; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
58; CHECK-P8-NEXT:    std r0, 16(r1)
59; CHECK-P8-NEXT:    stdu r1, -48(r1)
60; CHECK-P8-NEXT:    lvx v2, 0, r3
61; CHECK-P8-NEXT:    mr r30, r4
62; CHECK-P8-NEXT:    bl rintf128
63; CHECK-P8-NEXT:    nop
64; CHECK-P8-NEXT:    stvx v2, 0, r30
65; CHECK-P8-NEXT:    addi r1, r1, 48
66; CHECK-P8-NEXT:    ld r0, 16(r1)
67; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
68; CHECK-P8-NEXT:    mtlr r0
69; CHECK-P8-NEXT:    blr
70entry:
71  %0 = load fp128, fp128* %a, align 16
72  %1 = tail call fp128 @llvm.rint.f128(fp128 %0)
73  store fp128 %1, fp128* %res, align 16
74  ret void
75}
76declare fp128     @llvm.rint.f128(fp128 %Val)
77
78define void @qp_nearbyint(fp128* nocapture readonly %a, fp128* nocapture %res) {
79; CHECK-LABEL: qp_nearbyint:
80; CHECK:       # %bb.0: # %entry
81; CHECK-NEXT:    lxv v2, 0(r3)
82; CHECK-NEXT:    xsrqpi 0, v2, v2, 3
83; CHECK-NEXT:    stxv v2, 0(r4)
84; CHECK-NEXT:    blr
85;
86; CHECK-P8-LABEL: qp_nearbyint:
87; CHECK-P8:       # %bb.0: # %entry
88; CHECK-P8-NEXT:    mflr r0
89; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
90; CHECK-P8-NEXT:    .cfi_offset lr, 16
91; CHECK-P8-NEXT:    .cfi_offset r30, -16
92; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
93; CHECK-P8-NEXT:    std r0, 16(r1)
94; CHECK-P8-NEXT:    stdu r1, -48(r1)
95; CHECK-P8-NEXT:    lvx v2, 0, r3
96; CHECK-P8-NEXT:    mr r30, r4
97; CHECK-P8-NEXT:    bl nearbyintf128
98; CHECK-P8-NEXT:    nop
99; CHECK-P8-NEXT:    stvx v2, 0, r30
100; CHECK-P8-NEXT:    addi r1, r1, 48
101; CHECK-P8-NEXT:    ld r0, 16(r1)
102; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
103; CHECK-P8-NEXT:    mtlr r0
104; CHECK-P8-NEXT:    blr
105entry:
106  %0 = load fp128, fp128* %a, align 16
107  %1 = tail call fp128 @llvm.nearbyint.f128(fp128 %0)
108  store fp128 %1, fp128* %res, align 16
109  ret void
110}
111declare fp128     @llvm.nearbyint.f128(fp128 %Val)
112
113define void @qp_round(fp128* nocapture readonly %a, fp128* nocapture %res) {
114; CHECK-LABEL: qp_round:
115; CHECK:       # %bb.0: # %entry
116; CHECK-NEXT:    lxv v2, 0(r3)
117; CHECK-NEXT:    xsrqpi 0, v2, v2, 0
118; CHECK-NEXT:    stxv v2, 0(r4)
119; CHECK-NEXT:    blr
120;
121; CHECK-P8-LABEL: qp_round:
122; CHECK-P8:       # %bb.0: # %entry
123; CHECK-P8-NEXT:    mflr r0
124; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
125; CHECK-P8-NEXT:    .cfi_offset lr, 16
126; CHECK-P8-NEXT:    .cfi_offset r30, -16
127; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
128; CHECK-P8-NEXT:    std r0, 16(r1)
129; CHECK-P8-NEXT:    stdu r1, -48(r1)
130; CHECK-P8-NEXT:    lvx v2, 0, r3
131; CHECK-P8-NEXT:    mr r30, r4
132; CHECK-P8-NEXT:    bl roundf128
133; CHECK-P8-NEXT:    nop
134; CHECK-P8-NEXT:    stvx v2, 0, r30
135; CHECK-P8-NEXT:    addi r1, r1, 48
136; CHECK-P8-NEXT:    ld r0, 16(r1)
137; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
138; CHECK-P8-NEXT:    mtlr r0
139; CHECK-P8-NEXT:    blr
140entry:
141  %0 = load fp128, fp128* %a, align 16
142  %1 = tail call fp128 @llvm.round.f128(fp128 %0)
143  store fp128 %1, fp128* %res, align 16
144  ret void
145}
146declare fp128     @llvm.round.f128(fp128 %Val)
147
148define void @qp_floor(fp128* nocapture readonly %a, fp128* nocapture %res) {
149; CHECK-LABEL: qp_floor:
150; CHECK:       # %bb.0: # %entry
151; CHECK-NEXT:    lxv v2, 0(r3)
152; CHECK-NEXT:    xsrqpi 1, v2, v2, 3
153; CHECK-NEXT:    stxv v2, 0(r4)
154; CHECK-NEXT:    blr
155;
156; CHECK-P8-LABEL: qp_floor:
157; CHECK-P8:       # %bb.0: # %entry
158; CHECK-P8-NEXT:    mflr r0
159; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
160; CHECK-P8-NEXT:    .cfi_offset lr, 16
161; CHECK-P8-NEXT:    .cfi_offset r30, -16
162; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
163; CHECK-P8-NEXT:    std r0, 16(r1)
164; CHECK-P8-NEXT:    stdu r1, -48(r1)
165; CHECK-P8-NEXT:    lvx v2, 0, r3
166; CHECK-P8-NEXT:    mr r30, r4
167; CHECK-P8-NEXT:    bl floorf128
168; CHECK-P8-NEXT:    nop
169; CHECK-P8-NEXT:    stvx v2, 0, r30
170; CHECK-P8-NEXT:    addi r1, r1, 48
171; CHECK-P8-NEXT:    ld r0, 16(r1)
172; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
173; CHECK-P8-NEXT:    mtlr r0
174; CHECK-P8-NEXT:    blr
175entry:
176  %0 = load fp128, fp128* %a, align 16
177  %1 = tail call fp128 @llvm.floor.f128(fp128 %0)
178  store fp128 %1, fp128* %res, align 16
179  ret void
180}
181declare fp128     @llvm.floor.f128(fp128 %Val)
182
183define void @qp_ceil(fp128* nocapture readonly %a, fp128* nocapture %res) {
184; CHECK-LABEL: qp_ceil:
185; CHECK:       # %bb.0: # %entry
186; CHECK-NEXT:    lxv v2, 0(r3)
187; CHECK-NEXT:    xsrqpi 1, v2, v2, 2
188; CHECK-NEXT:    stxv v2, 0(r4)
189; CHECK-NEXT:    blr
190;
191; CHECK-P8-LABEL: qp_ceil:
192; CHECK-P8:       # %bb.0: # %entry
193; CHECK-P8-NEXT:    mflr r0
194; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
195; CHECK-P8-NEXT:    .cfi_offset lr, 16
196; CHECK-P8-NEXT:    .cfi_offset r30, -16
197; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
198; CHECK-P8-NEXT:    std r0, 16(r1)
199; CHECK-P8-NEXT:    stdu r1, -48(r1)
200; CHECK-P8-NEXT:    lvx v2, 0, r3
201; CHECK-P8-NEXT:    mr r30, r4
202; CHECK-P8-NEXT:    bl ceilf128
203; CHECK-P8-NEXT:    nop
204; CHECK-P8-NEXT:    stvx v2, 0, r30
205; CHECK-P8-NEXT:    addi r1, r1, 48
206; CHECK-P8-NEXT:    ld r0, 16(r1)
207; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
208; CHECK-P8-NEXT:    mtlr r0
209; CHECK-P8-NEXT:    blr
210entry:
211  %0 = load fp128, fp128* %a, align 16
212  %1 = tail call fp128 @llvm.ceil.f128(fp128 %0)
213  store fp128 %1, fp128* %res, align 16
214  ret void
215}
216declare fp128     @llvm.ceil.f128(fp128 %Val)
217
218