1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=ve | FileCheck %s
3
4;;; Check stack frame allocation especially about the new SP calculation
5;;; using multiple sizes as a test of emitSPAdjustment().
6
7; Function Attrs: norecurse nounwind readnone
8define signext i32 @test_frame0(i32 signext %0) {
9; CHECK-LABEL: test_frame0:
10; CHECK:       # %bb.0:
11; CHECK-NEXT:    adds.w.sx %s0, 3, %s0
12; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
13; CHECK-NEXT:    b.l.t (, %s10)
14  %2 = add nsw i32 %0, 3
15  ret i32 %2
16}
17
18; Function Attrs: nounwind
19define i8* @test_frame8(i8* %0) {
20; CHECK-LABEL: test_frame8:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    adds.l %s11, -16, %s11
23; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB1_2
24; CHECK-NEXT:  # %bb.1:
25; CHECK-NEXT:    ld %s61, 24(, %s14)
26; CHECK-NEXT:    or %s62, 0, %s0
27; CHECK-NEXT:    lea %s63, 315
28; CHECK-NEXT:    shm.l %s63, (%s61)
29; CHECK-NEXT:    shm.l %s8, 8(%s61)
30; CHECK-NEXT:    shm.l %s11, 16(%s61)
31; CHECK-NEXT:    monc
32; CHECK-NEXT:    or %s0, 0, %s62
33; CHECK-NEXT:  .LBB1_2:
34; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
35; CHECK-NEXT:    lea %s0, 8(, %s11)
36; CHECK-NEXT:    st1b %s1, 8(, %s11)
37; CHECK-NEXT:    adds.l %s11, 16, %s11
38; CHECK-NEXT:    b.l.t (, %s10)
39  %2 = alloca [8 x i8], align 1
40  %3 = getelementptr inbounds [8 x i8], [8 x i8]* %2, i64 0, i64 0
41  %4 = load i8, i8* %0, align 1
42  store i8 %4, i8* %3, align 1
43  ret i8* %3
44}
45
46; Function Attrs: nounwind
47define i8* @test_frame16(i8* %0) {
48; CHECK-LABEL: test_frame16:
49; CHECK:       # %bb.0:
50; CHECK-NEXT:    adds.l %s11, -16, %s11
51; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB2_2
52; CHECK-NEXT:  # %bb.1:
53; CHECK-NEXT:    ld %s61, 24(, %s14)
54; CHECK-NEXT:    or %s62, 0, %s0
55; CHECK-NEXT:    lea %s63, 315
56; CHECK-NEXT:    shm.l %s63, (%s61)
57; CHECK-NEXT:    shm.l %s8, 8(%s61)
58; CHECK-NEXT:    shm.l %s11, 16(%s61)
59; CHECK-NEXT:    monc
60; CHECK-NEXT:    or %s0, 0, %s62
61; CHECK-NEXT:  .LBB2_2:
62; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
63; CHECK-NEXT:    lea %s0, (, %s11)
64; CHECK-NEXT:    st1b %s1, (, %s11)
65; CHECK-NEXT:    adds.l %s11, 16, %s11
66; CHECK-NEXT:    b.l.t (, %s10)
67  %2 = alloca [16 x i8], align 1
68  %3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0
69  %4 = load i8, i8* %0, align 1
70  store i8 %4, i8* %3, align 1
71  ret i8* %3
72}
73
74; Function Attrs: nounwind
75define i8* @test_frame32(i8* %0) {
76; CHECK-LABEL: test_frame32:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    adds.l %s11, -32, %s11
79; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB3_2
80; CHECK-NEXT:  # %bb.1:
81; CHECK-NEXT:    ld %s61, 24(, %s14)
82; CHECK-NEXT:    or %s62, 0, %s0
83; CHECK-NEXT:    lea %s63, 315
84; CHECK-NEXT:    shm.l %s63, (%s61)
85; CHECK-NEXT:    shm.l %s8, 8(%s61)
86; CHECK-NEXT:    shm.l %s11, 16(%s61)
87; CHECK-NEXT:    monc
88; CHECK-NEXT:    or %s0, 0, %s62
89; CHECK-NEXT:  .LBB3_2:
90; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
91; CHECK-NEXT:    lea %s0, (, %s11)
92; CHECK-NEXT:    st1b %s1, (, %s11)
93; CHECK-NEXT:    adds.l %s11, 32, %s11
94; CHECK-NEXT:    b.l.t (, %s10)
95  %2 = alloca [32 x i8], align 1
96  %3 = getelementptr inbounds [32 x i8], [32 x i8]* %2, i64 0, i64 0
97  %4 = load i8, i8* %0, align 1
98  store i8 %4, i8* %3, align 1
99  ret i8* %3
100}
101
102; Function Attrs: nounwind
103define i8* @test_frame64(i8* %0) {
104; CHECK-LABEL: test_frame64:
105; CHECK:       # %bb.0:
106; CHECK-NEXT:    adds.l %s11, -64, %s11
107; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB4_2
108; CHECK-NEXT:  # %bb.1:
109; CHECK-NEXT:    ld %s61, 24(, %s14)
110; CHECK-NEXT:    or %s62, 0, %s0
111; CHECK-NEXT:    lea %s63, 315
112; CHECK-NEXT:    shm.l %s63, (%s61)
113; CHECK-NEXT:    shm.l %s8, 8(%s61)
114; CHECK-NEXT:    shm.l %s11, 16(%s61)
115; CHECK-NEXT:    monc
116; CHECK-NEXT:    or %s0, 0, %s62
117; CHECK-NEXT:  .LBB4_2:
118; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
119; CHECK-NEXT:    lea %s0, (, %s11)
120; CHECK-NEXT:    st1b %s1, (, %s11)
121; CHECK-NEXT:    lea %s11, 64(, %s11)
122; CHECK-NEXT:    b.l.t (, %s10)
123  %2 = alloca [64 x i8], align 1
124  %3 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i64 0, i64 0
125  %4 = load i8, i8* %0, align 1
126  store i8 %4, i8* %3, align 1
127  ret i8* %3
128}
129
130; Function Attrs: nounwind
131define i8* @test_frame128(i8* %0) {
132; CHECK-LABEL: test_frame128:
133; CHECK:       # %bb.0:
134; CHECK-NEXT:    lea %s11, -128(, %s11)
135; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB5_2
136; CHECK-NEXT:  # %bb.1:
137; CHECK-NEXT:    ld %s61, 24(, %s14)
138; CHECK-NEXT:    or %s62, 0, %s0
139; CHECK-NEXT:    lea %s63, 315
140; CHECK-NEXT:    shm.l %s63, (%s61)
141; CHECK-NEXT:    shm.l %s8, 8(%s61)
142; CHECK-NEXT:    shm.l %s11, 16(%s61)
143; CHECK-NEXT:    monc
144; CHECK-NEXT:    or %s0, 0, %s62
145; CHECK-NEXT:  .LBB5_2:
146; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
147; CHECK-NEXT:    lea %s0, (, %s11)
148; CHECK-NEXT:    st1b %s1, (, %s11)
149; CHECK-NEXT:    lea %s11, 128(, %s11)
150; CHECK-NEXT:    b.l.t (, %s10)
151  %2 = alloca [128 x i8], align 1
152  %3 = getelementptr inbounds [128 x i8], [128 x i8]* %2, i64 0, i64 0
153  %4 = load i8, i8* %0, align 1
154  store i8 %4, i8* %3, align 1
155  ret i8* %3
156}
157
158; Function Attrs: nounwind
159define i8* @test_frame65536(i8* %0) {
160; CHECK-LABEL: test_frame65536:
161; CHECK:       # %bb.0:
162; CHECK-NEXT:    lea %s11, -65536(, %s11)
163; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB6_2
164; CHECK-NEXT:  # %bb.1:
165; CHECK-NEXT:    ld %s61, 24(, %s14)
166; CHECK-NEXT:    or %s62, 0, %s0
167; CHECK-NEXT:    lea %s63, 315
168; CHECK-NEXT:    shm.l %s63, (%s61)
169; CHECK-NEXT:    shm.l %s8, 8(%s61)
170; CHECK-NEXT:    shm.l %s11, 16(%s61)
171; CHECK-NEXT:    monc
172; CHECK-NEXT:    or %s0, 0, %s62
173; CHECK-NEXT:  .LBB6_2:
174; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
175; CHECK-NEXT:    lea %s0, (, %s11)
176; CHECK-NEXT:    st1b %s1, (, %s11)
177; CHECK-NEXT:    lea %s11, 65536(, %s11)
178; CHECK-NEXT:    b.l.t (, %s10)
179  %2 = alloca [65536 x i8], align 1
180  %3 = getelementptr inbounds [65536 x i8], [65536 x i8]* %2, i64 0, i64 0
181  %4 = load i8, i8* %0, align 1
182  store i8 %4, i8* %3, align 1
183  ret i8* %3
184}
185
186; Function Attrs: nounwind
187define i8* @test_frame4294967296(i8* %0) {
188; CHECK-LABEL: test_frame4294967296:
189; CHECK:       # %bb.0:
190; CHECK-NEXT:    lea %s13, 0
191; CHECK-NEXT:    and %s13, %s13, (32)0
192; CHECK-NEXT:    lea.sl %s11, -1(%s13, %s11)
193; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB7_2
194; CHECK-NEXT:  # %bb.1:
195; CHECK-NEXT:    ld %s61, 24(, %s14)
196; CHECK-NEXT:    or %s62, 0, %s0
197; CHECK-NEXT:    lea %s63, 315
198; CHECK-NEXT:    shm.l %s63, (%s61)
199; CHECK-NEXT:    shm.l %s8, 8(%s61)
200; CHECK-NEXT:    shm.l %s11, 16(%s61)
201; CHECK-NEXT:    monc
202; CHECK-NEXT:    or %s0, 0, %s62
203; CHECK-NEXT:  .LBB7_2:
204; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
205; CHECK-NEXT:    lea %s0, (, %s11)
206; CHECK-NEXT:    st1b %s1, (, %s11)
207; CHECK-NEXT:    lea %s13, 0
208; CHECK-NEXT:    and %s13, %s13, (32)0
209; CHECK-NEXT:    lea.sl %s11, 1(%s13, %s11)
210; CHECK-NEXT:    b.l.t (, %s10)
211  %2 = alloca [4294967296 x i8], align 1
212  %3 = getelementptr inbounds [4294967296 x i8], [4294967296 x i8]* %2, i64 0, i64 0
213  %4 = load i8, i8* %0, align 1
214  store i8 %4, i8* %3, align 1
215  ret i8* %3
216}
217