[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / PowerPC / fp-strict-f128.ll
blobe2c29f30cd3d6c75b4445d1f5634631fbdb7e879
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
7 declare fp128 @llvm.experimental.constrained.fadd.f128(fp128, fp128, metadata, metadata)
8 declare fp128 @llvm.experimental.constrained.fsub.f128(fp128, fp128, metadata, metadata)
9 declare fp128 @llvm.experimental.constrained.fmul.f128(fp128, fp128, metadata, metadata)
10 declare fp128 @llvm.experimental.constrained.fdiv.f128(fp128, fp128, metadata, metadata)
12 declare fp128 @llvm.experimental.constrained.fma.f128(fp128, fp128, fp128, metadata, metadata)
13 declare fp128 @llvm.experimental.constrained.sqrt.f128(fp128, metadata, metadata)
15 define 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
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
41 define 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
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
67 define 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
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
93 define 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
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
119 define 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
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 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
146 define 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
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, -48(r1)
158 ; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
159 ; CHECK-P8-NEXT:    .cfi_offset lr, 16
160 ; CHECK-P8-NEXT:    addi r3, r1, 32
161 ; CHECK-P8-NEXT:    stvx v4, 0, r3
162 ; CHECK-P8-NEXT:    lbz r4, 47(r1)
163 ; CHECK-P8-NEXT:    xori r4, r4, 128
164 ; CHECK-P8-NEXT:    stb r4, 47(r1)
165 ; CHECK-P8-NEXT:    lvx v4, 0, r3
166 ; CHECK-P8-NEXT:    bl fmaf128
167 ; CHECK-P8-NEXT:    nop
168 ; CHECK-P8-NEXT:    addi r1, r1, 48
169 ; CHECK-P8-NEXT:    ld r0, 16(r1)
170 ; CHECK-P8-NEXT:    mtlr r0
171 ; CHECK-P8-NEXT:    blr
172   %neg = fneg fp128 %f2
173   %res = call fp128 @llvm.experimental.constrained.fma.f128(
174                         fp128 %f0, fp128 %f1, fp128 %neg,
175                         metadata !"round.dynamic",
176                         metadata !"fpexcept.strict") #0
177   ret fp128 %res
180 define fp128 @fnmadd_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
181 ; CHECK-LABEL: fnmadd_f128:
182 ; CHECK:       # %bb.0:
183 ; CHECK-NEXT:    xsnmaddqp v4, v2, v3
184 ; CHECK-NEXT:    vmr v2, v4
185 ; CHECK-NEXT:    blr
187 ; CHECK-P8-LABEL: fnmadd_f128:
188 ; CHECK-P8:       # %bb.0:
189 ; CHECK-P8-NEXT:    mflr r0
190 ; CHECK-P8-NEXT:    std r0, 16(r1)
191 ; CHECK-P8-NEXT:    stdu r1, -48(r1)
192 ; CHECK-P8-NEXT:    .cfi_def_cfa_offset 48
193 ; CHECK-P8-NEXT:    .cfi_offset lr, 16
194 ; CHECK-P8-NEXT:    bl fmaf128
195 ; CHECK-P8-NEXT:    nop
196 ; CHECK-P8-NEXT:    addi r3, r1, 32
197 ; CHECK-P8-NEXT:    stvx v2, 0, r3
198 ; CHECK-P8-NEXT:    lbz r4, 47(r1)
199 ; CHECK-P8-NEXT:    xori r4, r4, 128
200 ; CHECK-P8-NEXT:    stb r4, 47(r1)
201 ; CHECK-P8-NEXT:    lvx v2, 0, r3
202 ; CHECK-P8-NEXT:    addi r1, r1, 48
203 ; CHECK-P8-NEXT:    ld r0, 16(r1)
204 ; CHECK-P8-NEXT:    mtlr r0
205 ; CHECK-P8-NEXT:    blr
206   %fma = call fp128 @llvm.experimental.constrained.fma.f128(
207                         fp128 %f0, fp128 %f1, fp128 %f2,
208                         metadata !"round.dynamic",
209                         metadata !"fpexcept.strict") #0
210   %res = fneg fp128 %fma
211   ret fp128 %res
214 define fp128 @fnmsub_f128(fp128 %f0, fp128 %f1, fp128 %f2) #0 {
215 ; CHECK-LABEL: fnmsub_f128:
216 ; CHECK:       # %bb.0:
217 ; CHECK-NEXT:    xsnmsubqp v4, v2, v3
218 ; CHECK-NEXT:    vmr v2, v4
219 ; CHECK-NEXT:    blr
221 ; CHECK-P8-LABEL: fnmsub_f128:
222 ; CHECK-P8:       # %bb.0:
223 ; CHECK-P8-NEXT:    mflr r0
224 ; CHECK-P8-NEXT:    std r0, 16(r1)
225 ; CHECK-P8-NEXT:    stdu r1, -64(r1)
226 ; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
227 ; CHECK-P8-NEXT:    .cfi_offset lr, 16
228 ; CHECK-P8-NEXT:    addi r3, r1, 32
229 ; CHECK-P8-NEXT:    stvx v4, 0, r3
230 ; CHECK-P8-NEXT:    lbz r4, 47(r1)
231 ; CHECK-P8-NEXT:    xori r4, r4, 128
232 ; CHECK-P8-NEXT:    stb r4, 47(r1)
233 ; CHECK-P8-NEXT:    lvx v4, 0, r3
234 ; CHECK-P8-NEXT:    bl fmaf128
235 ; CHECK-P8-NEXT:    nop
236 ; CHECK-P8-NEXT:    addi r3, r1, 48
237 ; CHECK-P8-NEXT:    stvx v2, 0, r3
238 ; CHECK-P8-NEXT:    lbz r4, 63(r1)
239 ; CHECK-P8-NEXT:    xori r4, r4, 128
240 ; CHECK-P8-NEXT:    stb r4, 63(r1)
241 ; CHECK-P8-NEXT:    lvx v2, 0, r3
242 ; CHECK-P8-NEXT:    addi r1, r1, 64
243 ; CHECK-P8-NEXT:    ld r0, 16(r1)
244 ; CHECK-P8-NEXT:    mtlr r0
245 ; CHECK-P8-NEXT:    blr
246   %neg = fneg fp128 %f2
247   %fma = call fp128 @llvm.experimental.constrained.fma.f128(
248                         fp128 %f0, fp128 %f1, fp128 %neg,
249                         metadata !"round.dynamic",
250                         metadata !"fpexcept.strict") #0
251   %res = fneg fp128 %fma
252   ret fp128 %res
256 define fp128 @fsqrt_f128(fp128 %f1) #0 {
257 ; CHECK-LABEL: fsqrt_f128:
258 ; CHECK:       # %bb.0:
259 ; CHECK-NEXT:    xssqrtqp v2, v2
260 ; CHECK-NEXT:    blr
262 ; CHECK-P8-LABEL: fsqrt_f128:
263 ; CHECK-P8:       # %bb.0:
264 ; CHECK-P8-NEXT:    mflr r0
265 ; CHECK-P8-NEXT:    std r0, 16(r1)
266 ; CHECK-P8-NEXT:    stdu r1, -32(r1)
267 ; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
268 ; CHECK-P8-NEXT:    .cfi_offset lr, 16
269 ; CHECK-P8-NEXT:    bl sqrtf128
270 ; CHECK-P8-NEXT:    nop
271 ; CHECK-P8-NEXT:    addi r1, r1, 32
272 ; CHECK-P8-NEXT:    ld r0, 16(r1)
273 ; CHECK-P8-NEXT:    mtlr r0
274 ; CHECK-P8-NEXT:    blr
275   %res = call fp128 @llvm.experimental.constrained.sqrt.f128(
276                         fp128 %f1,
277                         metadata !"round.dynamic",
278                         metadata !"fpexcept.strict") #0
279   ret fp128 %res
282 attributes #0 = { strictfp }