[llvm] [AArch64] Use LD1/ST1 in strict-align mode (PR #211513)
Oliver Stannard via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 20 01:48:30 PDT 2026
================
@@ -0,0 +1,8227 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=aarch64-linux-gnu %s -o - | FileCheck %s --check-prefix=NOSTRICTALIGN
+; RUN: llc -mtriple=aarch64-linux-gnu %s -o - -mattr=+strict-align | FileCheck %s --check-prefix=STRICTALIGN
+; RUN: llc -mtriple=aarch64_be-linux-gnu %s -o - | FileCheck %s --check-prefix=NOSTRICTALIGN-BE
+; RUN: llc -mtriple=aarch64_be-linux-gnu %s -o - -mattr=+strict-align | FileCheck %s --check-prefix=STRICTALIGN-BE
+
+
+define <8 x i8> @load_v8i8_align1(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.8b }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.8b }, [x0]
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <8 x i8>, ptr %ptr, align 1
+ ret <8 x i8> %val
+}
+
+define void @store_v8i8_align1(ptr %ptr, <8 x i8> %val) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.8b }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: st1 { v0.8b }, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <8 x i8> %val, ptr %ptr, align 1
+ ret void
+}
+
+define <8 x i8> @load_v8i8_align1_post8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align1_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align1_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.8b }, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align1_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align1_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.8b }, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <8 x i8>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define <8 x i8> @load_v8i8_align1_pre8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align1_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align1_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #8
+; STRICTALIGN-NEXT: ld1 { v0.8b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align1_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align1_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #8
+; STRICTALIGN-BE-NEXT: ld1 { v0.8b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <8 x i8>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define void @store_v8i8_align1_post8(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align1_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align1_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.8b }, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align1_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align1_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: st1 { v0.8b }, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <8 x i8> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i8_align1_pre8(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align1_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align1_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #8
+; STRICTALIGN-NEXT: st1 { v0.8b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align1_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align1_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: add x8, x0, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.8b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <8 x i8> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i8> @load_v8i8_align1_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.8b }, [x0]
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.8b }, [x0]
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i8>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define <8 x i8> @load_v8i8_align1_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: ld1 { v0.8b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: ld1 { v0.8b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i8>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define void @store_v8i8_align1_post16(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: st1 { v0.8b }, [x0]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: st1 { v0.8b }, [x0]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i8> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i8_align1_pre16(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: st1 { v0.8b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8b, v0.8b
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: st1 { v0.8b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i8> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i8> @load_v8i8_align8(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <8 x i8>, ptr %ptr, align 8
+ ret <8 x i8> %val
+}
+
+define void @store_v8i8_align8(ptr %ptr, <8 x i8> %val) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <8 x i8> %val, ptr %ptr, align 8
+ ret void
+}
+
+define <8 x i8> @load_v8i8_align8_post8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align8_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align8_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align8_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align8_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <8 x i8>, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define <8 x i8> @load_v8i8_align8_pre8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align8_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align8_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0, #8]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align8_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align8_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0, #8]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <8 x i8>, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define void @store_v8i8_align8_post8(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align8_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align8_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.8b }, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align8_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align8_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <8 x i8> %val, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i8_align8_pre8(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align8_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align8_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0, #8]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align8_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align8_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0, #8]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <8 x i8> %val, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i8> @load_v8i8_align8_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align8_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align8_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align8_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align8_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i8>, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define <8 x i8> @load_v8i8_align8_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i8_align8_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i8_align8_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0, #16]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i8_align8_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i8_align8_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0, #16]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i8>, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <8 x i8> %val
+}
+
+define void @store_v8i8_align8_post16(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align8_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align8_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align8_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align8_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i8> %val, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i8_align8_pre16(ptr %ptr, <8 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i8_align8_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i8_align8_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0, #16]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i8_align8_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i8_align8_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0, #16]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i8> %val, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <16 x i8> @load_v16i8_align1(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.16b }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.16b }, [x0]
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <16 x i8>, ptr %ptr, align 1
+ ret <16 x i8> %val
+}
+
+define void @store_v16i8_align1(ptr %ptr, <16 x i8> %val) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.16b }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.16b }, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <16 x i8> %val, ptr %ptr, align 1
+ ret void
+}
+
+define <16 x i8> @load_v16i8_align1_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.16b }, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.16b }, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <16 x i8>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define <16 x i8> @load_v16i8_align1_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: ld1 { v0.16b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: ld1 { v0.16b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <16 x i8>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define void @store_v16i8_align1_post16(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.16b }, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.16b }, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <16 x i8> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v16i8_align1_pre16(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: st1 { v0.16b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.16b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <16 x i8> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <16 x i8> @load_v16i8_align1_post32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align1_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align1_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.16b }, [x0]
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align1_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align1_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.16b }, [x0]
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <16 x i8>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define <16 x i8> @load_v16i8_align1_pre32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align1_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align1_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: ld1 { v0.16b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align1_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align1_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: ld1 { v0.16b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <16 x i8>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define void @store_v16i8_align1_post32(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align1_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align1_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: st1 { v0.16b }, [x0]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align1_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align1_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.16b }, [x0]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <16 x i8> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v16i8_align1_pre32(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align1_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align1_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: st1 { v0.16b }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align1_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align1_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.16b, v0.16b
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.16b }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <16 x i8> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <16 x i8> @load_v16i8_align16(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <16 x i8>, ptr %ptr, align 16
+ ret <16 x i8> %val
+}
+
+define void @store_v16i8_align16(ptr %ptr, <16 x i8> %val) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str q0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <16 x i8> %val, ptr %ptr, align 16
+ ret void
+}
+
+define <16 x i8> @load_v16i8_align16_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align16_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align16_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align16_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align16_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0]
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <16 x i8>, ptr %ptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define <16 x i8> @load_v16i8_align16_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align16_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align16_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0, #16]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align16_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align16_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0, #16]
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <16 x i8>, ptr %newptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define void @store_v16i8_align16_post16(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align16_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align16_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.16b }, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align16_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align16_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str q0, [x0]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <16 x i8> %val, ptr %ptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v16i8_align16_pre16(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align16_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align16_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [x0, #16]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align16_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align16_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str q0, [x0, #16]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <16 x i8> %val, ptr %newptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <16 x i8> @load_v16i8_align16_post32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align16_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align16_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0], #32
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align16_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align16_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0]
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <16 x i8>, ptr %ptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define <16 x i8> @load_v16i8_align16_pre32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v16i8_align16_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v16i8_align16_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0, #32]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v16i8_align16_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v16i8_align16_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0, #32]
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <16 x i8>, ptr %newptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret <16 x i8> %val
+}
+
+define void @store_v16i8_align16_post32(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align16_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align16_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [x0], #32
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align16_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align16_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: str q0, [x0]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <16 x i8> %val, ptr %ptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v16i8_align16_pre32(ptr %ptr, <16 x i8> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v16i8_align16_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v16i8_align16_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [x0, #32]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v16i8_align16_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v16i8_align16_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: str q0, [x0, #32]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <16 x i8> %val, ptr %newptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align1(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldrb w8, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w9, [x0]
+; STRICTALIGN-NEXT: ldrb w10, [x0, #3]
+; STRICTALIGN-NEXT: ldrb w11, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w12, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w13, [x0, #4]!
+; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #8
+; STRICTALIGN-NEXT: ldrb w14, [x0, #2]
+; STRICTALIGN-NEXT: lsl x11, x11, #16
+; STRICTALIGN-NEXT: ldrb w15, [x0, #3]
+; STRICTALIGN-NEXT: lsl w14, w14, #16
+; STRICTALIGN-NEXT: orr x9, x11, x10, lsl #24
+; STRICTALIGN-NEXT: orr w10, w13, w12, lsl #8
+; STRICTALIGN-NEXT: orr w11, w14, w15, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w11, w10
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: fmov d0, x8
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #4]!
+; STRICTALIGN-BE-NEXT: lsl w10, w10, #16
+; STRICTALIGN-BE-NEXT: ldrb w14, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w15, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsl x12, x12, #16
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w10, w11, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x15, x14, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x12, x13, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8
+; STRICTALIGN-BE-NEXT: orr x9, x11, x10
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: fmov d0, x8
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <4 x i16>, ptr %ptr, align 1
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align1(ptr %ptr, <4 x i16> %val) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: fmov x8, d0
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: strb w8, [x0]
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: lsr x9, x8, #16
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #8
+; STRICTALIGN-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-NEXT: lsr x9, x8, #32
+; STRICTALIGN-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-NEXT: lsr x10, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w9, [x0, #4]!
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: fmov x8, d0
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #24
+; STRICTALIGN-BE-NEXT: lsr x8, x8, #8
+; STRICTALIGN-BE-NEXT: strb w9, [x0]
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-BE-NEXT: str b0, [x0, #3]
+; STRICTALIGN-BE-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: ret
+ store <4 x i16> %val, ptr %ptr, align 1
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align1_post8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align1_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align1_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #8
+; STRICTALIGN-NEXT: ldrb w9, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w10, [x0]
+; STRICTALIGN-NEXT: ldrb w11, [x0, #3]
+; STRICTALIGN-NEXT: ldrb w12, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #4]!
+; STRICTALIGN-NEXT: orr x9, x10, x9, lsl #8
+; STRICTALIGN-NEXT: ldrb w15, [x0, #2]
+; STRICTALIGN-NEXT: lsl x12, x12, #16
+; STRICTALIGN-NEXT: ldrb w16, [x0, #3]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: lsl w15, w15, #16
+; STRICTALIGN-NEXT: orr x10, x12, x11, lsl #24
+; STRICTALIGN-NEXT: orr w11, w14, w13, lsl #8
+; STRICTALIGN-NEXT: orr w12, w15, w16, lsl #24
+; STRICTALIGN-NEXT: orr x9, x10, x9
+; STRICTALIGN-NEXT: orr w10, w12, w11
+; STRICTALIGN-NEXT: orr x9, x9, x10, lsl #32
+; STRICTALIGN-NEXT: fmov d0, x9
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align1_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align1_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x0, #5]
+; STRICTALIGN-BE-NEXT: mov x13, x0
+; STRICTALIGN-BE-NEXT: ldrb w14, [x13, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0]
+; STRICTALIGN-BE-NEXT: lsl w10, w10, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x13, #2]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x13, #3]
+; STRICTALIGN-BE-NEXT: lsl x12, x12, #16
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w10, w11, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x13, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x12, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8
+; STRICTALIGN-BE-NEXT: orr x9, x11, x10
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: fmov d0, x8
+; STRICTALIGN-BE-NEXT: add x8, x0, #8
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <4 x i16>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define <4 x i16> @load_v4i16_align1_pre8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align1_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align1_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldrb w8, [x0, #8]!
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w11, [x10, #4]!
+; STRICTALIGN-NEXT: ldrb w12, [x10, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #3]
+; STRICTALIGN-NEXT: lsl x9, x9, #16
+; STRICTALIGN-NEXT: ldrb w15, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w10, [x10, #3]
+; STRICTALIGN-NEXT: lsl w12, w12, #16
+; STRICTALIGN-NEXT: orr x8, x8, x13, lsl #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #24
+; STRICTALIGN-NEXT: orr w11, w11, w15, lsl #8
+; STRICTALIGN-NEXT: orr w10, w12, w10, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w10, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: fmov d0, x8
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align1_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align1_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #8]!
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x12, x0
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x12, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsl w10, w10, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x12, #2]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x12, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w9, w11, w9, lsl #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: orr w8, w10, w8, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x12, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w8, w9
+; STRICTALIGN-BE-NEXT: orr x9, x11, x10
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: fmov d0, x8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <4 x i16>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align1_post8(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align1_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align1_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: fmov x8, d0
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: strb w8, [x0]
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: lsr x9, x8, #8
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #32
+; STRICTALIGN-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-NEXT: lsr x9, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: add x11, x0, #8
+; STRICTALIGN-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-NEXT: str x11, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align1_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align1_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: fmov x8, d0
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #24
+; STRICTALIGN-BE-NEXT: lsr x8, x8, #8
+; STRICTALIGN-BE-NEXT: strb w9, [x0]
+; STRICTALIGN-BE-NEXT: add x9, x0, #8
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-BE-NEXT: str b0, [x0, #3]
+; STRICTALIGN-BE-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: str x9, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <4 x i16> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v4i16_align1_pre8(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align1_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align1_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: fmov x8, d0
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: strb w8, [x0, #8]!
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: lsr x9, x8, #8
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #32
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: lsr x11, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: strb w10, [x9, #4]!
+; STRICTALIGN-NEXT: strb w11, [x9, #3]
+; STRICTALIGN-NEXT: strb w8, [x9, #2]
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align1_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align1_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: fmov x8, d0
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #8]!
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #32
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #40
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #48
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #24
+; STRICTALIGN-BE-NEXT: lsr x8, x8, #8
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x9, x0
+; STRICTALIGN-BE-NEXT: strb w10, [x9, #4]!
+; STRICTALIGN-BE-NEXT: str b0, [x9, #3]
+; STRICTALIGN-BE-NEXT: strb w8, [x9, #2]
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <4 x i16> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align1_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: ldrb w9, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w10, [x0]
+; STRICTALIGN-NEXT: ldrb w11, [x0, #3]
+; STRICTALIGN-NEXT: ldrb w12, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #4]!
+; STRICTALIGN-NEXT: orr x9, x10, x9, lsl #8
+; STRICTALIGN-NEXT: ldrb w15, [x0, #2]
+; STRICTALIGN-NEXT: lsl x12, x12, #16
+; STRICTALIGN-NEXT: ldrb w16, [x0, #3]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: lsl w15, w15, #16
+; STRICTALIGN-NEXT: orr x10, x12, x11, lsl #24
+; STRICTALIGN-NEXT: orr w11, w14, w13, lsl #8
+; STRICTALIGN-NEXT: orr w12, w15, w16, lsl #24
+; STRICTALIGN-NEXT: orr x9, x10, x9
+; STRICTALIGN-NEXT: orr w10, w12, w11
+; STRICTALIGN-NEXT: orr x9, x9, x10, lsl #32
+; STRICTALIGN-NEXT: fmov d0, x9
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x0, #5]
+; STRICTALIGN-BE-NEXT: mov x13, x0
+; STRICTALIGN-BE-NEXT: ldrb w14, [x13, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0]
+; STRICTALIGN-BE-NEXT: lsl w10, w10, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x13, #2]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x13, #3]
+; STRICTALIGN-BE-NEXT: lsl x12, x12, #16
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w10, w11, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x13, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x12, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8
+; STRICTALIGN-BE-NEXT: orr x9, x11, x10
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: fmov d0, x8
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <4 x i16>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define <4 x i16> @load_v4i16_align1_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldrb w8, [x0, #16]!
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w11, [x10, #4]!
+; STRICTALIGN-NEXT: ldrb w12, [x10, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #3]
+; STRICTALIGN-NEXT: lsl x9, x9, #16
+; STRICTALIGN-NEXT: ldrb w15, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w10, [x10, #3]
+; STRICTALIGN-NEXT: lsl w12, w12, #16
+; STRICTALIGN-NEXT: orr x8, x8, x13, lsl #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #24
+; STRICTALIGN-NEXT: orr w11, w11, w15, lsl #8
+; STRICTALIGN-NEXT: orr w10, w12, w10, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w10, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: fmov d0, x8
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #16]!
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x12, x0
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x12, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsl w10, w10, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x12, #2]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x12, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w9, w11, w9, lsl #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: orr w8, w10, w8, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x12, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w8, w9
+; STRICTALIGN-BE-NEXT: orr x9, x11, x10
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: fmov d0, x8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <4 x i16>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align1_post16(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: fmov x8, d0
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: strb w8, [x0]
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: lsr x9, x8, #8
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #32
+; STRICTALIGN-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-NEXT: lsr x9, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: add x11, x0, #16
+; STRICTALIGN-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-NEXT: str x11, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: fmov x8, d0
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #24
+; STRICTALIGN-BE-NEXT: lsr x8, x8, #8
+; STRICTALIGN-BE-NEXT: strb w9, [x0]
+; STRICTALIGN-BE-NEXT: add x9, x0, #16
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-BE-NEXT: str b0, [x0, #3]
+; STRICTALIGN-BE-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: str x9, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <4 x i16> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v4i16_align1_pre16(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: fmov x8, d0
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: strb w8, [x0, #16]!
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: lsr x9, x8, #8
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #32
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: lsr x11, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: strb w10, [x9, #4]!
+; STRICTALIGN-NEXT: strb w11, [x9, #3]
+; STRICTALIGN-NEXT: strb w8, [x9, #2]
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: fmov x8, d0
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #16]!
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #32
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #40
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #48
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #24
+; STRICTALIGN-BE-NEXT: lsr x8, x8, #8
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x9, x0
+; STRICTALIGN-BE-NEXT: strb w10, [x9, #4]!
+; STRICTALIGN-BE-NEXT: str b0, [x9, #3]
+; STRICTALIGN-BE-NEXT: strb w8, [x9, #2]
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <4 x i16> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align2(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align2:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align2:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.4h }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align2:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align2:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.4h }, [x0]
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <4 x i16>, ptr %ptr, align 2
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align2(ptr %ptr, <4 x i16> %val) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align2:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align2:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.4h }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align2:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align2:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: st1 { v0.4h }, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <4 x i16> %val, ptr %ptr, align 2
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align2_post8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align2_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align2_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.4h }, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align2_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align2_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.4h }, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <4 x i16>, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define <4 x i16> @load_v4i16_align2_pre8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align2_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align2_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #8
+; STRICTALIGN-NEXT: ld1 { v0.4h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align2_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align2_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #8
+; STRICTALIGN-BE-NEXT: ld1 { v0.4h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <4 x i16>, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align2_post8(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align2_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align2_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.4h }, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align2_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align2_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: st1 { v0.4h }, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <4 x i16> %val, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v4i16_align2_pre8(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align2_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align2_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #8
+; STRICTALIGN-NEXT: st1 { v0.4h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align2_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align2_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: add x8, x0, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.4h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <4 x i16> %val, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align2_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align2_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align2_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.4h }, [x0]
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align2_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align2_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.4h }, [x0]
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <4 x i16>, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define <4 x i16> @load_v4i16_align2_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align2_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align2_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: ld1 { v0.4h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align2_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align2_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: ld1 { v0.4h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <4 x i16>, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align2_post16(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align2_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align2_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: st1 { v0.4h }, [x0]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align2_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align2_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: st1 { v0.4h }, [x0]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <4 x i16> %val, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v4i16_align2_pre16(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align2_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align2_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: st1 { v0.4h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align2_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align2_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.4h, v0.4h
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: st1 { v0.4h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <4 x i16> %val, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align8(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <4 x i16>, ptr %ptr, align 8
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align8(ptr %ptr, <4 x i16> %val) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <4 x i16> %val, ptr %ptr, align 8
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align8_post8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align8_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align8_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align8_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align8_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <4 x i16>, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define <4 x i16> @load_v4i16_align8_pre8(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align8_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align8_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0, #8]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align8_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align8_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0, #8]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ %val = load <4 x i16>, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align8_post8(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align8_post8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align8_post8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.4h }, [x0], #8
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align8_post8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #8
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align8_post8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0], #8
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <4 x i16> %val, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v4i16_align8_pre8(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align8_pre8:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align8_pre8:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0, #8]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align8_pre8:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #8]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align8_pre8:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0, #8]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 8
+ store <4 x i16> %val, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <4 x i16> @load_v4i16_align8_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align8_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align8_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align8_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align8_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <4 x i16>, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define <4 x i16> @load_v4i16_align8_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v4i16_align8_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v4i16_align8_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr d0, [x0, #16]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v4i16_align8_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v4i16_align8_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr d0, [x0, #16]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <4 x i16>, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret <4 x i16> %val
+}
+
+define void @store_v4i16_align8_post16(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align8_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align8_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align8_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0], #16
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align8_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <4 x i16> %val, ptr %ptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v4i16_align8_pre16(ptr %ptr, <4 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v4i16_align8_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v4i16_align8_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str d0, [x0, #16]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v4i16_align8_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #16]!
+; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v4i16_align8_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str d0, [x0, #16]!
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <4 x i16> %val, ptr %newptr, align 8
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align1(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w8, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w11, [x10, #4]!
+; STRICTALIGN-NEXT: ldrb w12, [x10, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #3]
+; STRICTALIGN-NEXT: lsl x9, x9, #16
+; STRICTALIGN-NEXT: ldrb w15, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w10, [x10, #3]
+; STRICTALIGN-NEXT: lsl w12, w12, #16
+; STRICTALIGN-NEXT: orr x8, x13, x8, lsl #8
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #24
+; STRICTALIGN-NEXT: orr w11, w11, w15, lsl #8
+; STRICTALIGN-NEXT: orr w10, w12, w10, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w10, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: mov x8, x0
+; STRICTALIGN-NEXT: ldrb w14, [x0, #9]
+; STRICTALIGN-NEXT: ldrb w15, [x0, #13]
+; STRICTALIGN-NEXT: ldrb w9, [x8, #8]!
+; STRICTALIGN-NEXT: ldrb w10, [x8, #3]
+; STRICTALIGN-NEXT: ldrb w11, [x8, #2]
+; STRICTALIGN-NEXT: ldrb w12, [x8, #4]!
+; STRICTALIGN-NEXT: ldrb w13, [x8, #2]
+; STRICTALIGN-NEXT: ldrb w8, [x8, #3]
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #8
+; STRICTALIGN-NEXT: lsl x11, x11, #16
+; STRICTALIGN-NEXT: lsl w13, w13, #16
+; STRICTALIGN-NEXT: orr x10, x11, x10, lsl #24
+; STRICTALIGN-NEXT: orr w11, w12, w15, lsl #8
+; STRICTALIGN-NEXT: orr w8, w13, w8, lsl #24
+; STRICTALIGN-NEXT: orr x9, x10, x9
+; STRICTALIGN-NEXT: orr w8, w8, w11
+; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #8]
+; STRICTALIGN-NEXT: ldr q0, [sp], #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x12, x0
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x12, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0]
+; STRICTALIGN-BE-NEXT: lsl w11, w11, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x12, #2]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x12, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #8
+; STRICTALIGN-BE-NEXT: orr w10, w11, w10, lsl #24
+; STRICTALIGN-BE-NEXT: orr x9, x12, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w10, w8
+; STRICTALIGN-BE-NEXT: orr x9, x11, x9
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: mov x8, x0
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #9]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #13]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x8, #8]!
+; STRICTALIGN-BE-NEXT: ldrb w12, [x8, #2]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x8, #3]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x8, #4]!
+; STRICTALIGN-BE-NEXT: lsl w9, w9, #16
+; STRICTALIGN-BE-NEXT: lsl x11, x11, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x8, #2]
+; STRICTALIGN-BE-NEXT: ldrb w8, [x8, #3]
+; STRICTALIGN-BE-NEXT: orr w12, w13, w12, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w9, w10, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x11, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr x8, x8, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w9, w12
+; STRICTALIGN-BE-NEXT: orr x8, x10, x8
+; STRICTALIGN-BE-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: ldr q0, [sp], #16
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <8 x i16>, ptr %ptr, align 1
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align1(ptr %ptr, <8 x i16> %val) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align1:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align1:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: ldr x8, [sp]
+; STRICTALIGN-NEXT: strb w8, [x0]
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: ldr x12, [sp, #8]
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: lsr x10, x12, #40
+; STRICTALIGN-NEXT: lsr x11, x12, #24
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: strb w12, [x9, #8]!
+; STRICTALIGN-NEXT: strb w10, [x0, #13]
+; STRICTALIGN-NEXT: lsr x10, x12, #16
+; STRICTALIGN-NEXT: strb w11, [x9, #3]
+; STRICTALIGN-NEXT: lsr x11, x12, #8
+; STRICTALIGN-NEXT: strb w10, [x9, #2]
+; STRICTALIGN-NEXT: lsr x10, x8, #8
+; STRICTALIGN-NEXT: strb w11, [x0, #9]
+; STRICTALIGN-NEXT: lsr x11, x12, #32
+; STRICTALIGN-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-NEXT: lsr x10, x12, #56
+; STRICTALIGN-NEXT: strb w11, [x9, #4]!
+; STRICTALIGN-NEXT: lsr x11, x12, #48
+; STRICTALIGN-NEXT: strb w10, [x9, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #32
+; STRICTALIGN-NEXT: strb w11, [x9, #2]
+; STRICTALIGN-NEXT: lsr x9, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align1:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align1:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: ldr x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #32
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #13]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #9]
+; STRICTALIGN-BE-NEXT: mov x10, x0
+; STRICTALIGN-BE-NEXT: ldr x12, [sp]
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #8]!
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: strb w11, [x10, #3]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #32
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #40
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #48
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #56
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #24
+; STRICTALIGN-BE-NEXT: strb w11, [x0]
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #24
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #4]!
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #8
+; STRICTALIGN-BE-NEXT: strb w12, [x0, #3]
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #8
+; STRICTALIGN-BE-NEXT: strb w11, [x10, #4]!
+; STRICTALIGN-BE-NEXT: strb w8, [x10, #3]
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-BE-NEXT: add sp, sp, #16
+; STRICTALIGN-BE-NEXT: ret
+ store <8 x i16> %val, ptr %ptr, align 1
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align1_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w8, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w11, [x10, #4]!
+; STRICTALIGN-NEXT: ldrb w12, [x10, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #3]
+; STRICTALIGN-NEXT: lsl x9, x9, #16
+; STRICTALIGN-NEXT: ldrb w15, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w10, [x10, #3]
+; STRICTALIGN-NEXT: lsl w12, w12, #16
+; STRICTALIGN-NEXT: orr x8, x13, x8, lsl #8
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #24
+; STRICTALIGN-NEXT: orr w11, w11, w15, lsl #8
+; STRICTALIGN-NEXT: orr w10, w12, w10, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w10, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: mov x8, x0
+; STRICTALIGN-NEXT: ldrb w14, [x0, #9]
+; STRICTALIGN-NEXT: ldrb w15, [x0, #13]
+; STRICTALIGN-NEXT: ldrb w9, [x8, #8]!
+; STRICTALIGN-NEXT: ldrb w10, [x8, #3]
+; STRICTALIGN-NEXT: ldrb w11, [x8, #2]
+; STRICTALIGN-NEXT: ldrb w12, [x8, #4]!
+; STRICTALIGN-NEXT: ldrb w13, [x8, #2]
+; STRICTALIGN-NEXT: ldrb w8, [x8, #3]
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #8
+; STRICTALIGN-NEXT: lsl x11, x11, #16
+; STRICTALIGN-NEXT: lsl w13, w13, #16
+; STRICTALIGN-NEXT: orr x10, x11, x10, lsl #24
+; STRICTALIGN-NEXT: orr w11, w12, w15, lsl #8
+; STRICTALIGN-NEXT: orr w8, w13, w8, lsl #24
+; STRICTALIGN-NEXT: orr x9, x10, x9
+; STRICTALIGN-NEXT: orr w8, w8, w11
+; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #8]
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: ldr q0, [sp]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x12, x0
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x12, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0]
+; STRICTALIGN-BE-NEXT: lsl w11, w11, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x12, #2]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x12, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #8
+; STRICTALIGN-BE-NEXT: orr w10, w11, w10, lsl #24
+; STRICTALIGN-BE-NEXT: orr x9, x12, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w10, w8
+; STRICTALIGN-BE-NEXT: orr x9, x11, x9
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: mov x8, x0
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #9]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #13]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x8, #8]!
+; STRICTALIGN-BE-NEXT: ldrb w12, [x8, #2]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x8, #3]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x8, #4]!
+; STRICTALIGN-BE-NEXT: lsl w9, w9, #16
+; STRICTALIGN-BE-NEXT: lsl x11, x11, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x8, #2]
+; STRICTALIGN-BE-NEXT: ldrb w8, [x8, #3]
+; STRICTALIGN-BE-NEXT: orr w12, w13, w12, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w9, w10, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x11, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr x8, x8, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w9, w12
+; STRICTALIGN-BE-NEXT: orr x8, x10, x8
+; STRICTALIGN-BE-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-BE-NEXT: add x9, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: str x9, [x1]
+; STRICTALIGN-BE-NEXT: ldr q0, [sp], #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i16>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define <8 x i16> @load_v8i16_align1_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldrb w8, [x0, #16]!
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w11, [x10, #4]!
+; STRICTALIGN-NEXT: ldrb w12, [x10, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #3]
+; STRICTALIGN-NEXT: ldrb w15, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w10, [x10, #3]
+; STRICTALIGN-NEXT: lsl x9, x9, #16
+; STRICTALIGN-NEXT: lsl w12, w12, #16
+; STRICTALIGN-NEXT: orr x8, x8, x13, lsl #8
+; STRICTALIGN-NEXT: orr w11, w11, w15, lsl #8
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #24
+; STRICTALIGN-NEXT: orr w10, w12, w10, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w10, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: ldrb w8, [x9, #8]!
+; STRICTALIGN-NEXT: ldrb w10, [x9, #3]
+; STRICTALIGN-NEXT: ldrb w11, [x9, #2]
+; STRICTALIGN-NEXT: ldrb w12, [x9, #4]!
+; STRICTALIGN-NEXT: ldrb w13, [x9, #2]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #9]
+; STRICTALIGN-NEXT: ldrb w15, [x0, #13]
+; STRICTALIGN-NEXT: lsl x11, x11, #16
+; STRICTALIGN-NEXT: ldrb w9, [x9, #3]
+; STRICTALIGN-NEXT: lsl w13, w13, #16
+; STRICTALIGN-NEXT: orr x8, x8, x14, lsl #8
+; STRICTALIGN-NEXT: orr x10, x11, x10, lsl #24
+; STRICTALIGN-NEXT: orr w11, w12, w15, lsl #8
+; STRICTALIGN-NEXT: orr w9, w13, w9, lsl #24
+; STRICTALIGN-NEXT: orr x8, x10, x8
+; STRICTALIGN-NEXT: orr w9, w9, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #8]
+; STRICTALIGN-NEXT: ldr q0, [sp]
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #16]!
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x12, x0
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x12, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsl w10, w10, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x12, #2]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x12, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w9, w11, w9, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x12, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr w8, w10, w8, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w8, w9
+; STRICTALIGN-BE-NEXT: orr x9, x10, x11
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: mov x9, x0
+; STRICTALIGN-BE-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: ldrb w8, [x9, #8]!
+; STRICTALIGN-BE-NEXT: ldrb w12, [x0, #9]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #13]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x9, #2]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x9, #3]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x9, #4]!
+; STRICTALIGN-BE-NEXT: lsl w12, w12, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x9, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x9, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w10, w11, w10, lsl #8
+; STRICTALIGN-BE-NEXT: orr w8, w12, w8, lsl #24
+; STRICTALIGN-BE-NEXT: orr x9, x9, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w8, w10
+; STRICTALIGN-BE-NEXT: orr x9, x11, x9
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ldr q0, [sp], #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i16>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align1_post16(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align1_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align1_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: ldr x8, [sp]
+; STRICTALIGN-NEXT: strb w8, [x0]
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: ldr x12, [sp, #8]
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: lsr x10, x12, #40
+; STRICTALIGN-NEXT: lsr x11, x12, #24
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: strb w12, [x9, #8]!
+; STRICTALIGN-NEXT: strb w10, [x0, #13]
+; STRICTALIGN-NEXT: lsr x10, x12, #16
+; STRICTALIGN-NEXT: strb w11, [x9, #3]
+; STRICTALIGN-NEXT: lsr x11, x12, #8
+; STRICTALIGN-NEXT: strb w10, [x9, #2]
+; STRICTALIGN-NEXT: lsr x10, x8, #8
+; STRICTALIGN-NEXT: strb w11, [x0, #9]
+; STRICTALIGN-NEXT: lsr x11, x12, #32
+; STRICTALIGN-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-NEXT: lsr x10, x12, #56
+; STRICTALIGN-NEXT: strb w11, [x9, #4]!
+; STRICTALIGN-NEXT: lsr x11, x12, #48
+; STRICTALIGN-NEXT: strb w10, [x9, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #32
+; STRICTALIGN-NEXT: add x12, x0, #16
+; STRICTALIGN-NEXT: strb w11, [x9, #2]
+; STRICTALIGN-NEXT: lsr x9, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-NEXT: str x12, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align1_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align1_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: ldr x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #32
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #13]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #9]
+; STRICTALIGN-BE-NEXT: mov x10, x0
+; STRICTALIGN-BE-NEXT: ldr x12, [sp]
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #8]!
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: strb w11, [x10, #3]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #32
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #40
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #48
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #56
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #24
+; STRICTALIGN-BE-NEXT: strb w11, [x0]
+; STRICTALIGN-BE-NEXT: add x11, x0, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #4]!
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #8
+; STRICTALIGN-BE-NEXT: strb w12, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x12, x8, #24
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #8
+; STRICTALIGN-BE-NEXT: strb w12, [x10, #4]!
+; STRICTALIGN-BE-NEXT: strb w8, [x10, #3]
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-BE-NEXT: str x11, [x1]
+; STRICTALIGN-BE-NEXT: add sp, sp, #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i16> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i16_align1_pre16(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align1_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align1_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: ldr x8, [sp]
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: strb w8, [x0, #16]!
+; STRICTALIGN-NEXT: ldr x12, [sp, #8]
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: lsr x9, x8, #8
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: lsr x11, x12, #8
+; STRICTALIGN-NEXT: lsr x13, x12, #24
+; STRICTALIGN-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-NEXT: lsr x9, x12, #40
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: strb w9, [x0, #13]
+; STRICTALIGN-NEXT: lsr x9, x12, #16
+; STRICTALIGN-NEXT: strb w11, [x0, #9]
+; STRICTALIGN-NEXT: lsr x11, x8, #32
+; STRICTALIGN-NEXT: strb w12, [x10, #8]!
+; STRICTALIGN-NEXT: strb w13, [x10, #3]
+; STRICTALIGN-NEXT: lsr x13, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: strb w11, [x9, #4]!
+; STRICTALIGN-NEXT: lsr x11, x12, #32
+; STRICTALIGN-NEXT: strb w13, [x9, #3]
+; STRICTALIGN-NEXT: strb w8, [x9, #2]
+; STRICTALIGN-NEXT: lsr x8, x12, #56
+; STRICTALIGN-NEXT: lsr x9, x12, #48
+; STRICTALIGN-NEXT: strb w11, [x10, #4]!
+; STRICTALIGN-NEXT: strb w8, [x10, #3]
+; STRICTALIGN-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align1_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align1_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: ldr x8, [sp]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #32
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #16]!
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: ldr x12, [sp, #8]
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #24
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: mov x9, x0
+; STRICTALIGN-BE-NEXT: lsr x13, x12, #56
+; STRICTALIGN-BE-NEXT: strb w11, [x9, #4]!
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #48
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x10, x12, #16
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #9]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #32
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #13]
+; STRICTALIGN-BE-NEXT: mov x10, x0
+; STRICTALIGN-BE-NEXT: strb w13, [x10, #8]!
+; STRICTALIGN-BE-NEXT: lsr x13, x12, #40
+; STRICTALIGN-BE-NEXT: strb w11, [x10, #3]
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #8
+; STRICTALIGN-BE-NEXT: strb w8, [x9, #3]
+; STRICTALIGN-BE-NEXT: lsr x8, x12, #24
+; STRICTALIGN-BE-NEXT: strb w13, [x10, #2]
+; STRICTALIGN-BE-NEXT: strb w8, [x10, #4]!
+; STRICTALIGN-BE-NEXT: lsr x8, x12, #8
+; STRICTALIGN-BE-NEXT: strb w11, [x9, #2]
+; STRICTALIGN-BE-NEXT: strb w12, [x10, #3]
+; STRICTALIGN-BE-NEXT: strb w8, [x10, #2]
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: add sp, sp, #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i16> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align1_post32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align1_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align1_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w8, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w11, [x10, #4]!
+; STRICTALIGN-NEXT: ldrb w12, [x10, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #3]
+; STRICTALIGN-NEXT: lsl x9, x9, #16
+; STRICTALIGN-NEXT: ldrb w15, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w10, [x10, #3]
+; STRICTALIGN-NEXT: lsl w12, w12, #16
+; STRICTALIGN-NEXT: orr x8, x13, x8, lsl #8
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #24
+; STRICTALIGN-NEXT: orr w11, w11, w15, lsl #8
+; STRICTALIGN-NEXT: orr w10, w12, w10, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w10, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: mov x8, x0
+; STRICTALIGN-NEXT: ldrb w14, [x0, #9]
+; STRICTALIGN-NEXT: ldrb w15, [x0, #13]
+; STRICTALIGN-NEXT: ldrb w9, [x8, #8]!
+; STRICTALIGN-NEXT: ldrb w10, [x8, #3]
+; STRICTALIGN-NEXT: ldrb w11, [x8, #2]
+; STRICTALIGN-NEXT: ldrb w12, [x8, #4]!
+; STRICTALIGN-NEXT: ldrb w13, [x8, #2]
+; STRICTALIGN-NEXT: ldrb w8, [x8, #3]
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #8
+; STRICTALIGN-NEXT: lsl x11, x11, #16
+; STRICTALIGN-NEXT: lsl w13, w13, #16
+; STRICTALIGN-NEXT: orr x10, x11, x10, lsl #24
+; STRICTALIGN-NEXT: orr w11, w12, w15, lsl #8
+; STRICTALIGN-NEXT: orr w8, w13, w8, lsl #24
+; STRICTALIGN-NEXT: orr x9, x10, x9
+; STRICTALIGN-NEXT: orr w8, w8, w11
+; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #8]
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: ldr q0, [sp]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align1_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align1_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x12, x0
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x12, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0]
+; STRICTALIGN-BE-NEXT: lsl w11, w11, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x12, #2]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x12, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #8
+; STRICTALIGN-BE-NEXT: orr w10, w11, w10, lsl #24
+; STRICTALIGN-BE-NEXT: orr x9, x12, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w10, w8
+; STRICTALIGN-BE-NEXT: orr x9, x11, x9
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: mov x8, x0
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #9]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #13]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x8, #8]!
+; STRICTALIGN-BE-NEXT: ldrb w12, [x8, #2]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x8, #3]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x8, #4]!
+; STRICTALIGN-BE-NEXT: lsl w9, w9, #16
+; STRICTALIGN-BE-NEXT: lsl x11, x11, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x8, #2]
+; STRICTALIGN-BE-NEXT: ldrb w8, [x8, #3]
+; STRICTALIGN-BE-NEXT: orr w12, w13, w12, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w9, w10, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x11, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr x8, x8, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr w9, w9, w12
+; STRICTALIGN-BE-NEXT: orr x8, x10, x8
+; STRICTALIGN-BE-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-BE-NEXT: add x9, x0, #32
+; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: str x9, [x1]
+; STRICTALIGN-BE-NEXT: ldr q0, [sp], #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <8 x i16>, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define <8 x i16> @load_v8i16_align1_pre32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align1_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align1_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldrb w8, [x0, #32]!
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-NEXT: ldrb w11, [x10, #4]!
+; STRICTALIGN-NEXT: ldrb w12, [x10, #2]
+; STRICTALIGN-NEXT: ldrb w13, [x0, #1]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #3]
+; STRICTALIGN-NEXT: ldrb w15, [x0, #5]
+; STRICTALIGN-NEXT: ldrb w10, [x10, #3]
+; STRICTALIGN-NEXT: lsl x9, x9, #16
+; STRICTALIGN-NEXT: lsl w12, w12, #16
+; STRICTALIGN-NEXT: orr x8, x8, x13, lsl #8
+; STRICTALIGN-NEXT: orr w11, w11, w15, lsl #8
+; STRICTALIGN-NEXT: orr x9, x9, x14, lsl #24
+; STRICTALIGN-NEXT: orr w10, w12, w10, lsl #24
+; STRICTALIGN-NEXT: orr x8, x9, x8
+; STRICTALIGN-NEXT: orr w9, w10, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: ldrb w8, [x9, #8]!
+; STRICTALIGN-NEXT: ldrb w10, [x9, #3]
+; STRICTALIGN-NEXT: ldrb w11, [x9, #2]
+; STRICTALIGN-NEXT: ldrb w12, [x9, #4]!
+; STRICTALIGN-NEXT: ldrb w13, [x9, #2]
+; STRICTALIGN-NEXT: ldrb w14, [x0, #9]
+; STRICTALIGN-NEXT: ldrb w15, [x0, #13]
+; STRICTALIGN-NEXT: lsl x11, x11, #16
+; STRICTALIGN-NEXT: ldrb w9, [x9, #3]
+; STRICTALIGN-NEXT: lsl w13, w13, #16
+; STRICTALIGN-NEXT: orr x8, x8, x14, lsl #8
+; STRICTALIGN-NEXT: orr x10, x11, x10, lsl #24
+; STRICTALIGN-NEXT: orr w11, w12, w15, lsl #8
+; STRICTALIGN-NEXT: orr w9, w13, w9, lsl #24
+; STRICTALIGN-NEXT: orr x8, x10, x8
+; STRICTALIGN-NEXT: orr w9, w9, w11
+; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
+; STRICTALIGN-NEXT: str x8, [sp, #8]
+; STRICTALIGN-NEXT: ldr q0, [sp]
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align1_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align1_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldrb w8, [x0, #32]!
+; STRICTALIGN-BE-NEXT: ldrb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: mov x12, x0
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #5]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x12, #4]!
+; STRICTALIGN-BE-NEXT: ldrb w11, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsl w10, w10, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x12, #2]
+; STRICTALIGN-BE-NEXT: ldrb w12, [x12, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w9, w11, w9, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x12, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr w8, w10, w8, lsl #24
+; STRICTALIGN-BE-NEXT: orr x10, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w8, w9
+; STRICTALIGN-BE-NEXT: orr x9, x10, x11
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: mov x9, x0
+; STRICTALIGN-BE-NEXT: str x8, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: ldrb w8, [x9, #8]!
+; STRICTALIGN-BE-NEXT: ldrb w12, [x0, #9]
+; STRICTALIGN-BE-NEXT: ldrb w13, [x0, #13]
+; STRICTALIGN-BE-NEXT: ldrb w10, [x9, #2]
+; STRICTALIGN-BE-NEXT: ldrb w11, [x9, #3]
+; STRICTALIGN-BE-NEXT: ldrb w14, [x9, #4]!
+; STRICTALIGN-BE-NEXT: lsl w12, w12, #16
+; STRICTALIGN-BE-NEXT: ldrb w15, [x9, #2]
+; STRICTALIGN-BE-NEXT: ldrb w9, [x9, #3]
+; STRICTALIGN-BE-NEXT: lsl x13, x13, #16
+; STRICTALIGN-BE-NEXT: orr w10, w11, w10, lsl #8
+; STRICTALIGN-BE-NEXT: orr w8, w12, w8, lsl #24
+; STRICTALIGN-BE-NEXT: orr x9, x9, x15, lsl #8
+; STRICTALIGN-BE-NEXT: orr x11, x13, x14, lsl #24
+; STRICTALIGN-BE-NEXT: orr w8, w8, w10
+; STRICTALIGN-BE-NEXT: orr x9, x11, x9
+; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
+; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ldr q0, [sp], #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <8 x i16>, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align1_post32(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align1_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align1_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: ldr x8, [sp]
+; STRICTALIGN-NEXT: strb w8, [x0]
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: ldr x12, [sp, #8]
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: lsr x10, x12, #40
+; STRICTALIGN-NEXT: lsr x11, x12, #24
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: strb w12, [x9, #8]!
+; STRICTALIGN-NEXT: strb w10, [x0, #13]
+; STRICTALIGN-NEXT: lsr x10, x12, #16
+; STRICTALIGN-NEXT: strb w11, [x9, #3]
+; STRICTALIGN-NEXT: lsr x11, x12, #8
+; STRICTALIGN-NEXT: strb w10, [x9, #2]
+; STRICTALIGN-NEXT: lsr x10, x8, #8
+; STRICTALIGN-NEXT: strb w11, [x0, #9]
+; STRICTALIGN-NEXT: lsr x11, x12, #32
+; STRICTALIGN-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-NEXT: lsr x10, x12, #56
+; STRICTALIGN-NEXT: strb w11, [x9, #4]!
+; STRICTALIGN-NEXT: lsr x11, x12, #48
+; STRICTALIGN-NEXT: strb w10, [x9, #3]
+; STRICTALIGN-NEXT: lsr x10, x8, #32
+; STRICTALIGN-NEXT: add x12, x0, #32
+; STRICTALIGN-NEXT: strb w11, [x9, #2]
+; STRICTALIGN-NEXT: lsr x9, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w10, [x0, #4]!
+; STRICTALIGN-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-NEXT: strb w8, [x0, #2]
+; STRICTALIGN-NEXT: str x12, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align1_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align1_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: ldr x8, [sp, #8]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #32
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #13]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #9]
+; STRICTALIGN-BE-NEXT: mov x10, x0
+; STRICTALIGN-BE-NEXT: ldr x12, [sp]
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #8]!
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: strb w11, [x10, #3]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #32
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #40
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #48
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #56
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #24
+; STRICTALIGN-BE-NEXT: strb w11, [x0]
+; STRICTALIGN-BE-NEXT: add x11, x0, #32
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #4]!
+; STRICTALIGN-BE-NEXT: lsr x9, x12, #8
+; STRICTALIGN-BE-NEXT: strb w12, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x12, x8, #24
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #8
+; STRICTALIGN-BE-NEXT: strb w12, [x10, #4]!
+; STRICTALIGN-BE-NEXT: strb w8, [x10, #3]
+; STRICTALIGN-BE-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-BE-NEXT: str x11, [x1]
+; STRICTALIGN-BE-NEXT: add sp, sp, #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <8 x i16> %val, ptr %ptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i16_align1_pre32(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align1_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align1_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-NEXT: ldr x8, [sp]
+; STRICTALIGN-NEXT: lsr x9, x8, #40
+; STRICTALIGN-NEXT: strb w8, [x0, #32]!
+; STRICTALIGN-NEXT: ldr x12, [sp, #8]
+; STRICTALIGN-NEXT: lsr x11, x8, #16
+; STRICTALIGN-NEXT: lsr x10, x8, #24
+; STRICTALIGN-NEXT: strb w9, [x0, #5]
+; STRICTALIGN-NEXT: lsr x9, x8, #8
+; STRICTALIGN-NEXT: strb w11, [x0, #2]
+; STRICTALIGN-NEXT: lsr x11, x12, #8
+; STRICTALIGN-NEXT: lsr x13, x12, #24
+; STRICTALIGN-NEXT: strb w9, [x0, #1]
+; STRICTALIGN-NEXT: lsr x9, x12, #40
+; STRICTALIGN-NEXT: strb w10, [x0, #3]
+; STRICTALIGN-NEXT: mov x10, x0
+; STRICTALIGN-NEXT: strb w9, [x0, #13]
+; STRICTALIGN-NEXT: lsr x9, x12, #16
+; STRICTALIGN-NEXT: strb w11, [x0, #9]
+; STRICTALIGN-NEXT: lsr x11, x8, #32
+; STRICTALIGN-NEXT: strb w12, [x10, #8]!
+; STRICTALIGN-NEXT: strb w13, [x10, #3]
+; STRICTALIGN-NEXT: lsr x13, x8, #56
+; STRICTALIGN-NEXT: lsr x8, x8, #48
+; STRICTALIGN-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-NEXT: mov x9, x0
+; STRICTALIGN-NEXT: strb w11, [x9, #4]!
+; STRICTALIGN-NEXT: lsr x11, x12, #32
+; STRICTALIGN-NEXT: strb w13, [x9, #3]
+; STRICTALIGN-NEXT: strb w8, [x9, #2]
+; STRICTALIGN-NEXT: lsr x8, x12, #56
+; STRICTALIGN-NEXT: lsr x9, x12, #48
+; STRICTALIGN-NEXT: strb w11, [x10, #4]!
+; STRICTALIGN-NEXT: strb w8, [x10, #3]
+; STRICTALIGN-NEXT: strb w9, [x10, #2]
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: add sp, sp, #16
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align1_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align1_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str q0, [sp, #-16]!
+; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
+; STRICTALIGN-BE-NEXT: ldr x8, [sp]
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #56
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #32
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #16
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #32]!
+; STRICTALIGN-BE-NEXT: lsr x9, x8, #40
+; STRICTALIGN-BE-NEXT: ldr x12, [sp, #8]
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #3]
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #24
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #5]
+; STRICTALIGN-BE-NEXT: lsr x10, x8, #48
+; STRICTALIGN-BE-NEXT: strb w9, [x0, #2]
+; STRICTALIGN-BE-NEXT: mov x9, x0
+; STRICTALIGN-BE-NEXT: lsr x13, x12, #56
+; STRICTALIGN-BE-NEXT: strb w11, [x9, #4]!
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #48
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #1]
+; STRICTALIGN-BE-NEXT: lsr x10, x12, #16
+; STRICTALIGN-BE-NEXT: strb w11, [x0, #9]
+; STRICTALIGN-BE-NEXT: lsr x11, x12, #32
+; STRICTALIGN-BE-NEXT: strb w10, [x0, #13]
+; STRICTALIGN-BE-NEXT: mov x10, x0
+; STRICTALIGN-BE-NEXT: strb w13, [x10, #8]!
+; STRICTALIGN-BE-NEXT: lsr x13, x12, #40
+; STRICTALIGN-BE-NEXT: strb w11, [x10, #3]
+; STRICTALIGN-BE-NEXT: lsr x11, x8, #8
+; STRICTALIGN-BE-NEXT: strb w8, [x9, #3]
+; STRICTALIGN-BE-NEXT: lsr x8, x12, #24
+; STRICTALIGN-BE-NEXT: strb w13, [x10, #2]
+; STRICTALIGN-BE-NEXT: strb w8, [x10, #4]!
+; STRICTALIGN-BE-NEXT: lsr x8, x12, #8
+; STRICTALIGN-BE-NEXT: strb w11, [x9, #2]
+; STRICTALIGN-BE-NEXT: strb w12, [x10, #3]
+; STRICTALIGN-BE-NEXT: strb w8, [x10, #2]
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: add sp, sp, #16
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <8 x i16> %val, ptr %newptr, align 1
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align2(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align2:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align2:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.8h }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align2:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align2:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.8h }, [x0]
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <8 x i16>, ptr %ptr, align 2
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align2(ptr %ptr, <8 x i16> %val) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align2:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align2:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.8h }, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align2:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align2:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.8h }, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <8 x i16> %val, ptr %ptr, align 2
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align2_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align2_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align2_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.8h }, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align2_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align2_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.8h }, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i16>, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define <8 x i16> @load_v8i16_align2_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align2_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align2_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: ld1 { v0.8h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align2_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align2_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: ld1 { v0.8h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i16>, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align2_post16(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align2_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align2_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.8h }, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align2_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align2_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.8h }, [x0], #16
+; STRICTALIGN-BE-NEXT: str x0, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i16> %val, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i16_align2_pre16(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align2_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align2_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #16
+; STRICTALIGN-NEXT: st1 { v0.8h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align2_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align2_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.8h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ store <8 x i16> %val, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align2_post32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align2_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align2_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ld1 { v0.8h }, [x0]
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align2_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align2_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ld1 { v0.8h }, [x0]
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <8 x i16>, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define <8 x i16> @load_v8i16_align2_pre32(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align2_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align2_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: ld1 { v0.8h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align2_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align2_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: ld1 { v0.8h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ %val = load <8 x i16>, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align2_post32(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align2_post32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #32
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align2_post32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: st1 { v0.8h }, [x0]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align2_post32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align2_post32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.8h }, [x0]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <8 x i16> %val, ptr %ptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define void @store_v8i16_align2_pre32(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align2_pre32:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align2_pre32:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: add x8, x0, #32
+; STRICTALIGN-NEXT: st1 { v0.8h }, [x8]
+; STRICTALIGN-NEXT: str x8, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align2_pre32:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #32
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0, #32]
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align2_pre32:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: rev64 v0.8h, v0.8h
+; STRICTALIGN-BE-NEXT: add x8, x0, #32
+; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
+; STRICTALIGN-BE-NEXT: st1 { v0.8h }, [x8]
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 32
+ store <8 x i16> %val, ptr %newptr, align 2
+ store ptr %newptr, ptr %writeback
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align16(ptr %ptr) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ %val = load <8 x i16>, ptr %ptr, align 16
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align16(ptr %ptr, <8 x i16> %val) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: str q0, [x0]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: store_v8i16_align16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: store_v8i16_align16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: str q0, [x0]
+; STRICTALIGN-BE-NEXT: ret
+ store <8 x i16> %val, ptr %ptr, align 16
+ ret void
+}
+
+define <8 x i16> @load_v8i16_align16_post16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align16_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align16_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0], #16
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align16_post16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align16_post16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0]
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i16>, ptr %ptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define <8 x i16> @load_v8i16_align16_pre16(ptr %ptr, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: load_v8i16_align16_pre16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: load_v8i16_align16_pre16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: ldr q0, [x0, #16]!
+; STRICTALIGN-NEXT: str x0, [x1]
+; STRICTALIGN-NEXT: ret
+;
+; NOSTRICTALIGN-BE-LABEL: load_v8i16_align16_pre16:
+; NOSTRICTALIGN-BE: // %bb.0:
+; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0, #16]
+; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
+; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
+; NOSTRICTALIGN-BE-NEXT: ret
+;
+; STRICTALIGN-BE-LABEL: load_v8i16_align16_pre16:
+; STRICTALIGN-BE: // %bb.0:
+; STRICTALIGN-BE-NEXT: ldr q0, [x0, #16]
+; STRICTALIGN-BE-NEXT: add x8, x0, #16
+; STRICTALIGN-BE-NEXT: str x8, [x1]
+; STRICTALIGN-BE-NEXT: ret
+ %newptr = getelementptr i8, ptr %ptr, i64 16
+ %val = load <8 x i16>, ptr %newptr, align 16
+ store ptr %newptr, ptr %writeback
+ ret <8 x i16> %val
+}
+
+define void @store_v8i16_align16_post16(ptr %ptr, <8 x i16> %val, ptr %writeback) {
+; NOSTRICTALIGN-LABEL: store_v8i16_align16_post16:
+; NOSTRICTALIGN: // %bb.0:
+; NOSTRICTALIGN-NEXT: str q0, [x0], #16
+; NOSTRICTALIGN-NEXT: str x0, [x1]
+; NOSTRICTALIGN-NEXT: ret
+;
+; STRICTALIGN-LABEL: store_v8i16_align16_post16:
+; STRICTALIGN: // %bb.0:
+; STRICTALIGN-NEXT: st1 { v0.8h }, [x0], #16
----------------
ostannard wrote:
Some patterns were missing the AddedComplexity needed to prioritise ldr/str over ld1/st1, I've added that to all of them.
https://github.com/llvm/llvm-project/pull/211513
More information about the llvm-commits
mailing list