xref: /llvm-project/llvm/test/CodeGen/PowerPC/ctrloop-sh.ll (revision 3e0a76b1fd10d2f5f36d34a91b525c1d29685185)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s | FileCheck %s
3target datalayout = "E-m:e-p:32:32-i128:64-n32"
4target triple = "powerpc-ellcc-linux"
5
6; Function Attrs: nounwind
7define void @foo1(ptr %a, ptr readonly %b, ptr readonly %c) #0 {
8; CHECK-LABEL: foo1:
9; CHECK:       # %bb.0: # %entry
10; CHECK-NEXT:    stwu 1, -64(1)
11; CHECK-NEXT:    stw 29, 52(1) # 4-byte Folded Spill
12; CHECK-NEXT:    li 7, 2048
13; CHECK-NEXT:    stw 30, 56(1) # 4-byte Folded Spill
14; CHECK-NEXT:    li 6, 0
15; CHECK-NEXT:    mtctr 7
16; CHECK-NEXT:    addi 7, 1, 16
17; CHECK-NEXT:  .LBB0_1: # %for.body
18; CHECK-NEXT:    #
19; CHECK-NEXT:    lwz 8, 0(4)
20; CHECK-NEXT:    lwz 9, 4(4)
21; CHECK-NEXT:    lwz 10, 8(4)
22; CHECK-NEXT:    lwz 11, 12(4)
23; CHECK-NEXT:    lwz 12, 12(5)
24; CHECK-NEXT:    stw 6, 44(1)
25; CHECK-NEXT:    stw 6, 40(1)
26; CHECK-NEXT:    stw 6, 36(1)
27; CHECK-NEXT:    stw 6, 32(1)
28; CHECK-NEXT:    stw 11, 28(1)
29; CHECK-NEXT:    stw 10, 24(1)
30; CHECK-NEXT:    clrlwi 10, 12, 27
31; CHECK-NEXT:    stw 9, 20(1)
32; CHECK-NEXT:    stw 8, 16(1)
33; CHECK-NEXT:    rlwinm 8, 12, 29, 28, 29
34; CHECK-NEXT:    lwzux 9, 8, 7
35; CHECK-NEXT:    subfic 12, 10, 32
36; CHECK-NEXT:    lwz 11, 8(8)
37; CHECK-NEXT:    slw 9, 9, 10
38; CHECK-NEXT:    lwz 0, 4(8)
39; CHECK-NEXT:    lwz 8, 12(8)
40; CHECK-NEXT:    srw 30, 11, 12
41; CHECK-NEXT:    slw 29, 0, 10
42; CHECK-NEXT:    srw 0, 0, 12
43; CHECK-NEXT:    srw 12, 8, 12
44; CHECK-NEXT:    slw 11, 11, 10
45; CHECK-NEXT:    slw 8, 8, 10
46; CHECK-NEXT:    stw 8, 12(3)
47; CHECK-NEXT:    or 8, 11, 12
48; CHECK-NEXT:    stw 8, 8(3)
49; CHECK-NEXT:    or 8, 9, 0
50; CHECK-NEXT:    stw 8, 0(3)
51; CHECK-NEXT:    or 8, 29, 30
52; CHECK-NEXT:    stw 8, 4(3)
53; CHECK-NEXT:    bdnz .LBB0_1
54; CHECK-NEXT:  # %bb.2: # %for.end
55; CHECK-NEXT:    lwz 30, 56(1) # 4-byte Folded Reload
56; CHECK-NEXT:    lwz 29, 52(1) # 4-byte Folded Reload
57; CHECK-NEXT:    addi 1, 1, 64
58; CHECK-NEXT:    blr
59entry:
60  br label %for.body
61
62for.body:                                         ; preds = %for.body, %entry
63  %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
64  %0 = load i128, ptr %b, align 16
65  %1 = load i128, ptr %c, align 16
66  %shl = shl i128 %0, %1
67  store i128 %shl, ptr %a, align 16
68  %inc = add nsw i32 %i.02, 1
69  %exitcond = icmp eq i32 %inc, 2048
70  br i1 %exitcond, label %for.end, label %for.body
71
72for.end:                                          ; preds = %for.body
73  ret void
74}
75
76; Function Attrs: nounwind
77define void @foo2(ptr %a, ptr readonly %b, ptr readonly %c) #0 {
78; CHECK-LABEL: foo2:
79; CHECK:       # %bb.0: # %entry
80; CHECK-NEXT:    stwu 1, -48(1)
81; CHECK-NEXT:    stw 30, 40(1) # 4-byte Folded Spill
82; CHECK-NEXT:    li 6, 2048
83; CHECK-NEXT:    mtctr 6
84; CHECK-NEXT:    addi 6, 1, 24
85; CHECK-NEXT:  .LBB1_1: # %for.body
86; CHECK-NEXT:    #
87; CHECK-NEXT:    lwz 7, 0(4)
88; CHECK-NEXT:    lwz 8, 4(4)
89; CHECK-NEXT:    lwz 11, 12(5)
90; CHECK-NEXT:    lwz 9, 8(4)
91; CHECK-NEXT:    lwz 10, 12(4)
92; CHECK-NEXT:    stw 8, 28(1)
93; CHECK-NEXT:    rlwinm 8, 11, 29, 28, 29
94; CHECK-NEXT:    stw 7, 24(1)
95; CHECK-NEXT:    srawi 7, 7, 31
96; CHECK-NEXT:    stw 10, 36(1)
97; CHECK-NEXT:    clrlwi 10, 11, 27
98; CHECK-NEXT:    stw 9, 32(1)
99; CHECK-NEXT:    subfic 12, 10, 32
100; CHECK-NEXT:    stw 7, 20(1)
101; CHECK-NEXT:    stw 7, 16(1)
102; CHECK-NEXT:    stw 7, 12(1)
103; CHECK-NEXT:    stw 7, 8(1)
104; CHECK-NEXT:    sub 7, 6, 8
105; CHECK-NEXT:    lwz 8, 4(7)
106; CHECK-NEXT:    lwz 9, 0(7)
107; CHECK-NEXT:    lwz 11, 12(7)
108; CHECK-NEXT:    srw 0, 8, 10
109; CHECK-NEXT:    lwz 7, 8(7)
110; CHECK-NEXT:    slw 30, 9, 12
111; CHECK-NEXT:    slw 8, 8, 12
112; CHECK-NEXT:    srw 11, 11, 10
113; CHECK-NEXT:    slw 12, 7, 12
114; CHECK-NEXT:    srw 7, 7, 10
115; CHECK-NEXT:    or 7, 8, 7
116; CHECK-NEXT:    stw 7, 8(3)
117; CHECK-NEXT:    or 7, 12, 11
118; CHECK-NEXT:    sraw 9, 9, 10
119; CHECK-NEXT:    stw 7, 12(3)
120; CHECK-NEXT:    or 7, 30, 0
121; CHECK-NEXT:    stw 9, 0(3)
122; CHECK-NEXT:    stw 7, 4(3)
123; CHECK-NEXT:    bdnz .LBB1_1
124; CHECK-NEXT:  # %bb.2: # %for.end
125; CHECK-NEXT:    lwz 30, 40(1) # 4-byte Folded Reload
126; CHECK-NEXT:    addi 1, 1, 48
127; CHECK-NEXT:    blr
128entry:
129  br label %for.body
130
131for.body:                                         ; preds = %for.body, %entry
132  %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
133  %0 = load i128, ptr %b, align 16
134  %1 = load i128, ptr %c, align 16
135  %shl = ashr i128 %0, %1
136  store i128 %shl, ptr %a, align 16
137  %inc = add nsw i32 %i.02, 1
138  %exitcond = icmp eq i32 %inc, 2048
139  br i1 %exitcond, label %for.end, label %for.body
140
141for.end:                                          ; preds = %for.body
142  ret void
143}
144
145; Function Attrs: nounwind
146define void @foo3(ptr %a, ptr readonly %b, ptr readonly %c) #0 {
147; CHECK-LABEL: foo3:
148; CHECK:       # %bb.0: # %entry
149; CHECK-NEXT:    stwu 1, -64(1)
150; CHECK-NEXT:    stw 29, 52(1) # 4-byte Folded Spill
151; CHECK-NEXT:    li 7, 2048
152; CHECK-NEXT:    stw 30, 56(1) # 4-byte Folded Spill
153; CHECK-NEXT:    li 6, 0
154; CHECK-NEXT:    mtctr 7
155; CHECK-NEXT:    addi 7, 1, 32
156; CHECK-NEXT:  .LBB2_1: # %for.body
157; CHECK-NEXT:    #
158; CHECK-NEXT:    lwz 8, 0(4)
159; CHECK-NEXT:    lwz 12, 12(5)
160; CHECK-NEXT:    lwz 9, 4(4)
161; CHECK-NEXT:    lwz 10, 8(4)
162; CHECK-NEXT:    lwz 11, 12(4)
163; CHECK-NEXT:    stw 8, 32(1)
164; CHECK-NEXT:    rlwinm 8, 12, 29, 28, 29
165; CHECK-NEXT:    stw 6, 28(1)
166; CHECK-NEXT:    sub 8, 7, 8
167; CHECK-NEXT:    stw 6, 24(1)
168; CHECK-NEXT:    stw 6, 20(1)
169; CHECK-NEXT:    stw 6, 16(1)
170; CHECK-NEXT:    stw 11, 44(1)
171; CHECK-NEXT:    clrlwi 11, 12, 27
172; CHECK-NEXT:    stw 10, 40(1)
173; CHECK-NEXT:    subfic 0, 11, 32
174; CHECK-NEXT:    stw 9, 36(1)
175; CHECK-NEXT:    lwz 9, 4(8)
176; CHECK-NEXT:    lwz 10, 0(8)
177; CHECK-NEXT:    lwz 12, 12(8)
178; CHECK-NEXT:    srw 30, 9, 11
179; CHECK-NEXT:    lwz 8, 8(8)
180; CHECK-NEXT:    slw 29, 10, 0
181; CHECK-NEXT:    slw 9, 9, 0
182; CHECK-NEXT:    srw 12, 12, 11
183; CHECK-NEXT:    slw 0, 8, 0
184; CHECK-NEXT:    srw 8, 8, 11
185; CHECK-NEXT:    or 8, 9, 8
186; CHECK-NEXT:    stw 8, 8(3)
187; CHECK-NEXT:    or 8, 0, 12
188; CHECK-NEXT:    srw 10, 10, 11
189; CHECK-NEXT:    stw 8, 12(3)
190; CHECK-NEXT:    or 8, 29, 30
191; CHECK-NEXT:    stw 10, 0(3)
192; CHECK-NEXT:    stw 8, 4(3)
193; CHECK-NEXT:    bdnz .LBB2_1
194; CHECK-NEXT:  # %bb.2: # %for.end
195; CHECK-NEXT:    lwz 30, 56(1) # 4-byte Folded Reload
196; CHECK-NEXT:    lwz 29, 52(1) # 4-byte Folded Reload
197; CHECK-NEXT:    addi 1, 1, 64
198; CHECK-NEXT:    blr
199entry:
200  br label %for.body
201
202for.body:                                         ; preds = %for.body, %entry
203  %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
204  %0 = load i128, ptr %b, align 16
205  %1 = load i128, ptr %c, align 16
206  %shl = lshr i128 %0, %1
207  store i128 %shl, ptr %a, align 16
208  %inc = add nsw i32 %i.02, 1
209  %exitcond = icmp eq i32 %inc, 2048
210  br i1 %exitcond, label %for.end, label %for.body
211
212for.end:                                          ; preds = %for.body
213  ret void
214}
215
216attributes #0 = { nounwind }
217
218