[RISCV][VLOPT] Add vector narrowing integer right shift instructions to isSupportedIn...
[llvm-project.git] / llvm / test / CodeGen / PowerPC / fp-strict-f128.ll
blob8faed9b8f844ed7ea4f7aca1fa985c19b195702c
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:    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
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:    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
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:    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
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:    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
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:    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
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:    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
182 define 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
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
218 define 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
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
264 define 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
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
290 attributes #0 = { strictfp }