[llvm] ebb6583 - [ARM] Add pre/post inc tests of various sizes. NFC
David Green via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 23 02:53:35 PST 2021
Author: David Green
Date: 2021-02-23T10:53:22Z
New Revision: ebb6583e02c46293987567b4e9835d10c9841a4d
URL: https://github.com/llvm/llvm-project/commit/ebb6583e02c46293987567b4e9835d10c9841a4d
DIFF: https://github.com/llvm/llvm-project/commit/ebb6583e02c46293987567b4e9835d10c9841a4d.diff
LOG: [ARM] Add pre/post inc tests of various sizes. NFC
Added:
llvm/test/CodeGen/ARM/store-postinc.ll
llvm/test/CodeGen/ARM/store-preinc.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/CodeGen/ARM/store-postinc.ll b/llvm/test/CodeGen/ARM/store-postinc.ll
new file mode 100644
index 000000000000..29d2550e05d2
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/store-postinc.ll
@@ -0,0 +1,1828 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv6m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T1
+; RUN: llc -mtriple=thumbv7m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T2
+; RUN: llc -mtriple=armv7a-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-ARM
+
+define i8* @i32_0(i8* %p, i32 %v) {
+; CHECK-LABEL: i32_0:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_3(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #3
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #3]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #3]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_4(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r1, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_8(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #8]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #8]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m1(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-1]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-1]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m4(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_252(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #252
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_255(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_256(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #8
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str.w r1, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m252(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m255(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m256(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: mvns r2, r2
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r2, #255
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_4095(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI12_0
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI12_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i32_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str.w r1, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_4096(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #12
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r2, #4096
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #4096
+; CHECK-ARM-NEXT: str r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m4095(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI14_0
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI14_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i32_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61441
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m4096(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI15_0
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI15_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i32_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61440
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61440
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: str r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i64_0(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_0:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_0:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strd r2, r3, [r0]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_0:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r1, r3
+; CHECK-ARM-NEXT: str r2, [r0]
+; CHECK-ARM-NEXT: str r1, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_3(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #3
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #3]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #3]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_4(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r2, [r0, #4]
+; CHECK-T1-NEXT: str r3, [r0, #8]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #4]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #4]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_8(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r2, [r0, #8]
+; CHECK-T1-NEXT: str r3, [r0, #12]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #8]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #8]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m1(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-1]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-1]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m4(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r3, [r0]
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: str r2, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r3, [r0]
+; CHECK-T2-NEXT: str r2, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r3, [r0]
+; CHECK-ARM-NEXT: str r2, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_252(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #252
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #252]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #252]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_255(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #255
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #255]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #255]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_256(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #1
+; CHECK-T1-NEXT: lsls r1, r1, #8
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strd r2, r3, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #256]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m252(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-252]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-252]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m255(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-255]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-255]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m256(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #255
+; CHECK-T1-NEXT: mvns r1, r1
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r1, #255
+; CHECK-T2-NEXT: str r3, [r0, #-252]
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-256]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_4095(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, .LCPI28_0
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI28_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i64_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str.w r2, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #4095]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_4096(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #1
+; CHECK-T1-NEXT: lsls r1, r1, #12
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r1, #4096
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r1, #4096
+; CHECK-ARM-NEXT: str r2, [r0, r1]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m4095(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, .LCPI30_0
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI30_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i64_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r1, #61441
+; CHECK-T2-NEXT: movt r1, #65535
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-4095]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m4096(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, .LCPI31_0
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI31_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i64_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r1, #61440
+; CHECK-T2-NEXT: movt r1, #65535
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r1, #61440
+; CHECK-ARM-NEXT: movt r1, #65535
+; CHECK-ARM-NEXT: str r2, [r0, r1]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i128_0(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_0:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_0:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: str r1, [r0, #8]
+; CHECK-T2-NEXT: strd r2, r3, [r0]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_0:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: stm r0, {r2, r3}
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_3(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #3
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #3]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #3]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_4(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #16]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: str r3, [r0, #8]
+; CHECK-T1-NEXT: str r2, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #4]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #4]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_8(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #20]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #16]
+; CHECK-T1-NEXT: str r3, [r0, #12]
+; CHECK-T1-NEXT: str r2, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #8]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #8]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_16(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_16:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #28]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #24]
+; CHECK-T1-NEXT: str r3, [r0, #20]
+; CHECK-T1-NEXT: str r2, [r0, #16]
+; CHECK-T1-NEXT: adds r0, #16
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_16:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #16]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_16:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #16]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 16
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_m1(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-1]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-1]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_m4(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #4]
+; CHECK-T1-NEXT: str r3, [r0]
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: str r2, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #8]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0]
+; CHECK-T2-NEXT: str r2, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0]
+; CHECK-ARM-NEXT: stmib r0, {r1, r12}
+; CHECK-ARM-NEXT: str r2, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i16_0(i8* %p, i16 %v) {
+; CHECK-LABEL: i16_0:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: strh r1, [r0]
+; CHECK-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_3(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #3
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #3]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #3]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_4(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strh r1, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_8(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strh r1, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #8]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #8]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m1(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-1]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-1]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m4(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_252(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #252
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_255(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_256(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #8
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh.w r1, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #256
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m252(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m255(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m256(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: mvns r2, r2
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r2, #255
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mvn r2, #255
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_4095(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI51_0
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI51_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i16_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh.w r1, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #4095
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_4096(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #12
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r2, #4096
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #4096
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m4095(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI53_0
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI53_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i16_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61441
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61441
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m4096(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI54_0
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI54_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i16_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61440
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61440
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i8_0(i8* %p, i8 %v) {
+; CHECK-LABEL: i8_0:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: strb r1, [r0]
+; CHECK-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_3(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strb r1, [r0, #3]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #3]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #3]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_4(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strb r1, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_8(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strb r1, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #8]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #8]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m1(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-1]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-1]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m4(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_252(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #252
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_255(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_256(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #8
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb.w r1, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m252(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m255(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m256(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: mvns r2, r2
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r2, #255
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_4095(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI67_0
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI67_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i8_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb.w r1, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_4096(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #12
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r2, #4096
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #4096
+; CHECK-ARM-NEXT: strb r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m4095(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI69_0
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI69_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i8_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61441
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m4096(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI70_0
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI70_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i8_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61440
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61440
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: strb r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
diff --git a/llvm/test/CodeGen/ARM/store-preinc.ll b/llvm/test/CodeGen/ARM/store-preinc.ll
new file mode 100644
index 000000000000..47aa73a86e76
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/store-preinc.ll
@@ -0,0 +1,1832 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv6m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T1
+; RUN: llc -mtriple=thumbv7m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T2
+; RUN: llc -mtriple=armv7a-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-ARM
+
+define i8* @i32_0(i8* %p, i32 %v) {
+; CHECK-LABEL: i32_0:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_3(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #3
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #3]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #3]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_4(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r1, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_8(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #8]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #8]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m1(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-1]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-1]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m4(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_252(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #252
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_255(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_256(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #8
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str.w r1, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m252(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m255(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: str r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r1, [r0, #-255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m256(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: mvns r2, r2
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r2, #255
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_4095(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI12_0
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI12_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i32_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str.w r1, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_4096(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #12
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i32_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r2, #4096
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #4096
+; CHECK-ARM-NEXT: str r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m4095(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI14_0
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI14_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i32_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61441
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r1, [r0, #-4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i32_m4096(i8* %p, i32 %v) {
+; CHECK-T1-LABEL: i32_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI15_0
+; CHECK-T1-NEXT: str r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI15_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i32_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61440
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: str r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i32_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61440
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: str r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i32*
+ store i32 %v, i32* %q, align 4
+ ret i8* %o
+}
+
+define i8* @i64_0(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_0:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_0:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strd r2, r3, [r0]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_0:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r1, r3
+; CHECK-ARM-NEXT: str r2, [r0]
+; CHECK-ARM-NEXT: str r1, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_3(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #3
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #3]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #3]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_4(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r2, [r0, #4]
+; CHECK-T1-NEXT: str r3, [r0, #8]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #4]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #4]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_8(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r2, [r0, #8]
+; CHECK-T1-NEXT: str r3, [r0, #12]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #8]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #8]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m1(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-1]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-1]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m4(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: str r3, [r0]
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: str r2, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r3, [r0]
+; CHECK-T2-NEXT: str r2, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r3, [r0]
+; CHECK-ARM-NEXT: str r2, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_252(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #252
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #252]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #252]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_255(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #255
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #255]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #255]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_256(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #1
+; CHECK-T1-NEXT: lsls r1, r1, #8
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strd r2, r3, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #256]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m252(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-252]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-252]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m255(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-255]!
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-255]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m256(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #255
+; CHECK-T1-NEXT: mvns r1, r1
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r1, #255
+; CHECK-T2-NEXT: str r3, [r0, #-252]
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-256]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_4095(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, .LCPI28_0
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI28_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i64_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str.w r2, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #4095]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_4096(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #1
+; CHECK-T1-NEXT: lsls r1, r1, #12
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i64_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r1, #4096
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r1, #4096
+; CHECK-ARM-NEXT: str r2, [r0, r1]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m4095(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, .LCPI30_0
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI30_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i64_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r1, #61441
+; CHECK-T2-NEXT: movt r1, #65535
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-4095]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i64_m4096(i8* %p, i64 %v) {
+; CHECK-T1-LABEL: i64_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, .LCPI31_0
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI31_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i64_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r1, #61440
+; CHECK-T2-NEXT: movt r1, #65535
+; CHECK-T2-NEXT: str r2, [r0, r1]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: str r3, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i64_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r1, #61440
+; CHECK-ARM-NEXT: movt r1, #65535
+; CHECK-ARM-NEXT: str r2, [r0, r1]!
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i64*
+ store i64 %v, i64* %q, align 8
+ ret i8* %o
+}
+
+define i8* @i128_0(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_0:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_0:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: str r1, [r0, #8]
+; CHECK-T2-NEXT: strd r2, r3, [r0]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_0:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: stm r0, {r2, r3}
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_3(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r1, #3
+; CHECK-T1-NEXT: str r2, [r0, r1]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: str r3, [r0, #4]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #3]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #3]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_4(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #16]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: str r3, [r0, #8]
+; CHECK-T1-NEXT: str r2, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #4]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #4]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_8(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #20]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #16]
+; CHECK-T1-NEXT: str r3, [r0, #12]
+; CHECK-T1-NEXT: str r2, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #8]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #8]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_16(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_16:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #28]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #24]
+; CHECK-T1-NEXT: str r3, [r0, #20]
+; CHECK-T1-NEXT: str r2, [r0, #16]
+; CHECK-T1-NEXT: adds r0, #16
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_16:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #16]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_16:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #16]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 16
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_m1(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #12]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: stm r0!, {r2, r3}
+; CHECK-T1-NEXT: subs r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: str r2, [r0, #-1]!
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #12]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0, #4]
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: str r2, [r0, #-1]!
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0, #4]
+; CHECK-ARM-NEXT: str r1, [r0, #8]
+; CHECK-ARM-NEXT: str r12, [r0, #12]
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+define i8* @i128_m4(i8* %p, i128 %v) {
+; CHECK-T1-LABEL: i128_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r1, [sp, #4]
+; CHECK-T1-NEXT: str r1, [r0, #8]
+; CHECK-T1-NEXT: ldr r1, [sp]
+; CHECK-T1-NEXT: str r1, [r0, #4]
+; CHECK-T1-NEXT: str r3, [r0]
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: str r2, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i128_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: ldr r1, [sp, #4]
+; CHECK-T2-NEXT: str r1, [r0, #8]
+; CHECK-T2-NEXT: ldr r1, [sp]
+; CHECK-T2-NEXT: strd r3, r1, [r0]
+; CHECK-T2-NEXT: str r2, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i128_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: ldm sp, {r1, r12}
+; CHECK-ARM-NEXT: str r3, [r0]
+; CHECK-ARM-NEXT: stmib r0, {r1, r12}
+; CHECK-ARM-NEXT: str r2, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i128*
+ store i128 %v, i128* %q, align 16
+ ret i8* %o
+}
+
+; i16
+
+define i8* @i16_0(i8* %p, i16 %v) {
+; CHECK-LABEL: i16_0:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: strh r1, [r0]
+; CHECK-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_3(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #3
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #3]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #3]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_4(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strh r1, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_8(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strh r1, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #8]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #8]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m1(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-1]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-1]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m4(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_252(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #252
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_255(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_256(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #8
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh.w r1, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #256
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m252(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m255(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: strh r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh r1, [r0, #-255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strh r1, [r0, #-255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m256(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: mvns r2, r2
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r2, #255
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mvn r2, #255
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_4095(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI51_0
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI51_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i16_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strh.w r1, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #4095
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_4096(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #12
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i16_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r2, #4096
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #4096
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m4095(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI53_0
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI53_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i16_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61441
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61441
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+define i8* @i16_m4096(i8* %p, i16 %v) {
+; CHECK-T1-LABEL: i16_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI54_0
+; CHECK-T1-NEXT: strh r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI54_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i16_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61440
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strh r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i16_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61440
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: strh r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i16*
+ store i16 %v, i16* %q, align 2
+ ret i8* %o
+}
+
+; i8
+
+define i8* @i8_0(i8* %p, i8 %v) {
+; CHECK-LABEL: i8_0:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: strb r1, [r0]
+; CHECK-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 0
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_3(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_3:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strb r1, [r0, #3]
+; CHECK-T1-NEXT: adds r0, r0, #3
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_3:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #3]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_3:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #3]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 3
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_4(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strb r1, [r0, #4]
+; CHECK-T1-NEXT: adds r0, r0, #4
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_8(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_8:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: strb r1, [r0, #8]
+; CHECK-T1-NEXT: adds r0, #8
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_8:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #8]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_8:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #8]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 8
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m1(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m1:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #1
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m1:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-1]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m1:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-1]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -1
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m4(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m4:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, r0, #4
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m4:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-4]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m4:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-4]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_252(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #252
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #252
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 252
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_255(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, #255
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 255
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_256(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #8
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb.w r1, [r0, #256]
+; CHECK-T2-NEXT: add.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 256
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m252(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m252:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #252
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m252:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-252]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m252:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-252]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -252
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m255(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m255:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: subs r0, #255
+; CHECK-T1-NEXT: strb r1, [r0]
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m255:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb r1, [r0, #-255]!
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m255:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-255]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -255
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m256(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m256:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #255
+; CHECK-T1-NEXT: mvns r2, r2
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_m256:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mvn r2, #255
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #256
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m256:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-256]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -256
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_4095(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI67_0
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI67_0:
+; CHECK-T1-NEXT: .long 4095 @ 0xfff
+;
+; CHECK-T2-LABEL: i8_4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: strb.w r1, [r0, #4095]
+; CHECK-T2-NEXT: addw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4095
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_4096(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: movs r2, #1
+; CHECK-T1-NEXT: lsls r2, r2, #12
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+;
+; CHECK-T2-LABEL: i8_4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: mov.w r2, #4096
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: add.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: mov r2, #4096
+; CHECK-ARM-NEXT: strb r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 4096
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m4095(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m4095:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI69_0
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI69_0:
+; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001
+;
+; CHECK-T2-LABEL: i8_m4095:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61441
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: subw r0, r0, #4095
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m4095:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: strb r1, [r0, #-4095]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4095
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
+
+define i8* @i8_m4096(i8* %p, i8 %v) {
+; CHECK-T1-LABEL: i8_m4096:
+; CHECK-T1: @ %bb.0:
+; CHECK-T1-NEXT: ldr r2, .LCPI70_0
+; CHECK-T1-NEXT: strb r1, [r0, r2]
+; CHECK-T1-NEXT: adds r0, r0, r2
+; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.1:
+; CHECK-T1-NEXT: .LCPI70_0:
+; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000
+;
+; CHECK-T2-LABEL: i8_m4096:
+; CHECK-T2: @ %bb.0:
+; CHECK-T2-NEXT: movw r2, #61440
+; CHECK-T2-NEXT: movt r2, #65535
+; CHECK-T2-NEXT: strb r1, [r0, r2]
+; CHECK-T2-NEXT: sub.w r0, r0, #4096
+; CHECK-T2-NEXT: bx lr
+;
+; CHECK-ARM-LABEL: i8_m4096:
+; CHECK-ARM: @ %bb.0:
+; CHECK-ARM-NEXT: movw r2, #61440
+; CHECK-ARM-NEXT: movt r2, #65535
+; CHECK-ARM-NEXT: strb r1, [r0, r2]!
+; CHECK-ARM-NEXT: bx lr
+ %o = getelementptr inbounds i8, i8* %p, i32 -4096
+ %q = bitcast i8* %o to i8*
+ store i8 %v, i8* %q, align 1
+ ret i8* %o
+}
More information about the llvm-commits
mailing list