1;RUN: llc < %s -mtriple=armv7-none-linux-gnueabi   -mattr=+neon -verify-machineinstrs -filetype=obj | llvm-objdump -triple armv7-none-linux-gnueabi   -disassemble - | FileCheck %s --check-prefix=ARM
2;RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabi -mattr=+neon -verify-machineinstrs -filetype=obj | llvm-objdump -triple thumbv7-none-linux-gnueabi -disassemble - | FileCheck %s --check-prefix=THUMB2
3;RUN: llc < %s -mtriple=armv7-none-linux-gnueabi   -mattr=-neon -verify-machineinstrs -filetype=obj | llvm-objdump -triple armv7-none-linux-gnueabi   -disassemble - | FileCheck %s --check-prefix=NO_NEON
4;We want to have both positive and negative checks for thumb1. These checks
5;are not easy to do in a single pass so we generate the output once to a
6;temp file and run filecheck twice with different prefixes.
7;RUN: llc < %s -mtriple=thumbv5-none-linux-gnueabi              -verify-machineinstrs -filetype=obj | llvm-objdump -triple thumbv5-none-linux-gnueabi -disassemble - > %t
8;RUN: cat %t | FileCheck %s --check-prefix=THUMB1
9;RUN: cat %t | FileCheck %s --check-prefix=T1POST
10;RUN: llc < %s -mtriple=thumbv8m.base-arm-none-eabi             -verify-machineinstrs -filetype=obj | llvm-objdump -triple thumbv8m.base-arm-none-eabi -disassemble - > %t
11;RUN: cat %t | FileCheck %s --check-prefix=THUMB1
12;RUN: cat %t | FileCheck %s --check-prefix=T1POST
13;RUN: cat %t | FileCheck %s --check-prefix=V8MBASE
14
15;This file contains auto generated tests for the lowering of passing structs
16;byval in the arm backend. We have tests for both packed and unpacked
17;structs at varying alignments. Each test is run for arm, thumb2 and thumb1.
18;We check for the strings in the generated object code using llvm-objdump
19;because it provides better assurance that we are generating instructions
20;for the correct architecture. Otherwise we could accidentally generate an
21;ARM instruction for THUMB1 and wouldn't detect it because the assembly
22;code representation is the same, but the object code would be generated
23;incorrectly. For each test we check for the label, a load instruction of the
24;correct form, a branch if it will be generated with a loop, and the leftover
25;cleanup if the number of bytes does not divide evenly by the store size
26
27%struct.A = type <{ [ 10 x i32 ] }> ; 40 bytes
28declare void @use_A(%struct.A* byval)
29%struct.B = type <{ [ 10 x i32 ], i8 }> ; 41 bytes
30declare void @use_B(%struct.B* byval)
31%struct.C = type <{ [ 10 x i32 ], [ 3 x i8 ] }> ; 43 bytes
32declare void @use_C(%struct.C* byval)
33%struct.D = type <{ [ 100 x i32 ] }> ; 400 bytes
34declare void @use_D(%struct.D* byval)
35%struct.E = type <{ [ 100 x i32 ], i8 }> ; 401 bytes
36declare void @use_E(%struct.E* byval)
37%struct.F = type <{ [ 100 x i32 ], [ 3 x i8 ] }> ; 403 bytes
38declare void @use_F(%struct.F* byval)
39%struct.G = type  { [ 10 x i32 ] }  ; 40 bytes
40declare void @use_G(%struct.G* byval)
41%struct.H = type  { [ 10 x i32 ], i8 }  ; 41 bytes
42declare void @use_H(%struct.H* byval)
43%struct.I = type  { [ 10 x i32 ], [ 3 x i8 ] }  ; 43 bytes
44declare void @use_I(%struct.I* byval)
45%struct.J = type  { [ 100 x i32 ] }  ; 400 bytes
46declare void @use_J(%struct.J* byval)
47%struct.K = type  { [ 100 x i32 ], i8 }  ; 401 bytes
48declare void @use_K(%struct.K* byval)
49%struct.L = type  { [ 100 x i32 ], [ 3 x i8 ] }  ; 403 bytes
50declare void @use_L(%struct.L* byval)
51%struct.M = type  { [  64 x i8 ] }   ; 64 bytes
52declare void @use_M(%struct.M* byval)
53%struct.N = type  { [ 128 x i8 ] }  ; 128 bytes
54declare void @use_N(%struct.N* byval)
55
56;ARM-LABEL:    test_A_1:
57;THUMB2-LABEL: test_A_1:
58;NO_NEON-LABEL:test_A_1:
59;THUMB1-LABEL: test_A_1:
60;T1POST-LABEL: test_A_1:
61  define void @test_A_1() {
62;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
63
64;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
65
66;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
67
68;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
69;THUMB1:      adds    [[BASE]], #1
70
71;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
72  entry:
73    %a = alloca %struct.A, align 1
74    call void @use_A(%struct.A* byval align 1 %a)
75    ret void
76  }
77;ARM-LABEL:    test_A_2:
78;THUMB2-LABEL: test_A_2:
79;NO_NEON-LABEL:test_A_2:
80;THUMB1-LABEL: test_A_2:
81;T1POST-LABEL: test_A_2:
82  define void @test_A_2() {
83;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
84
85;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
86
87;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
88
89;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
90;THUMB1:      adds    [[BASE]], #2
91
92;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
93  entry:
94    %a = alloca %struct.A, align 2
95    call void @use_A(%struct.A* byval align 2 %a)
96    ret void
97  }
98;ARM-LABEL:    test_A_4:
99;THUMB2-LABEL: test_A_4:
100;NO_NEON-LABEL:test_A_4:
101;THUMB1-LABEL: test_A_4:
102;T1POST-LABEL: test_A_4:
103  define void @test_A_4() {
104;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
105
106;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
107
108;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
109
110;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
111;THUMB1:      adds    [[BASE]], #4
112
113;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
114  entry:
115    %a = alloca %struct.A, align 4
116    call void @use_A(%struct.A* byval align 4 %a)
117    ret void
118  }
119;ARM-LABEL:    test_A_8:
120;THUMB2-LABEL: test_A_8:
121;NO_NEON-LABEL:test_A_8:
122;THUMB1-LABEL: test_A_8:
123;T1POST-LABEL: test_A_8:
124  define void @test_A_8() {
125;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
126
127;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
128
129;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
130;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
131
132;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
133;THUMB1:      adds    [[BASE]], #4
134
135;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
136  entry:
137    %a = alloca %struct.A, align 8
138    call void @use_A(%struct.A* byval align 8 %a)
139    ret void
140  }
141;ARM-LABEL:    test_A_16:
142;THUMB2-LABEL: test_A_16:
143;NO_NEON-LABEL:test_A_16:
144;THUMB1-LABEL: test_A_16:
145;T1POST-LABEL: test_A_16:
146  define void @test_A_16() {
147;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
148;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
149
150;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
151;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
152
153;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
154;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
155
156;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
157;THUMB1:      adds    [[BASE]], #4
158
159;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
160  entry:
161    %a = alloca %struct.A, align 16
162    call void @use_A(%struct.A* byval align 16 %a)
163    ret void
164  }
165;ARM-LABEL:    test_B_1:
166;THUMB2-LABEL: test_B_1:
167;NO_NEON-LABEL:test_B_1:
168;THUMB1-LABEL: test_B_1:
169;T1POST-LABEL: test_B_1:
170  define void @test_B_1() {
171;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
172
173;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
174
175;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
176
177;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
178;THUMB1:      adds    [[BASE]], #1
179
180;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
181  entry:
182    %a = alloca %struct.B, align 1
183    call void @use_B(%struct.B* byval align 1 %a)
184    ret void
185  }
186;ARM-LABEL:    test_B_2:
187;THUMB2-LABEL: test_B_2:
188;NO_NEON-LABEL:test_B_2:
189;THUMB1-LABEL: test_B_2:
190;T1POST-LABEL: test_B_2:
191  define void @test_B_2() {
192;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
193;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
194
195;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
196;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
197
198;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
199;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
200
201;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
202;THUMB1:      adds    [[BASE]], #2
203;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
204
205;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
206  entry:
207    %a = alloca %struct.B, align 2
208    call void @use_B(%struct.B* byval align 2 %a)
209    ret void
210  }
211;ARM-LABEL:    test_B_4:
212;THUMB2-LABEL: test_B_4:
213;NO_NEON-LABEL:test_B_4:
214;THUMB1-LABEL: test_B_4:
215;T1POST-LABEL: test_B_4:
216  define void @test_B_4() {
217;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
218;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
219
220;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
221;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
222
223;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
224;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
225
226;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
227;THUMB1:      adds    [[BASE]], #4
228;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
229
230;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
231  entry:
232    %a = alloca %struct.B, align 4
233    call void @use_B(%struct.B* byval align 4 %a)
234    ret void
235  }
236;ARM-LABEL:    test_B_8:
237;THUMB2-LABEL: test_B_8:
238;NO_NEON-LABEL:test_B_8:
239;THUMB1-LABEL: test_B_8:
240;T1POST-LABEL: test_B_8:
241  define void @test_B_8() {
242;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
243;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
244
245;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
246;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
247
248;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
249;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
250;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
251
252;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
253;THUMB1:      adds    [[BASE]], #4
254;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
255
256;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
257  entry:
258    %a = alloca %struct.B, align 8
259    call void @use_B(%struct.B* byval align 8 %a)
260    ret void
261  }
262;ARM-LABEL:    test_B_16:
263;THUMB2-LABEL: test_B_16:
264;NO_NEON-LABEL:test_B_16:
265;THUMB1-LABEL: test_B_16:
266;T1POST-LABEL: test_B_16:
267  define void @test_B_16() {
268;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
269;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
270
271;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
272;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
273
274;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
275;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
276;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
277
278;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
279;THUMB1:      adds    [[BASE]], #4
280;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
281
282;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
283  entry:
284    %a = alloca %struct.B, align 16
285    call void @use_B(%struct.B* byval align 16 %a)
286    ret void
287  }
288;ARM-LABEL:    test_C_1:
289;THUMB2-LABEL: test_C_1:
290;NO_NEON-LABEL:test_C_1:
291;THUMB1-LABEL: test_C_1:
292;T1POST-LABEL: test_C_1:
293  define void @test_C_1() {
294;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
295
296;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
297
298;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
299
300;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
301;THUMB1:      adds    [[BASE]], #1
302
303;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
304  entry:
305    %a = alloca %struct.C, align 1
306    call void @use_C(%struct.C* byval align 1 %a)
307    ret void
308  }
309;ARM-LABEL:    test_C_2:
310;THUMB2-LABEL: test_C_2:
311;NO_NEON-LABEL:test_C_2:
312;THUMB1-LABEL: test_C_2:
313;T1POST-LABEL: test_C_2:
314  define void @test_C_2() {
315;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
316;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
317
318;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
319;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
320
321;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
322;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
323
324;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
325;THUMB1:      adds    [[BASE]], #2
326;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
327
328;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
329  entry:
330    %a = alloca %struct.C, align 2
331    call void @use_C(%struct.C* byval align 2 %a)
332    ret void
333  }
334;ARM-LABEL:    test_C_4:
335;THUMB2-LABEL: test_C_4:
336;NO_NEON-LABEL:test_C_4:
337;THUMB1-LABEL: test_C_4:
338;T1POST-LABEL: test_C_4:
339  define void @test_C_4() {
340;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
341;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
342
343;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
344;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
345
346;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
347;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
348
349;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
350;THUMB1:      adds    [[BASE]], #4
351;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
352;THUMB1:      adds    [[BASE]], #1
353
354;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
355  entry:
356    %a = alloca %struct.C, align 4
357    call void @use_C(%struct.C* byval align 4 %a)
358    ret void
359  }
360;ARM-LABEL:    test_C_8:
361;THUMB2-LABEL: test_C_8:
362;NO_NEON-LABEL:test_C_8:
363;THUMB1-LABEL: test_C_8:
364;T1POST-LABEL: test_C_8:
365  define void @test_C_8() {
366;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
367;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
368
369;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
370;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
371
372;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
373;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
374;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
375
376;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
377;THUMB1:      adds    [[BASE]], #4
378;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
379;THUMB1:      adds    [[BASE]], #1
380
381;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
382  entry:
383    %a = alloca %struct.C, align 8
384    call void @use_C(%struct.C* byval align 8 %a)
385    ret void
386  }
387;ARM-LABEL:    test_C_16:
388;THUMB2-LABEL: test_C_16:
389;NO_NEON-LABEL:test_C_16:
390;THUMB1-LABEL: test_C_16:
391;T1POST-LABEL: test_C_16:
392  define void @test_C_16() {
393;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
394;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
395
396;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
397;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
398
399;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
400;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
401;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
402
403;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
404;THUMB1:      adds    [[BASE]], #4
405;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
406;THUMB1:      adds    [[BASE]], #1
407
408;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
409  entry:
410    %a = alloca %struct.C, align 16
411    call void @use_C(%struct.C* byval align 16 %a)
412    ret void
413  }
414;ARM-LABEL:    test_D_1:
415;THUMB2-LABEL: test_D_1:
416;NO_NEON-LABEL:test_D_1:
417;THUMB1-LABEL: test_D_1:
418;T1POST-LABEL: test_D_1:
419  define void @test_D_1() {
420;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
421;ARM:         bne
422
423;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
424;THUMB2:      bne
425
426;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
427;NO_NEON:     bne
428
429;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
430;THUMB1:      adds    [[BASE]], #1
431;THUMB1:      bne
432
433;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
434  entry:
435    %a = alloca %struct.D, align 1
436    call void @use_D(%struct.D* byval align 1 %a)
437    ret void
438  }
439;ARM-LABEL:    test_D_2:
440;THUMB2-LABEL: test_D_2:
441;NO_NEON-LABEL:test_D_2:
442;THUMB1-LABEL: test_D_2:
443;T1POST-LABEL: test_D_2:
444  define void @test_D_2() {
445;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
446;ARM:         bne
447
448;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
449;THUMB2:      bne
450
451;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
452;NO_NEON:     bne
453
454;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
455;THUMB1:      adds    [[BASE]], #2
456;THUMB1:      bne
457
458;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
459  entry:
460    %a = alloca %struct.D, align 2
461    call void @use_D(%struct.D* byval align 2 %a)
462    ret void
463  }
464;ARM-LABEL:    test_D_4:
465;THUMB2-LABEL: test_D_4:
466;NO_NEON-LABEL:test_D_4:
467;THUMB1-LABEL: test_D_4:
468;T1POST-LABEL: test_D_4:
469  define void @test_D_4() {
470;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
471;ARM:         bne
472
473;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
474;THUMB2:      bne
475
476;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
477;NO_NEON:     bne
478
479;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
480;THUMB1:      adds    [[BASE]], #4
481;THUMB1:      bne
482
483;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
484  entry:
485    %a = alloca %struct.D, align 4
486    call void @use_D(%struct.D* byval align 4 %a)
487    ret void
488  }
489;ARM-LABEL:    test_D_8:
490;THUMB2-LABEL: test_D_8:
491;NO_NEON-LABEL:test_D_8:
492;THUMB1-LABEL: test_D_8:
493;T1POST-LABEL: test_D_8:
494  define void @test_D_8() {
495;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
496;ARM:         bne
497
498;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
499;THUMB2:      bne
500
501;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
502;NO_NEON:     bne
503;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
504
505;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
506;THUMB1:      adds    [[BASE]], #4
507;THUMB1:      bne
508
509;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
510  entry:
511    %a = alloca %struct.D, align 8
512    call void @use_D(%struct.D* byval align 8 %a)
513    ret void
514  }
515;ARM-LABEL:    test_D_16:
516;THUMB2-LABEL: test_D_16:
517;NO_NEON-LABEL:test_D_16:
518;THUMB1-LABEL: test_D_16:
519;T1POST-LABEL: test_D_16:
520  define void @test_D_16() {
521;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
522;ARM:         bne
523
524;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
525;THUMB2:      bne
526
527;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
528;NO_NEON:     bne
529;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
530
531;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
532;THUMB1:      adds    [[BASE]], #4
533;THUMB1:      bne
534
535;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
536  entry:
537    %a = alloca %struct.D, align 16
538    call void @use_D(%struct.D* byval align 16 %a)
539    ret void
540  }
541;ARM-LABEL:    test_E_1:
542;THUMB2-LABEL: test_E_1:
543;NO_NEON-LABEL:test_E_1:
544;THUMB1-LABEL: test_E_1:
545;T1POST-LABEL: test_E_1:
546  define void @test_E_1() {
547;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
548;ARM:         bne
549
550;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
551;THUMB2:      bne
552
553;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
554;NO_NEON:     bne
555
556;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
557;THUMB1:      adds    [[BASE]], #1
558;THUMB1:      bne
559
560;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
561  entry:
562    %a = alloca %struct.E, align 1
563    call void @use_E(%struct.E* byval align 1 %a)
564    ret void
565  }
566;ARM-LABEL:    test_E_2:
567;THUMB2-LABEL: test_E_2:
568;NO_NEON-LABEL:test_E_2:
569;THUMB1-LABEL: test_E_2:
570;T1POST-LABEL: test_E_2:
571  define void @test_E_2() {
572;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
573;ARM:         bne
574;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
575
576;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
577;THUMB2:      bne
578;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
579
580;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
581;NO_NEON:     bne
582;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
583
584;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
585;THUMB1:      adds    [[BASE]], #2
586;THUMB1:      bne
587;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
588
589;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
590  entry:
591    %a = alloca %struct.E, align 2
592    call void @use_E(%struct.E* byval align 2 %a)
593    ret void
594  }
595;ARM-LABEL:    test_E_4:
596;THUMB2-LABEL: test_E_4:
597;NO_NEON-LABEL:test_E_4:
598;THUMB1-LABEL: test_E_4:
599;T1POST-LABEL: test_E_4:
600  define void @test_E_4() {
601;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
602;ARM:         bne
603;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
604
605;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
606;THUMB2:      bne
607;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
608
609;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
610;NO_NEON:     bne
611;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
612
613;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
614;THUMB1:      adds    [[BASE]], #4
615;THUMB1:      bne
616;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
617
618;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
619  entry:
620    %a = alloca %struct.E, align 4
621    call void @use_E(%struct.E* byval align 4 %a)
622    ret void
623  }
624;ARM-LABEL:    test_E_8:
625;THUMB2-LABEL: test_E_8:
626;NO_NEON-LABEL:test_E_8:
627;THUMB1-LABEL: test_E_8:
628;T1POST-LABEL: test_E_8:
629  define void @test_E_8() {
630;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
631;ARM:         bne
632;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
633
634;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
635;THUMB2:      bne
636;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
637
638;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
639;NO_NEON:     bne
640;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
641;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
642
643;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
644;THUMB1:      adds    [[BASE]], #4
645;THUMB1:      bne
646;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
647
648;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
649  entry:
650    %a = alloca %struct.E, align 8
651    call void @use_E(%struct.E* byval align 8 %a)
652    ret void
653  }
654;ARM-LABEL:    test_E_16:
655;THUMB2-LABEL: test_E_16:
656;NO_NEON-LABEL:test_E_16:
657;THUMB1-LABEL: test_E_16:
658;T1POST-LABEL: test_E_16:
659  define void @test_E_16() {
660;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
661;ARM:         bne
662;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
663
664;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
665;THUMB2:      bne
666;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
667
668;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
669;NO_NEON:     bne
670;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
671;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
672
673;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
674;THUMB1:      adds    [[BASE]], #4
675;THUMB1:      bne
676;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
677
678;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
679  entry:
680    %a = alloca %struct.E, align 16
681    call void @use_E(%struct.E* byval align 16 %a)
682    ret void
683  }
684;ARM-LABEL:    test_F_1:
685;THUMB2-LABEL: test_F_1:
686;NO_NEON-LABEL:test_F_1:
687;THUMB1-LABEL: test_F_1:
688;T1POST-LABEL: test_F_1:
689  define void @test_F_1() {
690;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
691;ARM:         bne
692
693;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
694;THUMB2:      bne
695
696;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
697;NO_NEON:     bne
698
699;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
700;THUMB1:      adds    [[BASE]], #1
701;THUMB1:      bne
702
703;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
704  entry:
705    %a = alloca %struct.F, align 1
706    call void @use_F(%struct.F* byval align 1 %a)
707    ret void
708  }
709;ARM-LABEL:    test_F_2:
710;THUMB2-LABEL: test_F_2:
711;NO_NEON-LABEL:test_F_2:
712;THUMB1-LABEL: test_F_2:
713;T1POST-LABEL: test_F_2:
714  define void @test_F_2() {
715;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
716;ARM:         bne
717;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
718
719;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
720;THUMB2:      bne
721;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
722
723;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
724;NO_NEON:     bne
725;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
726
727;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
728;THUMB1:      adds    [[BASE]], #2
729;THUMB1:      bne
730;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
731
732;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
733  entry:
734    %a = alloca %struct.F, align 2
735    call void @use_F(%struct.F* byval align 2 %a)
736    ret void
737  }
738;ARM-LABEL:    test_F_4:
739;THUMB2-LABEL: test_F_4:
740;NO_NEON-LABEL:test_F_4:
741;THUMB1-LABEL: test_F_4:
742;T1POST-LABEL: test_F_4:
743  define void @test_F_4() {
744;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
745;ARM:         bne
746;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
747
748;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
749;THUMB2:      bne
750;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
751
752;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
753;NO_NEON:     bne
754;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
755
756;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
757;THUMB1:      adds    [[BASE]], #4
758;THUMB1:      bne
759;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
760;THUMB1:      adds    [[BASE]], #1
761
762;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
763  entry:
764    %a = alloca %struct.F, align 4
765    call void @use_F(%struct.F* byval align 4 %a)
766    ret void
767  }
768;ARM-LABEL:    test_F_8:
769;THUMB2-LABEL: test_F_8:
770;NO_NEON-LABEL:test_F_8:
771;THUMB1-LABEL: test_F_8:
772;T1POST-LABEL: test_F_8:
773  define void @test_F_8() {
774;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
775;ARM:         bne
776;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
777
778;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
779;THUMB2:      bne
780;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
781
782;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
783;NO_NEON:     bne
784;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
785;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
786
787;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
788;THUMB1:      adds    [[BASE]], #4
789;THUMB1:      bne
790;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
791;THUMB1:      adds    [[BASE]], #1
792
793;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
794  entry:
795    %a = alloca %struct.F, align 8
796    call void @use_F(%struct.F* byval align 8 %a)
797    ret void
798  }
799;ARM-LABEL:    test_F_16:
800;THUMB2-LABEL: test_F_16:
801;NO_NEON-LABEL:test_F_16:
802;THUMB1-LABEL: test_F_16:
803;T1POST-LABEL: test_F_16:
804  define void @test_F_16() {
805;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
806;ARM:         bne
807;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
808
809;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
810;THUMB2:      bne
811;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
812
813;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
814;NO_NEON:     bne
815;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
816;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
817
818;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
819;THUMB1:      adds    [[BASE]], #4
820;THUMB1:      bne
821;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
822;THUMB1:      adds    [[BASE]], #1
823
824;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
825  entry:
826    %a = alloca %struct.F, align 16
827    call void @use_F(%struct.F* byval align 16 %a)
828    ret void
829  }
830;ARM-LABEL:    test_G_1:
831;THUMB2-LABEL: test_G_1:
832;NO_NEON-LABEL:test_G_1:
833;THUMB1-LABEL: test_G_1:
834;T1POST-LABEL: test_G_1:
835  define void @test_G_1() {
836;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
837
838;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
839
840;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
841
842;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
843;THUMB1:      adds    [[BASE]], #1
844
845;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
846  entry:
847    %a = alloca %struct.G, align 1
848    call void @use_G(%struct.G* byval align 1 %a)
849    ret void
850  }
851;ARM-LABEL:    test_G_2:
852;THUMB2-LABEL: test_G_2:
853;NO_NEON-LABEL:test_G_2:
854;THUMB1-LABEL: test_G_2:
855;T1POST-LABEL: test_G_2:
856  define void @test_G_2() {
857;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
858
859;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
860
861;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
862
863;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
864;THUMB1:      adds    [[BASE]], #2
865
866;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
867  entry:
868    %a = alloca %struct.G, align 2
869    call void @use_G(%struct.G* byval align 2 %a)
870    ret void
871  }
872;ARM-LABEL:    test_G_4:
873;THUMB2-LABEL: test_G_4:
874;NO_NEON-LABEL:test_G_4:
875;THUMB1-LABEL: test_G_4:
876;T1POST-LABEL: test_G_4:
877  define void @test_G_4() {
878;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
879
880;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
881
882;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
883
884;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
885;THUMB1:      adds    [[BASE]], #4
886
887;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
888  entry:
889    %a = alloca %struct.G, align 4
890    call void @use_G(%struct.G* byval align 4 %a)
891    ret void
892  }
893;ARM-LABEL:    test_G_8:
894;THUMB2-LABEL: test_G_8:
895;NO_NEON-LABEL:test_G_8:
896;THUMB1-LABEL: test_G_8:
897;T1POST-LABEL: test_G_8:
898  define void @test_G_8() {
899;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
900
901;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
902
903;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
904;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
905
906;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
907;THUMB1:      adds    [[BASE]], #4
908
909;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
910  entry:
911    %a = alloca %struct.G, align 8
912    call void @use_G(%struct.G* byval align 8 %a)
913    ret void
914  }
915;ARM-LABEL:    test_G_16:
916;THUMB2-LABEL: test_G_16:
917;NO_NEON-LABEL:test_G_16:
918;THUMB1-LABEL: test_G_16:
919;T1POST-LABEL: test_G_16:
920  define void @test_G_16() {
921;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
922
923;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
924
925;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
926;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
927
928;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
929;THUMB1:      adds    [[BASE]], #4
930
931;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
932  entry:
933    %a = alloca %struct.G, align 16
934    call void @use_G(%struct.G* byval align 16 %a)
935    ret void
936  }
937;ARM-LABEL:    test_H_1:
938;THUMB2-LABEL: test_H_1:
939;NO_NEON-LABEL:test_H_1:
940;THUMB1-LABEL: test_H_1:
941;T1POST-LABEL: test_H_1:
942  define void @test_H_1() {
943;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
944
945;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
946
947;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
948
949;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
950;THUMB1:      adds    [[BASE]], #1
951
952;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
953  entry:
954    %a = alloca %struct.H, align 1
955    call void @use_H(%struct.H* byval align 1 %a)
956    ret void
957  }
958;ARM-LABEL:    test_H_2:
959;THUMB2-LABEL: test_H_2:
960;NO_NEON-LABEL:test_H_2:
961;THUMB1-LABEL: test_H_2:
962;T1POST-LABEL: test_H_2:
963  define void @test_H_2() {
964;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
965
966;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
967
968;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
969
970;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
971;THUMB1:      adds    [[BASE]], #2
972
973;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
974  entry:
975    %a = alloca %struct.H, align 2
976    call void @use_H(%struct.H* byval align 2 %a)
977    ret void
978  }
979;ARM-LABEL:    test_H_4:
980;THUMB2-LABEL: test_H_4:
981;NO_NEON-LABEL:test_H_4:
982;THUMB1-LABEL: test_H_4:
983;T1POST-LABEL: test_H_4:
984  define void @test_H_4() {
985;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
986
987;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
988
989;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
990
991;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
992;THUMB1:      adds    [[BASE]], #4
993
994;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
995  entry:
996    %a = alloca %struct.H, align 4
997    call void @use_H(%struct.H* byval align 4 %a)
998    ret void
999  }
1000;ARM-LABEL:    test_H_8:
1001;THUMB2-LABEL: test_H_8:
1002;NO_NEON-LABEL:test_H_8:
1003;THUMB1-LABEL: test_H_8:
1004;T1POST-LABEL: test_H_8:
1005  define void @test_H_8() {
1006;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1007
1008;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1009
1010;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1011;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1012
1013;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1014;THUMB1:      adds    [[BASE]], #4
1015
1016;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1017  entry:
1018    %a = alloca %struct.H, align 8
1019    call void @use_H(%struct.H* byval align 8 %a)
1020    ret void
1021  }
1022;ARM-LABEL:    test_H_16:
1023;THUMB2-LABEL: test_H_16:
1024;NO_NEON-LABEL:test_H_16:
1025;THUMB1-LABEL: test_H_16:
1026;T1POST-LABEL: test_H_16:
1027  define void @test_H_16() {
1028;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1029
1030;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1031
1032;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1033;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1034
1035;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1036;THUMB1:      adds    [[BASE]], #4
1037
1038;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1039  entry:
1040    %a = alloca %struct.H, align 16
1041    call void @use_H(%struct.H* byval align 16 %a)
1042    ret void
1043  }
1044;ARM-LABEL:    test_I_1:
1045;THUMB2-LABEL: test_I_1:
1046;NO_NEON-LABEL:test_I_1:
1047;THUMB1-LABEL: test_I_1:
1048;T1POST-LABEL: test_I_1:
1049  define void @test_I_1() {
1050;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
1051
1052;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
1053
1054;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
1055
1056;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1057;THUMB1:      adds    [[BASE]], #1
1058
1059;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
1060  entry:
1061    %a = alloca %struct.I, align 1
1062    call void @use_I(%struct.I* byval align 1 %a)
1063    ret void
1064  }
1065;ARM-LABEL:    test_I_2:
1066;THUMB2-LABEL: test_I_2:
1067;NO_NEON-LABEL:test_I_2:
1068;THUMB1-LABEL: test_I_2:
1069;T1POST-LABEL: test_I_2:
1070  define void @test_I_2() {
1071;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
1072
1073;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
1074
1075;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
1076
1077;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1078;THUMB1:      adds    [[BASE]], #2
1079
1080;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
1081  entry:
1082    %a = alloca %struct.I, align 2
1083    call void @use_I(%struct.I* byval align 2 %a)
1084    ret void
1085  }
1086;ARM-LABEL:    test_I_4:
1087;THUMB2-LABEL: test_I_4:
1088;NO_NEON-LABEL:test_I_4:
1089;THUMB1-LABEL: test_I_4:
1090;T1POST-LABEL: test_I_4:
1091  define void @test_I_4() {
1092;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
1093
1094;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
1095
1096;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1097
1098;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1099;THUMB1:      adds    [[BASE]], #4
1100
1101;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
1102  entry:
1103    %a = alloca %struct.I, align 4
1104    call void @use_I(%struct.I* byval align 4 %a)
1105    ret void
1106  }
1107;ARM-LABEL:    test_I_8:
1108;THUMB2-LABEL: test_I_8:
1109;NO_NEON-LABEL:test_I_8:
1110;THUMB1-LABEL: test_I_8:
1111;T1POST-LABEL: test_I_8:
1112  define void @test_I_8() {
1113;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1114
1115;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1116
1117;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1118;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1119
1120;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1121;THUMB1:      adds    [[BASE]], #4
1122
1123;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1124  entry:
1125    %a = alloca %struct.I, align 8
1126    call void @use_I(%struct.I* byval align 8 %a)
1127    ret void
1128  }
1129;ARM-LABEL:    test_I_16:
1130;THUMB2-LABEL: test_I_16:
1131;NO_NEON-LABEL:test_I_16:
1132;THUMB1-LABEL: test_I_16:
1133;T1POST-LABEL: test_I_16:
1134  define void @test_I_16() {
1135;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1136
1137;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1138
1139;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1140;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1141
1142;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1143;THUMB1:      adds    [[BASE]], #4
1144
1145;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1146  entry:
1147    %a = alloca %struct.I, align 16
1148    call void @use_I(%struct.I* byval align 16 %a)
1149    ret void
1150  }
1151;ARM-LABEL:    test_J_1:
1152;THUMB2-LABEL: test_J_1:
1153;NO_NEON-LABEL:test_J_1:
1154;THUMB1-LABEL: test_J_1:
1155;T1POST-LABEL: test_J_1:
1156  define void @test_J_1() {
1157;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
1158;ARM:         bne
1159
1160;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
1161;THUMB2:      bne
1162
1163;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
1164;NO_NEON:     bne
1165
1166;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1167;THUMB1:      adds    [[BASE]], #1
1168;THUMB1:      bne
1169
1170;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
1171  entry:
1172    %a = alloca %struct.J, align 1
1173    call void @use_J(%struct.J* byval align 1 %a)
1174    ret void
1175  }
1176;ARM-LABEL:    test_J_2:
1177;THUMB2-LABEL: test_J_2:
1178;NO_NEON-LABEL:test_J_2:
1179;THUMB1-LABEL: test_J_2:
1180;T1POST-LABEL: test_J_2:
1181  define void @test_J_2() {
1182;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
1183;ARM:         bne
1184
1185;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
1186;THUMB2:      bne
1187
1188;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
1189;NO_NEON:     bne
1190
1191;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1192;THUMB1:      adds    [[BASE]], #2
1193;THUMB1:      bne
1194
1195;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
1196  entry:
1197    %a = alloca %struct.J, align 2
1198    call void @use_J(%struct.J* byval align 2 %a)
1199    ret void
1200  }
1201;ARM-LABEL:    test_J_4:
1202;THUMB2-LABEL: test_J_4:
1203;NO_NEON-LABEL:test_J_4:
1204;THUMB1-LABEL: test_J_4:
1205;T1POST-LABEL: test_J_4:
1206  define void @test_J_4() {
1207;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
1208;ARM:         bne
1209
1210;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
1211;THUMB2:      bne
1212
1213;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1214;NO_NEON:     bne
1215
1216;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1217;THUMB1:      adds    [[BASE]], #4
1218;THUMB1:      bne
1219
1220;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
1221  entry:
1222    %a = alloca %struct.J, align 4
1223    call void @use_J(%struct.J* byval align 4 %a)
1224    ret void
1225  }
1226;ARM-LABEL:    test_J_8:
1227;THUMB2-LABEL: test_J_8:
1228;NO_NEON-LABEL:test_J_8:
1229;THUMB1-LABEL: test_J_8:
1230;T1POST-LABEL: test_J_8:
1231  define void @test_J_8() {
1232;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1233;ARM:         bne
1234
1235;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1236;THUMB2:      bne
1237
1238;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1239;NO_NEON:     bne
1240;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1241
1242;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1243;THUMB1:      adds    [[BASE]], #4
1244;THUMB1:      bne
1245
1246;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1247  entry:
1248    %a = alloca %struct.J, align 8
1249    call void @use_J(%struct.J* byval align 8 %a)
1250    ret void
1251  }
1252;ARM-LABEL:    test_J_16:
1253;THUMB2-LABEL: test_J_16:
1254;NO_NEON-LABEL:test_J_16:
1255;THUMB1-LABEL: test_J_16:
1256;T1POST-LABEL: test_J_16:
1257  define void @test_J_16() {
1258;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1259;ARM:         bne
1260
1261;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1262;THUMB2:      bne
1263
1264;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1265;NO_NEON:     bne
1266;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1267
1268;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1269;THUMB1:      adds    [[BASE]], #4
1270;THUMB1:      bne
1271
1272;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1273  entry:
1274    %a = alloca %struct.J, align 16
1275    call void @use_J(%struct.J* byval align 16 %a)
1276    ret void
1277  }
1278;ARM-LABEL:    test_K_1:
1279;THUMB2-LABEL: test_K_1:
1280;NO_NEON-LABEL:test_K_1:
1281;THUMB1-LABEL: test_K_1:
1282;T1POST-LABEL: test_K_1:
1283  define void @test_K_1() {
1284;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
1285;ARM:         bne
1286
1287;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
1288;THUMB2:      bne
1289
1290;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
1291;NO_NEON:     bne
1292
1293;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1294;THUMB1:      adds    [[BASE]], #1
1295;THUMB1:      bne
1296
1297;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
1298  entry:
1299    %a = alloca %struct.K, align 1
1300    call void @use_K(%struct.K* byval align 1 %a)
1301    ret void
1302  }
1303;ARM-LABEL:    test_K_2:
1304;THUMB2-LABEL: test_K_2:
1305;NO_NEON-LABEL:test_K_2:
1306;THUMB1-LABEL: test_K_2:
1307;T1POST-LABEL: test_K_2:
1308  define void @test_K_2() {
1309;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
1310;ARM:         bne
1311
1312;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
1313;THUMB2:      bne
1314
1315;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
1316;NO_NEON:     bne
1317
1318;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1319;THUMB1:      adds    [[BASE]], #2
1320;THUMB1:      bne
1321
1322;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
1323  entry:
1324    %a = alloca %struct.K, align 2
1325    call void @use_K(%struct.K* byval align 2 %a)
1326    ret void
1327  }
1328;ARM-LABEL:    test_K_4:
1329;THUMB2-LABEL: test_K_4:
1330;NO_NEON-LABEL:test_K_4:
1331;THUMB1-LABEL: test_K_4:
1332;T1POST-LABEL: test_K_4:
1333  define void @test_K_4() {
1334;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
1335;ARM:         bne
1336
1337;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
1338;THUMB2:      bne
1339
1340;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1341;NO_NEON:     bne
1342
1343;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1344;THUMB1:      adds    [[BASE]], #4
1345;THUMB1:      bne
1346
1347;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
1348  entry:
1349    %a = alloca %struct.K, align 4
1350    call void @use_K(%struct.K* byval align 4 %a)
1351    ret void
1352  }
1353;ARM-LABEL:    test_K_8:
1354;THUMB2-LABEL: test_K_8:
1355;NO_NEON-LABEL:test_K_8:
1356;THUMB1-LABEL: test_K_8:
1357;T1POST-LABEL: test_K_8:
1358  define void @test_K_8() {
1359;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1360;ARM:         bne
1361
1362;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1363;THUMB2:      bne
1364
1365;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1366;NO_NEON:     bne
1367;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1368
1369;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1370;THUMB1:      adds    [[BASE]], #4
1371;THUMB1:      bne
1372
1373;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1374  entry:
1375    %a = alloca %struct.K, align 8
1376    call void @use_K(%struct.K* byval align 8 %a)
1377    ret void
1378  }
1379;ARM-LABEL:    test_K_16:
1380;THUMB2-LABEL: test_K_16:
1381;NO_NEON-LABEL:test_K_16:
1382;THUMB1-LABEL: test_K_16:
1383;T1POST-LABEL: test_K_16:
1384  define void @test_K_16() {
1385;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1386;ARM:         bne
1387
1388;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1389;THUMB2:      bne
1390
1391;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1392;NO_NEON:     bne
1393;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1394
1395;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1396;THUMB1:      adds    [[BASE]], #4
1397;THUMB1:      bne
1398
1399;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1400  entry:
1401    %a = alloca %struct.K, align 16
1402    call void @use_K(%struct.K* byval align 16 %a)
1403    ret void
1404  }
1405;ARM-LABEL:    test_L_1:
1406;THUMB2-LABEL: test_L_1:
1407;NO_NEON-LABEL:test_L_1:
1408;THUMB1-LABEL: test_L_1:
1409;T1POST-LABEL: test_L_1:
1410  define void @test_L_1() {
1411;ARM:         ldrb    r{{[0-9]+}}, [{{.*}}], #1
1412;ARM:         bne
1413
1414;THUMB2:      ldrb    r{{[0-9]+}}, [{{.*}}], #1
1415;THUMB2:      bne
1416
1417;NO_NEON:     ldrb    r{{[0-9]+}}, [{{.*}}], #1
1418;NO_NEON:     bne
1419
1420;THUMB1:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1421;THUMB1:      adds    [[BASE]], #1
1422;THUMB1:      bne
1423
1424;T1POST-NOT:  ldrb    r{{[0-9]+}}, [{{.*}}], #1
1425  entry:
1426    %a = alloca %struct.L, align 1
1427    call void @use_L(%struct.L* byval align 1 %a)
1428    ret void
1429  }
1430;ARM-LABEL:    test_L_2:
1431;THUMB2-LABEL: test_L_2:
1432;NO_NEON-LABEL:test_L_2:
1433;THUMB1-LABEL: test_L_2:
1434;T1POST-LABEL: test_L_2:
1435  define void @test_L_2() {
1436;ARM:         ldrh    r{{[0-9]+}}, [{{.*}}], #2
1437;ARM:         bne
1438
1439;THUMB2:      ldrh    r{{[0-9]+}}, [{{.*}}], #2
1440;THUMB2:      bne
1441
1442;NO_NEON:     ldrh    r{{[0-9]+}}, [{{.*}}], #2
1443;NO_NEON:     bne
1444
1445;THUMB1:      ldrh    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1446;THUMB1:      adds    [[BASE]], #2
1447;THUMB1:      bne
1448
1449;T1POST-NOT:  ldrh    r{{[0-9]+}}, [{{.*}}], #2
1450  entry:
1451    %a = alloca %struct.L, align 2
1452    call void @use_L(%struct.L* byval align 2 %a)
1453    ret void
1454  }
1455;ARM-LABEL:    test_L_4:
1456;THUMB2-LABEL: test_L_4:
1457;NO_NEON-LABEL:test_L_4:
1458;THUMB1-LABEL: test_L_4:
1459;T1POST-LABEL: test_L_4:
1460  define void @test_L_4() {
1461;ARM:         ldr     r{{[0-9]+}}, [{{.*}}], #4
1462;ARM:         bne
1463
1464;THUMB2:      ldr     r{{[0-9]+}}, [{{.*}}], #4
1465;THUMB2:      bne
1466
1467;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1468;NO_NEON:     bne
1469
1470;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1471;THUMB1:      adds    [[BASE]], #4
1472;THUMB1:      bne
1473
1474;T1POST-NOT:  ldr     r{{[0-9]+}}, [{{.*}}], #4
1475  entry:
1476    %a = alloca %struct.L, align 4
1477    call void @use_L(%struct.L* byval align 4 %a)
1478    ret void
1479  }
1480;ARM-LABEL:    test_L_8:
1481;THUMB2-LABEL: test_L_8:
1482;NO_NEON-LABEL:test_L_8:
1483;THUMB1-LABEL: test_L_8:
1484;T1POST-LABEL: test_L_8:
1485  define void @test_L_8() {
1486;ARM:         vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1487;ARM:         bne
1488
1489;THUMB2:      vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1490;THUMB2:      bne
1491
1492;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1493;NO_NEON:     bne
1494;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1495
1496;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1497;THUMB1:      adds    [[BASE]], #4
1498;THUMB1:      bne
1499
1500;T1POST-NOT:  vld1.32 {d{{[0-9]+}}}, [{{.*}}]!
1501  entry:
1502    %a = alloca %struct.L, align 8
1503    call void @use_L(%struct.L* byval align 8 %a)
1504    ret void
1505  }
1506;ARM-LABEL:    test_L_16:
1507;THUMB2-LABEL: test_L_16:
1508;NO_NEON-LABEL:test_L_16:
1509;THUMB1-LABEL: test_L_16:
1510;T1POST-LABEL: test_L_16:
1511  define void @test_L_16() {
1512;ARM:         vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1513;ARM:         bne
1514
1515;THUMB2:      vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1516;THUMB2:      bne
1517
1518;NO_NEON:     ldr     r{{[0-9]+}}, [{{.*}}], #4
1519;NO_NEON:     bne
1520;NO_NEON-NOT: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1521
1522;THUMB1:      ldr     r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1523;THUMB1:      adds    [[BASE]], #4
1524;THUMB1:      bne
1525
1526;T1POST-NOT:  vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}}, [{{.*}}]!
1527  entry:
1528    %a = alloca %struct.L, align 16
1529    call void @use_L(%struct.L* byval align 16 %a)
1530    ret void
1531  }
1532;V8MBASE-LABEL: test_M:
1533  define void @test_M() {
1534
1535;V8MBASE:      ldrb    r{{[0-9]+}}, {{\[}}[[BASE:r[0-9]+]]{{\]}}
1536;V8MBASE:      adds    [[BASE]], #1
1537;V8MBASE-NOT:  movw
1538  entry:
1539    %a = alloca %struct.M, align 1
1540    call void @use_M(%struct.M* byval align 1 %a)
1541    ret void
1542  }
1543;V8MBASE-LABEL: test_N:
1544  define void @test_N() {
1545
1546;V8MBASE:      movw    r{{[0-9]+}}, #{{[0-9]+}}
1547;V8MBASE-NOT:  b       #{{[0-9]+}}
1548  entry:
1549    %a = alloca %struct.N, align 1
1550    call void @use_N(%struct.N* byval align 1 %a)
1551    ret void
1552  }
1553