blob: 24040d85466a657549d6a62c4231d0b245fa27ff [file] [edit]
; 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: str d0, [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: str q0, [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: str d0, [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: str q0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v8i16_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_v8i16_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 <8 x i16> %val, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v8i16_align16_pre16(ptr %ptr, <8 x i16> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v8i16_align16_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v8i16_align16_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v8i16_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_v8i16_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 <8 x i16> %val, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define <8 x i16> @load_v8i16_align16_post32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v8i16_align16_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v8i16_align16_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0], #32
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v8i16_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_v8i16_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 <8 x i16>, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret <8 x i16> %val
}
define <8 x i16> @load_v8i16_align16_pre32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v8i16_align16_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v8i16_align16_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0, #32]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v8i16_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_v8i16_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 <8 x i16>, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret <8 x i16> %val
}
define void @store_v8i16_align16_post32(ptr %ptr, <8 x i16> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v8i16_align16_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v8i16_align16_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0], #32
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v8i16_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_v8i16_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 <8 x i16> %val, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v8i16_align16_pre32(ptr %ptr, <8 x i16> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v8i16_align16_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v8i16_align16_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0, #32]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v8i16_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_v8i16_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 <8 x i16> %val, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i32> @load_v2i32_align2(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v2i32_align2:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align2:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #6]
; STRICTALIGN-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-NEXT: ldrh w10, [x0, #2]
; STRICTALIGN-NEXT: ldrh w11, [x0]
; STRICTALIGN-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-NEXT: orr x9, x11, x10, lsl #16
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_align2:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v2i32_align2:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0]
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #2]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-BE-NEXT: orr x9, x11, x10, lsl #16
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: fmov d0, x8
; STRICTALIGN-BE-NEXT: ret
%val = load <2 x i32>, ptr %ptr, align 2
ret <2 x i32> %val
}
define void @store_v2i32_align2(ptr %ptr, <2 x i32> %val) {
; NOSTRICTALIGN-LABEL: store_v2i32_align2:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align2:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: strh w8, [x0]
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_align2:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v2i32_align2:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: str h0, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
; STRICTALIGN-BE-NEXT: lsr x8, x8, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: strh w10, [x0, #2]
; STRICTALIGN-BE-NEXT: strh w8, [x0]
; STRICTALIGN-BE-NEXT: ret
store <2 x i32> %val, ptr %ptr, align 2
ret void
}
define <2 x i32> @load_v2i32_align2_post8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align2_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align2_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #6]
; STRICTALIGN-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-NEXT: ldrh w10, [x0, #2]
; STRICTALIGN-NEXT: ldrh w11, [x0]
; STRICTALIGN-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-NEXT: orr x9, x11, x10, lsl #16
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: add x8, x0, #8
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_align2_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0]
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #2]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-BE-NEXT: orr x9, x11, x10, lsl #16
; 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 <2 x i32>, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define <2 x i32> @load_v2i32_align2_pre8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align2_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align2_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #8]!
; STRICTALIGN-NEXT: ldrh w9, [x0, #6]
; STRICTALIGN-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: orr w9, w10, w9, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x11, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_align2_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0, #8]!
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #6]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: orr x9, x10, x9, lsl #16
; STRICTALIGN-BE-NEXT: orr w8, w11, w8, lsl #16
; 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 <2 x i32>, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define void @store_v2i32_align2_post8(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align2_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align2_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: strh w8, [x0]
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: add x9, x0, #8
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: str x9, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_align2_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: str h0, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
; STRICTALIGN-BE-NEXT: lsr x8, x8, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: add x9, x0, #8
; STRICTALIGN-BE-NEXT: strh w10, [x0, #2]
; STRICTALIGN-BE-NEXT: strh w8, [x0]
; STRICTALIGN-BE-NEXT: str x9, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <2 x i32> %val, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i32_align2_pre8(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align2_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align2_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: strh w8, [x0, #8]!
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_align2_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: lsr x9, x8, #48
; STRICTALIGN-BE-NEXT: lsr x10, x8, #16
; STRICTALIGN-BE-NEXT: lsr x8, x8, #32
; STRICTALIGN-BE-NEXT: strh w9, [x0, #8]!
; STRICTALIGN-BE-NEXT: str h0, [x0, #6]
; STRICTALIGN-BE-NEXT: strh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: strh w8, [x0, #2]
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <2 x i32> %val, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i32> @load_v2i32_align2_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align2_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align2_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #6]
; STRICTALIGN-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-NEXT: ldrh w10, [x0, #2]
; STRICTALIGN-NEXT: ldrh w11, [x0]
; STRICTALIGN-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-NEXT: orr x9, x11, x10, lsl #16
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_align2_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0]
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #2]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-BE-NEXT: orr x9, x11, x10, lsl #16
; 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 <2 x i32>, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define <2 x i32> @load_v2i32_align2_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align2_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align2_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #16]!
; STRICTALIGN-NEXT: ldrh w9, [x0, #6]
; STRICTALIGN-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: orr w9, w10, w9, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x11, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_align2_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0, #16]!
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #6]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: orr x9, x10, x9, lsl #16
; STRICTALIGN-BE-NEXT: orr w8, w11, w8, lsl #16
; 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 <2 x i32>, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define void @store_v2i32_align2_post16(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align2_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align2_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: strh w8, [x0]
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: add x9, x0, #16
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: str x9, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_align2_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: str h0, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
; STRICTALIGN-BE-NEXT: lsr x8, x8, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: add x9, x0, #16
; STRICTALIGN-BE-NEXT: strh w10, [x0, #2]
; STRICTALIGN-BE-NEXT: strh w8, [x0]
; STRICTALIGN-BE-NEXT: str x9, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <2 x i32> %val, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i32_align2_pre16(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align2_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align2_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: strh w8, [x0, #16]!
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_align2_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: lsr x9, x8, #48
; STRICTALIGN-BE-NEXT: lsr x10, x8, #16
; STRICTALIGN-BE-NEXT: lsr x8, x8, #32
; STRICTALIGN-BE-NEXT: strh w9, [x0, #16]!
; STRICTALIGN-BE-NEXT: str h0, [x0, #6]
; STRICTALIGN-BE-NEXT: strh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: strh w8, [x0, #2]
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <2 x i32> %val, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i32> @load_v2i32_align4(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v2i32_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.2s }, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v2i32_align4:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.2s }, [x0]
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: ret
%val = load <2 x i32>, ptr %ptr, align 4
ret <2 x i32> %val
}
define void @store_v2i32_align4(ptr %ptr, <2 x i32> %val) {
; NOSTRICTALIGN-LABEL: store_v2i32_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: st1 { v0.2s }, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v2i32_align4:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: st1 { v0.2s }, [x0]
; STRICTALIGN-BE-NEXT: ret
store <2 x i32> %val, ptr %ptr, align 4
ret void
}
define <2 x i32> @load_v2i32_align4_post8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align4_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align4_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.2s }, [x0], #8
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_align4_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_v2i32_align4_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.2s }, [x0], #8
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
%val = load <2 x i32>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define <2 x i32> @load_v2i32_align4_pre8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align4_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align4_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #8
; STRICTALIGN-NEXT: ld1 { v0.2s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_align4_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_v2i32_align4_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #8
; STRICTALIGN-BE-NEXT: ld1 { v0.2s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
%val = load <2 x i32>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define void @store_v2i32_align4_post8(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align4_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align4_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: st1 { v0.2s }, [x0], #8
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_align4_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_v2i32_align4_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: st1 { v0.2s }, [x0], #8
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <2 x i32> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i32_align4_pre8(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align4_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align4_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #8
; STRICTALIGN-NEXT: st1 { v0.2s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_align4_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_v2i32_align4_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: add x8, x0, #8
; STRICTALIGN-BE-NEXT: st1 { v0.2s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <2 x i32> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i32> @load_v2i32_align4_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.2s }, [x0]
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_align4_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_v2i32_align4_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.2s }, [x0]
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
%val = load <2 x i32>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define <2 x i32> @load_v2i32_align4_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: ld1 { v0.2s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_align4_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_v2i32_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: ld1 { v0.2s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
%val = load <2 x i32>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define void @store_v2i32_align4_post16(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: st1 { v0.2s }, [x0]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_align4_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_v2i32_align4_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: st1 { v0.2s }, [x0]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <2 x i32> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i32_align4_pre16(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: st1 { v0.2s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_align4_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_v2i32_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.2s, v0.2s
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: st1 { v0.2s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <2 x i32> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i32> @load_v2i32_align8(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v2i32_align8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_align8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v2i32_align8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldr d0, [x0]
; STRICTALIGN-BE-NEXT: ret
%val = load <2 x i32>, ptr %ptr, align 8
ret <2 x i32> %val
}
define void @store_v2i32_align8(ptr %ptr, <2 x i32> %val) {
; NOSTRICTALIGN-LABEL: store_v2i32_align8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_align8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v2i32_align8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: str d0, [x0]
; STRICTALIGN-BE-NEXT: ret
store <2 x i32> %val, ptr %ptr, align 8
ret void
}
define <2 x i32> @load_v2i32_align8_post8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align8_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align8_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0], #8
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_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 <2 x i32>, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define <2 x i32> @load_v2i32_align8_pre8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align8_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align8_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0, #8]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_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 <2 x i32>, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define void @store_v2i32_align8_post8(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align8_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align8_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0], #8
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_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 <2 x i32> %val, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i32_align8_pre8(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align8_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align8_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0, #8]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_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 <2 x i32> %val, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i32> @load_v2i32_align8_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align8_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align8_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_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 <2 x i32>, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define <2 x i32> @load_v2i32_align8_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i32_align8_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i32_align8_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i32_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_v2i32_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 <2 x i32>, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i32> %val
}
define void @store_v2i32_align8_post16(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align8_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align8_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_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 <2 x i32> %val, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i32_align8_pre16(ptr %ptr, <2 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i32_align8_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i32_align8_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i32_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_v2i32_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 <2 x i32> %val, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define <4 x i32> @load_v4i32_align2(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v4i32_align2:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align2:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #6]
; STRICTALIGN-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-NEXT: ldrh w10, [x0, #2]
; STRICTALIGN-NEXT: ldrh w11, [x0]
; STRICTALIGN-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-NEXT: orr x9, x11, x10, lsl #16
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: str x8, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldrh w8, [x0, #10]
; STRICTALIGN-NEXT: ldrh w9, [x0, #8]!
; STRICTALIGN-NEXT: ldrh w10, [x0, #6]
; STRICTALIGN-NEXT: ldrh w11, [x0, #4]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #16
; STRICTALIGN-NEXT: orr w9, w11, w10, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
; STRICTALIGN-NEXT: str x8, [sp, #8]
; STRICTALIGN-NEXT: ldr q0, [sp], #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_align2:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v4i32_align2:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0]
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #2]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-BE-NEXT: orr x9, x11, x10, lsl #16
; 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: ldrh w10, [x0, #10]
; STRICTALIGN-BE-NEXT: ldrh w9, [x8, #8]!
; STRICTALIGN-BE-NEXT: ldrh w11, [x8, #4]
; STRICTALIGN-BE-NEXT: ldrh w8, [x8, #6]
; STRICTALIGN-BE-NEXT: orr w9, w10, w9, lsl #16
; STRICTALIGN-BE-NEXT: orr x8, x8, x11, lsl #16
; 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 <4 x i32>, ptr %ptr, align 2
ret <4 x i32> %val
}
define void @store_v4i32_align2(ptr %ptr, <4 x i32> %val) {
; NOSTRICTALIGN-LABEL: store_v4i32_align2:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align2:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp]
; STRICTALIGN-NEXT: strh w8, [x0]
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: lsr x9, x11, #16
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: lsr x8, x11, #48
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: strh w9, [x0, #10]
; STRICTALIGN-NEXT: lsr x9, x11, #32
; STRICTALIGN-NEXT: strh w11, [x0, #8]!
; STRICTALIGN-NEXT: strh w8, [x0, #6]
; STRICTALIGN-NEXT: strh w9, [x0, #4]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_align2:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v4i32_align2:
; 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: strh w8, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
; STRICTALIGN-BE-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x9, x11, #32
; STRICTALIGN-BE-NEXT: strh w8, [x0]
; STRICTALIGN-BE-NEXT: lsr x8, x11, #48
; STRICTALIGN-BE-NEXT: strh w10, [x0, #2]
; STRICTALIGN-BE-NEXT: strh w9, [x0, #10]
; STRICTALIGN-BE-NEXT: lsr x9, x11, #16
; STRICTALIGN-BE-NEXT: strh w8, [x0, #8]!
; STRICTALIGN-BE-NEXT: strh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: add sp, sp, #16
; STRICTALIGN-BE-NEXT: ret
store <4 x i32> %val, ptr %ptr, align 2
ret void
}
define <4 x i32> @load_v4i32_align2_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align2_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align2_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #6]
; STRICTALIGN-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-NEXT: ldrh w10, [x0, #2]
; STRICTALIGN-NEXT: ldrh w11, [x0]
; STRICTALIGN-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-NEXT: orr x9, x11, x10, lsl #16
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: add x9, x0, #16
; STRICTALIGN-NEXT: str x8, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldrh w8, [x0, #10]
; STRICTALIGN-NEXT: ldrh w10, [x0, #8]!
; STRICTALIGN-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-NEXT: ldrh w12, [x0, #4]
; STRICTALIGN-NEXT: orr x8, x10, x8, lsl #16
; STRICTALIGN-NEXT: orr w10, w12, w11, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x10, lsl #32
; STRICTALIGN-NEXT: str x8, [sp, #8]
; STRICTALIGN-NEXT: ldr q0, [sp]
; STRICTALIGN-NEXT: str x9, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_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_v4i32_align2_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0]
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #2]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-BE-NEXT: orr x9, x11, x10, lsl #16
; 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: ldrh w10, [x0, #10]
; STRICTALIGN-BE-NEXT: ldrh w9, [x8, #8]!
; STRICTALIGN-BE-NEXT: ldrh w11, [x8, #4]
; STRICTALIGN-BE-NEXT: ldrh w8, [x8, #6]
; STRICTALIGN-BE-NEXT: orr w9, w10, w9, lsl #16
; STRICTALIGN-BE-NEXT: orr x8, x8, x11, lsl #16
; 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 <4 x i32>, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define <4 x i32> @load_v4i32_align2_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align2_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align2_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #16]!
; STRICTALIGN-NEXT: ldrh w9, [x0, #6]
; STRICTALIGN-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-NEXT: orr w9, w10, w9, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x11, lsl #16
; 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: ldrh w8, [x9, #8]!
; STRICTALIGN-NEXT: ldrh w10, [x0, #10]
; STRICTALIGN-NEXT: ldrh w11, [x9, #6]
; STRICTALIGN-NEXT: ldrh w9, [x9, #4]
; STRICTALIGN-NEXT: orr x8, x8, x10, lsl #16
; STRICTALIGN-NEXT: orr w9, w9, w11, lsl #16
; 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_v4i32_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_v4i32_align2_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0, #16]!
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #6]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-BE-NEXT: orr x9, x10, x9, lsl #16
; STRICTALIGN-BE-NEXT: orr w8, w11, w8, lsl #16
; 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: ldrh w8, [x9, #8]!
; STRICTALIGN-BE-NEXT: ldrh w10, [x9, #4]
; STRICTALIGN-BE-NEXT: ldrh w9, [x9, #6]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #10]
; STRICTALIGN-BE-NEXT: orr x9, x9, x10, lsl #16
; STRICTALIGN-BE-NEXT: orr w8, w11, w8, lsl #16
; 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 <4 x i32>, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define void @store_v4i32_align2_post16(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align2_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align2_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp]
; STRICTALIGN-NEXT: strh w8, [x0]
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: lsr x9, x11, #16
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: lsr x8, x11, #48
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: lsr x10, x11, #32
; STRICTALIGN-NEXT: strh w9, [x0, #10]
; STRICTALIGN-NEXT: mov x9, x0
; STRICTALIGN-NEXT: strh w11, [x9, #8]!
; STRICTALIGN-NEXT: strh w8, [x9, #6]
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: strh w10, [x9, #4]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_align2_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]
; STRICTALIGN-BE-NEXT: strh w8, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
; STRICTALIGN-BE-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x9, x11, #32
; STRICTALIGN-BE-NEXT: strh w8, [x0]
; STRICTALIGN-BE-NEXT: lsr x8, x11, #48
; STRICTALIGN-BE-NEXT: strh w10, [x0, #2]
; STRICTALIGN-BE-NEXT: add x10, x0, #16
; STRICTALIGN-BE-NEXT: strh w9, [x0, #10]
; STRICTALIGN-BE-NEXT: lsr x9, x11, #16
; STRICTALIGN-BE-NEXT: strh w8, [x0, #8]!
; STRICTALIGN-BE-NEXT: strh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: str x10, [x1]
; STRICTALIGN-BE-NEXT: add sp, sp, #16
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <4 x i32> %val, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v4i32_align2_pre16(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align2_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align2_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp]
; STRICTALIGN-NEXT: strh w8, [x0, #16]!
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: lsr x9, x11, #16
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: lsr x10, x11, #32
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: mov x8, x0
; STRICTALIGN-NEXT: strh w9, [x0, #10]
; STRICTALIGN-NEXT: lsr x9, x11, #48
; STRICTALIGN-NEXT: strh w11, [x8, #8]!
; STRICTALIGN-NEXT: strh w9, [x8, #6]
; STRICTALIGN-NEXT: strh w10, [x8, #4]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_align2_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, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #16]!
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: ldr x10, [sp, #8]
; STRICTALIGN-BE-NEXT: strh w8, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #32
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x9, x10, #32
; STRICTALIGN-BE-NEXT: strh w8, [x0, #2]
; STRICTALIGN-BE-NEXT: lsr x8, x10, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #10]
; STRICTALIGN-BE-NEXT: mov x9, x0
; STRICTALIGN-BE-NEXT: strh w8, [x9, #8]!
; STRICTALIGN-BE-NEXT: lsr x8, x10, #16
; STRICTALIGN-BE-NEXT: strh w10, [x9, #6]
; STRICTALIGN-BE-NEXT: strh w8, [x9, #4]
; 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 <4 x i32> %val, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define <4 x i32> @load_v4i32_align2_post32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align2_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align2_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #6]
; STRICTALIGN-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-NEXT: ldrh w10, [x0, #2]
; STRICTALIGN-NEXT: ldrh w11, [x0]
; STRICTALIGN-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-NEXT: orr x9, x11, x10, lsl #16
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: add x9, x0, #32
; STRICTALIGN-NEXT: str x8, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldrh w8, [x0, #10]
; STRICTALIGN-NEXT: ldrh w10, [x0, #8]!
; STRICTALIGN-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-NEXT: ldrh w12, [x0, #4]
; STRICTALIGN-NEXT: orr x8, x10, x8, lsl #16
; STRICTALIGN-NEXT: orr w10, w12, w11, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x10, lsl #32
; STRICTALIGN-NEXT: str x8, [sp, #8]
; STRICTALIGN-NEXT: ldr q0, [sp]
; STRICTALIGN-NEXT: str x9, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_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_v4i32_align2_post32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0]
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #2]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: orr w8, w9, w8, lsl #16
; STRICTALIGN-BE-NEXT: orr x9, x11, x10, lsl #16
; 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: ldrh w10, [x0, #10]
; STRICTALIGN-BE-NEXT: ldrh w9, [x8, #8]!
; STRICTALIGN-BE-NEXT: ldrh w11, [x8, #4]
; STRICTALIGN-BE-NEXT: ldrh w8, [x8, #6]
; STRICTALIGN-BE-NEXT: orr w9, w10, w9, lsl #16
; STRICTALIGN-BE-NEXT: orr x8, x8, x11, lsl #16
; 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 <4 x i32>, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define <4 x i32> @load_v4i32_align2_pre32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align2_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align2_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldrh w8, [x0, #32]!
; STRICTALIGN-NEXT: ldrh w9, [x0, #6]
; STRICTALIGN-NEXT: ldrh w10, [x0, #4]
; STRICTALIGN-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-NEXT: orr w9, w10, w9, lsl #16
; STRICTALIGN-NEXT: orr x8, x8, x11, lsl #16
; 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: ldrh w8, [x9, #8]!
; STRICTALIGN-NEXT: ldrh w10, [x0, #10]
; STRICTALIGN-NEXT: ldrh w11, [x9, #6]
; STRICTALIGN-NEXT: ldrh w9, [x9, #4]
; STRICTALIGN-NEXT: orr x8, x8, x10, lsl #16
; STRICTALIGN-NEXT: orr w9, w9, w11, lsl #16
; 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_v4i32_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_v4i32_align2_pre32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldrh w8, [x0, #32]!
; STRICTALIGN-BE-NEXT: ldrh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: ldrh w10, [x0, #6]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #2]
; STRICTALIGN-BE-NEXT: orr x9, x10, x9, lsl #16
; STRICTALIGN-BE-NEXT: orr w8, w11, w8, lsl #16
; 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: ldrh w8, [x9, #8]!
; STRICTALIGN-BE-NEXT: ldrh w10, [x9, #4]
; STRICTALIGN-BE-NEXT: ldrh w9, [x9, #6]
; STRICTALIGN-BE-NEXT: ldrh w11, [x0, #10]
; STRICTALIGN-BE-NEXT: orr x9, x9, x10, lsl #16
; STRICTALIGN-BE-NEXT: orr w8, w11, w8, lsl #16
; 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 <4 x i32>, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define void @store_v4i32_align2_post32(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align2_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align2_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp]
; STRICTALIGN-NEXT: strh w8, [x0]
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: lsr x9, x11, #16
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: lsr x8, x11, #48
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: lsr x10, x11, #32
; STRICTALIGN-NEXT: strh w9, [x0, #10]
; STRICTALIGN-NEXT: mov x9, x0
; STRICTALIGN-NEXT: strh w11, [x9, #8]!
; STRICTALIGN-NEXT: strh w8, [x9, #6]
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: strh w10, [x9, #4]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_align2_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]
; STRICTALIGN-BE-NEXT: strh w8, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: lsr x10, x8, #32
; STRICTALIGN-BE-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x9, x11, #32
; STRICTALIGN-BE-NEXT: strh w8, [x0]
; STRICTALIGN-BE-NEXT: lsr x8, x11, #48
; STRICTALIGN-BE-NEXT: strh w10, [x0, #2]
; STRICTALIGN-BE-NEXT: add x10, x0, #32
; STRICTALIGN-BE-NEXT: strh w9, [x0, #10]
; STRICTALIGN-BE-NEXT: lsr x9, x11, #16
; STRICTALIGN-BE-NEXT: strh w8, [x0, #8]!
; STRICTALIGN-BE-NEXT: strh w11, [x0, #6]
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: str x10, [x1]
; STRICTALIGN-BE-NEXT: add sp, sp, #16
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
store <4 x i32> %val, ptr %ptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v4i32_align2_pre32(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align2_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align2_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp]
; STRICTALIGN-NEXT: strh w8, [x0, #32]!
; STRICTALIGN-NEXT: lsr x9, x8, #48
; STRICTALIGN-NEXT: ldr x11, [sp, #8]
; STRICTALIGN-NEXT: lsr x10, x8, #32
; STRICTALIGN-NEXT: lsr x8, x8, #16
; STRICTALIGN-NEXT: strh w9, [x0, #6]
; STRICTALIGN-NEXT: lsr x9, x11, #16
; STRICTALIGN-NEXT: strh w10, [x0, #4]
; STRICTALIGN-NEXT: lsr x10, x11, #32
; STRICTALIGN-NEXT: strh w8, [x0, #2]
; STRICTALIGN-NEXT: mov x8, x0
; STRICTALIGN-NEXT: strh w9, [x0, #10]
; STRICTALIGN-NEXT: lsr x9, x11, #48
; STRICTALIGN-NEXT: strh w11, [x8, #8]!
; STRICTALIGN-NEXT: strh w9, [x8, #6]
; STRICTALIGN-NEXT: strh w10, [x8, #4]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_align2_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, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #32]!
; STRICTALIGN-BE-NEXT: lsr x9, x8, #16
; STRICTALIGN-BE-NEXT: ldr x10, [sp, #8]
; STRICTALIGN-BE-NEXT: strh w8, [x0, #6]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #32
; STRICTALIGN-BE-NEXT: strh w9, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x9, x10, #32
; STRICTALIGN-BE-NEXT: strh w8, [x0, #2]
; STRICTALIGN-BE-NEXT: lsr x8, x10, #48
; STRICTALIGN-BE-NEXT: strh w9, [x0, #10]
; STRICTALIGN-BE-NEXT: mov x9, x0
; STRICTALIGN-BE-NEXT: strh w8, [x9, #8]!
; STRICTALIGN-BE-NEXT: lsr x8, x10, #16
; STRICTALIGN-BE-NEXT: strh w10, [x9, #6]
; STRICTALIGN-BE-NEXT: strh w8, [x9, #4]
; 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 <4 x i32> %val, ptr %newptr, align 2
store ptr %newptr, ptr %writeback
ret void
}
define <4 x i32> @load_v4i32_align4(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v4i32_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.4s }, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v4i32_align4:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.4s }, [x0]
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%val = load <4 x i32>, ptr %ptr, align 4
ret <4 x i32> %val
}
define void @store_v4i32_align4(ptr %ptr, <4 x i32> %val) {
; NOSTRICTALIGN-LABEL: store_v4i32_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: st1 { v0.4s }, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v4i32_align4:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: st1 { v0.4s }, [x0]
; STRICTALIGN-BE-NEXT: ret
store <4 x i32> %val, ptr %ptr, align 4
ret void
}
define <4 x i32> @load_v4i32_align4_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.4s }, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_align4_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_v4i32_align4_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.4s }, [x0], #16
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
%val = load <4 x i32>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define <4 x i32> @load_v4i32_align4_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: ld1 { v0.4s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_align4_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_v4i32_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: ld1 { v0.4s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
%val = load <4 x i32>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define void @store_v4i32_align4_post16(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: st1 { v0.4s }, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_align4_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_v4i32_align4_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: st1 { v0.4s }, [x0], #16
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <4 x i32> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v4i32_align4_pre16(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: st1 { v0.4s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_align4_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_v4i32_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: st1 { v0.4s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <4 x i32> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <4 x i32> @load_v4i32_align4_post32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align4_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align4_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.4s }, [x0]
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_align4_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_v4i32_align4_post32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.4s }, [x0]
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
%val = load <4 x i32>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define <4 x i32> @load_v4i32_align4_pre32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align4_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align4_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: ld1 { v0.4s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_align4_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_v4i32_align4_pre32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: ld1 { v0.4s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
%val = load <4 x i32>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define void @store_v4i32_align4_post32(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align4_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align4_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: st1 { v0.4s }, [x0]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_align4_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_v4i32_align4_post32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: st1 { v0.4s }, [x0]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
store <4 x i32> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v4i32_align4_pre32(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align4_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align4_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: st1 { v0.4s }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_align4_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_v4i32_align4_pre32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: rev64 v0.4s, v0.4s
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: st1 { v0.4s }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
store <4 x i32> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <4 x i32> @load_v4i32_align16(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v4i32_align16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_align16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v4i32_align16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldr q0, [x0]
; STRICTALIGN-BE-NEXT: ret
%val = load <4 x i32>, ptr %ptr, align 16
ret <4 x i32> %val
}
define void @store_v4i32_align16(ptr %ptr, <4 x i32> %val) {
; NOSTRICTALIGN-LABEL: store_v4i32_align16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_align16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v4i32_align16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: str q0, [x0]
; STRICTALIGN-BE-NEXT: ret
store <4 x i32> %val, ptr %ptr, align 16
ret void
}
define <4 x i32> @load_v4i32_align16_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align16_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align16_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_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_v4i32_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 <4 x i32>, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define <4 x i32> @load_v4i32_align16_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align16_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align16_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_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_v4i32_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 <4 x i32>, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define void @store_v4i32_align16_post16(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align16_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align16_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_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 <4 x i32> %val, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v4i32_align16_pre16(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align16_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align16_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_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 <4 x i32> %val, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define <4 x i32> @load_v4i32_align16_post32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align16_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align16_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0], #32
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_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_v4i32_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 <4 x i32>, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define <4 x i32> @load_v4i32_align16_pre32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v4i32_align16_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v4i32_align16_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0, #32]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v4i32_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_v4i32_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 <4 x i32>, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret <4 x i32> %val
}
define void @store_v4i32_align16_post32(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align16_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align16_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0], #32
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_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 <4 x i32> %val, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v4i32_align16_pre32(ptr %ptr, <4 x i32> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v4i32_align16_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v4i32_align16_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0, #32]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v4i32_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_v4i32_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 <4 x i32> %val, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define <1 x i64> @load_v1i64_align4(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v1i64_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldp w9, w8, [x0]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align4:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: fmov d0, x8
; STRICTALIGN-BE-NEXT: ret
%val = load <1 x i64>, ptr %ptr, align 4
ret <1 x i64> %val
}
define void @store_v1i64_align4(ptr %ptr, <1 x i64> %val) {
; NOSTRICTALIGN-LABEL: store_v1i64_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #32
; STRICTALIGN-NEXT: stp w8, w9, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align4:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: lsr x9, x8, #32
; STRICTALIGN-BE-NEXT: stp w9, w8, [x0]
; STRICTALIGN-BE-NEXT: ret
store <1 x i64> %val, ptr %ptr, align 4
ret void
}
define <1 x i64> @load_v1i64_align4_post8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align4_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align4_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldp w9, w8, [x0]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: add x8, x0, #8
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align4_post8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ld1 { v0.1d }, [x0], #8
; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align4_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0]
; 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 <1 x i64>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define <1 x i64> @load_v1i64_align4_pre8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align4_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align4_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldp w8, w9, [x0, #8]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align4_pre8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #8]
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #8
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align4_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0, #8]!
; STRICTALIGN-BE-NEXT: str x0, [x1]
; 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 <1 x i64>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define void @store_v1i64_align4_post8(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align4_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align4_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #32
; STRICTALIGN-NEXT: stp w8, w9, [x0]
; STRICTALIGN-NEXT: add x8, x0, #8
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align4_post8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: st1 { v0.1d }, [x0], #8
; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align4_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: lsr x9, x8, #32
; STRICTALIGN-BE-NEXT: stp w9, w8, [x0]
; STRICTALIGN-BE-NEXT: add x8, x0, #8
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <1 x i64> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v1i64_align4_pre8(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align4_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align4_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #32
; STRICTALIGN-NEXT: stp w8, w9, [x0, #8]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align4_pre8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #8
; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #8]
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align4_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: lsr x9, x8, #32
; STRICTALIGN-BE-NEXT: stp w9, w8, [x0, #8]!
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <1 x i64> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <1 x i64> @load_v1i64_align4_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldp w9, w8, [x0]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align4_post16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align4_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0]
; 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 <1 x i64>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define <1 x i64> @load_v1i64_align4_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldp w8, w9, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
; STRICTALIGN-NEXT: fmov d0, x8
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align4_pre16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #16]
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0, #16]!
; STRICTALIGN-BE-NEXT: str x0, [x1]
; 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 <1 x i64>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define void @store_v1i64_align4_post16(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #32
; STRICTALIGN-NEXT: stp w8, w9, [x0]
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align4_post16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align4_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: lsr x9, x8, #32
; STRICTALIGN-BE-NEXT: stp w9, w8, [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
store <1 x i64> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v1i64_align4_pre16(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: fmov x8, d0
; STRICTALIGN-NEXT: lsr x9, x8, #32
; STRICTALIGN-NEXT: stp w8, w9, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align4_pre16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #16]
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: fmov x8, d0
; STRICTALIGN-BE-NEXT: lsr x9, x8, #32
; STRICTALIGN-BE-NEXT: stp w9, w8, [x0, #16]!
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <1 x i64> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <1 x i64> @load_v1i64_align8(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v1i64_align8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldr d0, [x0]
; STRICTALIGN-BE-NEXT: ret
%val = load <1 x i64>, ptr %ptr, align 8
ret <1 x i64> %val
}
define void @store_v1i64_align8(ptr %ptr, <1 x i64> %val) {
; NOSTRICTALIGN-LABEL: store_v1i64_align8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: str d0, [x0]
; STRICTALIGN-BE-NEXT: ret
store <1 x i64> %val, ptr %ptr, align 8
ret void
}
define <1 x i64> @load_v1i64_align8_post8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align8_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align8_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0], #8
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align8_post8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ld1 { v0.1d }, [x0], #8
; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align8_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.1d }, [x0], #8
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
%val = load <1 x i64>, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define <1 x i64> @load_v1i64_align8_pre8(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align8_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align8_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0, #8]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align8_pre8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #8]
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #8
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align8_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldr d0, [x0, #8]
; 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 <1 x i64>, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define void @store_v1i64_align8_post8(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align8_post8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #8
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align8_post8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0], #8
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align8_post8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: st1 { v0.1d }, [x0], #8
; NOSTRICTALIGN-BE-NEXT: str x0, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align8_post8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: st1 { v0.1d }, [x0], #8
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <1 x i64> %val, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v1i64_align8_pre8(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align8_pre8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #8]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align8_pre8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0, #8]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align8_pre8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #8
; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #8]
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align8_pre8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #8
; STRICTALIGN-BE-NEXT: str d0, [x0, #8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 8
store <1 x i64> %val, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define <1 x i64> @load_v1i64_align8_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align8_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align8_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align8_post16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0]
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align8_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldr d0, [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 <1 x i64>, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define <1 x i64> @load_v1i64_align8_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v1i64_align8_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v1i64_align8_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr d0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v1i64_align8_pre16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr d0, [x0, #16]
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v1i64_align8_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldr d0, [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 <1 x i64>, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret <1 x i64> %val
}
define void @store_v1i64_align8_post16(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align8_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align8_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align8_post16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str d0, [x0]
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align8_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: str d0, [x0]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <1 x i64> %val, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v1i64_align8_pre16(ptr %ptr, <1 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v1i64_align8_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str d0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v1i64_align8_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str d0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v1i64_align8_pre16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: add x8, x0, #16
; NOSTRICTALIGN-BE-NEXT: str d0, [x0, #16]
; NOSTRICTALIGN-BE-NEXT: str x8, [x1]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v1i64_align8_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: str d0, [x0, #16]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <1 x i64> %val, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i64> @load_v2i64_align4(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v2i64_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: sub sp, sp, #16
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldp w9, w8, [x0, #8]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: str x8, [sp, #8]
; STRICTALIGN-NEXT: ldp w9, w8, [x0]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: str x8, [sp]
; STRICTALIGN-NEXT: ldr q0, [sp], #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v2i64_align4:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: sub sp, sp, #16
; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0, #8]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: str x8, [sp]
; STRICTALIGN-BE-NEXT: ldr q0, [sp], #16
; STRICTALIGN-BE-NEXT: ret
%val = load <2 x i64>, ptr %ptr, align 4
ret <2 x i64> %val
}
define void @store_v2i64_align4(ptr %ptr, <2 x i64> %val) {
; NOSTRICTALIGN-LABEL: store_v2i64_align4:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align4:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp, #8]
; STRICTALIGN-NEXT: str w8, [x0, #8]
; STRICTALIGN-NEXT: lsr x8, x8, #32
; STRICTALIGN-NEXT: ldr x9, [sp]
; STRICTALIGN-NEXT: str w8, [x0, #12]
; STRICTALIGN-NEXT: lsr x8, x9, #32
; STRICTALIGN-NEXT: stp w9, w8, [x0]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align4:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v2i64_align4:
; 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: str w8, [x0, #12]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #32
; STRICTALIGN-BE-NEXT: ldr x9, [sp]
; STRICTALIGN-BE-NEXT: stp w9, w8, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x8, x9, #32
; STRICTALIGN-BE-NEXT: str w8, [x0]
; STRICTALIGN-BE-NEXT: add sp, sp, #16
; STRICTALIGN-BE-NEXT: ret
store <2 x i64> %val, ptr %ptr, align 4
ret void
}
define <2 x i64> @load_v2i64_align4_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: sub sp, sp, #16
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldp w9, w8, [x0, #8]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: str x8, [sp, #8]
; STRICTALIGN-NEXT: ldp w9, w8, [x0]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: str x8, [sp]
; 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_v2i64_align4_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_v2i64_align4_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: sub sp, sp, #16
; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0, #8]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: add x9, x0, #16
; STRICTALIGN-BE-NEXT: str x8, [sp]
; 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 <2 x i64>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define <2 x i64> @load_v2i64_align4_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: sub sp, sp, #16
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr w8, [x0, #16]!
; STRICTALIGN-NEXT: ldp w10, w9, [x0, #8]
; STRICTALIGN-NEXT: orr x9, x10, x9, lsl #32
; STRICTALIGN-NEXT: str x9, [sp, #8]
; STRICTALIGN-NEXT: ldr w9, [x0, #4]
; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
; STRICTALIGN-NEXT: str x8, [sp]
; STRICTALIGN-NEXT: ldr q0, [sp]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align4_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_v2i64_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: sub sp, sp, #16
; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-BE-NEXT: ldr w8, [x0, #16]!
; STRICTALIGN-BE-NEXT: ldp w9, w10, [x0, #8]
; STRICTALIGN-BE-NEXT: orr x9, x10, x9, lsl #32
; STRICTALIGN-BE-NEXT: str x9, [sp, #8]
; STRICTALIGN-BE-NEXT: ldr w9, [x0, #4]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: str x8, [sp]
; 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 <2 x i64>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define void @store_v2i64_align4_post16(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align4_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align4_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp, #8]
; STRICTALIGN-NEXT: str w8, [x0, #8]
; STRICTALIGN-NEXT: lsr x8, x8, #32
; STRICTALIGN-NEXT: ldr x9, [sp]
; STRICTALIGN-NEXT: str w8, [x0, #12]
; STRICTALIGN-NEXT: lsr x8, x9, #32
; STRICTALIGN-NEXT: stp w9, w8, [x0]
; STRICTALIGN-NEXT: add x9, x0, #16
; STRICTALIGN-NEXT: str x9, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align4_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_v2i64_align4_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: str w8, [x0, #12]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #32
; STRICTALIGN-BE-NEXT: ldr x9, [sp]
; STRICTALIGN-BE-NEXT: stp w9, w8, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x8, x9, #32
; STRICTALIGN-BE-NEXT: add x9, x0, #16
; STRICTALIGN-BE-NEXT: str w8, [x0]
; STRICTALIGN-BE-NEXT: str x9, [x1]
; STRICTALIGN-BE-NEXT: add sp, sp, #16
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <2 x i64> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i64_align4_pre16(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align4_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align4_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp]
; STRICTALIGN-NEXT: str w8, [x0, #16]!
; STRICTALIGN-NEXT: lsr x8, x8, #32
; STRICTALIGN-NEXT: ldr x9, [sp, #8]
; STRICTALIGN-NEXT: lsr x10, x9, #32
; STRICTALIGN-NEXT: stp w8, w9, [x0, #4]
; STRICTALIGN-NEXT: str w10, [x0, #12]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align4_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_v2i64_align4_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-BE-NEXT: ldr x10, [sp]
; STRICTALIGN-BE-NEXT: lsr x9, x10, #32
; STRICTALIGN-BE-NEXT: str w9, [x0, #16]!
; STRICTALIGN-BE-NEXT: ldr x9, [sp, #8]
; STRICTALIGN-BE-NEXT: lsr x8, x9, #32
; STRICTALIGN-BE-NEXT: str w9, [x0, #12]
; STRICTALIGN-BE-NEXT: stp w10, w8, [x0, #4]
; 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 <2 x i64> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i64> @load_v2i64_align4_post32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align4_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align4_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: sub sp, sp, #16
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldp w9, w8, [x0, #8]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: str x8, [sp, #8]
; STRICTALIGN-NEXT: ldp w9, w8, [x0]
; STRICTALIGN-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-NEXT: str x8, [sp]
; 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_v2i64_align4_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_v2i64_align4_post32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: sub sp, sp, #16
; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0, #8]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: str x8, [sp, #8]
; STRICTALIGN-BE-NEXT: ldp w8, w9, [x0]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: add x9, x0, #32
; STRICTALIGN-BE-NEXT: str x8, [sp]
; 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 <2 x i64>, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define <2 x i64> @load_v2i64_align4_pre32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align4_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align4_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: sub sp, sp, #16
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr w8, [x0, #32]!
; STRICTALIGN-NEXT: ldp w10, w9, [x0, #8]
; STRICTALIGN-NEXT: orr x9, x10, x9, lsl #32
; STRICTALIGN-NEXT: str x9, [sp, #8]
; STRICTALIGN-NEXT: ldr w9, [x0, #4]
; STRICTALIGN-NEXT: orr x8, x8, x9, lsl #32
; STRICTALIGN-NEXT: str x8, [sp]
; STRICTALIGN-NEXT: ldr q0, [sp]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align4_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_v2i64_align4_pre32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: sub sp, sp, #16
; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-BE-NEXT: ldr w8, [x0, #32]!
; STRICTALIGN-BE-NEXT: ldp w9, w10, [x0, #8]
; STRICTALIGN-BE-NEXT: orr x9, x10, x9, lsl #32
; STRICTALIGN-BE-NEXT: str x9, [sp, #8]
; STRICTALIGN-BE-NEXT: ldr w9, [x0, #4]
; STRICTALIGN-BE-NEXT: orr x8, x9, x8, lsl #32
; STRICTALIGN-BE-NEXT: str x8, [sp]
; 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 <2 x i64>, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define void @store_v2i64_align4_post32(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align4_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align4_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp, #8]
; STRICTALIGN-NEXT: str w8, [x0, #8]
; STRICTALIGN-NEXT: lsr x8, x8, #32
; STRICTALIGN-NEXT: ldr x9, [sp]
; STRICTALIGN-NEXT: str w8, [x0, #12]
; STRICTALIGN-NEXT: lsr x8, x9, #32
; STRICTALIGN-NEXT: stp w9, w8, [x0]
; STRICTALIGN-NEXT: add x9, x0, #32
; STRICTALIGN-NEXT: str x9, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align4_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_v2i64_align4_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: str w8, [x0, #12]
; STRICTALIGN-BE-NEXT: lsr x8, x8, #32
; STRICTALIGN-BE-NEXT: ldr x9, [sp]
; STRICTALIGN-BE-NEXT: stp w9, w8, [x0, #4]
; STRICTALIGN-BE-NEXT: lsr x8, x9, #32
; STRICTALIGN-BE-NEXT: add x9, x0, #32
; STRICTALIGN-BE-NEXT: str w8, [x0]
; STRICTALIGN-BE-NEXT: str x9, [x1]
; STRICTALIGN-BE-NEXT: add sp, sp, #16
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
store <2 x i64> %val, ptr %ptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i64_align4_pre32(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align4_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align4_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-NEXT: ldr x8, [sp]
; STRICTALIGN-NEXT: str w8, [x0, #32]!
; STRICTALIGN-NEXT: lsr x8, x8, #32
; STRICTALIGN-NEXT: ldr x9, [sp, #8]
; STRICTALIGN-NEXT: lsr x10, x9, #32
; STRICTALIGN-NEXT: stp w8, w9, [x0, #4]
; STRICTALIGN-NEXT: str w10, [x0, #12]
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: add sp, sp, #16
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align4_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_v2i64_align4_pre32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: str q0, [sp, #-16]!
; STRICTALIGN-BE-NEXT: .cfi_def_cfa_offset 16
; STRICTALIGN-BE-NEXT: ldr x10, [sp]
; STRICTALIGN-BE-NEXT: lsr x9, x10, #32
; STRICTALIGN-BE-NEXT: str w9, [x0, #32]!
; STRICTALIGN-BE-NEXT: ldr x9, [sp, #8]
; STRICTALIGN-BE-NEXT: lsr x8, x9, #32
; STRICTALIGN-BE-NEXT: str w9, [x0, #12]
; STRICTALIGN-BE-NEXT: stp w10, w8, [x0, #4]
; 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 <2 x i64> %val, ptr %newptr, align 4
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i64> @load_v2i64_align8(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v2i64_align8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.2d }, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v2i64_align8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.2d }, [x0]
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%val = load <2 x i64>, ptr %ptr, align 8
ret <2 x i64> %val
}
define void @store_v2i64_align8(ptr %ptr, <2 x i64> %val) {
; NOSTRICTALIGN-LABEL: store_v2i64_align8:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align8:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: st1 { v0.2d }, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align8:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v2i64_align8:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: st1 { v0.2d }, [x0]
; STRICTALIGN-BE-NEXT: ret
store <2 x i64> %val, ptr %ptr, align 8
ret void
}
define <2 x i64> @load_v2i64_align8_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align8_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align8_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.2d }, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align8_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_v2i64_align8_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.2d }, [x0], #16
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
%val = load <2 x i64>, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define <2 x i64> @load_v2i64_align8_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align8_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align8_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: ld1 { v0.2d }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align8_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_v2i64_align8_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: ld1 { v0.2d }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
%val = load <2 x i64>, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define void @store_v2i64_align8_post16(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align8_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align8_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: st1 { v0.2d }, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align8_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_v2i64_align8_post16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: st1 { v0.2d }, [x0], #16
; STRICTALIGN-BE-NEXT: str x0, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <2 x i64> %val, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i64_align8_pre16(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align8_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align8_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #16
; STRICTALIGN-NEXT: st1 { v0.2d }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align8_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_v2i64_align8_pre16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: add x8, x0, #16
; STRICTALIGN-BE-NEXT: st1 { v0.2d }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 16
store <2 x i64> %val, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i64> @load_v2i64_align8_post32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align8_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align8_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ld1 { v0.2d }, [x0]
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align8_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_v2i64_align8_post32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ld1 { v0.2d }, [x0]
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
%val = load <2 x i64>, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define <2 x i64> @load_v2i64_align8_pre32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align8_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align8_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: ld1 { v0.2d }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align8_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_v2i64_align8_pre32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: ld1 { v0.2d }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
%val = load <2 x i64>, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define void @store_v2i64_align8_post32(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align8_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align8_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: st1 { v0.2d }, [x0]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align8_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_v2i64_align8_post32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: st1 { v0.2d }, [x0]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
store <2 x i64> %val, ptr %ptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i64_align8_pre32(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align8_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align8_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: add x8, x0, #32
; STRICTALIGN-NEXT: st1 { v0.2d }, [x8]
; STRICTALIGN-NEXT: str x8, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align8_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_v2i64_align8_pre32:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8
; STRICTALIGN-BE-NEXT: add x8, x0, #32
; STRICTALIGN-BE-NEXT: st1 { v0.2d }, [x8]
; STRICTALIGN-BE-NEXT: str x8, [x1]
; STRICTALIGN-BE-NEXT: ret
%newptr = getelementptr i8, ptr %ptr, i64 32
store <2 x i64> %val, ptr %newptr, align 8
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i64> @load_v2i64_align16(ptr %ptr) {
; NOSTRICTALIGN-LABEL: load_v2i64_align16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_align16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: ldr q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: load_v2i64_align16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: ldr q0, [x0]
; STRICTALIGN-BE-NEXT: ret
%val = load <2 x i64>, ptr %ptr, align 16
ret <2 x i64> %val
}
define void @store_v2i64_align16(ptr %ptr, <2 x i64> %val) {
; NOSTRICTALIGN-LABEL: store_v2i64_align16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_align16:
; NOSTRICTALIGN-BE: // %bb.0:
; NOSTRICTALIGN-BE-NEXT: str q0, [x0]
; NOSTRICTALIGN-BE-NEXT: ret
;
; STRICTALIGN-BE-LABEL: store_v2i64_align16:
; STRICTALIGN-BE: // %bb.0:
; STRICTALIGN-BE-NEXT: str q0, [x0]
; STRICTALIGN-BE-NEXT: ret
store <2 x i64> %val, ptr %ptr, align 16
ret void
}
define <2 x i64> @load_v2i64_align16_post16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align16_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align16_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_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_v2i64_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 <2 x i64>, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define <2 x i64> @load_v2i64_align16_pre16(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align16_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align16_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_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_v2i64_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 <2 x i64>, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define void @store_v2i64_align16_post16(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align16_post16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #16
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align16_post16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0], #16
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_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_v2i64_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 <2 x i64> %val, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i64_align16_pre16(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align16_pre16:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #16]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align16_pre16:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0, #16]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_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_v2i64_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 <2 x i64> %val, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define <2 x i64> @load_v2i64_align16_post32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align16_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align16_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0], #32
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_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_v2i64_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 <2 x i64>, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define <2 x i64> @load_v2i64_align16_pre32(ptr %ptr, ptr %writeback) {
; NOSTRICTALIGN-LABEL: load_v2i64_align16_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: ldr q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: load_v2i64_align16_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: ldr q0, [x0, #32]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: load_v2i64_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_v2i64_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 <2 x i64>, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret <2 x i64> %val
}
define void @store_v2i64_align16_post32(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align16_post32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0], #32
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align16_post32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0], #32
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_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_v2i64_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 <2 x i64> %val, ptr %ptr, align 16
store ptr %newptr, ptr %writeback
ret void
}
define void @store_v2i64_align16_pre32(ptr %ptr, <2 x i64> %val, ptr %writeback) {
; NOSTRICTALIGN-LABEL: store_v2i64_align16_pre32:
; NOSTRICTALIGN: // %bb.0:
; NOSTRICTALIGN-NEXT: str q0, [x0, #32]!
; NOSTRICTALIGN-NEXT: str x0, [x1]
; NOSTRICTALIGN-NEXT: ret
;
; STRICTALIGN-LABEL: store_v2i64_align16_pre32:
; STRICTALIGN: // %bb.0:
; STRICTALIGN-NEXT: str q0, [x0, #32]!
; STRICTALIGN-NEXT: str x0, [x1]
; STRICTALIGN-NEXT: ret
;
; NOSTRICTALIGN-BE-LABEL: store_v2i64_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_v2i64_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 <2 x i64> %val, ptr %newptr, align 16
store ptr %newptr, ptr %writeback
ret void
}