xref: /llvm-project/llvm/test/CodeGen/ARM/store-preinc.ll (revision bed1c7f061aa12417aa081e334afdba45767b938)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv6m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T1
3; RUN: llc -mtriple=thumbv7m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T2
4; RUN: llc -mtriple=armv7a-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-ARM
5
6define ptr @i32_0(ptr %p, i32 %v) {
7; CHECK-LABEL: i32_0:
8; CHECK:       @ %bb.0:
9; CHECK-NEXT:    str r1, [r0]
10; CHECK-NEXT:    bx lr
11  store i32 %v, ptr %p, align 4
12  ret ptr %p
13}
14
15define ptr @i32_3(ptr %p, i32 %v) {
16; CHECK-T1-LABEL: i32_3:
17; CHECK-T1:       @ %bb.0:
18; CHECK-T1-NEXT:    movs r2, #3
19; CHECK-T1-NEXT:    str r1, [r0, r2]
20; CHECK-T1-NEXT:    adds r0, r0, #3
21; CHECK-T1-NEXT:    bx lr
22;
23; CHECK-T2-LABEL: i32_3:
24; CHECK-T2:       @ %bb.0:
25; CHECK-T2-NEXT:    str r1, [r0, #3]!
26; CHECK-T2-NEXT:    bx lr
27;
28; CHECK-ARM-LABEL: i32_3:
29; CHECK-ARM:       @ %bb.0:
30; CHECK-ARM-NEXT:    str r1, [r0, #3]!
31; CHECK-ARM-NEXT:    bx lr
32  %o = getelementptr inbounds i8, ptr %p, i32 3
33  store i32 %v, ptr %o, align 4
34  ret ptr %o
35}
36
37define ptr @i32_4(ptr %p, i32 %v) {
38; CHECK-T1-LABEL: i32_4:
39; CHECK-T1:       @ %bb.0:
40; CHECK-T1-NEXT:    str r1, [r0, #4]
41; CHECK-T1-NEXT:    adds r0, r0, #4
42; CHECK-T1-NEXT:    bx lr
43;
44; CHECK-T2-LABEL: i32_4:
45; CHECK-T2:       @ %bb.0:
46; CHECK-T2-NEXT:    str r1, [r0, #4]!
47; CHECK-T2-NEXT:    bx lr
48;
49; CHECK-ARM-LABEL: i32_4:
50; CHECK-ARM:       @ %bb.0:
51; CHECK-ARM-NEXT:    str r1, [r0, #4]!
52; CHECK-ARM-NEXT:    bx lr
53  %o = getelementptr inbounds i8, ptr %p, i32 4
54  store i32 %v, ptr %o, align 4
55  ret ptr %o
56}
57
58define ptr @i32_8(ptr %p, i32 %v) {
59; CHECK-T1-LABEL: i32_8:
60; CHECK-T1:       @ %bb.0:
61; CHECK-T1-NEXT:    str r1, [r0, #8]
62; CHECK-T1-NEXT:    adds r0, #8
63; CHECK-T1-NEXT:    bx lr
64;
65; CHECK-T2-LABEL: i32_8:
66; CHECK-T2:       @ %bb.0:
67; CHECK-T2-NEXT:    str r1, [r0, #8]!
68; CHECK-T2-NEXT:    bx lr
69;
70; CHECK-ARM-LABEL: i32_8:
71; CHECK-ARM:       @ %bb.0:
72; CHECK-ARM-NEXT:    str r1, [r0, #8]!
73; CHECK-ARM-NEXT:    bx lr
74  %o = getelementptr inbounds i8, ptr %p, i32 8
75  store i32 %v, ptr %o, align 4
76  ret ptr %o
77}
78
79define ptr @i32_m1(ptr %p, i32 %v) {
80; CHECK-T1-LABEL: i32_m1:
81; CHECK-T1:       @ %bb.0:
82; CHECK-T1-NEXT:    subs r0, r0, #1
83; CHECK-T1-NEXT:    str r1, [r0]
84; CHECK-T1-NEXT:    bx lr
85;
86; CHECK-T2-LABEL: i32_m1:
87; CHECK-T2:       @ %bb.0:
88; CHECK-T2-NEXT:    str r1, [r0, #-1]!
89; CHECK-T2-NEXT:    bx lr
90;
91; CHECK-ARM-LABEL: i32_m1:
92; CHECK-ARM:       @ %bb.0:
93; CHECK-ARM-NEXT:    str r1, [r0, #-1]!
94; CHECK-ARM-NEXT:    bx lr
95  %o = getelementptr inbounds i8, ptr %p, i32 -1
96  store i32 %v, ptr %o, align 4
97  ret ptr %o
98}
99
100define ptr @i32_m4(ptr %p, i32 %v) {
101; CHECK-T1-LABEL: i32_m4:
102; CHECK-T1:       @ %bb.0:
103; CHECK-T1-NEXT:    subs r0, r0, #4
104; CHECK-T1-NEXT:    str r1, [r0]
105; CHECK-T1-NEXT:    bx lr
106;
107; CHECK-T2-LABEL: i32_m4:
108; CHECK-T2:       @ %bb.0:
109; CHECK-T2-NEXT:    str r1, [r0, #-4]!
110; CHECK-T2-NEXT:    bx lr
111;
112; CHECK-ARM-LABEL: i32_m4:
113; CHECK-ARM:       @ %bb.0:
114; CHECK-ARM-NEXT:    str r1, [r0, #-4]!
115; CHECK-ARM-NEXT:    bx lr
116  %o = getelementptr inbounds i8, ptr %p, i32 -4
117  store i32 %v, ptr %o, align 4
118  ret ptr %o
119}
120
121define ptr @i32_252(ptr %p, i32 %v) {
122; CHECK-T1-LABEL: i32_252:
123; CHECK-T1:       @ %bb.0:
124; CHECK-T1-NEXT:    movs r2, #252
125; CHECK-T1-NEXT:    str r1, [r0, r2]
126; CHECK-T1-NEXT:    adds r0, #252
127; CHECK-T1-NEXT:    bx lr
128;
129; CHECK-T2-LABEL: i32_252:
130; CHECK-T2:       @ %bb.0:
131; CHECK-T2-NEXT:    str r1, [r0, #252]!
132; CHECK-T2-NEXT:    bx lr
133;
134; CHECK-ARM-LABEL: i32_252:
135; CHECK-ARM:       @ %bb.0:
136; CHECK-ARM-NEXT:    str r1, [r0, #252]!
137; CHECK-ARM-NEXT:    bx lr
138  %o = getelementptr inbounds i8, ptr %p, i32 252
139  store i32 %v, ptr %o, align 4
140  ret ptr %o
141}
142
143define ptr @i32_255(ptr %p, i32 %v) {
144; CHECK-T1-LABEL: i32_255:
145; CHECK-T1:       @ %bb.0:
146; CHECK-T1-NEXT:    movs r2, #255
147; CHECK-T1-NEXT:    str r1, [r0, r2]
148; CHECK-T1-NEXT:    adds r0, #255
149; CHECK-T1-NEXT:    bx lr
150;
151; CHECK-T2-LABEL: i32_255:
152; CHECK-T2:       @ %bb.0:
153; CHECK-T2-NEXT:    str r1, [r0, #255]!
154; CHECK-T2-NEXT:    bx lr
155;
156; CHECK-ARM-LABEL: i32_255:
157; CHECK-ARM:       @ %bb.0:
158; CHECK-ARM-NEXT:    str r1, [r0, #255]!
159; CHECK-ARM-NEXT:    bx lr
160  %o = getelementptr inbounds i8, ptr %p, i32 255
161  store i32 %v, ptr %o, align 4
162  ret ptr %o
163}
164
165define ptr @i32_256(ptr %p, i32 %v) {
166; CHECK-T1-LABEL: i32_256:
167; CHECK-T1:       @ %bb.0:
168; CHECK-T1-NEXT:    movs r2, #1
169; CHECK-T1-NEXT:    lsls r2, r2, #8
170; CHECK-T1-NEXT:    str r1, [r0, r2]
171; CHECK-T1-NEXT:    adds r0, r0, r2
172; CHECK-T1-NEXT:    bx lr
173;
174; CHECK-T2-LABEL: i32_256:
175; CHECK-T2:       @ %bb.0:
176; CHECK-T2-NEXT:    str.w r1, [r0, #256]
177; CHECK-T2-NEXT:    add.w r0, r0, #256
178; CHECK-T2-NEXT:    bx lr
179;
180; CHECK-ARM-LABEL: i32_256:
181; CHECK-ARM:       @ %bb.0:
182; CHECK-ARM-NEXT:    str r1, [r0, #256]!
183; CHECK-ARM-NEXT:    bx lr
184  %o = getelementptr inbounds i8, ptr %p, i32 256
185  store i32 %v, ptr %o, align 4
186  ret ptr %o
187}
188
189define ptr @i32_m252(ptr %p, i32 %v) {
190; CHECK-T1-LABEL: i32_m252:
191; CHECK-T1:       @ %bb.0:
192; CHECK-T1-NEXT:    subs r0, #252
193; CHECK-T1-NEXT:    str r1, [r0]
194; CHECK-T1-NEXT:    bx lr
195;
196; CHECK-T2-LABEL: i32_m252:
197; CHECK-T2:       @ %bb.0:
198; CHECK-T2-NEXT:    str r1, [r0, #-252]!
199; CHECK-T2-NEXT:    bx lr
200;
201; CHECK-ARM-LABEL: i32_m252:
202; CHECK-ARM:       @ %bb.0:
203; CHECK-ARM-NEXT:    str r1, [r0, #-252]!
204; CHECK-ARM-NEXT:    bx lr
205  %o = getelementptr inbounds i8, ptr %p, i32 -252
206  store i32 %v, ptr %o, align 4
207  ret ptr %o
208}
209
210define ptr @i32_m255(ptr %p, i32 %v) {
211; CHECK-T1-LABEL: i32_m255:
212; CHECK-T1:       @ %bb.0:
213; CHECK-T1-NEXT:    subs r0, #255
214; CHECK-T1-NEXT:    str r1, [r0]
215; CHECK-T1-NEXT:    bx lr
216;
217; CHECK-T2-LABEL: i32_m255:
218; CHECK-T2:       @ %bb.0:
219; CHECK-T2-NEXT:    str r1, [r0, #-255]!
220; CHECK-T2-NEXT:    bx lr
221;
222; CHECK-ARM-LABEL: i32_m255:
223; CHECK-ARM:       @ %bb.0:
224; CHECK-ARM-NEXT:    str r1, [r0, #-255]!
225; CHECK-ARM-NEXT:    bx lr
226  %o = getelementptr inbounds i8, ptr %p, i32 -255
227  store i32 %v, ptr %o, align 4
228  ret ptr %o
229}
230
231define ptr @i32_m256(ptr %p, i32 %v) {
232; CHECK-T1-LABEL: i32_m256:
233; CHECK-T1:       @ %bb.0:
234; CHECK-T1-NEXT:    movs r2, #255
235; CHECK-T1-NEXT:    mvns r2, r2
236; CHECK-T1-NEXT:    str r1, [r0, r2]
237; CHECK-T1-NEXT:    adds r0, r0, r2
238; CHECK-T1-NEXT:    bx lr
239;
240; CHECK-T2-LABEL: i32_m256:
241; CHECK-T2:       @ %bb.0:
242; CHECK-T2-NEXT:    mvn r2, #255
243; CHECK-T2-NEXT:    str r1, [r0, r2]
244; CHECK-T2-NEXT:    sub.w r0, r0, #256
245; CHECK-T2-NEXT:    bx lr
246;
247; CHECK-ARM-LABEL: i32_m256:
248; CHECK-ARM:       @ %bb.0:
249; CHECK-ARM-NEXT:    str r1, [r0, #-256]!
250; CHECK-ARM-NEXT:    bx lr
251  %o = getelementptr inbounds i8, ptr %p, i32 -256
252  store i32 %v, ptr %o, align 4
253  ret ptr %o
254}
255
256define ptr @i32_4095(ptr %p, i32 %v) {
257; CHECK-T1-LABEL: i32_4095:
258; CHECK-T1:       @ %bb.0:
259; CHECK-T1-NEXT:    ldr r2, .LCPI12_0
260; CHECK-T1-NEXT:    str r1, [r0, r2]
261; CHECK-T1-NEXT:    adds r0, r0, r2
262; CHECK-T1-NEXT:    bx lr
263; CHECK-T1-NEXT:    .p2align 2
264; CHECK-T1-NEXT:  @ %bb.1:
265; CHECK-T1-NEXT:  .LCPI12_0:
266; CHECK-T1-NEXT:    .long 4095 @ 0xfff
267;
268; CHECK-T2-LABEL: i32_4095:
269; CHECK-T2:       @ %bb.0:
270; CHECK-T2-NEXT:    str.w r1, [r0, #4095]
271; CHECK-T2-NEXT:    addw r0, r0, #4095
272; CHECK-T2-NEXT:    bx lr
273;
274; CHECK-ARM-LABEL: i32_4095:
275; CHECK-ARM:       @ %bb.0:
276; CHECK-ARM-NEXT:    str r1, [r0, #4095]!
277; CHECK-ARM-NEXT:    bx lr
278  %o = getelementptr inbounds i8, ptr %p, i32 4095
279  store i32 %v, ptr %o, align 4
280  ret ptr %o
281}
282
283define ptr @i32_4096(ptr %p, i32 %v) {
284; CHECK-T1-LABEL: i32_4096:
285; CHECK-T1:       @ %bb.0:
286; CHECK-T1-NEXT:    movs r2, #1
287; CHECK-T1-NEXT:    lsls r2, r2, #12
288; CHECK-T1-NEXT:    str r1, [r0, r2]
289; CHECK-T1-NEXT:    adds r0, r0, r2
290; CHECK-T1-NEXT:    bx lr
291;
292; CHECK-T2-LABEL: i32_4096:
293; CHECK-T2:       @ %bb.0:
294; CHECK-T2-NEXT:    mov.w r2, #4096
295; CHECK-T2-NEXT:    str r1, [r0, r2]
296; CHECK-T2-NEXT:    add.w r0, r0, #4096
297; CHECK-T2-NEXT:    bx lr
298;
299; CHECK-ARM-LABEL: i32_4096:
300; CHECK-ARM:       @ %bb.0:
301; CHECK-ARM-NEXT:    mov r2, #4096
302; CHECK-ARM-NEXT:    str r1, [r0, r2]!
303; CHECK-ARM-NEXT:    bx lr
304  %o = getelementptr inbounds i8, ptr %p, i32 4096
305  store i32 %v, ptr %o, align 4
306  ret ptr %o
307}
308
309define ptr @i32_m4095(ptr %p, i32 %v) {
310; CHECK-T1-LABEL: i32_m4095:
311; CHECK-T1:       @ %bb.0:
312; CHECK-T1-NEXT:    ldr r2, .LCPI14_0
313; CHECK-T1-NEXT:    str r1, [r0, r2]
314; CHECK-T1-NEXT:    adds r0, r0, r2
315; CHECK-T1-NEXT:    bx lr
316; CHECK-T1-NEXT:    .p2align 2
317; CHECK-T1-NEXT:  @ %bb.1:
318; CHECK-T1-NEXT:  .LCPI14_0:
319; CHECK-T1-NEXT:    .long 4294963201 @ 0xfffff001
320;
321; CHECK-T2-LABEL: i32_m4095:
322; CHECK-T2:       @ %bb.0:
323; CHECK-T2-NEXT:    movw r2, #61441
324; CHECK-T2-NEXT:    movt r2, #65535
325; CHECK-T2-NEXT:    str r1, [r0, r2]
326; CHECK-T2-NEXT:    subw r0, r0, #4095
327; CHECK-T2-NEXT:    bx lr
328;
329; CHECK-ARM-LABEL: i32_m4095:
330; CHECK-ARM:       @ %bb.0:
331; CHECK-ARM-NEXT:    str r1, [r0, #-4095]!
332; CHECK-ARM-NEXT:    bx lr
333  %o = getelementptr inbounds i8, ptr %p, i32 -4095
334  store i32 %v, ptr %o, align 4
335  ret ptr %o
336}
337
338define ptr @i32_m4096(ptr %p, i32 %v) {
339; CHECK-T1-LABEL: i32_m4096:
340; CHECK-T1:       @ %bb.0:
341; CHECK-T1-NEXT:    ldr r2, .LCPI15_0
342; CHECK-T1-NEXT:    str r1, [r0, r2]
343; CHECK-T1-NEXT:    adds r0, r0, r2
344; CHECK-T1-NEXT:    bx lr
345; CHECK-T1-NEXT:    .p2align 2
346; CHECK-T1-NEXT:  @ %bb.1:
347; CHECK-T1-NEXT:  .LCPI15_0:
348; CHECK-T1-NEXT:    .long 4294963200 @ 0xfffff000
349;
350; CHECK-T2-LABEL: i32_m4096:
351; CHECK-T2:       @ %bb.0:
352; CHECK-T2-NEXT:    movw r2, #61440
353; CHECK-T2-NEXT:    movt r2, #65535
354; CHECK-T2-NEXT:    str r1, [r0, r2]
355; CHECK-T2-NEXT:    sub.w r0, r0, #4096
356; CHECK-T2-NEXT:    bx lr
357;
358; CHECK-ARM-LABEL: i32_m4096:
359; CHECK-ARM:       @ %bb.0:
360; CHECK-ARM-NEXT:    movw r2, #61440
361; CHECK-ARM-NEXT:    movt r2, #65535
362; CHECK-ARM-NEXT:    str r1, [r0, r2]!
363; CHECK-ARM-NEXT:    bx lr
364  %o = getelementptr inbounds i8, ptr %p, i32 -4096
365  store i32 %v, ptr %o, align 4
366  ret ptr %o
367}
368
369define ptr @i64_0(ptr %p, i64 %v) {
370; CHECK-T1-LABEL: i64_0:
371; CHECK-T1:       @ %bb.0:
372; CHECK-T1-NEXT:    stm r0!, {r2, r3}
373; CHECK-T1-NEXT:    subs r0, #8
374; CHECK-T1-NEXT:    bx lr
375;
376; CHECK-T2-LABEL: i64_0:
377; CHECK-T2:       @ %bb.0:
378; CHECK-T2-NEXT:    strd r2, r3, [r0]
379; CHECK-T2-NEXT:    bx lr
380;
381; CHECK-ARM-LABEL: i64_0:
382; CHECK-ARM:       @ %bb.0:
383; CHECK-ARM-NEXT:    mov r1, r3
384; CHECK-ARM-NEXT:    str r2, [r0]
385; CHECK-ARM-NEXT:    str r1, [r0, #4]
386; CHECK-ARM-NEXT:    bx lr
387  store i64 %v, ptr %p, align 8
388  ret ptr %p
389}
390
391define ptr @i64_3(ptr %p, i64 %v) {
392; CHECK-T1-LABEL: i64_3:
393; CHECK-T1:       @ %bb.0:
394; CHECK-T1-NEXT:    movs r1, #3
395; CHECK-T1-NEXT:    str r2, [r0, r1]
396; CHECK-T1-NEXT:    adds r0, r0, #3
397; CHECK-T1-NEXT:    str r3, [r0, #4]
398; CHECK-T1-NEXT:    bx lr
399;
400; CHECK-T2-LABEL: i64_3:
401; CHECK-T2:       @ %bb.0:
402; CHECK-T2-NEXT:    str r2, [r0, #3]!
403; CHECK-T2-NEXT:    str r3, [r0, #4]
404; CHECK-T2-NEXT:    bx lr
405;
406; CHECK-ARM-LABEL: i64_3:
407; CHECK-ARM:       @ %bb.0:
408; CHECK-ARM-NEXT:    str r2, [r0, #3]!
409; CHECK-ARM-NEXT:    str r3, [r0, #4]
410; CHECK-ARM-NEXT:    bx lr
411  %o = getelementptr inbounds i8, ptr %p, i32 3
412  store i64 %v, ptr %o, align 8
413  ret ptr %o
414}
415
416define ptr @i64_4(ptr %p, i64 %v) {
417; CHECK-T1-LABEL: i64_4:
418; CHECK-T1:       @ %bb.0:
419; CHECK-T1-NEXT:    str r2, [r0, #4]
420; CHECK-T1-NEXT:    str r3, [r0, #8]
421; CHECK-T1-NEXT:    adds r0, r0, #4
422; CHECK-T1-NEXT:    bx lr
423;
424; CHECK-T2-LABEL: i64_4:
425; CHECK-T2:       @ %bb.0:
426; CHECK-T2-NEXT:    str r2, [r0, #4]!
427; CHECK-T2-NEXT:    str r3, [r0, #4]
428; CHECK-T2-NEXT:    bx lr
429;
430; CHECK-ARM-LABEL: i64_4:
431; CHECK-ARM:       @ %bb.0:
432; CHECK-ARM-NEXT:    str r2, [r0, #4]!
433; CHECK-ARM-NEXT:    str r3, [r0, #4]
434; CHECK-ARM-NEXT:    bx lr
435  %o = getelementptr inbounds i8, ptr %p, i32 4
436  store i64 %v, ptr %o, align 8
437  ret ptr %o
438}
439
440define ptr @i64_8(ptr %p, i64 %v) {
441; CHECK-T1-LABEL: i64_8:
442; CHECK-T1:       @ %bb.0:
443; CHECK-T1-NEXT:    str r2, [r0, #8]
444; CHECK-T1-NEXT:    str r3, [r0, #12]
445; CHECK-T1-NEXT:    adds r0, #8
446; CHECK-T1-NEXT:    bx lr
447;
448; CHECK-T2-LABEL: i64_8:
449; CHECK-T2:       @ %bb.0:
450; CHECK-T2-NEXT:    str r2, [r0, #8]!
451; CHECK-T2-NEXT:    str r3, [r0, #4]
452; CHECK-T2-NEXT:    bx lr
453;
454; CHECK-ARM-LABEL: i64_8:
455; CHECK-ARM:       @ %bb.0:
456; CHECK-ARM-NEXT:    str r2, [r0, #8]!
457; CHECK-ARM-NEXT:    str r3, [r0, #4]
458; CHECK-ARM-NEXT:    bx lr
459  %o = getelementptr inbounds i8, ptr %p, i32 8
460  store i64 %v, ptr %o, align 8
461  ret ptr %o
462}
463
464define ptr @i64_m1(ptr %p, i64 %v) {
465; CHECK-T1-LABEL: i64_m1:
466; CHECK-T1:       @ %bb.0:
467; CHECK-T1-NEXT:    subs r0, r0, #1
468; CHECK-T1-NEXT:    stm r0!, {r2, r3}
469; CHECK-T1-NEXT:    subs r0, #8
470; CHECK-T1-NEXT:    bx lr
471;
472; CHECK-T2-LABEL: i64_m1:
473; CHECK-T2:       @ %bb.0:
474; CHECK-T2-NEXT:    str r2, [r0, #-1]!
475; CHECK-T2-NEXT:    str r3, [r0, #4]
476; CHECK-T2-NEXT:    bx lr
477;
478; CHECK-ARM-LABEL: i64_m1:
479; CHECK-ARM:       @ %bb.0:
480; CHECK-ARM-NEXT:    str r2, [r0, #-1]!
481; CHECK-ARM-NEXT:    str r3, [r0, #4]
482; CHECK-ARM-NEXT:    bx lr
483  %o = getelementptr inbounds i8, ptr %p, i32 -1
484  store i64 %v, ptr %o, align 8
485  ret ptr %o
486}
487
488define ptr @i64_m4(ptr %p, i64 %v) {
489; CHECK-T1-LABEL: i64_m4:
490; CHECK-T1:       @ %bb.0:
491; CHECK-T1-NEXT:    str r3, [r0]
492; CHECK-T1-NEXT:    subs r0, r0, #4
493; CHECK-T1-NEXT:    str r2, [r0]
494; CHECK-T1-NEXT:    bx lr
495;
496; CHECK-T2-LABEL: i64_m4:
497; CHECK-T2:       @ %bb.0:
498; CHECK-T2-NEXT:    str r3, [r0]
499; CHECK-T2-NEXT:    str r2, [r0, #-4]!
500; CHECK-T2-NEXT:    bx lr
501;
502; CHECK-ARM-LABEL: i64_m4:
503; CHECK-ARM:       @ %bb.0:
504; CHECK-ARM-NEXT:    str r3, [r0]
505; CHECK-ARM-NEXT:    str r2, [r0, #-4]!
506; CHECK-ARM-NEXT:    bx lr
507  %o = getelementptr inbounds i8, ptr %p, i32 -4
508  store i64 %v, ptr %o, align 8
509  ret ptr %o
510}
511
512define ptr @i64_252(ptr %p, i64 %v) {
513; CHECK-T1-LABEL: i64_252:
514; CHECK-T1:       @ %bb.0:
515; CHECK-T1-NEXT:    movs r1, #252
516; CHECK-T1-NEXT:    str r2, [r0, r1]
517; CHECK-T1-NEXT:    adds r0, #252
518; CHECK-T1-NEXT:    str r3, [r0, #4]
519; CHECK-T1-NEXT:    bx lr
520;
521; CHECK-T2-LABEL: i64_252:
522; CHECK-T2:       @ %bb.0:
523; CHECK-T2-NEXT:    str r2, [r0, #252]!
524; CHECK-T2-NEXT:    str r3, [r0, #4]
525; CHECK-T2-NEXT:    bx lr
526;
527; CHECK-ARM-LABEL: i64_252:
528; CHECK-ARM:       @ %bb.0:
529; CHECK-ARM-NEXT:    str r2, [r0, #252]!
530; CHECK-ARM-NEXT:    str r3, [r0, #4]
531; CHECK-ARM-NEXT:    bx lr
532  %o = getelementptr inbounds i8, ptr %p, i32 252
533  store i64 %v, ptr %o, align 8
534  ret ptr %o
535}
536
537define ptr @i64_255(ptr %p, i64 %v) {
538; CHECK-T1-LABEL: i64_255:
539; CHECK-T1:       @ %bb.0:
540; CHECK-T1-NEXT:    movs r1, #255
541; CHECK-T1-NEXT:    str r2, [r0, r1]
542; CHECK-T1-NEXT:    adds r0, #255
543; CHECK-T1-NEXT:    str r3, [r0, #4]
544; CHECK-T1-NEXT:    bx lr
545;
546; CHECK-T2-LABEL: i64_255:
547; CHECK-T2:       @ %bb.0:
548; CHECK-T2-NEXT:    str r2, [r0, #255]!
549; CHECK-T2-NEXT:    str r3, [r0, #4]
550; CHECK-T2-NEXT:    bx lr
551;
552; CHECK-ARM-LABEL: i64_255:
553; CHECK-ARM:       @ %bb.0:
554; CHECK-ARM-NEXT:    str r2, [r0, #255]!
555; CHECK-ARM-NEXT:    str r3, [r0, #4]
556; CHECK-ARM-NEXT:    bx lr
557  %o = getelementptr inbounds i8, ptr %p, i32 255
558  store i64 %v, ptr %o, align 8
559  ret ptr %o
560}
561
562define ptr @i64_256(ptr %p, i64 %v) {
563; CHECK-T1-LABEL: i64_256:
564; CHECK-T1:       @ %bb.0:
565; CHECK-T1-NEXT:    movs r1, #1
566; CHECK-T1-NEXT:    lsls r1, r1, #8
567; CHECK-T1-NEXT:    str r2, [r0, r1]
568; CHECK-T1-NEXT:    adds r0, r0, r1
569; CHECK-T1-NEXT:    str r3, [r0, #4]
570; CHECK-T1-NEXT:    bx lr
571;
572; CHECK-T2-LABEL: i64_256:
573; CHECK-T2:       @ %bb.0:
574; CHECK-T2-NEXT:    strd r2, r3, [r0, #256]
575; CHECK-T2-NEXT:    add.w r0, r0, #256
576; CHECK-T2-NEXT:    bx lr
577;
578; CHECK-ARM-LABEL: i64_256:
579; CHECK-ARM:       @ %bb.0:
580; CHECK-ARM-NEXT:    str r2, [r0, #256]!
581; CHECK-ARM-NEXT:    str r3, [r0, #4]
582; CHECK-ARM-NEXT:    bx lr
583  %o = getelementptr inbounds i8, ptr %p, i32 256
584  store i64 %v, ptr %o, align 8
585  ret ptr %o
586}
587
588define ptr @i64_m252(ptr %p, i64 %v) {
589; CHECK-T1-LABEL: i64_m252:
590; CHECK-T1:       @ %bb.0:
591; CHECK-T1-NEXT:    subs r0, #252
592; CHECK-T1-NEXT:    stm r0!, {r2, r3}
593; CHECK-T1-NEXT:    subs r0, #8
594; CHECK-T1-NEXT:    bx lr
595;
596; CHECK-T2-LABEL: i64_m252:
597; CHECK-T2:       @ %bb.0:
598; CHECK-T2-NEXT:    str r2, [r0, #-252]!
599; CHECK-T2-NEXT:    str r3, [r0, #4]
600; CHECK-T2-NEXT:    bx lr
601;
602; CHECK-ARM-LABEL: i64_m252:
603; CHECK-ARM:       @ %bb.0:
604; CHECK-ARM-NEXT:    str r2, [r0, #-252]!
605; CHECK-ARM-NEXT:    str r3, [r0, #4]
606; CHECK-ARM-NEXT:    bx lr
607  %o = getelementptr inbounds i8, ptr %p, i32 -252
608  store i64 %v, ptr %o, align 8
609  ret ptr %o
610}
611
612define ptr @i64_m255(ptr %p, i64 %v) {
613; CHECK-T1-LABEL: i64_m255:
614; CHECK-T1:       @ %bb.0:
615; CHECK-T1-NEXT:    subs r0, #255
616; CHECK-T1-NEXT:    stm r0!, {r2, r3}
617; CHECK-T1-NEXT:    subs r0, #8
618; CHECK-T1-NEXT:    bx lr
619;
620; CHECK-T2-LABEL: i64_m255:
621; CHECK-T2:       @ %bb.0:
622; CHECK-T2-NEXT:    str r2, [r0, #-255]!
623; CHECK-T2-NEXT:    str r3, [r0, #4]
624; CHECK-T2-NEXT:    bx lr
625;
626; CHECK-ARM-LABEL: i64_m255:
627; CHECK-ARM:       @ %bb.0:
628; CHECK-ARM-NEXT:    str r2, [r0, #-255]!
629; CHECK-ARM-NEXT:    str r3, [r0, #4]
630; CHECK-ARM-NEXT:    bx lr
631  %o = getelementptr inbounds i8, ptr %p, i32 -255
632  store i64 %v, ptr %o, align 8
633  ret ptr %o
634}
635
636define ptr @i64_m256(ptr %p, i64 %v) {
637; CHECK-T1-LABEL: i64_m256:
638; CHECK-T1:       @ %bb.0:
639; CHECK-T1-NEXT:    movs r1, #255
640; CHECK-T1-NEXT:    mvns r1, r1
641; CHECK-T1-NEXT:    str r2, [r0, r1]
642; CHECK-T1-NEXT:    adds r0, r0, r1
643; CHECK-T1-NEXT:    str r3, [r0, #4]
644; CHECK-T1-NEXT:    bx lr
645;
646; CHECK-T2-LABEL: i64_m256:
647; CHECK-T2:       @ %bb.0:
648; CHECK-T2-NEXT:    mvn r1, #255
649; CHECK-T2-NEXT:    str r3, [r0, #-252]
650; CHECK-T2-NEXT:    str r2, [r0, r1]
651; CHECK-T2-NEXT:    sub.w r0, r0, #256
652; CHECK-T2-NEXT:    bx lr
653;
654; CHECK-ARM-LABEL: i64_m256:
655; CHECK-ARM:       @ %bb.0:
656; CHECK-ARM-NEXT:    str r2, [r0, #-256]!
657; CHECK-ARM-NEXT:    str r3, [r0, #4]
658; CHECK-ARM-NEXT:    bx lr
659  %o = getelementptr inbounds i8, ptr %p, i32 -256
660  store i64 %v, ptr %o, align 8
661  ret ptr %o
662}
663
664define ptr @i64_4095(ptr %p, i64 %v) {
665; CHECK-T1-LABEL: i64_4095:
666; CHECK-T1:       @ %bb.0:
667; CHECK-T1-NEXT:    ldr r1, .LCPI28_0
668; CHECK-T1-NEXT:    str r2, [r0, r1]
669; CHECK-T1-NEXT:    adds r0, r0, r1
670; CHECK-T1-NEXT:    str r3, [r0, #4]
671; CHECK-T1-NEXT:    bx lr
672; CHECK-T1-NEXT:    .p2align 2
673; CHECK-T1-NEXT:  @ %bb.1:
674; CHECK-T1-NEXT:  .LCPI28_0:
675; CHECK-T1-NEXT:    .long 4095 @ 0xfff
676;
677; CHECK-T2-LABEL: i64_4095:
678; CHECK-T2:       @ %bb.0:
679; CHECK-T2-NEXT:    str.w r2, [r0, #4095]
680; CHECK-T2-NEXT:    addw r0, r0, #4095
681; CHECK-T2-NEXT:    str r3, [r0, #4]
682; CHECK-T2-NEXT:    bx lr
683;
684; CHECK-ARM-LABEL: i64_4095:
685; CHECK-ARM:       @ %bb.0:
686; CHECK-ARM-NEXT:    str r2, [r0, #4095]!
687; CHECK-ARM-NEXT:    str r3, [r0, #4]
688; CHECK-ARM-NEXT:    bx lr
689  %o = getelementptr inbounds i8, ptr %p, i32 4095
690  store i64 %v, ptr %o, align 8
691  ret ptr %o
692}
693
694define ptr @i64_4096(ptr %p, i64 %v) {
695; CHECK-T1-LABEL: i64_4096:
696; CHECK-T1:       @ %bb.0:
697; CHECK-T1-NEXT:    movs r1, #1
698; CHECK-T1-NEXT:    lsls r1, r1, #12
699; CHECK-T1-NEXT:    str r2, [r0, r1]
700; CHECK-T1-NEXT:    adds r0, r0, r1
701; CHECK-T1-NEXT:    str r3, [r0, #4]
702; CHECK-T1-NEXT:    bx lr
703;
704; CHECK-T2-LABEL: i64_4096:
705; CHECK-T2:       @ %bb.0:
706; CHECK-T2-NEXT:    mov.w r1, #4096
707; CHECK-T2-NEXT:    str r2, [r0, r1]
708; CHECK-T2-NEXT:    add.w r0, r0, #4096
709; CHECK-T2-NEXT:    str r3, [r0, #4]
710; CHECK-T2-NEXT:    bx lr
711;
712; CHECK-ARM-LABEL: i64_4096:
713; CHECK-ARM:       @ %bb.0:
714; CHECK-ARM-NEXT:    mov r1, #4096
715; CHECK-ARM-NEXT:    str r2, [r0, r1]!
716; CHECK-ARM-NEXT:    str r3, [r0, #4]
717; CHECK-ARM-NEXT:    bx lr
718  %o = getelementptr inbounds i8, ptr %p, i32 4096
719  store i64 %v, ptr %o, align 8
720  ret ptr %o
721}
722
723define ptr @i64_m4095(ptr %p, i64 %v) {
724; CHECK-T1-LABEL: i64_m4095:
725; CHECK-T1:       @ %bb.0:
726; CHECK-T1-NEXT:    ldr r1, .LCPI30_0
727; CHECK-T1-NEXT:    str r2, [r0, r1]
728; CHECK-T1-NEXT:    adds r0, r0, r1
729; CHECK-T1-NEXT:    str r3, [r0, #4]
730; CHECK-T1-NEXT:    bx lr
731; CHECK-T1-NEXT:    .p2align 2
732; CHECK-T1-NEXT:  @ %bb.1:
733; CHECK-T1-NEXT:  .LCPI30_0:
734; CHECK-T1-NEXT:    .long 4294963201 @ 0xfffff001
735;
736; CHECK-T2-LABEL: i64_m4095:
737; CHECK-T2:       @ %bb.0:
738; CHECK-T2-NEXT:    movw r1, #61441
739; CHECK-T2-NEXT:    movt r1, #65535
740; CHECK-T2-NEXT:    str r2, [r0, r1]
741; CHECK-T2-NEXT:    subw r0, r0, #4095
742; CHECK-T2-NEXT:    str r3, [r0, #4]
743; CHECK-T2-NEXT:    bx lr
744;
745; CHECK-ARM-LABEL: i64_m4095:
746; CHECK-ARM:       @ %bb.0:
747; CHECK-ARM-NEXT:    str r2, [r0, #-4095]!
748; CHECK-ARM-NEXT:    str r3, [r0, #4]
749; CHECK-ARM-NEXT:    bx lr
750  %o = getelementptr inbounds i8, ptr %p, i32 -4095
751  store i64 %v, ptr %o, align 8
752  ret ptr %o
753}
754
755define ptr @i64_m4096(ptr %p, i64 %v) {
756; CHECK-T1-LABEL: i64_m4096:
757; CHECK-T1:       @ %bb.0:
758; CHECK-T1-NEXT:    ldr r1, .LCPI31_0
759; CHECK-T1-NEXT:    str r2, [r0, r1]
760; CHECK-T1-NEXT:    adds r0, r0, r1
761; CHECK-T1-NEXT:    str r3, [r0, #4]
762; CHECK-T1-NEXT:    bx lr
763; CHECK-T1-NEXT:    .p2align 2
764; CHECK-T1-NEXT:  @ %bb.1:
765; CHECK-T1-NEXT:  .LCPI31_0:
766; CHECK-T1-NEXT:    .long 4294963200 @ 0xfffff000
767;
768; CHECK-T2-LABEL: i64_m4096:
769; CHECK-T2:       @ %bb.0:
770; CHECK-T2-NEXT:    movw r1, #61440
771; CHECK-T2-NEXT:    movt r1, #65535
772; CHECK-T2-NEXT:    str r2, [r0, r1]
773; CHECK-T2-NEXT:    sub.w r0, r0, #4096
774; CHECK-T2-NEXT:    str r3, [r0, #4]
775; CHECK-T2-NEXT:    bx lr
776;
777; CHECK-ARM-LABEL: i64_m4096:
778; CHECK-ARM:       @ %bb.0:
779; CHECK-ARM-NEXT:    movw r1, #61440
780; CHECK-ARM-NEXT:    movt r1, #65535
781; CHECK-ARM-NEXT:    str r2, [r0, r1]!
782; CHECK-ARM-NEXT:    str r3, [r0, #4]
783; CHECK-ARM-NEXT:    bx lr
784  %o = getelementptr inbounds i8, ptr %p, i32 -4096
785  store i64 %v, ptr %o, align 8
786  ret ptr %o
787}
788
789define ptr @i128_0(ptr %p, i128 %v) {
790; CHECK-T1-LABEL: i128_0:
791; CHECK-T1:       @ %bb.0:
792; CHECK-T1-NEXT:    ldr r1, [sp, #4]
793; CHECK-T1-NEXT:    str r1, [r0, #12]
794; CHECK-T1-NEXT:    ldr r1, [sp]
795; CHECK-T1-NEXT:    str r1, [r0, #8]
796; CHECK-T1-NEXT:    stm r0!, {r2, r3}
797; CHECK-T1-NEXT:    subs r0, #8
798; CHECK-T1-NEXT:    bx lr
799;
800; CHECK-T2-LABEL: i128_0:
801; CHECK-T2:       @ %bb.0:
802; CHECK-T2-NEXT:    ldr r1, [sp, #4]
803; CHECK-T2-NEXT:    str r1, [r0, #12]
804; CHECK-T2-NEXT:    ldr r1, [sp]
805; CHECK-T2-NEXT:    str r1, [r0, #8]
806; CHECK-T2-NEXT:    strd r2, r3, [r0]
807; CHECK-T2-NEXT:    bx lr
808;
809; CHECK-ARM-LABEL: i128_0:
810; CHECK-ARM:       @ %bb.0:
811; CHECK-ARM-NEXT:    ldm sp, {r1, r12}
812; CHECK-ARM-NEXT:    stm r0, {r2, r3}
813; CHECK-ARM-NEXT:    str r1, [r0, #8]
814; CHECK-ARM-NEXT:    str r12, [r0, #12]
815; CHECK-ARM-NEXT:    bx lr
816  store i128 %v, ptr %p, align 16
817  ret ptr %p
818}
819
820define ptr @i128_3(ptr %p, i128 %v) {
821; CHECK-T1-LABEL: i128_3:
822; CHECK-T1:       @ %bb.0:
823; CHECK-T1-NEXT:    movs r1, #3
824; CHECK-T1-NEXT:    str r2, [r0, r1]
825; CHECK-T1-NEXT:    adds r0, r0, #3
826; CHECK-T1-NEXT:    ldr r1, [sp, #4]
827; CHECK-T1-NEXT:    str r1, [r0, #12]
828; CHECK-T1-NEXT:    ldr r1, [sp]
829; CHECK-T1-NEXT:    str r1, [r0, #8]
830; CHECK-T1-NEXT:    str r3, [r0, #4]
831; CHECK-T1-NEXT:    bx lr
832;
833; CHECK-T2-LABEL: i128_3:
834; CHECK-T2:       @ %bb.0:
835; CHECK-T2-NEXT:    str r2, [r0, #3]!
836; CHECK-T2-NEXT:    ldr r1, [sp, #4]
837; CHECK-T2-NEXT:    str r1, [r0, #12]
838; CHECK-T2-NEXT:    ldr r1, [sp]
839; CHECK-T2-NEXT:    strd r3, r1, [r0, #4]
840; CHECK-T2-NEXT:    bx lr
841;
842; CHECK-ARM-LABEL: i128_3:
843; CHECK-ARM:       @ %bb.0:
844; CHECK-ARM-NEXT:    str r2, [r0, #3]!
845; CHECK-ARM-NEXT:    ldm sp, {r1, r12}
846; CHECK-ARM-NEXT:    str r3, [r0, #4]
847; CHECK-ARM-NEXT:    str r1, [r0, #8]
848; CHECK-ARM-NEXT:    str r12, [r0, #12]
849; CHECK-ARM-NEXT:    bx lr
850  %o = getelementptr inbounds i8, ptr %p, i32 3
851  store i128 %v, ptr %o, align 16
852  ret ptr %o
853}
854
855define ptr @i128_4(ptr %p, i128 %v) {
856; CHECK-T1-LABEL: i128_4:
857; CHECK-T1:       @ %bb.0:
858; CHECK-T1-NEXT:    ldr r1, [sp, #4]
859; CHECK-T1-NEXT:    str r1, [r0, #16]
860; CHECK-T1-NEXT:    ldr r1, [sp]
861; CHECK-T1-NEXT:    str r1, [r0, #12]
862; CHECK-T1-NEXT:    str r3, [r0, #8]
863; CHECK-T1-NEXT:    str r2, [r0, #4]
864; CHECK-T1-NEXT:    adds r0, r0, #4
865; CHECK-T1-NEXT:    bx lr
866;
867; CHECK-T2-LABEL: i128_4:
868; CHECK-T2:       @ %bb.0:
869; CHECK-T2-NEXT:    str r2, [r0, #4]!
870; CHECK-T2-NEXT:    ldr r1, [sp, #4]
871; CHECK-T2-NEXT:    str r1, [r0, #12]
872; CHECK-T2-NEXT:    ldr r1, [sp]
873; CHECK-T2-NEXT:    strd r3, r1, [r0, #4]
874; CHECK-T2-NEXT:    bx lr
875;
876; CHECK-ARM-LABEL: i128_4:
877; CHECK-ARM:       @ %bb.0:
878; CHECK-ARM-NEXT:    str r2, [r0, #4]!
879; CHECK-ARM-NEXT:    ldm sp, {r1, r12}
880; CHECK-ARM-NEXT:    str r3, [r0, #4]
881; CHECK-ARM-NEXT:    str r1, [r0, #8]
882; CHECK-ARM-NEXT:    str r12, [r0, #12]
883; CHECK-ARM-NEXT:    bx lr
884  %o = getelementptr inbounds i8, ptr %p, i32 4
885  store i128 %v, ptr %o, align 16
886  ret ptr %o
887}
888
889define ptr @i128_8(ptr %p, i128 %v) {
890; CHECK-T1-LABEL: i128_8:
891; CHECK-T1:       @ %bb.0:
892; CHECK-T1-NEXT:    ldr r1, [sp, #4]
893; CHECK-T1-NEXT:    str r1, [r0, #20]
894; CHECK-T1-NEXT:    ldr r1, [sp]
895; CHECK-T1-NEXT:    str r1, [r0, #16]
896; CHECK-T1-NEXT:    str r3, [r0, #12]
897; CHECK-T1-NEXT:    str r2, [r0, #8]
898; CHECK-T1-NEXT:    adds r0, #8
899; CHECK-T1-NEXT:    bx lr
900;
901; CHECK-T2-LABEL: i128_8:
902; CHECK-T2:       @ %bb.0:
903; CHECK-T2-NEXT:    str r2, [r0, #8]!
904; CHECK-T2-NEXT:    ldr r1, [sp, #4]
905; CHECK-T2-NEXT:    str r1, [r0, #12]
906; CHECK-T2-NEXT:    ldr r1, [sp]
907; CHECK-T2-NEXT:    strd r3, r1, [r0, #4]
908; CHECK-T2-NEXT:    bx lr
909;
910; CHECK-ARM-LABEL: i128_8:
911; CHECK-ARM:       @ %bb.0:
912; CHECK-ARM-NEXT:    str r2, [r0, #8]!
913; CHECK-ARM-NEXT:    ldm sp, {r1, r12}
914; CHECK-ARM-NEXT:    str r3, [r0, #4]
915; CHECK-ARM-NEXT:    str r1, [r0, #8]
916; CHECK-ARM-NEXT:    str r12, [r0, #12]
917; CHECK-ARM-NEXT:    bx lr
918  %o = getelementptr inbounds i8, ptr %p, i32 8
919  store i128 %v, ptr %o, align 16
920  ret ptr %o
921}
922
923define ptr @i128_16(ptr %p, i128 %v) {
924; CHECK-T1-LABEL: i128_16:
925; CHECK-T1:       @ %bb.0:
926; CHECK-T1-NEXT:    ldr r1, [sp, #4]
927; CHECK-T1-NEXT:    str r1, [r0, #28]
928; CHECK-T1-NEXT:    ldr r1, [sp]
929; CHECK-T1-NEXT:    str r1, [r0, #24]
930; CHECK-T1-NEXT:    str r3, [r0, #20]
931; CHECK-T1-NEXT:    str r2, [r0, #16]
932; CHECK-T1-NEXT:    adds r0, #16
933; CHECK-T1-NEXT:    bx lr
934;
935; CHECK-T2-LABEL: i128_16:
936; CHECK-T2:       @ %bb.0:
937; CHECK-T2-NEXT:    str r2, [r0, #16]!
938; CHECK-T2-NEXT:    ldr r1, [sp, #4]
939; CHECK-T2-NEXT:    str r1, [r0, #12]
940; CHECK-T2-NEXT:    ldr r1, [sp]
941; CHECK-T2-NEXT:    strd r3, r1, [r0, #4]
942; CHECK-T2-NEXT:    bx lr
943;
944; CHECK-ARM-LABEL: i128_16:
945; CHECK-ARM:       @ %bb.0:
946; CHECK-ARM-NEXT:    str r2, [r0, #16]!
947; CHECK-ARM-NEXT:    ldm sp, {r1, r12}
948; CHECK-ARM-NEXT:    str r3, [r0, #4]
949; CHECK-ARM-NEXT:    str r1, [r0, #8]
950; CHECK-ARM-NEXT:    str r12, [r0, #12]
951; CHECK-ARM-NEXT:    bx lr
952  %o = getelementptr inbounds i8, ptr %p, i32 16
953  store i128 %v, ptr %o, align 16
954  ret ptr %o
955}
956
957define ptr @i128_m1(ptr %p, i128 %v) {
958; CHECK-T1-LABEL: i128_m1:
959; CHECK-T1:       @ %bb.0:
960; CHECK-T1-NEXT:    subs r0, r0, #1
961; CHECK-T1-NEXT:    ldr r1, [sp, #4]
962; CHECK-T1-NEXT:    str r1, [r0, #12]
963; CHECK-T1-NEXT:    ldr r1, [sp]
964; CHECK-T1-NEXT:    str r1, [r0, #8]
965; CHECK-T1-NEXT:    stm r0!, {r2, r3}
966; CHECK-T1-NEXT:    subs r0, #8
967; CHECK-T1-NEXT:    bx lr
968;
969; CHECK-T2-LABEL: i128_m1:
970; CHECK-T2:       @ %bb.0:
971; CHECK-T2-NEXT:    str r2, [r0, #-1]!
972; CHECK-T2-NEXT:    ldr r1, [sp, #4]
973; CHECK-T2-NEXT:    str r1, [r0, #12]
974; CHECK-T2-NEXT:    ldr r1, [sp]
975; CHECK-T2-NEXT:    strd r3, r1, [r0, #4]
976; CHECK-T2-NEXT:    bx lr
977;
978; CHECK-ARM-LABEL: i128_m1:
979; CHECK-ARM:       @ %bb.0:
980; CHECK-ARM-NEXT:    str r2, [r0, #-1]!
981; CHECK-ARM-NEXT:    ldm sp, {r1, r12}
982; CHECK-ARM-NEXT:    str r3, [r0, #4]
983; CHECK-ARM-NEXT:    str r1, [r0, #8]
984; CHECK-ARM-NEXT:    str r12, [r0, #12]
985; CHECK-ARM-NEXT:    bx lr
986  %o = getelementptr inbounds i8, ptr %p, i32 -1
987  store i128 %v, ptr %o, align 16
988  ret ptr %o
989}
990
991define ptr @i128_m4(ptr %p, i128 %v) {
992; CHECK-T1-LABEL: i128_m4:
993; CHECK-T1:       @ %bb.0:
994; CHECK-T1-NEXT:    ldr r1, [sp, #4]
995; CHECK-T1-NEXT:    str r1, [r0, #8]
996; CHECK-T1-NEXT:    ldr r1, [sp]
997; CHECK-T1-NEXT:    str r1, [r0, #4]
998; CHECK-T1-NEXT:    str r3, [r0]
999; CHECK-T1-NEXT:    subs r0, r0, #4
1000; CHECK-T1-NEXT:    str r2, [r0]
1001; CHECK-T1-NEXT:    bx lr
1002;
1003; CHECK-T2-LABEL: i128_m4:
1004; CHECK-T2:       @ %bb.0:
1005; CHECK-T2-NEXT:    ldr r1, [sp, #4]
1006; CHECK-T2-NEXT:    str r1, [r0, #8]
1007; CHECK-T2-NEXT:    ldr r1, [sp]
1008; CHECK-T2-NEXT:    strd r3, r1, [r0]
1009; CHECK-T2-NEXT:    str r2, [r0, #-4]!
1010; CHECK-T2-NEXT:    bx lr
1011;
1012; CHECK-ARM-LABEL: i128_m4:
1013; CHECK-ARM:       @ %bb.0:
1014; CHECK-ARM-NEXT:    ldm sp, {r1, r12}
1015; CHECK-ARM-NEXT:    str r3, [r0]
1016; CHECK-ARM-NEXT:    stmib r0, {r1, r12}
1017; CHECK-ARM-NEXT:    str r2, [r0, #-4]!
1018; CHECK-ARM-NEXT:    bx lr
1019  %o = getelementptr inbounds i8, ptr %p, i32 -4
1020  store i128 %v, ptr %o, align 16
1021  ret ptr %o
1022}
1023
1024; i16
1025
1026define ptr @i16_0(ptr %p, i16 %v) {
1027; CHECK-LABEL: i16_0:
1028; CHECK:       @ %bb.0:
1029; CHECK-NEXT:    strh r1, [r0]
1030; CHECK-NEXT:    bx lr
1031  store i16 %v, ptr %p, align 2
1032  ret ptr %p
1033}
1034
1035define ptr @i16_3(ptr %p, i16 %v) {
1036; CHECK-T1-LABEL: i16_3:
1037; CHECK-T1:       @ %bb.0:
1038; CHECK-T1-NEXT:    movs r2, #3
1039; CHECK-T1-NEXT:    strh r1, [r0, r2]
1040; CHECK-T1-NEXT:    adds r0, r0, #3
1041; CHECK-T1-NEXT:    bx lr
1042;
1043; CHECK-T2-LABEL: i16_3:
1044; CHECK-T2:       @ %bb.0:
1045; CHECK-T2-NEXT:    strh r1, [r0, #3]!
1046; CHECK-T2-NEXT:    bx lr
1047;
1048; CHECK-ARM-LABEL: i16_3:
1049; CHECK-ARM:       @ %bb.0:
1050; CHECK-ARM-NEXT:    strh r1, [r0, #3]!
1051; CHECK-ARM-NEXT:    bx lr
1052  %o = getelementptr inbounds i8, ptr %p, i32 3
1053  store i16 %v, ptr %o, align 2
1054  ret ptr %o
1055}
1056
1057define ptr @i16_4(ptr %p, i16 %v) {
1058; CHECK-T1-LABEL: i16_4:
1059; CHECK-T1:       @ %bb.0:
1060; CHECK-T1-NEXT:    strh r1, [r0, #4]
1061; CHECK-T1-NEXT:    adds r0, r0, #4
1062; CHECK-T1-NEXT:    bx lr
1063;
1064; CHECK-T2-LABEL: i16_4:
1065; CHECK-T2:       @ %bb.0:
1066; CHECK-T2-NEXT:    strh r1, [r0, #4]!
1067; CHECK-T2-NEXT:    bx lr
1068;
1069; CHECK-ARM-LABEL: i16_4:
1070; CHECK-ARM:       @ %bb.0:
1071; CHECK-ARM-NEXT:    strh r1, [r0, #4]!
1072; CHECK-ARM-NEXT:    bx lr
1073  %o = getelementptr inbounds i8, ptr %p, i32 4
1074  store i16 %v, ptr %o, align 2
1075  ret ptr %o
1076}
1077
1078define ptr @i16_8(ptr %p, i16 %v) {
1079; CHECK-T1-LABEL: i16_8:
1080; CHECK-T1:       @ %bb.0:
1081; CHECK-T1-NEXT:    strh r1, [r0, #8]
1082; CHECK-T1-NEXT:    adds r0, #8
1083; CHECK-T1-NEXT:    bx lr
1084;
1085; CHECK-T2-LABEL: i16_8:
1086; CHECK-T2:       @ %bb.0:
1087; CHECK-T2-NEXT:    strh r1, [r0, #8]!
1088; CHECK-T2-NEXT:    bx lr
1089;
1090; CHECK-ARM-LABEL: i16_8:
1091; CHECK-ARM:       @ %bb.0:
1092; CHECK-ARM-NEXT:    strh r1, [r0, #8]!
1093; CHECK-ARM-NEXT:    bx lr
1094  %o = getelementptr inbounds i8, ptr %p, i32 8
1095  store i16 %v, ptr %o, align 2
1096  ret ptr %o
1097}
1098
1099define ptr @i16_m1(ptr %p, i16 %v) {
1100; CHECK-T1-LABEL: i16_m1:
1101; CHECK-T1:       @ %bb.0:
1102; CHECK-T1-NEXT:    subs r0, r0, #1
1103; CHECK-T1-NEXT:    strh r1, [r0]
1104; CHECK-T1-NEXT:    bx lr
1105;
1106; CHECK-T2-LABEL: i16_m1:
1107; CHECK-T2:       @ %bb.0:
1108; CHECK-T2-NEXT:    strh r1, [r0, #-1]!
1109; CHECK-T2-NEXT:    bx lr
1110;
1111; CHECK-ARM-LABEL: i16_m1:
1112; CHECK-ARM:       @ %bb.0:
1113; CHECK-ARM-NEXT:    strh r1, [r0, #-1]!
1114; CHECK-ARM-NEXT:    bx lr
1115  %o = getelementptr inbounds i8, ptr %p, i32 -1
1116  store i16 %v, ptr %o, align 2
1117  ret ptr %o
1118}
1119
1120define ptr @i16_m4(ptr %p, i16 %v) {
1121; CHECK-T1-LABEL: i16_m4:
1122; CHECK-T1:       @ %bb.0:
1123; CHECK-T1-NEXT:    subs r0, r0, #4
1124; CHECK-T1-NEXT:    strh r1, [r0]
1125; CHECK-T1-NEXT:    bx lr
1126;
1127; CHECK-T2-LABEL: i16_m4:
1128; CHECK-T2:       @ %bb.0:
1129; CHECK-T2-NEXT:    strh r1, [r0, #-4]!
1130; CHECK-T2-NEXT:    bx lr
1131;
1132; CHECK-ARM-LABEL: i16_m4:
1133; CHECK-ARM:       @ %bb.0:
1134; CHECK-ARM-NEXT:    strh r1, [r0, #-4]!
1135; CHECK-ARM-NEXT:    bx lr
1136  %o = getelementptr inbounds i8, ptr %p, i32 -4
1137  store i16 %v, ptr %o, align 2
1138  ret ptr %o
1139}
1140
1141define ptr @i16_252(ptr %p, i16 %v) {
1142; CHECK-T1-LABEL: i16_252:
1143; CHECK-T1:       @ %bb.0:
1144; CHECK-T1-NEXT:    movs r2, #252
1145; CHECK-T1-NEXT:    strh r1, [r0, r2]
1146; CHECK-T1-NEXT:    adds r0, #252
1147; CHECK-T1-NEXT:    bx lr
1148;
1149; CHECK-T2-LABEL: i16_252:
1150; CHECK-T2:       @ %bb.0:
1151; CHECK-T2-NEXT:    strh r1, [r0, #252]!
1152; CHECK-T2-NEXT:    bx lr
1153;
1154; CHECK-ARM-LABEL: i16_252:
1155; CHECK-ARM:       @ %bb.0:
1156; CHECK-ARM-NEXT:    strh r1, [r0, #252]!
1157; CHECK-ARM-NEXT:    bx lr
1158  %o = getelementptr inbounds i8, ptr %p, i32 252
1159  store i16 %v, ptr %o, align 2
1160  ret ptr %o
1161}
1162
1163define ptr @i16_255(ptr %p, i16 %v) {
1164; CHECK-T1-LABEL: i16_255:
1165; CHECK-T1:       @ %bb.0:
1166; CHECK-T1-NEXT:    movs r2, #255
1167; CHECK-T1-NEXT:    strh r1, [r0, r2]
1168; CHECK-T1-NEXT:    adds r0, #255
1169; CHECK-T1-NEXT:    bx lr
1170;
1171; CHECK-T2-LABEL: i16_255:
1172; CHECK-T2:       @ %bb.0:
1173; CHECK-T2-NEXT:    strh r1, [r0, #255]!
1174; CHECK-T2-NEXT:    bx lr
1175;
1176; CHECK-ARM-LABEL: i16_255:
1177; CHECK-ARM:       @ %bb.0:
1178; CHECK-ARM-NEXT:    strh r1, [r0, #255]!
1179; CHECK-ARM-NEXT:    bx lr
1180  %o = getelementptr inbounds i8, ptr %p, i32 255
1181  store i16 %v, ptr %o, align 2
1182  ret ptr %o
1183}
1184
1185define ptr @i16_256(ptr %p, i16 %v) {
1186; CHECK-T1-LABEL: i16_256:
1187; CHECK-T1:       @ %bb.0:
1188; CHECK-T1-NEXT:    movs r2, #1
1189; CHECK-T1-NEXT:    lsls r2, r2, #8
1190; CHECK-T1-NEXT:    strh r1, [r0, r2]
1191; CHECK-T1-NEXT:    adds r0, r0, r2
1192; CHECK-T1-NEXT:    bx lr
1193;
1194; CHECK-T2-LABEL: i16_256:
1195; CHECK-T2:       @ %bb.0:
1196; CHECK-T2-NEXT:    strh.w r1, [r0, #256]
1197; CHECK-T2-NEXT:    add.w r0, r0, #256
1198; CHECK-T2-NEXT:    bx lr
1199;
1200; CHECK-ARM-LABEL: i16_256:
1201; CHECK-ARM:       @ %bb.0:
1202; CHECK-ARM-NEXT:    mov r2, #256
1203; CHECK-ARM-NEXT:    strh r1, [r0, r2]!
1204; CHECK-ARM-NEXT:    bx lr
1205  %o = getelementptr inbounds i8, ptr %p, i32 256
1206  store i16 %v, ptr %o, align 2
1207  ret ptr %o
1208}
1209
1210define ptr @i16_m252(ptr %p, i16 %v) {
1211; CHECK-T1-LABEL: i16_m252:
1212; CHECK-T1:       @ %bb.0:
1213; CHECK-T1-NEXT:    subs r0, #252
1214; CHECK-T1-NEXT:    strh r1, [r0]
1215; CHECK-T1-NEXT:    bx lr
1216;
1217; CHECK-T2-LABEL: i16_m252:
1218; CHECK-T2:       @ %bb.0:
1219; CHECK-T2-NEXT:    strh r1, [r0, #-252]!
1220; CHECK-T2-NEXT:    bx lr
1221;
1222; CHECK-ARM-LABEL: i16_m252:
1223; CHECK-ARM:       @ %bb.0:
1224; CHECK-ARM-NEXT:    strh r1, [r0, #-252]!
1225; CHECK-ARM-NEXT:    bx lr
1226  %o = getelementptr inbounds i8, ptr %p, i32 -252
1227  store i16 %v, ptr %o, align 2
1228  ret ptr %o
1229}
1230
1231define ptr @i16_m255(ptr %p, i16 %v) {
1232; CHECK-T1-LABEL: i16_m255:
1233; CHECK-T1:       @ %bb.0:
1234; CHECK-T1-NEXT:    subs r0, #255
1235; CHECK-T1-NEXT:    strh r1, [r0]
1236; CHECK-T1-NEXT:    bx lr
1237;
1238; CHECK-T2-LABEL: i16_m255:
1239; CHECK-T2:       @ %bb.0:
1240; CHECK-T2-NEXT:    strh r1, [r0, #-255]!
1241; CHECK-T2-NEXT:    bx lr
1242;
1243; CHECK-ARM-LABEL: i16_m255:
1244; CHECK-ARM:       @ %bb.0:
1245; CHECK-ARM-NEXT:    strh r1, [r0, #-255]!
1246; CHECK-ARM-NEXT:    bx lr
1247  %o = getelementptr inbounds i8, ptr %p, i32 -255
1248  store i16 %v, ptr %o, align 2
1249  ret ptr %o
1250}
1251
1252define ptr @i16_m256(ptr %p, i16 %v) {
1253; CHECK-T1-LABEL: i16_m256:
1254; CHECK-T1:       @ %bb.0:
1255; CHECK-T1-NEXT:    movs r2, #255
1256; CHECK-T1-NEXT:    mvns r2, r2
1257; CHECK-T1-NEXT:    strh r1, [r0, r2]
1258; CHECK-T1-NEXT:    adds r0, r0, r2
1259; CHECK-T1-NEXT:    bx lr
1260;
1261; CHECK-T2-LABEL: i16_m256:
1262; CHECK-T2:       @ %bb.0:
1263; CHECK-T2-NEXT:    mvn r2, #255
1264; CHECK-T2-NEXT:    strh r1, [r0, r2]
1265; CHECK-T2-NEXT:    sub.w r0, r0, #256
1266; CHECK-T2-NEXT:    bx lr
1267;
1268; CHECK-ARM-LABEL: i16_m256:
1269; CHECK-ARM:       @ %bb.0:
1270; CHECK-ARM-NEXT:    mvn r2, #255
1271; CHECK-ARM-NEXT:    strh r1, [r0, r2]!
1272; CHECK-ARM-NEXT:    bx lr
1273  %o = getelementptr inbounds i8, ptr %p, i32 -256
1274  store i16 %v, ptr %o, align 2
1275  ret ptr %o
1276}
1277
1278define ptr @i16_4095(ptr %p, i16 %v) {
1279; CHECK-T1-LABEL: i16_4095:
1280; CHECK-T1:       @ %bb.0:
1281; CHECK-T1-NEXT:    ldr r2, .LCPI51_0
1282; CHECK-T1-NEXT:    strh r1, [r0, r2]
1283; CHECK-T1-NEXT:    adds r0, r0, r2
1284; CHECK-T1-NEXT:    bx lr
1285; CHECK-T1-NEXT:    .p2align 2
1286; CHECK-T1-NEXT:  @ %bb.1:
1287; CHECK-T1-NEXT:  .LCPI51_0:
1288; CHECK-T1-NEXT:    .long 4095 @ 0xfff
1289;
1290; CHECK-T2-LABEL: i16_4095:
1291; CHECK-T2:       @ %bb.0:
1292; CHECK-T2-NEXT:    strh.w r1, [r0, #4095]
1293; CHECK-T2-NEXT:    addw r0, r0, #4095
1294; CHECK-T2-NEXT:    bx lr
1295;
1296; CHECK-ARM-LABEL: i16_4095:
1297; CHECK-ARM:       @ %bb.0:
1298; CHECK-ARM-NEXT:    movw r2, #4095
1299; CHECK-ARM-NEXT:    strh r1, [r0, r2]!
1300; CHECK-ARM-NEXT:    bx lr
1301  %o = getelementptr inbounds i8, ptr %p, i32 4095
1302  store i16 %v, ptr %o, align 2
1303  ret ptr %o
1304}
1305
1306define ptr @i16_4096(ptr %p, i16 %v) {
1307; CHECK-T1-LABEL: i16_4096:
1308; CHECK-T1:       @ %bb.0:
1309; CHECK-T1-NEXT:    movs r2, #1
1310; CHECK-T1-NEXT:    lsls r2, r2, #12
1311; CHECK-T1-NEXT:    strh r1, [r0, r2]
1312; CHECK-T1-NEXT:    adds r0, r0, r2
1313; CHECK-T1-NEXT:    bx lr
1314;
1315; CHECK-T2-LABEL: i16_4096:
1316; CHECK-T2:       @ %bb.0:
1317; CHECK-T2-NEXT:    mov.w r2, #4096
1318; CHECK-T2-NEXT:    strh r1, [r0, r2]
1319; CHECK-T2-NEXT:    add.w r0, r0, #4096
1320; CHECK-T2-NEXT:    bx lr
1321;
1322; CHECK-ARM-LABEL: i16_4096:
1323; CHECK-ARM:       @ %bb.0:
1324; CHECK-ARM-NEXT:    mov r2, #4096
1325; CHECK-ARM-NEXT:    strh r1, [r0, r2]!
1326; CHECK-ARM-NEXT:    bx lr
1327  %o = getelementptr inbounds i8, ptr %p, i32 4096
1328  store i16 %v, ptr %o, align 2
1329  ret ptr %o
1330}
1331
1332define ptr @i16_m4095(ptr %p, i16 %v) {
1333; CHECK-T1-LABEL: i16_m4095:
1334; CHECK-T1:       @ %bb.0:
1335; CHECK-T1-NEXT:    ldr r2, .LCPI53_0
1336; CHECK-T1-NEXT:    strh r1, [r0, r2]
1337; CHECK-T1-NEXT:    adds r0, r0, r2
1338; CHECK-T1-NEXT:    bx lr
1339; CHECK-T1-NEXT:    .p2align 2
1340; CHECK-T1-NEXT:  @ %bb.1:
1341; CHECK-T1-NEXT:  .LCPI53_0:
1342; CHECK-T1-NEXT:    .long 4294963201 @ 0xfffff001
1343;
1344; CHECK-T2-LABEL: i16_m4095:
1345; CHECK-T2:       @ %bb.0:
1346; CHECK-T2-NEXT:    movw r2, #61441
1347; CHECK-T2-NEXT:    movt r2, #65535
1348; CHECK-T2-NEXT:    strh r1, [r0, r2]
1349; CHECK-T2-NEXT:    subw r0, r0, #4095
1350; CHECK-T2-NEXT:    bx lr
1351;
1352; CHECK-ARM-LABEL: i16_m4095:
1353; CHECK-ARM:       @ %bb.0:
1354; CHECK-ARM-NEXT:    movw r2, #61441
1355; CHECK-ARM-NEXT:    movt r2, #65535
1356; CHECK-ARM-NEXT:    strh r1, [r0, r2]!
1357; CHECK-ARM-NEXT:    bx lr
1358  %o = getelementptr inbounds i8, ptr %p, i32 -4095
1359  store i16 %v, ptr %o, align 2
1360  ret ptr %o
1361}
1362
1363define ptr @i16_m4096(ptr %p, i16 %v) {
1364; CHECK-T1-LABEL: i16_m4096:
1365; CHECK-T1:       @ %bb.0:
1366; CHECK-T1-NEXT:    ldr r2, .LCPI54_0
1367; CHECK-T1-NEXT:    strh r1, [r0, r2]
1368; CHECK-T1-NEXT:    adds r0, r0, r2
1369; CHECK-T1-NEXT:    bx lr
1370; CHECK-T1-NEXT:    .p2align 2
1371; CHECK-T1-NEXT:  @ %bb.1:
1372; CHECK-T1-NEXT:  .LCPI54_0:
1373; CHECK-T1-NEXT:    .long 4294963200 @ 0xfffff000
1374;
1375; CHECK-T2-LABEL: i16_m4096:
1376; CHECK-T2:       @ %bb.0:
1377; CHECK-T2-NEXT:    movw r2, #61440
1378; CHECK-T2-NEXT:    movt r2, #65535
1379; CHECK-T2-NEXT:    strh r1, [r0, r2]
1380; CHECK-T2-NEXT:    sub.w r0, r0, #4096
1381; CHECK-T2-NEXT:    bx lr
1382;
1383; CHECK-ARM-LABEL: i16_m4096:
1384; CHECK-ARM:       @ %bb.0:
1385; CHECK-ARM-NEXT:    movw r2, #61440
1386; CHECK-ARM-NEXT:    movt r2, #65535
1387; CHECK-ARM-NEXT:    strh r1, [r0, r2]!
1388; CHECK-ARM-NEXT:    bx lr
1389  %o = getelementptr inbounds i8, ptr %p, i32 -4096
1390  store i16 %v, ptr %o, align 2
1391  ret ptr %o
1392}
1393
1394; i8
1395
1396define ptr @i8_0(ptr %p, i8 %v) {
1397; CHECK-LABEL: i8_0:
1398; CHECK:       @ %bb.0:
1399; CHECK-NEXT:    strb r1, [r0]
1400; CHECK-NEXT:    bx lr
1401  store i8 %v, ptr %p, align 1
1402  ret ptr %p
1403}
1404
1405define ptr @i8_3(ptr %p, i8 %v) {
1406; CHECK-T1-LABEL: i8_3:
1407; CHECK-T1:       @ %bb.0:
1408; CHECK-T1-NEXT:    strb r1, [r0, #3]
1409; CHECK-T1-NEXT:    adds r0, r0, #3
1410; CHECK-T1-NEXT:    bx lr
1411;
1412; CHECK-T2-LABEL: i8_3:
1413; CHECK-T2:       @ %bb.0:
1414; CHECK-T2-NEXT:    strb r1, [r0, #3]!
1415; CHECK-T2-NEXT:    bx lr
1416;
1417; CHECK-ARM-LABEL: i8_3:
1418; CHECK-ARM:       @ %bb.0:
1419; CHECK-ARM-NEXT:    strb r1, [r0, #3]!
1420; CHECK-ARM-NEXT:    bx lr
1421  %o = getelementptr inbounds i8, ptr %p, i32 3
1422  store i8 %v, ptr %o, align 1
1423  ret ptr %o
1424}
1425
1426define ptr @i8_4(ptr %p, i8 %v) {
1427; CHECK-T1-LABEL: i8_4:
1428; CHECK-T1:       @ %bb.0:
1429; CHECK-T1-NEXT:    strb r1, [r0, #4]
1430; CHECK-T1-NEXT:    adds r0, r0, #4
1431; CHECK-T1-NEXT:    bx lr
1432;
1433; CHECK-T2-LABEL: i8_4:
1434; CHECK-T2:       @ %bb.0:
1435; CHECK-T2-NEXT:    strb r1, [r0, #4]!
1436; CHECK-T2-NEXT:    bx lr
1437;
1438; CHECK-ARM-LABEL: i8_4:
1439; CHECK-ARM:       @ %bb.0:
1440; CHECK-ARM-NEXT:    strb r1, [r0, #4]!
1441; CHECK-ARM-NEXT:    bx lr
1442  %o = getelementptr inbounds i8, ptr %p, i32 4
1443  store i8 %v, ptr %o, align 1
1444  ret ptr %o
1445}
1446
1447define ptr @i8_8(ptr %p, i8 %v) {
1448; CHECK-T1-LABEL: i8_8:
1449; CHECK-T1:       @ %bb.0:
1450; CHECK-T1-NEXT:    strb r1, [r0, #8]
1451; CHECK-T1-NEXT:    adds r0, #8
1452; CHECK-T1-NEXT:    bx lr
1453;
1454; CHECK-T2-LABEL: i8_8:
1455; CHECK-T2:       @ %bb.0:
1456; CHECK-T2-NEXT:    strb r1, [r0, #8]!
1457; CHECK-T2-NEXT:    bx lr
1458;
1459; CHECK-ARM-LABEL: i8_8:
1460; CHECK-ARM:       @ %bb.0:
1461; CHECK-ARM-NEXT:    strb r1, [r0, #8]!
1462; CHECK-ARM-NEXT:    bx lr
1463  %o = getelementptr inbounds i8, ptr %p, i32 8
1464  store i8 %v, ptr %o, align 1
1465  ret ptr %o
1466}
1467
1468define ptr @i8_m1(ptr %p, i8 %v) {
1469; CHECK-T1-LABEL: i8_m1:
1470; CHECK-T1:       @ %bb.0:
1471; CHECK-T1-NEXT:    subs r0, r0, #1
1472; CHECK-T1-NEXT:    strb r1, [r0]
1473; CHECK-T1-NEXT:    bx lr
1474;
1475; CHECK-T2-LABEL: i8_m1:
1476; CHECK-T2:       @ %bb.0:
1477; CHECK-T2-NEXT:    strb r1, [r0, #-1]!
1478; CHECK-T2-NEXT:    bx lr
1479;
1480; CHECK-ARM-LABEL: i8_m1:
1481; CHECK-ARM:       @ %bb.0:
1482; CHECK-ARM-NEXT:    strb r1, [r0, #-1]!
1483; CHECK-ARM-NEXT:    bx lr
1484  %o = getelementptr inbounds i8, ptr %p, i32 -1
1485  store i8 %v, ptr %o, align 1
1486  ret ptr %o
1487}
1488
1489define ptr @i8_m4(ptr %p, i8 %v) {
1490; CHECK-T1-LABEL: i8_m4:
1491; CHECK-T1:       @ %bb.0:
1492; CHECK-T1-NEXT:    subs r0, r0, #4
1493; CHECK-T1-NEXT:    strb r1, [r0]
1494; CHECK-T1-NEXT:    bx lr
1495;
1496; CHECK-T2-LABEL: i8_m4:
1497; CHECK-T2:       @ %bb.0:
1498; CHECK-T2-NEXT:    strb r1, [r0, #-4]!
1499; CHECK-T2-NEXT:    bx lr
1500;
1501; CHECK-ARM-LABEL: i8_m4:
1502; CHECK-ARM:       @ %bb.0:
1503; CHECK-ARM-NEXT:    strb r1, [r0, #-4]!
1504; CHECK-ARM-NEXT:    bx lr
1505  %o = getelementptr inbounds i8, ptr %p, i32 -4
1506  store i8 %v, ptr %o, align 1
1507  ret ptr %o
1508}
1509
1510define ptr @i8_252(ptr %p, i8 %v) {
1511; CHECK-T1-LABEL: i8_252:
1512; CHECK-T1:       @ %bb.0:
1513; CHECK-T1-NEXT:    movs r2, #252
1514; CHECK-T1-NEXT:    strb r1, [r0, r2]
1515; CHECK-T1-NEXT:    adds r0, #252
1516; CHECK-T1-NEXT:    bx lr
1517;
1518; CHECK-T2-LABEL: i8_252:
1519; CHECK-T2:       @ %bb.0:
1520; CHECK-T2-NEXT:    strb r1, [r0, #252]!
1521; CHECK-T2-NEXT:    bx lr
1522;
1523; CHECK-ARM-LABEL: i8_252:
1524; CHECK-ARM:       @ %bb.0:
1525; CHECK-ARM-NEXT:    strb r1, [r0, #252]!
1526; CHECK-ARM-NEXT:    bx lr
1527  %o = getelementptr inbounds i8, ptr %p, i32 252
1528  store i8 %v, ptr %o, align 1
1529  ret ptr %o
1530}
1531
1532define ptr @i8_255(ptr %p, i8 %v) {
1533; CHECK-T1-LABEL: i8_255:
1534; CHECK-T1:       @ %bb.0:
1535; CHECK-T1-NEXT:    movs r2, #255
1536; CHECK-T1-NEXT:    strb r1, [r0, r2]
1537; CHECK-T1-NEXT:    adds r0, #255
1538; CHECK-T1-NEXT:    bx lr
1539;
1540; CHECK-T2-LABEL: i8_255:
1541; CHECK-T2:       @ %bb.0:
1542; CHECK-T2-NEXT:    strb r1, [r0, #255]!
1543; CHECK-T2-NEXT:    bx lr
1544;
1545; CHECK-ARM-LABEL: i8_255:
1546; CHECK-ARM:       @ %bb.0:
1547; CHECK-ARM-NEXT:    strb r1, [r0, #255]!
1548; CHECK-ARM-NEXT:    bx lr
1549  %o = getelementptr inbounds i8, ptr %p, i32 255
1550  store i8 %v, ptr %o, align 1
1551  ret ptr %o
1552}
1553
1554define ptr @i8_256(ptr %p, i8 %v) {
1555; CHECK-T1-LABEL: i8_256:
1556; CHECK-T1:       @ %bb.0:
1557; CHECK-T1-NEXT:    movs r2, #1
1558; CHECK-T1-NEXT:    lsls r2, r2, #8
1559; CHECK-T1-NEXT:    strb r1, [r0, r2]
1560; CHECK-T1-NEXT:    adds r0, r0, r2
1561; CHECK-T1-NEXT:    bx lr
1562;
1563; CHECK-T2-LABEL: i8_256:
1564; CHECK-T2:       @ %bb.0:
1565; CHECK-T2-NEXT:    strb.w r1, [r0, #256]
1566; CHECK-T2-NEXT:    add.w r0, r0, #256
1567; CHECK-T2-NEXT:    bx lr
1568;
1569; CHECK-ARM-LABEL: i8_256:
1570; CHECK-ARM:       @ %bb.0:
1571; CHECK-ARM-NEXT:    strb r1, [r0, #256]!
1572; CHECK-ARM-NEXT:    bx lr
1573  %o = getelementptr inbounds i8, ptr %p, i32 256
1574  store i8 %v, ptr %o, align 1
1575  ret ptr %o
1576}
1577
1578define ptr @i8_m252(ptr %p, i8 %v) {
1579; CHECK-T1-LABEL: i8_m252:
1580; CHECK-T1:       @ %bb.0:
1581; CHECK-T1-NEXT:    subs r0, #252
1582; CHECK-T1-NEXT:    strb r1, [r0]
1583; CHECK-T1-NEXT:    bx lr
1584;
1585; CHECK-T2-LABEL: i8_m252:
1586; CHECK-T2:       @ %bb.0:
1587; CHECK-T2-NEXT:    strb r1, [r0, #-252]!
1588; CHECK-T2-NEXT:    bx lr
1589;
1590; CHECK-ARM-LABEL: i8_m252:
1591; CHECK-ARM:       @ %bb.0:
1592; CHECK-ARM-NEXT:    strb r1, [r0, #-252]!
1593; CHECK-ARM-NEXT:    bx lr
1594  %o = getelementptr inbounds i8, ptr %p, i32 -252
1595  store i8 %v, ptr %o, align 1
1596  ret ptr %o
1597}
1598
1599define ptr @i8_m255(ptr %p, i8 %v) {
1600; CHECK-T1-LABEL: i8_m255:
1601; CHECK-T1:       @ %bb.0:
1602; CHECK-T1-NEXT:    subs r0, #255
1603; CHECK-T1-NEXT:    strb r1, [r0]
1604; CHECK-T1-NEXT:    bx lr
1605;
1606; CHECK-T2-LABEL: i8_m255:
1607; CHECK-T2:       @ %bb.0:
1608; CHECK-T2-NEXT:    strb r1, [r0, #-255]!
1609; CHECK-T2-NEXT:    bx lr
1610;
1611; CHECK-ARM-LABEL: i8_m255:
1612; CHECK-ARM:       @ %bb.0:
1613; CHECK-ARM-NEXT:    strb r1, [r0, #-255]!
1614; CHECK-ARM-NEXT:    bx lr
1615  %o = getelementptr inbounds i8, ptr %p, i32 -255
1616  store i8 %v, ptr %o, align 1
1617  ret ptr %o
1618}
1619
1620define ptr @i8_m256(ptr %p, i8 %v) {
1621; CHECK-T1-LABEL: i8_m256:
1622; CHECK-T1:       @ %bb.0:
1623; CHECK-T1-NEXT:    movs r2, #255
1624; CHECK-T1-NEXT:    mvns r2, r2
1625; CHECK-T1-NEXT:    strb r1, [r0, r2]
1626; CHECK-T1-NEXT:    adds r0, r0, r2
1627; CHECK-T1-NEXT:    bx lr
1628;
1629; CHECK-T2-LABEL: i8_m256:
1630; CHECK-T2:       @ %bb.0:
1631; CHECK-T2-NEXT:    mvn r2, #255
1632; CHECK-T2-NEXT:    strb r1, [r0, r2]
1633; CHECK-T2-NEXT:    sub.w r0, r0, #256
1634; CHECK-T2-NEXT:    bx lr
1635;
1636; CHECK-ARM-LABEL: i8_m256:
1637; CHECK-ARM:       @ %bb.0:
1638; CHECK-ARM-NEXT:    strb r1, [r0, #-256]!
1639; CHECK-ARM-NEXT:    bx lr
1640  %o = getelementptr inbounds i8, ptr %p, i32 -256
1641  store i8 %v, ptr %o, align 1
1642  ret ptr %o
1643}
1644
1645define ptr @i8_4095(ptr %p, i8 %v) {
1646; CHECK-T1-LABEL: i8_4095:
1647; CHECK-T1:       @ %bb.0:
1648; CHECK-T1-NEXT:    ldr r2, .LCPI67_0
1649; CHECK-T1-NEXT:    strb r1, [r0, r2]
1650; CHECK-T1-NEXT:    adds r0, r0, r2
1651; CHECK-T1-NEXT:    bx lr
1652; CHECK-T1-NEXT:    .p2align 2
1653; CHECK-T1-NEXT:  @ %bb.1:
1654; CHECK-T1-NEXT:  .LCPI67_0:
1655; CHECK-T1-NEXT:    .long 4095 @ 0xfff
1656;
1657; CHECK-T2-LABEL: i8_4095:
1658; CHECK-T2:       @ %bb.0:
1659; CHECK-T2-NEXT:    strb.w r1, [r0, #4095]
1660; CHECK-T2-NEXT:    addw r0, r0, #4095
1661; CHECK-T2-NEXT:    bx lr
1662;
1663; CHECK-ARM-LABEL: i8_4095:
1664; CHECK-ARM:       @ %bb.0:
1665; CHECK-ARM-NEXT:    strb r1, [r0, #4095]!
1666; CHECK-ARM-NEXT:    bx lr
1667  %o = getelementptr inbounds i8, ptr %p, i32 4095
1668  store i8 %v, ptr %o, align 1
1669  ret ptr %o
1670}
1671
1672define ptr @i8_4096(ptr %p, i8 %v) {
1673; CHECK-T1-LABEL: i8_4096:
1674; CHECK-T1:       @ %bb.0:
1675; CHECK-T1-NEXT:    movs r2, #1
1676; CHECK-T1-NEXT:    lsls r2, r2, #12
1677; CHECK-T1-NEXT:    strb r1, [r0, r2]
1678; CHECK-T1-NEXT:    adds r0, r0, r2
1679; CHECK-T1-NEXT:    bx lr
1680;
1681; CHECK-T2-LABEL: i8_4096:
1682; CHECK-T2:       @ %bb.0:
1683; CHECK-T2-NEXT:    mov.w r2, #4096
1684; CHECK-T2-NEXT:    strb r1, [r0, r2]
1685; CHECK-T2-NEXT:    add.w r0, r0, #4096
1686; CHECK-T2-NEXT:    bx lr
1687;
1688; CHECK-ARM-LABEL: i8_4096:
1689; CHECK-ARM:       @ %bb.0:
1690; CHECK-ARM-NEXT:    mov r2, #4096
1691; CHECK-ARM-NEXT:    strb r1, [r0, r2]!
1692; CHECK-ARM-NEXT:    bx lr
1693  %o = getelementptr inbounds i8, ptr %p, i32 4096
1694  store i8 %v, ptr %o, align 1
1695  ret ptr %o
1696}
1697
1698define ptr @i8_m4095(ptr %p, i8 %v) {
1699; CHECK-T1-LABEL: i8_m4095:
1700; CHECK-T1:       @ %bb.0:
1701; CHECK-T1-NEXT:    ldr r2, .LCPI69_0
1702; CHECK-T1-NEXT:    strb r1, [r0, r2]
1703; CHECK-T1-NEXT:    adds r0, r0, r2
1704; CHECK-T1-NEXT:    bx lr
1705; CHECK-T1-NEXT:    .p2align 2
1706; CHECK-T1-NEXT:  @ %bb.1:
1707; CHECK-T1-NEXT:  .LCPI69_0:
1708; CHECK-T1-NEXT:    .long 4294963201 @ 0xfffff001
1709;
1710; CHECK-T2-LABEL: i8_m4095:
1711; CHECK-T2:       @ %bb.0:
1712; CHECK-T2-NEXT:    movw r2, #61441
1713; CHECK-T2-NEXT:    movt r2, #65535
1714; CHECK-T2-NEXT:    strb r1, [r0, r2]
1715; CHECK-T2-NEXT:    subw r0, r0, #4095
1716; CHECK-T2-NEXT:    bx lr
1717;
1718; CHECK-ARM-LABEL: i8_m4095:
1719; CHECK-ARM:       @ %bb.0:
1720; CHECK-ARM-NEXT:    strb r1, [r0, #-4095]!
1721; CHECK-ARM-NEXT:    bx lr
1722  %o = getelementptr inbounds i8, ptr %p, i32 -4095
1723  store i8 %v, ptr %o, align 1
1724  ret ptr %o
1725}
1726
1727define ptr @i8_m4096(ptr %p, i8 %v) {
1728; CHECK-T1-LABEL: i8_m4096:
1729; CHECK-T1:       @ %bb.0:
1730; CHECK-T1-NEXT:    ldr r2, .LCPI70_0
1731; CHECK-T1-NEXT:    strb r1, [r0, r2]
1732; CHECK-T1-NEXT:    adds r0, r0, r2
1733; CHECK-T1-NEXT:    bx lr
1734; CHECK-T1-NEXT:    .p2align 2
1735; CHECK-T1-NEXT:  @ %bb.1:
1736; CHECK-T1-NEXT:  .LCPI70_0:
1737; CHECK-T1-NEXT:    .long 4294963200 @ 0xfffff000
1738;
1739; CHECK-T2-LABEL: i8_m4096:
1740; CHECK-T2:       @ %bb.0:
1741; CHECK-T2-NEXT:    movw r2, #61440
1742; CHECK-T2-NEXT:    movt r2, #65535
1743; CHECK-T2-NEXT:    strb r1, [r0, r2]
1744; CHECK-T2-NEXT:    sub.w r0, r0, #4096
1745; CHECK-T2-NEXT:    bx lr
1746;
1747; CHECK-ARM-LABEL: i8_m4096:
1748; CHECK-ARM:       @ %bb.0:
1749; CHECK-ARM-NEXT:    movw r2, #61440
1750; CHECK-ARM-NEXT:    movt r2, #65535
1751; CHECK-ARM-NEXT:    strb r1, [r0, r2]!
1752; CHECK-ARM-NEXT:    bx lr
1753  %o = getelementptr inbounds i8, ptr %p, i32 -4096
1754  store i8 %v, ptr %o, align 1
1755  ret ptr %o
1756}
1757