1; RUN: llc < %s -mtriple aarch64--none-eabi -mcpu=cortex-a57 -verify-machineinstrs -enable-narrow-ld-merge=true | FileCheck %s --check-prefix=CHECK --check-prefix=LE
2; RUN: llc < %s -mtriple aarch64_be--none-eabi -mcpu=cortex-a57 -verify-machineinstrs -enable-narrow-ld-merge=true | FileCheck %s --check-prefix=CHECK --check-prefix=BE
3; RUN: llc < %s -mtriple aarch64--none-eabi -mcpu=kryo -verify-machineinstrs -enable-narrow-ld-merge=true | FileCheck %s --check-prefix=CHECK --check-prefix=LE
4
5; CHECK-LABEL: Ldrh_merge
6; CHECK-NOT: ldrh
7; CHECK: ldr [[NEW_DEST:w[0-9]+]]
8; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
9; CHECK-DAG: lsr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
10; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
11; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
12define i16 @Ldrh_merge(i16* nocapture readonly %p) {
13  %1 = load i16, i16* %p, align 2
14  %arrayidx2 = getelementptr inbounds i16, i16* %p, i64 1
15  %2 = load i16, i16* %arrayidx2, align 2
16  %add = sub nuw nsw i16 %1, %2
17  ret i16 %add
18}
19
20; CHECK-LABEL: Ldurh_merge
21; CHECK-NOT: ldurh
22; CHECK: ldur [[NEW_DEST:w[0-9]+]]
23; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
24; CHECK-DAG: lsr  [[HI_PART:w[0-9]+]], [[NEW_DEST]]
25; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
26; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
27define i16 @Ldurh_merge(i16* nocapture readonly %p)  {
28entry:
29  %arrayidx = getelementptr inbounds i16, i16* %p, i64 -2
30  %0 = load i16, i16* %arrayidx
31  %arrayidx3 = getelementptr inbounds i16, i16* %p, i64 -1
32  %1 = load i16, i16* %arrayidx3
33  %add = sub nuw nsw i16 %0, %1
34  ret i16 %add
35}
36
37; CHECK-LABEL: Ldrh_4_merge
38; CHECK-NOT: ldrh
39; CHECK: ldp [[WORD1:w[0-9]+]], [[WORD2:w[0-9]+]], [x0]
40; CHECK-DAG: and [[WORD1LO:w[0-9]+]], [[WORD1]], #0xffff
41; CHECK-DAG: lsr [[WORD1HI:w[0-9]+]], [[WORD1]], #16
42; CHECK-DAG: and [[WORD2LO:w[0-9]+]], [[WORD2]], #0xffff
43; CHECK-DAG: lsr [[WORD2HI:w[0-9]+]], [[WORD2]], #16
44; LE-DAG: sub [[TEMP1:w[0-9]+]], [[WORD1HI]], [[WORD1LO]]
45; BE-DAG: sub [[TEMP1:w[0-9]+]], [[WORD1LO]], [[WORD1HI]]
46; LE: udiv [[TEMP2:w[0-9]+]], [[TEMP1]], [[WORD2LO]]
47; BE: udiv [[TEMP2:w[0-9]+]], [[TEMP1]], [[WORD2HI]]
48; LE: sub w0, [[TEMP2]], [[WORD2HI]]
49; BE: sub w0, [[TEMP2]], [[WORD2LO]]
50define i16 @Ldrh_4_merge(i16* nocapture readonly %P) {
51  %arrayidx = getelementptr inbounds i16, i16* %P, i64 0
52  %l0 = load i16, i16* %arrayidx
53  %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 1
54  %l1 = load i16, i16* %arrayidx2
55  %arrayidx7 = getelementptr inbounds i16, i16* %P, i64 2
56  %l2 = load i16, i16* %arrayidx7
57  %arrayidx12 = getelementptr inbounds i16, i16* %P, i64 3
58  %l3 = load i16, i16* %arrayidx12
59  %add4 = sub nuw nsw i16 %l1, %l0
60  %add9 = udiv i16 %add4, %l2
61  %add14 = sub nuw nsw i16 %add9, %l3
62  ret i16 %add14
63}
64
65; CHECK-LABEL: Ldrsh_merge
66; CHECK: ldr [[NEW_DEST:w[0-9]+]]
67; CHECK-DAG: asr [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
68; CHECK-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
69; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
70; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
71
72define i32 @Ldrsh_merge(i16* %p) nounwind {
73  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 4
74  %tmp = load i16, i16* %add.ptr0
75  %add.ptr = getelementptr inbounds i16, i16* %p, i64 5
76  %tmp1 = load i16, i16* %add.ptr
77  %sexttmp = sext i16 %tmp to i32
78  %sexttmp1 = sext i16 %tmp1 to i32
79  %add = sub nsw i32 %sexttmp1, %sexttmp
80  ret i32 %add
81}
82
83; CHECK-LABEL: Ldrsh_zsext_merge
84; CHECK: ldr [[NEW_DEST:w[0-9]+]]
85; LE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
86; LE-DAG: asr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
87; BE-DAG: sxth [[LO_PART:w[0-9]+]], [[NEW_DEST]]
88; BE-DAG: lsr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
89; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
90; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
91define i32 @Ldrsh_zsext_merge(i16* %p) nounwind {
92  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 4
93  %tmp = load i16, i16* %add.ptr0
94  %add.ptr = getelementptr inbounds i16, i16* %p, i64 5
95  %tmp1 = load i16, i16* %add.ptr
96  %sexttmp = zext i16 %tmp to i32
97  %sexttmp1 = sext i16 %tmp1 to i32
98  %add = sub nsw i32 %sexttmp, %sexttmp1
99  ret i32 %add
100}
101
102; CHECK-LABEL: Ldrsh_szext_merge
103; CHECK: ldr [[NEW_DEST:w[0-9]+]]
104; LE-DAG: sxth [[LO_PART:w[0-9]+]], [[NEW_DEST]]
105; LE-DAG: lsr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
106; BE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
107; BE-DAG: asr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
108; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
109; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
110define i32 @Ldrsh_szext_merge(i16* %p) nounwind {
111  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 4
112  %tmp = load i16, i16* %add.ptr0
113  %add.ptr = getelementptr inbounds i16, i16* %p, i64 5
114  %tmp1 = load i16, i16* %add.ptr
115  %sexttmp = sext i16 %tmp to i32
116  %sexttmp1 = zext i16 %tmp1 to i32
117  %add = sub nsw i32 %sexttmp, %sexttmp1
118  ret i32 %add
119}
120
121; CHECK-LABEL: Ldrb_merge
122; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
123; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xff
124; CHECK-DAG: ubfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
125; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
126; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
127define i32 @Ldrb_merge(i8* %p) nounwind {
128  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
129  %tmp = load i8, i8* %add.ptr0
130  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
131  %tmp1 = load i8, i8* %add.ptr
132  %sexttmp = zext i8 %tmp to i32
133  %sexttmp1 = zext i8 %tmp1 to i32
134  %add = sub nsw i32 %sexttmp, %sexttmp1
135  ret i32 %add
136}
137
138; CHECK-LABEL: Ldrsb_merge
139; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
140; CHECK-DAG: sxtb [[LO_PART:w[0-9]+]], [[NEW_DEST]]
141; CHECK-DAG: sbfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
142; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
143; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
144define i32 @Ldrsb_merge(i8* %p) nounwind {
145  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
146  %tmp = load i8, i8* %add.ptr0
147  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
148  %tmp1 = load i8, i8* %add.ptr
149  %sexttmp = sext i8 %tmp to i32
150  %sexttmp1 = sext i8 %tmp1 to i32
151  %add = sub nsw i32 %sexttmp, %sexttmp1
152  ret i32 %add
153}
154
155; CHECK-LABEL: Ldrsb_zsext_merge
156; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
157; LE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xff
158; LE-DAG: sbfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
159; BE-DAG: sxtb [[LO_PART:w[0-9]+]], [[NEW_DEST]]
160; BE-DAG: ubfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
161; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
162; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
163define i32 @Ldrsb_zsext_merge(i8* %p) nounwind {
164  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
165  %tmp = load i8, i8* %add.ptr0
166  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
167  %tmp1 = load i8, i8* %add.ptr
168  %sexttmp = zext i8 %tmp to i32
169  %sexttmp1 = sext i8 %tmp1 to i32
170  %add = sub nsw i32 %sexttmp, %sexttmp1
171  ret i32 %add
172}
173
174; CHECK-LABEL: Ldrsb_szext_merge
175; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
176; LE-DAG: sxtb [[LO_PART:w[0-9]+]], [[NEW_DEST]]
177; LE-DAG: ubfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
178; BE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xff
179; BE-DAG: sbfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
180; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
181; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
182define i32 @Ldrsb_szext_merge(i8* %p) nounwind {
183  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
184  %tmp = load i8, i8* %add.ptr0
185  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
186  %tmp1 = load i8, i8* %add.ptr
187  %sexttmp = sext i8 %tmp to i32
188  %sexttmp1 = zext i8 %tmp1 to i32
189  %add = sub nsw i32 %sexttmp, %sexttmp1
190  ret i32 %add
191}
192
193; CHECK-LABEL: Ldursh_merge
194; CHECK: ldur [[NEW_DEST:w[0-9]+]]
195; CHECK-DAG: asr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
196; CHECK-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
197; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
198; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
199define i32 @Ldursh_merge(i16* %p) nounwind {
200  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 -1
201  %tmp = load i16, i16* %add.ptr0
202  %add.ptr = getelementptr inbounds i16, i16* %p, i64 -2
203  %tmp1 = load i16, i16* %add.ptr
204  %sexttmp = sext i16 %tmp to i32
205  %sexttmp1 = sext i16 %tmp1 to i32
206  %add = sub nsw i32 %sexttmp, %sexttmp1
207  ret i32 %add
208}
209
210; CHECK-LABEL: Ldursh_zsext_merge
211; CHECK: ldur [[NEW_DEST:w[0-9]+]]
212; LE-DAG: lsr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
213; LE-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
214; BE-DAG: asr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
215; BE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
216; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
217; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
218define i32 @Ldursh_zsext_merge(i16* %p) nounwind {
219  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 -1
220  %tmp = load i16, i16* %add.ptr0
221  %add.ptr = getelementptr inbounds i16, i16* %p, i64 -2
222  %tmp1 = load i16, i16* %add.ptr
223  %sexttmp = zext i16 %tmp to i32
224  %sexttmp1 = sext i16 %tmp1 to i32
225  %add = sub nsw i32 %sexttmp, %sexttmp1
226  ret i32 %add
227}
228
229; CHECK-LABEL: Ldursh_szext_merge
230; CHECK: ldur [[NEW_DEST:w[0-9]+]]
231; LE-DAG: asr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
232; LE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
233; BE-DAG: lsr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
234; BE-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
235; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
236; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
237define i32 @Ldursh_szext_merge(i16* %p) nounwind {
238  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 -1
239  %tmp = load i16, i16* %add.ptr0
240  %add.ptr = getelementptr inbounds i16, i16* %p, i64 -2
241  %tmp1 = load i16, i16* %add.ptr
242  %sexttmp = sext i16 %tmp to i32
243  %sexttmp1 = zext i16 %tmp1 to i32
244  %add = sub nsw i32 %sexttmp, %sexttmp1
245  ret i32 %add
246}
247
248; CHECK-LABEL: Ldurb_merge
249; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
250; CHECK-DAG: ubfx  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
251; CHECK-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xff
252; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
253; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
254define i32 @Ldurb_merge(i8* %p) nounwind {
255  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
256  %tmp = load i8, i8* %add.ptr0
257  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
258  %tmp1 = load i8, i8* %add.ptr
259  %sexttmp = zext i8 %tmp to i32
260  %sexttmp1 = zext i8 %tmp1 to i32
261  %add = sub nsw i32 %sexttmp, %sexttmp1
262  ret i32 %add
263}
264
265; CHECK-LABEL: Ldursb_merge
266; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
267; CHECK-DAG: sbfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
268; CHECK-DAG: sxtb [[HI_PART:w[0-9]+]], [[NEW_DEST]]
269; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
270; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
271define i32 @Ldursb_merge(i8* %p) nounwind {
272  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
273  %tmp = load i8, i8* %add.ptr0
274  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
275  %tmp1 = load i8, i8* %add.ptr
276  %sexttmp = sext i8 %tmp to i32
277  %sexttmp1 = sext i8 %tmp1 to i32
278  %add = sub nsw i32 %sexttmp, %sexttmp1
279  ret i32 %add
280}
281
282; CHECK-LABEL: Ldursb_zsext_merge
283; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
284; LE-DAG: ubfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
285; LE-DAG: sxtb [[HI_PART:w[0-9]+]], [[NEW_DEST]]
286; BE-DAG: sbfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
287; BE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xff
288; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
289; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
290define i32 @Ldursb_zsext_merge(i8* %p) nounwind {
291  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
292  %tmp = load i8, i8* %add.ptr0
293  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
294  %tmp1 = load i8, i8* %add.ptr
295  %sexttmp = zext i8 %tmp to i32
296  %sexttmp1 = sext i8 %tmp1 to i32
297  %add = sub nsw i32 %sexttmp, %sexttmp1
298  ret i32 %add
299}
300
301; CHECK-LABEL: Ldursb_szext_merge
302; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
303; LE-DAG: sbfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
304; LE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xff
305; BE-DAG: ubfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
306; BE-DAG: sxtb [[HI_PART:w[0-9]+]], [[NEW_DEST]]
307; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
308; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
309define i32 @Ldursb_szext_merge(i8* %p) nounwind {
310  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
311  %tmp = load i8, i8* %add.ptr0
312  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
313  %tmp1 = load i8, i8* %add.ptr
314  %sexttmp = sext i8 %tmp to i32
315  %sexttmp1 = zext i8 %tmp1 to i32
316  %add = sub nsw i32 %sexttmp, %sexttmp1
317  ret i32 %add
318}
319
320; CHECK-LABEL: Strh_zero
321; CHECK: str wzr
322define void @Strh_zero(i16* nocapture %P, i32 %n) {
323entry:
324 %idxprom = sext i32 %n to i64
325  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
326 store i16 0, i16* %arrayidx
327  %add = add nsw i32 %n, 1
328  %idxprom1 = sext i32 %add to i64
329  %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 %idxprom1
330  store i16 0, i16* %arrayidx2
331  ret void
332}
333
334; CHECK-LABEL: Strh_zero_4
335; CHECK: stp wzr, wzr
336define void @Strh_zero_4(i16* nocapture %P, i32 %n) {
337entry:
338  %idxprom = sext i32 %n to i64
339  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
340  store i16 0, i16* %arrayidx
341  %add = add nsw i32 %n, 1
342  %idxprom1 = sext i32 %add to i64
343  %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 %idxprom1
344  store i16 0, i16* %arrayidx2
345  %add3 = add nsw i32 %n, 2
346  %idxprom4 = sext i32 %add3 to i64
347  %arrayidx5 = getelementptr inbounds i16, i16* %P, i64 %idxprom4
348  store i16 0, i16* %arrayidx5
349  %add6 = add nsw i32 %n, 3
350  %idxprom7 = sext i32 %add6 to i64
351  %arrayidx8 = getelementptr inbounds i16, i16* %P, i64 %idxprom7
352  store i16 0, i16* %arrayidx8
353  ret void
354}
355
356; CHECK-LABEL: Strw_zero
357; CHECK: str xzr
358define void @Strw_zero(i32* nocapture %P, i32 %n) {
359entry:
360  %idxprom = sext i32 %n to i64
361  %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom
362  store i32 0, i32* %arrayidx
363  %add = add nsw i32 %n, 1
364  %idxprom1 = sext i32 %add to i64
365  %arrayidx2 = getelementptr inbounds i32, i32* %P, i64 %idxprom1
366  store i32 0, i32* %arrayidx2
367  ret void
368}
369
370; CHECK-LABEL: Strw_zero_nonzero
371; CHECK: stp wzr, w1
372define void @Strw_zero_nonzero(i32* nocapture %P, i32 %n)  {
373entry:
374  %idxprom = sext i32 %n to i64
375  %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom
376  store i32 0, i32* %arrayidx
377  %add = add nsw i32 %n, 1
378  %idxprom1 = sext i32 %add to i64
379  %arrayidx2 = getelementptr inbounds i32, i32* %P, i64 %idxprom1
380  store i32 %n, i32* %arrayidx2
381  ret void
382}
383
384; CHECK-LABEL: Strw_zero_4
385; CHECK: stp xzr
386define void @Strw_zero_4(i32* nocapture %P, i32 %n) {
387entry:
388  %idxprom = sext i32 %n to i64
389  %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom
390  store i32 0, i32* %arrayidx
391  %add = add nsw i32 %n, 1
392  %idxprom1 = sext i32 %add to i64
393  %arrayidx2 = getelementptr inbounds i32, i32* %P, i64 %idxprom1
394  store i32 0, i32* %arrayidx2
395  %add3 = add nsw i32 %n, 2
396  %idxprom4 = sext i32 %add3 to i64
397  %arrayidx5 = getelementptr inbounds i32, i32* %P, i64 %idxprom4
398  store i32 0, i32* %arrayidx5
399  %add6 = add nsw i32 %n, 3
400  %idxprom7 = sext i32 %add6 to i64
401  %arrayidx8 = getelementptr inbounds i32, i32* %P, i64 %idxprom7
402  store i32 0, i32* %arrayidx8
403  ret void
404}
405
406; CHECK-LABEL: Sturb_zero
407; CHECK: sturh wzr
408define void @Sturb_zero(i8* nocapture %P, i32 %n) #0 {
409entry:
410  %sub = add nsw i32 %n, -2
411  %idxprom = sext i32 %sub to i64
412  %arrayidx = getelementptr inbounds i8, i8* %P, i64 %idxprom
413  store i8 0, i8* %arrayidx
414  %sub2= add nsw i32 %n, -1
415  %idxprom1 = sext i32 %sub2 to i64
416  %arrayidx2 = getelementptr inbounds i8, i8* %P, i64 %idxprom1
417  store i8 0, i8* %arrayidx2
418  ret void
419}
420
421; CHECK-LABEL: Sturh_zero
422; CHECK: stur wzr
423define void @Sturh_zero(i16* nocapture %P, i32 %n) {
424entry:
425  %sub = add nsw i32 %n, -2
426  %idxprom = sext i32 %sub to i64
427  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
428  store i16 0, i16* %arrayidx
429  %sub1 = add nsw i32 %n, -3
430  %idxprom2 = sext i32 %sub1 to i64
431  %arrayidx3 = getelementptr inbounds i16, i16* %P, i64 %idxprom2
432  store i16 0, i16* %arrayidx3
433  ret void
434}
435
436; CHECK-LABEL: Sturh_zero_4
437; CHECK: stp wzr, wzr
438define void @Sturh_zero_4(i16* nocapture %P, i32 %n) {
439entry:
440  %sub = add nsw i32 %n, -3
441  %idxprom = sext i32 %sub to i64
442  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
443  store i16 0, i16* %arrayidx
444  %sub1 = add nsw i32 %n, -4
445  %idxprom2 = sext i32 %sub1 to i64
446  %arrayidx3 = getelementptr inbounds i16, i16* %P, i64 %idxprom2
447  store i16 0, i16* %arrayidx3
448  %sub4 = add nsw i32 %n, -2
449  %idxprom5 = sext i32 %sub4 to i64
450  %arrayidx6 = getelementptr inbounds i16, i16* %P, i64 %idxprom5
451  store i16 0, i16* %arrayidx6
452  %sub7 = add nsw i32 %n, -1
453  %idxprom8 = sext i32 %sub7 to i64
454  %arrayidx9 = getelementptr inbounds i16, i16* %P, i64 %idxprom8
455  store i16 0, i16* %arrayidx9
456  ret void
457}
458
459; CHECK-LABEL: Sturw_zero
460; CHECK: stur xzr
461define void @Sturw_zero(i32* nocapture %P, i32 %n) {
462entry:
463  %sub = add nsw i32 %n, -3
464  %idxprom = sext i32 %sub to i64
465  %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom
466  store i32 0, i32* %arrayidx
467  %sub1 = add nsw i32 %n, -4
468  %idxprom2 = sext i32 %sub1 to i64
469  %arrayidx3 = getelementptr inbounds i32, i32* %P, i64 %idxprom2
470  store i32 0, i32* %arrayidx3
471  ret void
472}
473
474; CHECK-LABEL: Sturw_zero_4
475; CHECK: stp xzr, xzr
476define void @Sturw_zero_4(i32* nocapture %P, i32 %n) {
477entry:
478  %sub = add nsw i32 %n, -3
479  %idxprom = sext i32 %sub to i64
480  %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom
481  store i32 0, i32* %arrayidx
482  %sub1 = add nsw i32 %n, -4
483  %idxprom2 = sext i32 %sub1 to i64
484  %arrayidx3 = getelementptr inbounds i32, i32* %P, i64 %idxprom2
485  store i32 0, i32* %arrayidx3
486  %sub4 = add nsw i32 %n, -2
487  %idxprom5 = sext i32 %sub4 to i64
488  %arrayidx6 = getelementptr inbounds i32, i32* %P, i64 %idxprom5
489  store i32 0, i32* %arrayidx6
490  %sub7 = add nsw i32 %n, -1
491  %idxprom8 = sext i32 %sub7 to i64
492  %arrayidx9 = getelementptr inbounds i32, i32* %P, i64 %idxprom8
493  store i32 0, i32* %arrayidx9
494  ret void
495}
496
497