xref: /llvm-project/llvm/test/CodeGen/PowerPC/ppcsoftops.ll (revision a51712751c184ebe056718c938d2526693a31564)
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
5
6; Testing operations in soft-float mode
7define 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
22;
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
36;
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
50entry:
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
57}
58
59define 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
74;
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
88;
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
102entry:
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
109}
110
111define 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
126;
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
140;
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
154entry:
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
161}
162
163define 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
178;
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
192;
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
206entry:
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
213}
214
215; Function Attrs: noinline nounwind optnone uwtable
216define 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
249;
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
276;
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
313}
314
315; To check ppc_fp128 soften without crash
316define 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
338;
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
355;
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
369entry:
370  %fpclass = tail call i1 @llvm.is.fpclass.ppcf128(ppc_fp128 %a, i32 100)
371  ret i1 %fpclass
372}
373
374; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
375declare double @llvm.fmuladd.f64(double, double, double) #1
376declare i1 @llvm.is.fpclass.ppcf128(ppc_fp128, i32 immarg) #1
377
378attributes #0 = {"use-soft-float"="true" nounwind }
379attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
380