[Transforms] Silence a warning in SROA.cpp (NFC)
[llvm-project.git] / llvm / test / CodeGen / PowerPC / ppcsoftops.ll
blob7e10db76a3640ee67099b25167508208128c235a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc -mtriple=powerpc-unknown-linux-gnu -O0 < %s | FileCheck %s --check-prefix=PPC
3 ; RUN: llc -mcpu=ppc -mtriple=powerpc64-unknown-linux-gnu -O0 < %s | FileCheck %s --check-prefix=PPC64
4 ; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -O0 < %s | FileCheck %s --check-prefix=PPC64LE
6 ; Testing operations in soft-float mode
7 define double @foo() #0 {
8 ; PPC-LABEL: foo:
9 ; PPC:       # %bb.0: # %entry
10 ; PPC-NEXT:    mflr 0
11 ; PPC-NEXT:    stwu 1, -32(1)
12 ; PPC-NEXT:    stw 0, 36(1)
13 ; PPC-NEXT:    lwz 3, 24(1)
14 ; PPC-NEXT:    lwz 4, 28(1)
15 ; PPC-NEXT:    lwz 5, 16(1)
16 ; PPC-NEXT:    lwz 6, 20(1)
17 ; PPC-NEXT:    bl __adddf3
18 ; PPC-NEXT:    lwz 0, 36(1)
19 ; PPC-NEXT:    addi 1, 1, 32
20 ; PPC-NEXT:    mtlr 0
21 ; PPC-NEXT:    blr
23 ; PPC64-LABEL: foo:
24 ; PPC64:       # %bb.0: # %entry
25 ; PPC64-NEXT:    mflr 0
26 ; PPC64-NEXT:    stdu 1, -128(1)
27 ; PPC64-NEXT:    std 0, 144(1)
28 ; PPC64-NEXT:    ld 3, 120(1)
29 ; PPC64-NEXT:    ld 4, 112(1)
30 ; PPC64-NEXT:    bl __adddf3
31 ; PPC64-NEXT:    nop
32 ; PPC64-NEXT:    addi 1, 1, 128
33 ; PPC64-NEXT:    ld 0, 16(1)
34 ; PPC64-NEXT:    mtlr 0
35 ; PPC64-NEXT:    blr
37 ; PPC64LE-LABEL: foo:
38 ; PPC64LE:       # %bb.0: # %entry
39 ; PPC64LE-NEXT:    mflr 0
40 ; PPC64LE-NEXT:    stdu 1, -48(1)
41 ; PPC64LE-NEXT:    std 0, 64(1)
42 ; PPC64LE-NEXT:    ld 3, 40(1)
43 ; PPC64LE-NEXT:    ld 4, 32(1)
44 ; PPC64LE-NEXT:    bl __adddf3
45 ; PPC64LE-NEXT:    nop
46 ; PPC64LE-NEXT:    addi 1, 1, 48
47 ; PPC64LE-NEXT:    ld 0, 16(1)
48 ; PPC64LE-NEXT:    mtlr 0
49 ; PPC64LE-NEXT:    blr
50 entry:
51   %a = alloca double, align 8
52   %b = alloca double, align 8
53   %0 = load double, ptr %a, align 8
54   %1 = load double, ptr %b, align 8
55   %add = fadd double %0, %1
56   ret double %add
59 define double @foo1() #0 {
60 ; PPC-LABEL: foo1:
61 ; PPC:       # %bb.0: # %entry
62 ; PPC-NEXT:    mflr 0
63 ; PPC-NEXT:    stwu 1, -32(1)
64 ; PPC-NEXT:    stw 0, 36(1)
65 ; PPC-NEXT:    lwz 3, 24(1)
66 ; PPC-NEXT:    lwz 4, 28(1)
67 ; PPC-NEXT:    lwz 5, 16(1)
68 ; PPC-NEXT:    lwz 6, 20(1)
69 ; PPC-NEXT:    bl __muldf3
70 ; PPC-NEXT:    lwz 0, 36(1)
71 ; PPC-NEXT:    addi 1, 1, 32
72 ; PPC-NEXT:    mtlr 0
73 ; PPC-NEXT:    blr
75 ; PPC64-LABEL: foo1:
76 ; PPC64:       # %bb.0: # %entry
77 ; PPC64-NEXT:    mflr 0
78 ; PPC64-NEXT:    stdu 1, -128(1)
79 ; PPC64-NEXT:    std 0, 144(1)
80 ; PPC64-NEXT:    ld 3, 120(1)
81 ; PPC64-NEXT:    ld 4, 112(1)
82 ; PPC64-NEXT:    bl __muldf3
83 ; PPC64-NEXT:    nop
84 ; PPC64-NEXT:    addi 1, 1, 128
85 ; PPC64-NEXT:    ld 0, 16(1)
86 ; PPC64-NEXT:    mtlr 0
87 ; PPC64-NEXT:    blr
89 ; PPC64LE-LABEL: foo1:
90 ; PPC64LE:       # %bb.0: # %entry
91 ; PPC64LE-NEXT:    mflr 0
92 ; PPC64LE-NEXT:    stdu 1, -48(1)
93 ; PPC64LE-NEXT:    std 0, 64(1)
94 ; PPC64LE-NEXT:    ld 3, 40(1)
95 ; PPC64LE-NEXT:    ld 4, 32(1)
96 ; PPC64LE-NEXT:    bl __muldf3
97 ; PPC64LE-NEXT:    nop
98 ; PPC64LE-NEXT:    addi 1, 1, 48
99 ; PPC64LE-NEXT:    ld 0, 16(1)
100 ; PPC64LE-NEXT:    mtlr 0
101 ; PPC64LE-NEXT:    blr
102 entry:
103   %a = alloca double, align 8
104   %b = alloca double, align 8
105   %0 = load double, ptr %a, align 8
106   %1 = load double, ptr %b, align 8
107   %mul = fmul double %0, %1
108   ret double %mul
111 define double @foo2() #0 {
112 ; PPC-LABEL: foo2:
113 ; PPC:       # %bb.0: # %entry
114 ; PPC-NEXT:    mflr 0
115 ; PPC-NEXT:    stwu 1, -32(1)
116 ; PPC-NEXT:    stw 0, 36(1)
117 ; PPC-NEXT:    lwz 3, 24(1)
118 ; PPC-NEXT:    lwz 4, 28(1)
119 ; PPC-NEXT:    lwz 5, 16(1)
120 ; PPC-NEXT:    lwz 6, 20(1)
121 ; PPC-NEXT:    bl __subdf3
122 ; PPC-NEXT:    lwz 0, 36(1)
123 ; PPC-NEXT:    addi 1, 1, 32
124 ; PPC-NEXT:    mtlr 0
125 ; PPC-NEXT:    blr
127 ; PPC64-LABEL: foo2:
128 ; PPC64:       # %bb.0: # %entry
129 ; PPC64-NEXT:    mflr 0
130 ; PPC64-NEXT:    stdu 1, -128(1)
131 ; PPC64-NEXT:    std 0, 144(1)
132 ; PPC64-NEXT:    ld 3, 120(1)
133 ; PPC64-NEXT:    ld 4, 112(1)
134 ; PPC64-NEXT:    bl __subdf3
135 ; PPC64-NEXT:    nop
136 ; PPC64-NEXT:    addi 1, 1, 128
137 ; PPC64-NEXT:    ld 0, 16(1)
138 ; PPC64-NEXT:    mtlr 0
139 ; PPC64-NEXT:    blr
141 ; PPC64LE-LABEL: foo2:
142 ; PPC64LE:       # %bb.0: # %entry
143 ; PPC64LE-NEXT:    mflr 0
144 ; PPC64LE-NEXT:    stdu 1, -48(1)
145 ; PPC64LE-NEXT:    std 0, 64(1)
146 ; PPC64LE-NEXT:    ld 3, 40(1)
147 ; PPC64LE-NEXT:    ld 4, 32(1)
148 ; PPC64LE-NEXT:    bl __subdf3
149 ; PPC64LE-NEXT:    nop
150 ; PPC64LE-NEXT:    addi 1, 1, 48
151 ; PPC64LE-NEXT:    ld 0, 16(1)
152 ; PPC64LE-NEXT:    mtlr 0
153 ; PPC64LE-NEXT:    blr
154 entry:
155   %a = alloca double, align 8
156   %b = alloca double, align 8
157   %0 = load double, ptr %a, align 8
158   %1 = load double, ptr %b, align 8
159   %sub = fsub double %0, %1
160   ret double %sub
163 define double @foo3() #0 {
164 ; PPC-LABEL: foo3:
165 ; PPC:       # %bb.0: # %entry
166 ; PPC-NEXT:    mflr 0
167 ; PPC-NEXT:    stwu 1, -32(1)
168 ; PPC-NEXT:    stw 0, 36(1)
169 ; PPC-NEXT:    lwz 3, 24(1)
170 ; PPC-NEXT:    lwz 4, 28(1)
171 ; PPC-NEXT:    lwz 5, 16(1)
172 ; PPC-NEXT:    lwz 6, 20(1)
173 ; PPC-NEXT:    bl __divdf3
174 ; PPC-NEXT:    lwz 0, 36(1)
175 ; PPC-NEXT:    addi 1, 1, 32
176 ; PPC-NEXT:    mtlr 0
177 ; PPC-NEXT:    blr
179 ; PPC64-LABEL: foo3:
180 ; PPC64:       # %bb.0: # %entry
181 ; PPC64-NEXT:    mflr 0
182 ; PPC64-NEXT:    stdu 1, -128(1)
183 ; PPC64-NEXT:    std 0, 144(1)
184 ; PPC64-NEXT:    ld 3, 120(1)
185 ; PPC64-NEXT:    ld 4, 112(1)
186 ; PPC64-NEXT:    bl __divdf3
187 ; PPC64-NEXT:    nop
188 ; PPC64-NEXT:    addi 1, 1, 128
189 ; PPC64-NEXT:    ld 0, 16(1)
190 ; PPC64-NEXT:    mtlr 0
191 ; PPC64-NEXT:    blr
193 ; PPC64LE-LABEL: foo3:
194 ; PPC64LE:       # %bb.0: # %entry
195 ; PPC64LE-NEXT:    mflr 0
196 ; PPC64LE-NEXT:    stdu 1, -48(1)
197 ; PPC64LE-NEXT:    std 0, 64(1)
198 ; PPC64LE-NEXT:    ld 3, 40(1)
199 ; PPC64LE-NEXT:    ld 4, 32(1)
200 ; PPC64LE-NEXT:    bl __divdf3
201 ; PPC64LE-NEXT:    nop
202 ; PPC64LE-NEXT:    addi 1, 1, 48
203 ; PPC64LE-NEXT:    ld 0, 16(1)
204 ; PPC64LE-NEXT:    mtlr 0
205 ; PPC64LE-NEXT:    blr
206 entry:
207   %a = alloca double, align 8
208   %b = alloca double, align 8
209   %0 = load double, ptr %a, align 8
210   %1 = load double, ptr %b, align 8
211   %div = fdiv double %0, %1
212   ret double %div
215 ; Function Attrs: noinline nounwind optnone uwtable
216 define dso_local zeroext i32 @func(double noundef %0, double noundef %1) #0 {
217 ; PPC-LABEL: func:
218 ; PPC:       # %bb.0:
219 ; PPC-NEXT:    mflr 0
220 ; PPC-NEXT:    stwu 1, -32(1)
221 ; PPC-NEXT:    stw 0, 36(1)
222 ; PPC-NEXT:    # kill: def $r7 killed $r6
223 ; PPC-NEXT:    # kill: def $r7 killed $r5
224 ; PPC-NEXT:    # kill: def $r7 killed $r4
225 ; PPC-NEXT:    # kill: def $r7 killed $r3
226 ; PPC-NEXT:    stw 4, 28(1)
227 ; PPC-NEXT:    stw 3, 24(1)
228 ; PPC-NEXT:    stw 6, 20(1)
229 ; PPC-NEXT:    stw 5, 16(1)
230 ; PPC-NEXT:    lwz 3, 24(1)
231 ; PPC-NEXT:    stw 3, 8(1) # 4-byte Folded Spill
232 ; PPC-NEXT:    lwz 3, 28(1)
233 ; PPC-NEXT:    stw 3, 12(1) # 4-byte Folded Spill
234 ; PPC-NEXT:    lwz 3, 16(1)
235 ; PPC-NEXT:    lwz 4, 20(1)
236 ; PPC-NEXT:    lis 5, -15888
237 ; PPC-NEXT:    li 6, 0
238 ; PPC-NEXT:    bl __muldf3
239 ; PPC-NEXT:    mr 5, 3
240 ; PPC-NEXT:    lwz 3, 8(1) # 4-byte Folded Reload
241 ; PPC-NEXT:    mr 6, 4
242 ; PPC-NEXT:    lwz 4, 12(1) # 4-byte Folded Reload
243 ; PPC-NEXT:    bl __adddf3
244 ; PPC-NEXT:    bl __fixunsdfsi
245 ; PPC-NEXT:    lwz 0, 36(1)
246 ; PPC-NEXT:    addi 1, 1, 32
247 ; PPC-NEXT:    mtlr 0
248 ; PPC-NEXT:    blr
250 ; PPC64-LABEL: func:
251 ; PPC64:       # %bb.0:
252 ; PPC64-NEXT:    mflr 0
253 ; PPC64-NEXT:    stdu 1, -144(1)
254 ; PPC64-NEXT:    std 0, 160(1)
255 ; PPC64-NEXT:    std 3, 136(1)
256 ; PPC64-NEXT:    std 4, 128(1)
257 ; PPC64-NEXT:    ld 3, 136(1)
258 ; PPC64-NEXT:    std 3, 120(1) # 8-byte Folded Spill
259 ; PPC64-NEXT:    ld 3, 128(1)
260 ; PPC64-NEXT:    li 4, 3103
261 ; PPC64-NEXT:    rldic 4, 4, 52, 0
262 ; PPC64-NEXT:    bl __muldf3
263 ; PPC64-NEXT:    nop
264 ; PPC64-NEXT:    mr 4, 3
265 ; PPC64-NEXT:    ld 3, 120(1) # 8-byte Folded Reload
266 ; PPC64-NEXT:    bl __adddf3
267 ; PPC64-NEXT:    nop
268 ; PPC64-NEXT:    bl __fixunsdfsi
269 ; PPC64-NEXT:    nop
270 ; PPC64-NEXT:    # kill: def $r3 killed $r3 killed $x3
271 ; PPC64-NEXT:    clrldi 3, 3, 32
272 ; PPC64-NEXT:    addi 1, 1, 144
273 ; PPC64-NEXT:    ld 0, 16(1)
274 ; PPC64-NEXT:    mtlr 0
275 ; PPC64-NEXT:    blr
277 ; PPC64LE-LABEL: func:
278 ; PPC64LE:       # %bb.0:
279 ; PPC64LE-NEXT:    mflr 0
280 ; PPC64LE-NEXT:    stdu 1, -64(1)
281 ; PPC64LE-NEXT:    std 0, 80(1)
282 ; PPC64LE-NEXT:    std 3, 56(1)
283 ; PPC64LE-NEXT:    std 4, 48(1)
284 ; PPC64LE-NEXT:    ld 3, 56(1)
285 ; PPC64LE-NEXT:    std 3, 40(1) # 8-byte Folded Spill
286 ; PPC64LE-NEXT:    ld 3, 48(1)
287 ; PPC64LE-NEXT:    li 4, 3103
288 ; PPC64LE-NEXT:    rldic 4, 4, 52, 0
289 ; PPC64LE-NEXT:    bl __muldf3
290 ; PPC64LE-NEXT:    nop
291 ; PPC64LE-NEXT:    mr 4, 3
292 ; PPC64LE-NEXT:    ld 3, 40(1) # 8-byte Folded Reload
293 ; PPC64LE-NEXT:    bl __adddf3
294 ; PPC64LE-NEXT:    nop
295 ; PPC64LE-NEXT:    bl __fixunsdfsi
296 ; PPC64LE-NEXT:    nop
297 ; PPC64LE-NEXT:    # kill: def $r3 killed $r3 killed $x3
298 ; PPC64LE-NEXT:    clrldi 3, 3, 32
299 ; PPC64LE-NEXT:    addi 1, 1, 64
300 ; PPC64LE-NEXT:    ld 0, 16(1)
301 ; PPC64LE-NEXT:    mtlr 0
302 ; PPC64LE-NEXT:    blr
303   %3 = alloca double, align 8
304   %4 = alloca double, align 8
305   store double %0, ptr %3, align 8
306   store double %1, ptr %4, align 8
307   %5 = load double, ptr %3, align 8
308   %6 = load double, ptr %4, align 8
309   %7 = fneg double %6
310   %8 = call double @llvm.fmuladd.f64(double %7, double 0x41F0000000000000, double %5)
311   %9 = fptoui double %8 to i32
312   ret i32 %9
315 ; To check ppc_fp128 soften without crash
316 define zeroext i1 @ppcf128_soften(ppc_fp128 %a) #0 {
317 ; PPC-LABEL: ppcf128_soften:
318 ; PPC:       # %bb.0: # %entry
319 ; PPC-NEXT:    stwu 1, -16(1)
320 ; PPC-NEXT:    stw 5, 8(1) # 4-byte Folded Spill
321 ; PPC-NEXT:    mr 5, 4
322 ; PPC-NEXT:    lwz 4, 8(1) # 4-byte Folded Reload
323 ; PPC-NEXT:    stw 5, 12(1) # 4-byte Folded Spill
324 ; PPC-NEXT:    mr 5, 3
325 ; PPC-NEXT:    lwz 3, 12(1) # 4-byte Folded Reload
326 ; PPC-NEXT:    # kill: def $r4 killed $r3
327 ; PPC-NEXT:    # kill: def $r4 killed $r5
328 ; PPC-NEXT:    xoris 4, 5, 65520
329 ; PPC-NEXT:    or 4, 3, 4
330 ; PPC-NEXT:    cntlzw 4, 4
331 ; PPC-NEXT:    clrlwi 5, 5, 1
332 ; PPC-NEXT:    or 3, 3, 5
333 ; PPC-NEXT:    cntlzw 3, 3
334 ; PPC-NEXT:    or 3, 3, 4
335 ; PPC-NEXT:    srwi 3, 3, 5
336 ; PPC-NEXT:    addi 1, 1, 16
337 ; PPC-NEXT:    blr
339 ; PPC64-LABEL: ppcf128_soften:
340 ; PPC64:       # %bb.0: # %entry
341 ; PPC64-NEXT:    li 4, 4095
342 ; PPC64-NEXT:    rldic 4, 4, 52, 0
343 ; PPC64-NEXT:    cmpld 7, 3, 4
344 ; PPC64-NEXT:    mfcr 4 # cr7
345 ; PPC64-NEXT:    rlwinm 4, 4, 31, 31, 31
346 ; PPC64-NEXT:    clrldi 3, 3, 1
347 ; PPC64-NEXT:    cmpldi 7, 3, 0
348 ; PPC64-NEXT:    mfcr 3 # cr7
349 ; PPC64-NEXT:    rlwinm 3, 3, 31, 31, 31
350 ; PPC64-NEXT:    or 4, 3, 4
351 ; PPC64-NEXT:    # implicit-def: $x3
352 ; PPC64-NEXT:    mr 3, 4
353 ; PPC64-NEXT:    clrldi 3, 3, 32
354 ; PPC64-NEXT:    blr
356 ; PPC64LE-LABEL: ppcf128_soften:
357 ; PPC64LE:       # %bb.0: # %entry
358 ; PPC64LE-NEXT:    li 3, 4095
359 ; PPC64LE-NEXT:    rldic 3, 3, 52, 0
360 ; PPC64LE-NEXT:    cmpd 4, 3
361 ; PPC64LE-NEXT:    crmove 21, 2
362 ; PPC64LE-NEXT:    clrldi. 3, 4, 1
363 ; PPC64LE-NEXT:    crmove 20, 2
364 ; PPC64LE-NEXT:    cror 20, 20, 21
365 ; PPC64LE-NEXT:    li 4, 0
366 ; PPC64LE-NEXT:    li 3, 1
367 ; PPC64LE-NEXT:    isel 3, 3, 4, 20
368 ; PPC64LE-NEXT:    blr
369 entry:
370   %fpclass = tail call i1 @llvm.is.fpclass.ppcf128(ppc_fp128 %a, i32 100)
371   ret i1 %fpclass
374 ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
375 declare double @llvm.fmuladd.f64(double, double, double) #1
376 declare i1 @llvm.is.fpclass.ppcf128(ppc_fp128, i32 immarg) #1
378 attributes #0 = {"use-soft-float"="true" nounwind }
379 attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }