[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