• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
3; RUN:   < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 | FileCheck %s
4; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
5; RUN:   < %s -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 | FileCheck %s --check-prefix=CHECK-P8
6
7declare fp128 @llvm.experimental.constrained.fadd.f128(fp128, fp128, metadata, metadata)
8declare fp128 @llvm.experimental.constrained.fsub.f128(fp128, fp128, metadata, metadata)
9declare fp128 @llvm.experimental.constrained.fmul.f128(fp128, fp128, metadata, metadata)
10declare fp128 @llvm.experimental.constrained.fdiv.f128(fp128, fp128, metadata, metadata)
11
12declare fp128 @llvm.experimental.constrained.fma.f128(fp128, fp128, fp128, metadata, metadata)
13declare fp128 @llvm.experimental.constrained.sqrt.f128(fp128, metadata, metadata)
14
15define fp128 @fadd_f128(fp128 %f1, fp128 %f2) #0 {
16; CHECK-LABEL: fadd_f128:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    xsaddqp v2, v2, v3
19; CHECK-NEXT:    blr
20;
21; CHECK-P8-LABEL: fadd_f128:
22; CHECK-P8:       # %bb.0:
23; CHECK-P8-NEXT:    mflr r0
24; CHECK-P8-NEXT:    std r0, 16(r1)
25; CHECK-P8-NEXT:    stdu r1, -32(r1)
26; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
27; CHECK-P8-NEXT:    .cfi_offset lr, 16
28; CHECK-P8-NEXT:    bl __addkf3
29; CHECK-P8-NEXT:    nop
30; CHECK-P8-NEXT:    addi r1, r1, 32
31; CHECK-P8-NEXT:    ld r0, 16(r1)
32; CHECK-P8-NEXT:    mtlr r0
33; CHECK-P8-NEXT:    blr
34  %res = call fp128 @llvm.experimental.constrained.fadd.f128(
35                        fp128 %f1, fp128 %f2,
36                        metadata !"round.dynamic",
37                        metadata !"fpexcept.strict") #0
38  ret fp128 %res
39}
40
41define fp128 @fsub_f128(fp128 %f1, fp128 %f2) #0 {
42; CHECK-LABEL: fsub_f128:
43; CHECK:       # %bb.0:
44; CHECK-NEXT:    xssubqp v2, v2, v3
45; CHECK-NEXT:    blr
46;
47; CHECK-P8-LABEL: fsub_f128:
48; CHECK-P8:       # %bb.0:
49; CHECK-P8-NEXT:    mflr r0
50; CHECK-P8-NEXT:    std r0, 16(r1)
51; CHECK-P8-NEXT:    stdu r1, -32(r1)
52; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
53; CHECK-P8-NEXT:    .cfi_offset lr, 16
54; CHECK-P8-NEXT:    bl __subkf3
55; CHECK-P8-NEXT:    nop
56; CHECK-P8-NEXT:    addi r1, r1, 32
57; CHECK-P8-NEXT:    ld r0, 16(r1)
58; CHECK-P8-NEXT:    mtlr r0
59; CHECK-P8-NEXT:    blr
60  %res = call fp128 @llvm.experimental.constrained.fsub.f128(
61                        fp128 %f1, fp128 %f2,
62                        metadata !"round.dynamic",
63                        metadata !"fpexcept.strict") #0
64  ret fp128 %res
65}
66
67define fp128 @fmul_f128(fp128 %f1, fp128 %f2) #0 {
68; CHECK-LABEL: fmul_f128:
69; CHECK:       # %bb.0:
70; CHECK-NEXT:    xsmulqp v2, v2, v3
71; CHECK-NEXT:    blr
72;
73; CHECK-P8-LABEL: fmul_f128:
74; CHECK-P8:       # %bb.0:
75; CHECK-P8-NEXT:    mflr r0
76; CHECK-P8-NEXT:    std r0, 16(r1)
77; CHECK-P8-NEXT:    stdu r1, -32(r1)
78; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
79; CHECK-P8-NEXT:    .cfi_offset lr, 16
80; CHECK-P8-NEXT:    bl __mulkf3
81; CHECK-P8-NEXT:    nop
82; CHECK-P8-NEXT:    addi r1, r1, 32
83; CHECK-P8-NEXT:    ld r0, 16(r1)
84; CHECK-P8-NEXT:    mtlr r0
85; CHECK-P8-NEXT:    blr
86  %res = call fp128 @llvm.experimental.constrained.fmul.f128(
87                        fp128 %f1, fp128 %f2,
88                        metadata !"round.dynamic",
89                        metadata !"fpexcept.strict") #0
90  ret fp128 %res
91}
92
93define fp128 @fdiv_f128(fp128 %f1, fp128 %f2) #0 {
94; CHECK-LABEL: fdiv_f128:
95; CHECK:       # %bb.0:
96; CHECK-NEXT:    xsdivqp v2, v2, v3
97; CHECK-NEXT:    blr
98;
99; CHECK-P8-LABEL: fdiv_f128:
100; CHECK-P8:       # %bb.0:
101; CHECK-P8-NEXT:    mflr r0
102; CHECK-P8-NEXT:    std r0, 16(r1)
103; CHECK-P8-NEXT:    stdu r1, -32(r1)
104; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
105; CHECK-P8-NEXT:    .cfi_offset lr, 16
106; CHECK-P8-NEXT:    bl __divkf3
107; CHECK-P8-NEXT:    nop
108; CHECK-P8-NEXT:    addi r1, r1, 32
109; CHECK-P8-NEXT:    ld r0, 16(r1)
110; CHECK-P8-NEXT:    mtlr r0
111; CHECK-P8-NEXT:    blr
112  %res = call fp128 @llvm.experimental.constrained.fdiv.f128(
113                        fp128 %f1, fp128 %f2,
114                        metadata !"round.dynamic",
115                        metadata !"fpexcept.strict") #0
116  ret fp128 %res
117}
118
119define fp128 @fmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
120; CHECK-LABEL: fmadd_f128:
121; CHECK:       # %bb.0:
122; CHECK-NEXT:    xsmaddqp v4, v2, v3
123; CHECK-NEXT:    vmr v2, v4
124; CHECK-NEXT:    blr
125;
126; CHECK-P8-LABEL: fmadd_f128:
127; CHECK-P8:       # %bb.0:
128; CHECK-P8-NEXT:    mflr r0
129; CHECK-P8-NEXT:    std r0, 16(r1)
130; CHECK-P8-NEXT:    stdu r1, -32(r1)
131; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
132; CHECK-P8-NEXT:    .cfi_offset lr, 16
133; CHECK-P8-NEXT:    bl fmal
134; CHECK-P8-NEXT:    nop
135; CHECK-P8-NEXT:    addi r1, r1, 32
136; CHECK-P8-NEXT:    ld r0, 16(r1)
137; CHECK-P8-NEXT:    mtlr r0
138; CHECK-P8-NEXT:    blr
139  %res = call fp128 @llvm.experimental.constrained.fma.f128(
140                        fp128 %f0, fp128 %f1, fp128 %f2,
141                        metadata !"round.dynamic",
142                        metadata !"fpexcept.strict") #0
143  ret fp128 %res
144}
145
146define fp128 @fmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
147; CHECK-LABEL: fmsub_f128:
148; CHECK:       # %bb.0:
149; CHECK-NEXT:    xsmsubqp v4, v2, v3
150; CHECK-NEXT:    vmr v2, v4
151; CHECK-NEXT:    blr
152;
153; CHECK-P8-LABEL: fmsub_f128:
154; CHECK-P8:       # %bb.0:
155; CHECK-P8-NEXT:    mflr r0
156; CHECK-P8-NEXT:    std r0, 16(r1)
157; CHECK-P8-NEXT:    stdu r1, -32(r1)
158; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
159; CHECK-P8-NEXT:    .cfi_offset lr, 16
160; CHECK-P8-NEXT:    li r9, 1
161; CHECK-P8-NEXT:    sldi r9, r9, 63
162; CHECK-P8-NEXT:    xor r8, r8, r9
163; CHECK-P8-NEXT:    bl fmal
164; CHECK-P8-NEXT:    nop
165; CHECK-P8-NEXT:    addi r1, r1, 32
166; CHECK-P8-NEXT:    ld r0, 16(r1)
167; CHECK-P8-NEXT:    mtlr r0
168; CHECK-P8-NEXT:    blr
169  %neg = fneg fp128 %f2
170  %res = call fp128 @llvm.experimental.constrained.fma.f128(
171                        fp128 %f0, fp128 %f1, fp128 %neg,
172                        metadata !"round.dynamic",
173                        metadata !"fpexcept.strict") #0
174  ret fp128 %res
175}
176
177define fp128 @fnmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
178; CHECK-LABEL: fnmadd_f128:
179; CHECK:       # %bb.0:
180; CHECK-NEXT:    xsnmaddqp v4, v2, v3
181; CHECK-NEXT:    vmr v2, v4
182; CHECK-NEXT:    blr
183;
184; CHECK-P8-LABEL: fnmadd_f128:
185; CHECK-P8:       # %bb.0:
186; CHECK-P8-NEXT:    mflr r0
187; CHECK-P8-NEXT:    std r0, 16(r1)
188; CHECK-P8-NEXT:    stdu r1, -32(r1)
189; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
190; CHECK-P8-NEXT:    .cfi_offset lr, 16
191; CHECK-P8-NEXT:    bl fmal
192; CHECK-P8-NEXT:    nop
193; CHECK-P8-NEXT:    li r5, 1
194; CHECK-P8-NEXT:    sldi r5, r5, 63
195; CHECK-P8-NEXT:    xor r4, r4, r5
196; CHECK-P8-NEXT:    addi r1, r1, 32
197; CHECK-P8-NEXT:    ld r0, 16(r1)
198; CHECK-P8-NEXT:    mtlr r0
199; CHECK-P8-NEXT:    blr
200  %fma = call fp128 @llvm.experimental.constrained.fma.f128(
201                        fp128 %f0, fp128 %f1, fp128 %f2,
202                        metadata !"round.dynamic",
203                        metadata !"fpexcept.strict") #0
204  %res = fneg fp128 %fma
205  ret fp128 %res
206}
207
208define fp128 @fnmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
209; CHECK-LABEL: fnmsub_f128:
210; CHECK:       # %bb.0:
211; CHECK-NEXT:    xsnmsubqp v4, v2, v3
212; CHECK-NEXT:    vmr v2, v4
213; CHECK-NEXT:    blr
214;
215; CHECK-P8-LABEL: fnmsub_f128:
216; CHECK-P8:       # %bb.0:
217; CHECK-P8-NEXT:    mflr r0
218; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
219; CHECK-P8-NEXT:    .cfi_offset lr, 16
220; CHECK-P8-NEXT:    .cfi_offset r30, -16
221; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
222; CHECK-P8-NEXT:    std r0, 16(r1)
223; CHECK-P8-NEXT:    stdu r1, -48(r1)
224; CHECK-P8-NEXT:    li r9, 1
225; CHECK-P8-NEXT:    sldi r30, r9, 63
226; CHECK-P8-NEXT:    xor r8, r8, r30
227; CHECK-P8-NEXT:    bl fmal
228; CHECK-P8-NEXT:    nop
229; CHECK-P8-NEXT:    xor r4, r4, r30
230; CHECK-P8-NEXT:    addi r1, r1, 48
231; CHECK-P8-NEXT:    ld r0, 16(r1)
232; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
233; CHECK-P8-NEXT:    mtlr r0
234; CHECK-P8-NEXT:    blr
235  %neg = fneg fp128 %f2
236  %fma = call fp128 @llvm.experimental.constrained.fma.f128(
237                        fp128 %f0, fp128 %f1, fp128 %neg,
238                        metadata !"round.dynamic",
239                        metadata !"fpexcept.strict") #0
240  %res = fneg fp128 %fma
241  ret fp128 %res
242}
243
244
245define fp128 @fsqrt_f128(fp128 %f1) #0 {
246; CHECK-LABEL: fsqrt_f128:
247; CHECK:       # %bb.0:
248; CHECK-NEXT:    xssqrtqp v2, v2
249; CHECK-NEXT:    blr
250;
251; CHECK-P8-LABEL: fsqrt_f128:
252; CHECK-P8:       # %bb.0:
253; CHECK-P8-NEXT:    mflr r0
254; CHECK-P8-NEXT:    std r0, 16(r1)
255; CHECK-P8-NEXT:    stdu r1, -32(r1)
256; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
257; CHECK-P8-NEXT:    .cfi_offset lr, 16
258; CHECK-P8-NEXT:    bl sqrtl
259; CHECK-P8-NEXT:    nop
260; CHECK-P8-NEXT:    addi r1, r1, 32
261; CHECK-P8-NEXT:    ld r0, 16(r1)
262; CHECK-P8-NEXT:    mtlr r0
263; CHECK-P8-NEXT:    blr
264  %res = call fp128 @llvm.experimental.constrained.sqrt.f128(
265                        fp128 %f1,
266                        metadata !"round.dynamic",
267                        metadata !"fpexcept.strict") #0
268  ret fp128 %res
269}
270
271attributes #0 = { strictfp }
272