1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=ve | FileCheck %s
4 ;;; Check stack frame allocation especially about the new SP calculation
5 ;;; using multiple sizes as a test of emitSPAdjustment().
7 ; Function Attrs: norecurse nounwind readnone
8 define signext i32 @test_frame0(i32 signext %0) {
9 ; CHECK-LABEL: test_frame0:
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
18 ; Function Attrs: nounwind
19 define ptr @test_frame8(ptr %0) {
20 ; CHECK-LABEL: test_frame8:
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)
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 = load i8, ptr %0, align 1
41 store i8 %3, ptr %2, align 1
45 ; Function Attrs: nounwind
46 define ptr @test_frame16(ptr %0) {
47 ; CHECK-LABEL: test_frame16:
49 ; CHECK-NEXT: adds.l %s11, -16, %s11
50 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB2_2
51 ; CHECK-NEXT: # %bb.1:
52 ; CHECK-NEXT: ld %s61, 24(, %s14)
53 ; CHECK-NEXT: or %s62, 0, %s0
54 ; CHECK-NEXT: lea %s63, 315
55 ; CHECK-NEXT: shm.l %s63, (%s61)
56 ; CHECK-NEXT: shm.l %s8, 8(%s61)
57 ; CHECK-NEXT: shm.l %s11, 16(%s61)
59 ; CHECK-NEXT: or %s0, 0, %s62
60 ; CHECK-NEXT: .LBB2_2:
61 ; CHECK-NEXT: ld1b.zx %s1, (, %s0)
62 ; CHECK-NEXT: lea %s0, (, %s11)
63 ; CHECK-NEXT: st1b %s1, (, %s11)
64 ; CHECK-NEXT: adds.l %s11, 16, %s11
65 ; CHECK-NEXT: b.l.t (, %s10)
66 %2 = alloca [16 x i8], align 1
67 %3 = load i8, ptr %0, align 1
68 store i8 %3, ptr %2, align 1
72 ; Function Attrs: nounwind
73 define ptr @test_frame32(ptr %0) {
74 ; CHECK-LABEL: test_frame32:
76 ; CHECK-NEXT: adds.l %s11, -32, %s11
77 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB3_2
78 ; CHECK-NEXT: # %bb.1:
79 ; CHECK-NEXT: ld %s61, 24(, %s14)
80 ; CHECK-NEXT: or %s62, 0, %s0
81 ; CHECK-NEXT: lea %s63, 315
82 ; CHECK-NEXT: shm.l %s63, (%s61)
83 ; CHECK-NEXT: shm.l %s8, 8(%s61)
84 ; CHECK-NEXT: shm.l %s11, 16(%s61)
86 ; CHECK-NEXT: or %s0, 0, %s62
87 ; CHECK-NEXT: .LBB3_2:
88 ; CHECK-NEXT: ld1b.zx %s1, (, %s0)
89 ; CHECK-NEXT: lea %s0, (, %s11)
90 ; CHECK-NEXT: st1b %s1, (, %s11)
91 ; CHECK-NEXT: adds.l %s11, 32, %s11
92 ; CHECK-NEXT: b.l.t (, %s10)
93 %2 = alloca [32 x i8], align 1
94 %3 = load i8, ptr %0, align 1
95 store i8 %3, ptr %2, align 1
99 ; Function Attrs: nounwind
100 define ptr @test_frame64(ptr %0) {
101 ; CHECK-LABEL: test_frame64:
103 ; CHECK-NEXT: adds.l %s11, -64, %s11
104 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB4_2
105 ; CHECK-NEXT: # %bb.1:
106 ; CHECK-NEXT: ld %s61, 24(, %s14)
107 ; CHECK-NEXT: or %s62, 0, %s0
108 ; CHECK-NEXT: lea %s63, 315
109 ; CHECK-NEXT: shm.l %s63, (%s61)
110 ; CHECK-NEXT: shm.l %s8, 8(%s61)
111 ; CHECK-NEXT: shm.l %s11, 16(%s61)
113 ; CHECK-NEXT: or %s0, 0, %s62
114 ; CHECK-NEXT: .LBB4_2:
115 ; CHECK-NEXT: ld1b.zx %s1, (, %s0)
116 ; CHECK-NEXT: lea %s0, (, %s11)
117 ; CHECK-NEXT: st1b %s1, (, %s11)
118 ; CHECK-NEXT: lea %s11, 64(, %s11)
119 ; CHECK-NEXT: b.l.t (, %s10)
120 %2 = alloca [64 x i8], align 1
121 %3 = load i8, ptr %0, align 1
122 store i8 %3, ptr %2, align 1
126 ; Function Attrs: nounwind
127 define ptr @test_frame128(ptr %0) {
128 ; CHECK-LABEL: test_frame128:
130 ; CHECK-NEXT: lea %s11, -128(, %s11)
131 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB5_2
132 ; CHECK-NEXT: # %bb.1:
133 ; CHECK-NEXT: ld %s61, 24(, %s14)
134 ; CHECK-NEXT: or %s62, 0, %s0
135 ; CHECK-NEXT: lea %s63, 315
136 ; CHECK-NEXT: shm.l %s63, (%s61)
137 ; CHECK-NEXT: shm.l %s8, 8(%s61)
138 ; CHECK-NEXT: shm.l %s11, 16(%s61)
140 ; CHECK-NEXT: or %s0, 0, %s62
141 ; CHECK-NEXT: .LBB5_2:
142 ; CHECK-NEXT: ld1b.zx %s1, (, %s0)
143 ; CHECK-NEXT: lea %s0, (, %s11)
144 ; CHECK-NEXT: st1b %s1, (, %s11)
145 ; CHECK-NEXT: lea %s11, 128(, %s11)
146 ; CHECK-NEXT: b.l.t (, %s10)
147 %2 = alloca [128 x i8], align 1
148 %3 = load i8, ptr %0, align 1
149 store i8 %3, ptr %2, align 1
153 ; Function Attrs: nounwind
154 define ptr @test_frame65536(ptr %0) {
155 ; CHECK-LABEL: test_frame65536:
157 ; CHECK-NEXT: lea %s11, -65536(, %s11)
158 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB6_2
159 ; CHECK-NEXT: # %bb.1:
160 ; CHECK-NEXT: ld %s61, 24(, %s14)
161 ; CHECK-NEXT: or %s62, 0, %s0
162 ; CHECK-NEXT: lea %s63, 315
163 ; CHECK-NEXT: shm.l %s63, (%s61)
164 ; CHECK-NEXT: shm.l %s8, 8(%s61)
165 ; CHECK-NEXT: shm.l %s11, 16(%s61)
167 ; CHECK-NEXT: or %s0, 0, %s62
168 ; CHECK-NEXT: .LBB6_2:
169 ; CHECK-NEXT: ld1b.zx %s1, (, %s0)
170 ; CHECK-NEXT: lea %s0, (, %s11)
171 ; CHECK-NEXT: st1b %s1, (, %s11)
172 ; CHECK-NEXT: lea %s11, 65536(, %s11)
173 ; CHECK-NEXT: b.l.t (, %s10)
174 %2 = alloca [65536 x i8], align 1
175 %3 = load i8, ptr %0, align 1
176 store i8 %3, ptr %2, align 1
180 ; Function Attrs: nounwind
181 define ptr @test_frame4294967296(ptr %0) {
182 ; CHECK-LABEL: test_frame4294967296:
184 ; CHECK-NEXT: lea %s13, 0
185 ; CHECK-NEXT: and %s13, %s13, (32)0
186 ; CHECK-NEXT: lea.sl %s11, -1(%s13, %s11)
187 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB7_2
188 ; CHECK-NEXT: # %bb.1:
189 ; CHECK-NEXT: ld %s61, 24(, %s14)
190 ; CHECK-NEXT: or %s62, 0, %s0
191 ; CHECK-NEXT: lea %s63, 315
192 ; CHECK-NEXT: shm.l %s63, (%s61)
193 ; CHECK-NEXT: shm.l %s8, 8(%s61)
194 ; CHECK-NEXT: shm.l %s11, 16(%s61)
196 ; CHECK-NEXT: or %s0, 0, %s62
197 ; CHECK-NEXT: .LBB7_2:
198 ; CHECK-NEXT: ld1b.zx %s1, (, %s0)
199 ; CHECK-NEXT: lea %s0, (, %s11)
200 ; CHECK-NEXT: st1b %s1, (, %s11)
201 ; CHECK-NEXT: lea %s13, 0
202 ; CHECK-NEXT: and %s13, %s13, (32)0
203 ; CHECK-NEXT: lea.sl %s11, 1(%s13, %s11)
204 ; CHECK-NEXT: b.l.t (, %s10)
205 %2 = alloca [4294967296 x i8], align 1
206 %3 = load i8, ptr %0, align 1
207 store i8 %3, ptr %2, align 1