xref: /llvm-project/llvm/test/CodeGen/PowerPC/fp-strict-f128.ll (revision eb7d16ea25649909373e324e6ebf36774cabdbfa)
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:    stdu r1, -32(r1)
25; CHECK-P8-NEXT:    std r0, 48(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:    stdu r1, -32(r1)
51; CHECK-P8-NEXT:    std r0, 48(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:    stdu r1, -32(r1)
77; CHECK-P8-NEXT:    std r0, 48(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:    stdu r1, -32(r1)
103; CHECK-P8-NEXT:    std r0, 48(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:    stdu r1, -32(r1)
130; CHECK-P8-NEXT:    std r0, 48(r1)
131; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
132; CHECK-P8-NEXT:    .cfi_offset lr, 16
133; CHECK-P8-NEXT:    bl fmaf128
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:    stdu r1, -48(r1)
157; CHECK-P8-NEXT:    std r0, 64(r1)
158; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
159; CHECK-P8-NEXT:    .cfi_offset lr, 16
160; CHECK-P8-NEXT:    xxswapd vs0, v4
161; CHECK-P8-NEXT:    addi r3, r1, 32
162; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
163; CHECK-P8-NEXT:    lbz r4, 47(r1)
164; CHECK-P8-NEXT:    xori r4, r4, 128
165; CHECK-P8-NEXT:    stb r4, 47(r1)
166; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
167; CHECK-P8-NEXT:    xxswapd v4, vs0
168; CHECK-P8-NEXT:    bl fmaf128
169; CHECK-P8-NEXT:    nop
170; CHECK-P8-NEXT:    addi r1, r1, 48
171; CHECK-P8-NEXT:    ld r0, 16(r1)
172; CHECK-P8-NEXT:    mtlr r0
173; CHECK-P8-NEXT:    blr
174  %neg = fneg fp128 %f2
175  %res = call fp128 @llvm.experimental.constrained.fma.f128(
176                        fp128 %f0, fp128 %f1, fp128 %neg,
177                        metadata !"round.dynamic",
178                        metadata !"fpexcept.strict") #0
179  ret fp128 %res
180}
181
182define fp128 @fnmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
183; CHECK-LABEL: fnmadd_f128:
184; CHECK:       # %bb.0:
185; CHECK-NEXT:    xsnmaddqp v4, v2, v3
186; CHECK-NEXT:    vmr v2, v4
187; CHECK-NEXT:    blr
188;
189; CHECK-P8-LABEL: fnmadd_f128:
190; CHECK-P8:       # %bb.0:
191; CHECK-P8-NEXT:    mflr r0
192; CHECK-P8-NEXT:    stdu r1, -48(r1)
193; CHECK-P8-NEXT:    std r0, 64(r1)
194; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
195; CHECK-P8-NEXT:    .cfi_offset lr, 16
196; CHECK-P8-NEXT:    bl fmaf128
197; CHECK-P8-NEXT:    nop
198; CHECK-P8-NEXT:    xxswapd vs0, v2
199; CHECK-P8-NEXT:    addi r3, r1, 32
200; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
201; CHECK-P8-NEXT:    lbz r4, 47(r1)
202; CHECK-P8-NEXT:    xori r4, r4, 128
203; CHECK-P8-NEXT:    stb r4, 47(r1)
204; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
205; CHECK-P8-NEXT:    xxswapd v2, vs0
206; CHECK-P8-NEXT:    addi r1, r1, 48
207; CHECK-P8-NEXT:    ld r0, 16(r1)
208; CHECK-P8-NEXT:    mtlr r0
209; CHECK-P8-NEXT:    blr
210  %fma = call fp128 @llvm.experimental.constrained.fma.f128(
211                        fp128 %f0, fp128 %f1, fp128 %f2,
212                        metadata !"round.dynamic",
213                        metadata !"fpexcept.strict") #0
214  %res = fneg fp128 %fma
215  ret fp128 %res
216}
217
218define fp128 @fnmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
219; CHECK-LABEL: fnmsub_f128:
220; CHECK:       # %bb.0:
221; CHECK-NEXT:    xsnmsubqp v4, v2, v3
222; CHECK-NEXT:    vmr v2, v4
223; CHECK-NEXT:    blr
224;
225; CHECK-P8-LABEL: fnmsub_f128:
226; CHECK-P8:       # %bb.0:
227; CHECK-P8-NEXT:    mflr r0
228; CHECK-P8-NEXT:    stdu r1, -64(r1)
229; CHECK-P8-NEXT:    std r0, 80(r1)
230; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
231; CHECK-P8-NEXT:    .cfi_offset lr, 16
232; CHECK-P8-NEXT:    xxswapd vs0, v4
233; CHECK-P8-NEXT:    addi r3, r1, 32
234; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
235; CHECK-P8-NEXT:    lbz r4, 47(r1)
236; CHECK-P8-NEXT:    xori r4, r4, 128
237; CHECK-P8-NEXT:    stb r4, 47(r1)
238; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
239; CHECK-P8-NEXT:    xxswapd v4, vs0
240; CHECK-P8-NEXT:    bl fmaf128
241; CHECK-P8-NEXT:    nop
242; CHECK-P8-NEXT:    xxswapd vs0, v2
243; CHECK-P8-NEXT:    addi r3, r1, 48
244; CHECK-P8-NEXT:    stxvd2x vs0, 0, r3
245; CHECK-P8-NEXT:    lbz r4, 63(r1)
246; CHECK-P8-NEXT:    xori r4, r4, 128
247; CHECK-P8-NEXT:    stb r4, 63(r1)
248; CHECK-P8-NEXT:    lxvd2x vs0, 0, r3
249; CHECK-P8-NEXT:    xxswapd v2, vs0
250; CHECK-P8-NEXT:    addi r1, r1, 64
251; CHECK-P8-NEXT:    ld r0, 16(r1)
252; CHECK-P8-NEXT:    mtlr r0
253; CHECK-P8-NEXT:    blr
254  %neg = fneg fp128 %f2
255  %fma = call fp128 @llvm.experimental.constrained.fma.f128(
256                        fp128 %f0, fp128 %f1, fp128 %neg,
257                        metadata !"round.dynamic",
258                        metadata !"fpexcept.strict") #0
259  %res = fneg fp128 %fma
260  ret fp128 %res
261}
262
263
264define fp128 @fsqrt_f128(fp128 %f1) #0 {
265; CHECK-LABEL: fsqrt_f128:
266; CHECK:       # %bb.0:
267; CHECK-NEXT:    xssqrtqp v2, v2
268; CHECK-NEXT:    blr
269;
270; CHECK-P8-LABEL: fsqrt_f128:
271; CHECK-P8:       # %bb.0:
272; CHECK-P8-NEXT:    mflr r0
273; CHECK-P8-NEXT:    stdu r1, -32(r1)
274; CHECK-P8-NEXT:    std r0, 48(r1)
275; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
276; CHECK-P8-NEXT:    .cfi_offset lr, 16
277; CHECK-P8-NEXT:    bl sqrtf128
278; CHECK-P8-NEXT:    nop
279; CHECK-P8-NEXT:    addi r1, r1, 32
280; CHECK-P8-NEXT:    ld r0, 16(r1)
281; CHECK-P8-NEXT:    mtlr r0
282; CHECK-P8-NEXT:    blr
283  %res = call fp128 @llvm.experimental.constrained.sqrt.f128(
284                        fp128 %f1,
285                        metadata !"round.dynamic",
286                        metadata !"fpexcept.strict") #0
287  ret fp128 %res
288}
289
290attributes #0 = { strictfp }
291