[llvm] [ARM] Lower vector interleave operations (PR #225670)
Kamlesh Kumar via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 03:30:21 PDT 2026
https://github.com/kamleshbhalui created https://github.com/llvm/llvm-project/pull/225670
Adding support for lowering of vector_interleave
and vector_deinterleave operations.
>From 0125d143bf337106f9101c9539b9865e54d28453 Mon Sep 17 00:00:00 2001
From: Kamlesh Kumar <kamlesh.kumar at arm.com>
Date: Wed, 23 Sep 2026 10:20:08 +0000
Subject: [PATCH] [ARM] Lower vector interleave operations
Adding support for lowering of vector_interleave
and vector_deinterleave operations.
---
llvm/lib/Target/ARM/ARMISelLowering.cpp | 103 +
.../CodeGen/ARM/fixed-vector-deinterleave.ll | 3675 +++++++++++++++++
.../CodeGen/ARM/fixed-vector-interleave.ll | 2444 +++++++++++
3 files changed, 6222 insertions(+)
create mode 100644 llvm/test/CodeGen/ARM/fixed-vector-deinterleave.ll
create mode 100644 llvm/test/CodeGen/ARM/fixed-vector-interleave.ll
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 194b597bc77ba..7f5a8d1547703 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -198,6 +198,8 @@ void ARMTargetLowering::addTypeForNEON(MVT VT, MVT PromotedLdStVT) {
}
setOperationAction(ISD::BUILD_VECTOR, VT, Custom);
setOperationAction(ISD::VECTOR_SHUFFLE, VT, Custom);
+ setVectorInterleaveAction({ISD::VECTOR_INTERLEAVE, ISD::VECTOR_DEINTERLEAVE},
+ {2, 3, 4}, VT, Custom);
setOperationAction(ISD::CONCAT_VECTORS, VT, Legal);
setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Legal);
setOperationAction(ISD::SELECT, VT, Expand);
@@ -9067,6 +9069,103 @@ static SDValue LowerCONCAT_VECTORS_i1(SDValue Op, SelectionDAG &DAG,
return ConcatOps[0];
}
+static SDValue LowerVECTOR_INTERLEAVE(SDValue Op, SelectionDAG &DAG,
+ const ARMSubtarget *ST) {
+ if (!ST->hasNEON())
+ return SDValue();
+ unsigned Factor = Op->getNumOperands();
+ EVT OpVT = Op.getValueType();
+ SDLoc DL(Op);
+
+ if (Factor == 2) {
+ SDValue Zip = DAG.getNode(ARMISD::VZIP, DL, DAG.getVTList(OpVT, OpVT),
+ Op.getOperand(0), Op.getOperand(1));
+ return DAG.getMergeValues({Zip, Zip.getValue(1)}, DL);
+ }
+
+ if (Op->getNumOperands() == 3) {
+ Align Alignment = DAG.getReducedAlign(OpVT, /*UseABI=*/false);
+ SDValue StackPtr =
+ DAG.CreateStackTemporary(OpVT.getStoreSize() * 3, Alignment);
+ MachinePointerInfo StackPtrInfo = MachinePointerInfo::getFixedStack(
+ DAG.getMachineFunction(), cast<FrameIndexSDNode>(StackPtr)->getIndex());
+ SmallVector<SDValue, 6> Ops;
+ Ops.push_back(DAG.getEntryNode());
+ Ops.push_back(
+ DAG.getTargetConstant(Intrinsic::arm_neon_vst3, DL, MVT::i64));
+ Ops.push_back(StackPtr);
+
+ for (SDValue V : Op->ops())
+ Ops.push_back(V);
+ Ops.push_back(DAG.getConstant(Alignment.value(), DL, MVT::i32));
+ EVT TripleOpVT =
+ EVT::getVectorVT(*DAG.getContext(), OpVT.getVectorElementType(),
+ OpVT.getVectorNumElements() * 3);
+ SDValue Chain = DAG.getMemIntrinsicNode(
+ ISD::INTRINSIC_VOID, DL, DAG.getVTList(MVT::Other), Ops, TripleOpVT,
+ StackPtrInfo, Alignment, MachineMemOperand::MOStore);
+
+ SmallVector<SDValue, 3> Results;
+ for (unsigned I = 0; I < 3; ++I) {
+ SDValue Ptr =
+ DAG.getMemBasePlusOffset(StackPtr, OpVT.getStoreSize() * I, DL);
+ Results.push_back(
+ DAG.getLoad(OpVT, DL, Chain, Ptr, MachinePointerInfo()));
+ }
+ return DAG.getMergeValues(Results, DL);
+ }
+
+ return SDValue();
+}
+
+static SDValue LowerVECTOR_DEINTERLEAVE(SDValue Op, SelectionDAG &DAG,
+ const ARMSubtarget *ST) {
+ if (!ST->hasNEON())
+ return SDValue();
+ unsigned Factor = Op->getNumOperands();
+ EVT OpVT = Op.getValueType();
+ SDLoc DL(Op);
+
+ if (Factor == 2) {
+ SDValue Unzip = DAG.getNode(ARMISD::VUZP, DL, DAG.getVTList(OpVT, OpVT),
+ Op.getOperand(0), Op.getOperand(1));
+ return DAG.getMergeValues({Unzip, Unzip.getValue(1)}, DL);
+ }
+
+ if (Op->getNumOperands() == 3) {
+ Align Alignment = DAG.getReducedAlign(OpVT, /*UseABI=*/false);
+ SDValue StackPtr =
+ DAG.CreateStackTemporary(OpVT.getStoreSize() * 3, Alignment);
+
+ SmallVector<SDValue, 3> Chains;
+ for (unsigned I = 0; I < 3; ++I) {
+ SDValue Ptr =
+ DAG.getMemBasePlusOffset(StackPtr, OpVT.getStoreSize() * I, DL);
+ Chains.push_back(DAG.getStore(DAG.getEntryNode(), DL, Op.getOperand(I),
+ Ptr, MachinePointerInfo()));
+ }
+
+ SmallVector<SDValue, 3> Ops;
+ Ops.push_back(DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Chains));
+ Ops.push_back(
+ DAG.getTargetConstant(Intrinsic::arm_neon_vld3, DL, MVT::i64));
+ Ops.push_back(StackPtr);
+
+ EVT TripleOpVT =
+ EVT::getVectorVT(*DAG.getContext(), OpVT.getVectorElementType(),
+ OpVT.getVectorNumElements() * 3);
+ SDVTList VTs = DAG.getVTList(OpVT, OpVT, OpVT, MVT::Other);
+ SDValue LD3 = DAG.getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN, DL, VTs, Ops,
+ TripleOpVT, MachinePointerInfo(),
+ Alignment, MachineMemOperand::MOLoad);
+
+ return DAG.getMergeValues(
+ {LD3.getValue(0), LD3.getValue(1), LD3.getValue(2)}, DL);
+ }
+
+ return SDValue();
+}
+
static SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG,
const ARMSubtarget *ST) {
EVT VT = Op->getValueType(0);
@@ -10589,6 +10688,10 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
case ISD::INSERT_VECTOR_ELT: return LowerINSERT_VECTOR_ELT(Op, DAG);
case ISD::EXTRACT_VECTOR_ELT: return LowerEXTRACT_VECTOR_ELT(Op, DAG, Subtarget);
case ISD::CONCAT_VECTORS: return LowerCONCAT_VECTORS(Op, DAG, Subtarget);
+ case ISD::VECTOR_INTERLEAVE:
+ return LowerVECTOR_INTERLEAVE(Op, DAG, Subtarget);
+ case ISD::VECTOR_DEINTERLEAVE:
+ return LowerVECTOR_DEINTERLEAVE(Op, DAG, Subtarget);
case ISD::TRUNCATE: return LowerTruncate(Op.getNode(), DAG, Subtarget);
case ISD::SIGN_EXTEND:
case ISD::ZERO_EXTEND: return LowerVectorExtend(Op.getNode(), DAG, Subtarget);
diff --git a/llvm/test/CodeGen/ARM/fixed-vector-deinterleave.ll b/llvm/test/CodeGen/ARM/fixed-vector-deinterleave.ll
new file mode 100644
index 0000000000000..ee7da511d1c60
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/fixed-vector-deinterleave.ll
@@ -0,0 +1,3675 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=armv8-none-none-eabi -mattr=+neon %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-IAENABLED
+; RUN: llc -mtriple=armv8-none-none-eabi -mattr=+neon -lower-interleaved-accesses=false %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-IADISABLED
+
+define void @deinterleave2_v8i8(<16 x i8> %vec) {
+; CHECK-LABEL: deinterleave2_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vuzp.8 d17, d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i8>, <8 x i8> } @llvm.vector.deinterleave2(<16 x i8> %vec)
+ %result0 = extractvalue { <8 x i8>, <8 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i8> %result0)
+ %result1 = extractvalue { <8 x i8>, <8 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i8> %result1)
+ ret void
+}
+
+define void @deinterleave3_v8i8(<24 x i8> %vec) {
+; CHECK-LABEL: deinterleave3_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: add r12, sp, #72
+; CHECK-NEXT: vmov.8 d18[0], r0
+; CHECK-NEXT: add r0, sp, #80
+; CHECK-NEXT: vld1.8 {d16[0]}, [r12]
+; CHECK-NEXT: add r12, sp, #40
+; CHECK-NEXT: vld1.8 {d17[0]}, [r12]
+; CHECK-NEXT: add r12, sp, #76
+; CHECK-NEXT: vld1.8 {d16[1]}, [r12]
+; CHECK-NEXT: add r12, sp, #44
+; CHECK-NEXT: vld1.8 {d17[1]}, [r12]
+; CHECK-NEXT: vld1.8 {d16[2]}, [r0]
+; CHECK-NEXT: add r0, sp, #48
+; CHECK-NEXT: vld1.8 {d17[2]}, [r0]
+; CHECK-NEXT: add r0, sp, #84
+; CHECK-NEXT: vld1.8 {d16[3]}, [r0]
+; CHECK-NEXT: add r0, sp, #52
+; CHECK-NEXT: vld1.8 {d17[3]}, [r0]
+; CHECK-NEXT: add r0, sp, #24
+; CHECK-NEXT: vmov.8 d18[1], r1
+; CHECK-NEXT: vmov.8 d18[2], r2
+; CHECK-NEXT: vmov.8 d18[3], r3
+; CHECK-NEXT: vld1.8 {d18[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #88
+; CHECK-NEXT: vld1.8 {d16[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #56
+; CHECK-NEXT: vld1.8 {d17[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #28
+; CHECK-NEXT: vld1.8 {d18[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #92
+; CHECK-NEXT: vld1.8 {d16[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #60
+; CHECK-NEXT: vld1.8 {d17[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #32
+; CHECK-NEXT: vld1.8 {d18[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #96
+; CHECK-NEXT: vld1.8 {d16[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #64
+; CHECK-NEXT: vld1.8 {d17[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #36
+; CHECK-NEXT: vld1.8 {d18[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #100
+; CHECK-NEXT: vld1.8 {d16[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #68
+; CHECK-NEXT: vld1.8 {d17[7]}, [r0]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vstr d18, [sp]
+; CHECK-NEXT: vstr d16, [sp, #16]
+; CHECK-NEXT: vstr d17, [sp, #8]
+; CHECK-NEXT: vld3.8 {d16, d17, d18}, [r0:64]
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.vector.deinterleave3(<24 x i8> %vec)
+ %result0 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i8> %result0)
+ %result1 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i8> %result1)
+ %result2 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i8> %result2)
+ ret void
+}
+
+define void @deinterleave4_v8i8(<32 x i8> %vec) {
+; CHECK-LABEL: deinterleave4_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vorr d20, d18, d18
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vuzp.8 d20, d19
+; CHECK-NEXT: vuzp.8 d17, d16
+; CHECK-NEXT: vuzp.8 d16, d19
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: vuzp.8 d17, d20
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.vector.deinterleave4(<32 x i8> %vec)
+ %result0 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i8> %result0)
+ %result1 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i8> %result1)
+ %result2 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i8> %result2)
+ %result3 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 3
+ call void (...) @llvm.fake.use(<8 x i8> %result3)
+ ret void
+}
+
+define void @deinterleave6_v8i8(<48 x i8> %vec) {
+; CHECK-LABEL: deinterleave6_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: add r12, sp, #192
+; CHECK-NEXT: vmov.8 d21[0], r0
+; CHECK-NEXT: add r0, sp, #76
+; CHECK-NEXT: vld1.8 {d16[0]}, [r12]
+; CHECK-NEXT: add r12, sp, #160
+; CHECK-NEXT: vld1.8 {d18[0]}, [r12]
+; CHECK-NEXT: add r12, sp, #128
+; CHECK-NEXT: vld1.8 {d20[0]}, [r12]
+; CHECK-NEXT: add r12, sp, #96
+; CHECK-NEXT: vld1.8 {d17[0]}, [r12]
+; CHECK-NEXT: add r12, sp, #64
+; CHECK-NEXT: vld1.8 {d19[0]}, [r12]
+; CHECK-NEXT: add r12, sp, #196
+; CHECK-NEXT: vld1.8 {d16[1]}, [r12]
+; CHECK-NEXT: add r12, sp, #164
+; CHECK-NEXT: vld1.8 {d18[1]}, [r12]
+; CHECK-NEXT: add r12, sp, #132
+; CHECK-NEXT: vld1.8 {d20[1]}, [r12]
+; CHECK-NEXT: add r12, sp, #100
+; CHECK-NEXT: vld1.8 {d17[1]}, [r12]
+; CHECK-NEXT: add r12, sp, #68
+; CHECK-NEXT: vld1.8 {d19[1]}, [r12]
+; CHECK-NEXT: add r12, sp, #200
+; CHECK-NEXT: vld1.8 {d16[2]}, [r12]
+; CHECK-NEXT: add r12, sp, #168
+; CHECK-NEXT: vld1.8 {d18[2]}, [r12]
+; CHECK-NEXT: add r12, sp, #136
+; CHECK-NEXT: vld1.8 {d20[2]}, [r12]
+; CHECK-NEXT: add r12, sp, #104
+; CHECK-NEXT: vld1.8 {d17[2]}, [r12]
+; CHECK-NEXT: add r12, sp, #72
+; CHECK-NEXT: vld1.8 {d19[2]}, [r12]
+; CHECK-NEXT: add r12, sp, #204
+; CHECK-NEXT: vld1.8 {d16[3]}, [r12]
+; CHECK-NEXT: add r12, sp, #172
+; CHECK-NEXT: vld1.8 {d19[3]}, [r0]
+; CHECK-NEXT: add r0, sp, #208
+; CHECK-NEXT: vld1.8 {d18[3]}, [r12]
+; CHECK-NEXT: add r12, sp, #140
+; CHECK-NEXT: vld1.8 {d16[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #176
+; CHECK-NEXT: vld1.8 {d20[3]}, [r12]
+; CHECK-NEXT: add r12, sp, #108
+; CHECK-NEXT: vld1.8 {d18[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #144
+; CHECK-NEXT: vld1.8 {d20[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #48
+; CHECK-NEXT: vld1.8 {d17[3]}, [r12]
+; CHECK-NEXT: vmov.8 d21[1], r1
+; CHECK-NEXT: vmov.8 d21[2], r2
+; CHECK-NEXT: vmov.8 d21[3], r3
+; CHECK-NEXT: vld1.8 {d21[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #112
+; CHECK-NEXT: vld1.8 {d17[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #80
+; CHECK-NEXT: vld1.8 {d19[4]}, [r0]
+; CHECK-NEXT: add r0, sp, #212
+; CHECK-NEXT: vld1.8 {d16[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #180
+; CHECK-NEXT: vld1.8 {d18[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #148
+; CHECK-NEXT: vld1.8 {d20[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #52
+; CHECK-NEXT: vld1.8 {d21[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #116
+; CHECK-NEXT: vld1.8 {d17[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #84
+; CHECK-NEXT: vld1.8 {d19[5]}, [r0]
+; CHECK-NEXT: add r0, sp, #216
+; CHECK-NEXT: vld1.8 {d16[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #184
+; CHECK-NEXT: vld1.8 {d18[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #152
+; CHECK-NEXT: vld1.8 {d20[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #56
+; CHECK-NEXT: vld1.8 {d21[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #120
+; CHECK-NEXT: vld1.8 {d17[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #88
+; CHECK-NEXT: vld1.8 {d19[6]}, [r0]
+; CHECK-NEXT: add r0, sp, #220
+; CHECK-NEXT: vld1.8 {d16[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #188
+; CHECK-NEXT: vld1.8 {d18[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #156
+; CHECK-NEXT: vld1.8 {d20[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #60
+; CHECK-NEXT: vld1.8 {d21[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #124
+; CHECK-NEXT: vld1.8 {d17[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #92
+; CHECK-NEXT: vld1.8 {d19[7]}, [r0]
+; CHECK-NEXT: add r0, sp, #24
+; CHECK-NEXT: vstr d16, [sp, #40]
+; CHECK-NEXT: vstr d18, [sp, #32]
+; CHECK-NEXT: vstr d20, [sp, #24]
+; CHECK-NEXT: vld3.8 {d22, d23, d24}, [r0:64]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vorr d20, d22, d22
+; CHECK-NEXT: vorr d26, d23, d23
+; CHECK-NEXT: vstr d21, [sp]
+; CHECK-NEXT: vstr d17, [sp, #16]
+; CHECK-NEXT: vstr d19, [sp, #8]
+; CHECK-NEXT: vld3.8 {d16, d17, d18}, [r0:64]
+; CHECK-NEXT: vorr d21, d16, d16
+; CHECK-NEXT: vorr d27, d17, d17
+; CHECK-NEXT: vuzp.8 d18, d24
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: vuzp.8 d21, d20
+; CHECK-NEXT: @ fake_use: $d21
+; CHECK-NEXT: vuzp.8 d27, d26
+; CHECK-NEXT: @ fake_use: $d27
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: @ fake_use: $d24 $q11_q12
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.vector.deinterleave6(<48 x i8> %vec)
+ %result0 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i8> %result0)
+ %result1 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i8> %result1)
+ %result2 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i8> %result2)
+ %result3 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 3
+ call void (...) @llvm.fake.use(<8 x i8> %result3)
+ %result4 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 4
+ call void (...) @llvm.fake.use(<8 x i8> %result4)
+ %result5 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 5
+ call void (...) @llvm.fake.use(<8 x i8> %result5)
+ ret void
+}
+
+define void @deinterleave8_v8i8(<64 x i8> %vec) {
+; CHECK-LABEL: deinterleave8_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vorr d25, d16, d16
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vorr d26, d18, d18
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: vmov d23, r0, r1
+; CHECK-NEXT: vorr d24, d20, d20
+; CHECK-NEXT: vuzp.8 d25, d17
+; CHECK-NEXT: vuzp.8 d23, d22
+; CHECK-NEXT: vuzp.8 d24, d21
+; CHECK-NEXT: vuzp.8 d26, d19
+; CHECK-NEXT: vuzp.8 d25, d24
+; CHECK-NEXT: vuzp.8 d23, d26
+; CHECK-NEXT: vuzp.8 d17, d21
+; CHECK-NEXT: vuzp.8 d22, d19
+; CHECK-NEXT: vuzp.8 d23, d25
+; CHECK-NEXT: @ fake_use: $d23
+; CHECK-NEXT: vuzp.8 d19, d21
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: vuzp.8 d22, d17
+; CHECK-NEXT: @ fake_use: $d22
+; CHECK-NEXT: vuzp.8 d26, d24
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: @ fake_use: $d25
+; CHECK-NEXT: @ fake_use: $d17 $q8
+; CHECK-NEXT: @ fake_use: $d24
+; CHECK-NEXT: @ fake_use: $d21 $q10
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.vector.deinterleave8(<64 x i8> %vec)
+ %result0 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i8> %result0)
+ %result1 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i8> %result1)
+ %result2 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i8> %result2)
+ %result3 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 3
+ call void (...) @llvm.fake.use(<8 x i8> %result3)
+ %result4 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 4
+ call void (...) @llvm.fake.use(<8 x i8> %result4)
+ %result5 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 5
+ call void (...) @llvm.fake.use(<8 x i8> %result5)
+ %result6 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 6
+ call void (...) @llvm.fake.use(<8 x i8> %result6)
+ %result7 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %result, 7
+ call void (...) @llvm.fake.use(<8 x i8> %result7)
+ ret void
+}
+
+define void @deinterleave2_v4i16(<8 x i16> %vec) {
+; CHECK-LABEL: deinterleave2_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vuzp.16 d17, d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i16>, <4 x i16> } @llvm.vector.deinterleave2(<8 x i16> %vec)
+ %result0 = extractvalue { <4 x i16>, <4 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i16> %result0)
+ %result1 = extractvalue { <4 x i16>, <4 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i16> %result1)
+ ret void
+}
+
+define void @deinterleave3_v4i16(<12 x i16> %vec) {
+; CHECK-LABEL: deinterleave3_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: add r12, sp, #40
+; CHECK-NEXT: vmov.16 d18[0], r0
+; CHECK-NEXT: add r0, sp, #48
+; CHECK-NEXT: vld1.16 {d16[0]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #24
+; CHECK-NEXT: vld1.16 {d17[0]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #44
+; CHECK-NEXT: vld1.16 {d16[1]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #28
+; CHECK-NEXT: vld1.16 {d17[1]}, [r12:16]
+; CHECK-NEXT: vld1.16 {d16[2]}, [r0:16]
+; CHECK-NEXT: add r0, sp, #32
+; CHECK-NEXT: vld1.16 {d17[2]}, [r0:16]
+; CHECK-NEXT: add r0, sp, #52
+; CHECK-NEXT: vld1.16 {d16[3]}, [r0:16]
+; CHECK-NEXT: add r0, sp, #36
+; CHECK-NEXT: vld1.16 {d17[3]}, [r0:16]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vmov.16 d18[1], r1
+; CHECK-NEXT: vstr d16, [sp, #16]
+; CHECK-NEXT: vmov.16 d18[2], r2
+; CHECK-NEXT: vstr d17, [sp, #8]
+; CHECK-NEXT: vmov.16 d18[3], r3
+; CHECK-NEXT: vstr d18, [sp]
+; CHECK-NEXT: vld3.16 {d16, d17, d18}, [r0:64]
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.vector.deinterleave3(<12 x i16> %vec)
+ %result0 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i16> %result0)
+ %result1 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i16> %result1)
+ %result2 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i16> %result2)
+ ret void
+}
+
+define void @deinterleave4_v4i16(<16 x i16> %vec) {
+; CHECK-LABEL: deinterleave4_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vorr d20, d18, d18
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vuzp.16 d20, d19
+; CHECK-NEXT: vuzp.16 d17, d16
+; CHECK-NEXT: vuzp.16 d16, d19
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: vuzp.16 d17, d20
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.vector.deinterleave4(<16 x i16> %vec)
+ %result0 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i16> %result0)
+ %result1 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i16> %result1)
+ %result2 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i16> %result2)
+ %result3 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 3
+ call void (...) @llvm.fake.use(<4 x i16> %result3)
+ ret void
+}
+
+define void @deinterleave6_v4i16(<24 x i16> %vec) {
+; CHECK-LABEL: deinterleave6_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: add r12, sp, #112
+; CHECK-NEXT: vmov.16 d21[0], r0
+; CHECK-NEXT: add r0, sp, #108
+; CHECK-NEXT: vld1.16 {d16[0]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #96
+; CHECK-NEXT: vld1.16 {d17[0]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #80
+; CHECK-NEXT: vld1.16 {d18[0]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #64
+; CHECK-NEXT: vld1.16 {d19[0]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: vld1.16 {d20[0]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #116
+; CHECK-NEXT: vld1.16 {d16[1]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #100
+; CHECK-NEXT: vld1.16 {d17[1]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #84
+; CHECK-NEXT: vld1.16 {d18[1]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #68
+; CHECK-NEXT: vld1.16 {d19[1]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #52
+; CHECK-NEXT: vld1.16 {d20[1]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #120
+; CHECK-NEXT: vld1.16 {d16[2]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #104
+; CHECK-NEXT: vld1.16 {d17[2]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #88
+; CHECK-NEXT: vld1.16 {d18[2]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #72
+; CHECK-NEXT: vld1.16 {d17[3]}, [r0:16]
+; CHECK-NEXT: add r0, sp, #92
+; CHECK-NEXT: vld1.16 {d19[2]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #56
+; CHECK-NEXT: vld1.16 {d18[3]}, [r0:16]
+; CHECK-NEXT: add r0, sp, #76
+; CHECK-NEXT: vld1.16 {d20[2]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #124
+; CHECK-NEXT: vld1.16 {d19[3]}, [r0:16]
+; CHECK-NEXT: add r0, sp, #60
+; CHECK-NEXT: vld1.16 {d16[3]}, [r12:16]
+; CHECK-NEXT: vld1.16 {d20[3]}, [r0:16]
+; CHECK-NEXT: add r0, sp, #24
+; CHECK-NEXT: vmov.16 d21[1], r1
+; CHECK-NEXT: vstr d16, [sp, #40]
+; CHECK-NEXT: vmov.16 d21[2], r2
+; CHECK-NEXT: vstr d17, [sp, #32]
+; CHECK-NEXT: vmov.16 d21[3], r3
+; CHECK-NEXT: vstr d18, [sp, #24]
+; CHECK-NEXT: vld3.16 {d22, d23, d24}, [r0:64]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vorr d26, d23, d23
+; CHECK-NEXT: vstr d20, [sp, #8]
+; CHECK-NEXT: vorr d20, d22, d22
+; CHECK-NEXT: vstr d21, [sp]
+; CHECK-NEXT: vstr d19, [sp, #16]
+; CHECK-NEXT: vld3.16 {d16, d17, d18}, [r0:64]
+; CHECK-NEXT: vorr d21, d16, d16
+; CHECK-NEXT: vorr d27, d17, d17
+; CHECK-NEXT: vuzp.16 d18, d24
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: vuzp.16 d21, d20
+; CHECK-NEXT: @ fake_use: $d21
+; CHECK-NEXT: vuzp.16 d27, d26
+; CHECK-NEXT: @ fake_use: $d27
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: @ fake_use: $d24 $q11_q12
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.vector.deinterleave6(<24 x i16> %vec)
+ %result0 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i16> %result0)
+ %result1 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i16> %result1)
+ %result2 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i16> %result2)
+ %result3 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 3
+ call void (...) @llvm.fake.use(<4 x i16> %result3)
+ %result4 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 4
+ call void (...) @llvm.fake.use(<4 x i16> %result4)
+ %result5 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 5
+ call void (...) @llvm.fake.use(<4 x i16> %result5)
+ ret void
+}
+
+define void @deinterleave8_v4i16(<32 x i16> %vec) {
+; CHECK-LABEL: deinterleave8_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vorr d25, d16, d16
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vorr d26, d18, d18
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: vmov d23, r0, r1
+; CHECK-NEXT: vorr d24, d20, d20
+; CHECK-NEXT: vuzp.16 d25, d17
+; CHECK-NEXT: vuzp.16 d23, d22
+; CHECK-NEXT: vuzp.16 d24, d21
+; CHECK-NEXT: vuzp.16 d26, d19
+; CHECK-NEXT: vuzp.16 d25, d24
+; CHECK-NEXT: vuzp.16 d23, d26
+; CHECK-NEXT: vuzp.16 d17, d21
+; CHECK-NEXT: vuzp.16 d22, d19
+; CHECK-NEXT: vuzp.16 d23, d25
+; CHECK-NEXT: @ fake_use: $d23
+; CHECK-NEXT: vuzp.16 d19, d21
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: vuzp.16 d22, d17
+; CHECK-NEXT: @ fake_use: $d22
+; CHECK-NEXT: vuzp.16 d26, d24
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: @ fake_use: $d25
+; CHECK-NEXT: @ fake_use: $d17 $q8
+; CHECK-NEXT: @ fake_use: $d24
+; CHECK-NEXT: @ fake_use: $d21 $q10
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.vector.deinterleave8(<32 x i16> %vec)
+ %result0 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i16> %result0)
+ %result1 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i16> %result1)
+ %result2 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i16> %result2)
+ %result3 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 3
+ call void (...) @llvm.fake.use(<4 x i16> %result3)
+ %result4 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 4
+ call void (...) @llvm.fake.use(<4 x i16> %result4)
+ %result5 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 5
+ call void (...) @llvm.fake.use(<4 x i16> %result5)
+ %result6 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 6
+ call void (...) @llvm.fake.use(<4 x i16> %result6)
+ %result7 = extractvalue { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %result, 7
+ call void (...) @llvm.fake.use(<4 x i16> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v2i32(<4 x i32> %vec) {
+; CHECK-LABEL: deinterleave2_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vtrn.32 d17, d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: bx lr
+ %result = call { <2 x i32>, <2 x i32> } @llvm.vector.deinterleave2(<4 x i32> %vec)
+ %result0 = extractvalue { <2 x i32>, <2 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<2 x i32> %result0)
+ %result1 = extractvalue { <2 x i32>, <2 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<2 x i32> %result1)
+ ret void
+}
+
+define void @deinterleave3_v2i32(<6 x i32> %vec) {
+; CHECK-LABEL: deinterleave3_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: vldr s1, [sp, #28]
+; CHECK-NEXT: vmov s3, r1
+; CHECK-NEXT: vldr s0, [sp, #24]
+; CHECK-NEXT: vmov s2, r0
+; CHECK-NEXT: vmov s5, r3
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vmov s4, r2
+; CHECK-NEXT: vstr d0, [sp, #16]
+; CHECK-NEXT: vstmia sp, {d1, d2}
+; CHECK-NEXT: vld3.32 {d16, d17, d18}, [r0:64]
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.vector.deinterleave3(<6 x i32> %vec)
+ %result0 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<2 x i32> %result0)
+ %result1 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<2 x i32> %result1)
+ %result2 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<2 x i32> %result2)
+ ret void
+}
+
+define void @deinterleave4_v2i32(<8 x i32> %vec) {
+; CHECK-LABEL: deinterleave4_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vorr d20, d18, d18
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vtrn.32 d20, d19
+; CHECK-NEXT: vtrn.32 d17, d16
+; CHECK-NEXT: vtrn.32 d16, d19
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: vtrn.32 d17, d20
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: bx lr
+ %result = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.vector.deinterleave4(<8 x i32> %vec)
+ %result0 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<2 x i32> %result0)
+ %result1 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<2 x i32> %result1)
+ %result2 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<2 x i32> %result2)
+ %result3 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 3
+ call void (...) @llvm.fake.use(<2 x i32> %result3)
+ ret void
+}
+
+define void @deinterleave6_v2i32(<12 x i32> %vec) {
+; CHECK-LABEL: deinterleave6_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: vldr s1, [sp, #76]
+; CHECK-NEXT: add r12, sp, #24
+; CHECK-NEXT: vldr s0, [sp, #72]
+; CHECK-NEXT: vldr s3, [sp, #68]
+; CHECK-NEXT: vldr s5, [sp, #60]
+; CHECK-NEXT: vldr s7, [sp, #52]
+; CHECK-NEXT: vldr s2, [sp, #64]
+; CHECK-NEXT: vldr s4, [sp, #56]
+; CHECK-NEXT: vstr d0, [sp, #40]
+; CHECK-NEXT: vmov s1, r1
+; CHECK-NEXT: vmov s0, r0
+; CHECK-NEXT: vldr s6, [sp, #48]
+; CHECK-NEXT: vstr d1, [sp, #32]
+; CHECK-NEXT: vmov s3, r3
+; CHECK-NEXT: vstr d2, [sp, #24]
+; CHECK-NEXT: vmov s2, r2
+; CHECK-NEXT: vld3.32 {d16, d17, d18}, [r12:64]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vorr d24, d16, d16
+; CHECK-NEXT: vstr d3, [sp, #16]
+; CHECK-NEXT: vstmia sp, {d0, d1}
+; CHECK-NEXT: vld3.32 {d20, d21, d22}, [r0:64]
+; CHECK-NEXT: vorr d26, d21, d21
+; CHECK-NEXT: vorr d25, d20, d20
+; CHECK-NEXT: vorr d20, d22, d22
+; CHECK-NEXT: vtrn.32 d26, d17
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: vtrn.32 d25, d24
+; CHECK-NEXT: @ fake_use: $d25
+; CHECK-NEXT: vtrn.32 d20, d18
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d24
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.vector.deinterleave6(<12 x i32> %vec)
+ %result0 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<2 x i32> %result0)
+ %result1 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<2 x i32> %result1)
+ %result2 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<2 x i32> %result2)
+ %result3 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 3
+ call void (...) @llvm.fake.use(<2 x i32> %result3)
+ %result4 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 4
+ call void (...) @llvm.fake.use(<2 x i32> %result4)
+ %result5 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 5
+ call void (...) @llvm.fake.use(<2 x i32> %result5)
+ ret void
+}
+
+define void @deinterleave8_v2i32(<16 x i32> %vec) {
+; CHECK-LABEL: deinterleave8_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vorr d25, d16, d16
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vorr d26, d18, d18
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: vmov d23, r0, r1
+; CHECK-NEXT: vorr d24, d20, d20
+; CHECK-NEXT: vtrn.32 d25, d17
+; CHECK-NEXT: vtrn.32 d23, d22
+; CHECK-NEXT: vtrn.32 d24, d21
+; CHECK-NEXT: vtrn.32 d26, d19
+; CHECK-NEXT: vtrn.32 d25, d24
+; CHECK-NEXT: vtrn.32 d23, d26
+; CHECK-NEXT: vtrn.32 d17, d21
+; CHECK-NEXT: vtrn.32 d22, d19
+; CHECK-NEXT: vtrn.32 d23, d25
+; CHECK-NEXT: @ fake_use: $d23
+; CHECK-NEXT: vtrn.32 d19, d21
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: vtrn.32 d22, d17
+; CHECK-NEXT: @ fake_use: $d22
+; CHECK-NEXT: vtrn.32 d26, d24
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: @ fake_use: $d25
+; CHECK-NEXT: @ fake_use: $d17 $q8
+; CHECK-NEXT: @ fake_use: $d24
+; CHECK-NEXT: @ fake_use: $d21 $q10
+; CHECK-NEXT: bx lr
+ %result = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.vector.deinterleave8(<16 x i32> %vec)
+ %result0 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<2 x i32> %result0)
+ %result1 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<2 x i32> %result1)
+ %result2 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<2 x i32> %result2)
+ %result3 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 3
+ call void (...) @llvm.fake.use(<2 x i32> %result3)
+ %result4 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 4
+ call void (...) @llvm.fake.use(<2 x i32> %result4)
+ %result5 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 5
+ call void (...) @llvm.fake.use(<2 x i32> %result5)
+ %result6 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 6
+ call void (...) @llvm.fake.use(<2 x i32> %result6)
+ %result7 = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %result, 7
+ call void (...) @llvm.fake.use(<2 x i32> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v2f32(<4 x float> %vec) {
+; CHECK-LABEL: deinterleave2_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vtrn.32 d17, d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: bx lr
+ %result = call { <2 x float>, <2 x float> } @llvm.vector.deinterleave2(<4 x float> %vec)
+ %result0 = extractvalue { <2 x float>, <2 x float> } %result, 0
+ call void (...) @llvm.fake.use(<2 x float> %result0)
+ %result1 = extractvalue { <2 x float>, <2 x float> } %result, 1
+ call void (...) @llvm.fake.use(<2 x float> %result1)
+ ret void
+}
+
+define void @deinterleave3_v2f32(<6 x float> %vec) {
+; CHECK-LABEL: deinterleave3_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: vldr s1, [sp, #28]
+; CHECK-NEXT: vmov s3, r1
+; CHECK-NEXT: vldr s0, [sp, #24]
+; CHECK-NEXT: vmov s2, r0
+; CHECK-NEXT: vmov s5, r3
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vmov s4, r2
+; CHECK-NEXT: vstr d0, [sp, #16]
+; CHECK-NEXT: vstmia sp, {d1, d2}
+; CHECK-NEXT: vld3.32 {d16, d17, d18}, [r0:64]
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call { <2 x float>, <2 x float>, <2 x float> } @llvm.vector.deinterleave3(<6 x float> %vec)
+ %result0 = extractvalue { <2 x float>, <2 x float>, <2 x float> } %result, 0
+ call void (...) @llvm.fake.use(<2 x float> %result0)
+ %result1 = extractvalue { <2 x float>, <2 x float>, <2 x float> } %result, 1
+ call void (...) @llvm.fake.use(<2 x float> %result1)
+ %result2 = extractvalue { <2 x float>, <2 x float>, <2 x float> } %result, 2
+ call void (...) @llvm.fake.use(<2 x float> %result2)
+ ret void
+}
+
+define void @deinterleave4_v2f32(<8 x float> %vec) {
+; CHECK-LABEL: deinterleave4_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vorr d20, d18, d18
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vtrn.32 d20, d19
+; CHECK-NEXT: vtrn.32 d17, d16
+; CHECK-NEXT: vtrn.32 d16, d19
+; CHECK-NEXT: @ fake_use: $d16
+; CHECK-NEXT: vtrn.32 d17, d20
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: bx lr
+ %result = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.vector.deinterleave4(<8 x float> %vec)
+ %result0 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 0
+ call void (...) @llvm.fake.use(<2 x float> %result0)
+ %result1 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 1
+ call void (...) @llvm.fake.use(<2 x float> %result1)
+ %result2 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 2
+ call void (...) @llvm.fake.use(<2 x float> %result2)
+ %result3 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 3
+ call void (...) @llvm.fake.use(<2 x float> %result3)
+ ret void
+}
+
+define void @deinterleave6_v2f32(<12 x float> %vec) {
+; CHECK-LABEL: deinterleave6_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: vldr s1, [sp, #76]
+; CHECK-NEXT: add r12, sp, #24
+; CHECK-NEXT: vldr s0, [sp, #72]
+; CHECK-NEXT: vldr s3, [sp, #68]
+; CHECK-NEXT: vldr s5, [sp, #60]
+; CHECK-NEXT: vldr s7, [sp, #52]
+; CHECK-NEXT: vldr s2, [sp, #64]
+; CHECK-NEXT: vldr s4, [sp, #56]
+; CHECK-NEXT: vstr d0, [sp, #40]
+; CHECK-NEXT: vmov s1, r1
+; CHECK-NEXT: vmov s0, r0
+; CHECK-NEXT: vldr s6, [sp, #48]
+; CHECK-NEXT: vstr d1, [sp, #32]
+; CHECK-NEXT: vmov s3, r3
+; CHECK-NEXT: vstr d2, [sp, #24]
+; CHECK-NEXT: vmov s2, r2
+; CHECK-NEXT: vld3.32 {d16, d17, d18}, [r12:64]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vorr d24, d16, d16
+; CHECK-NEXT: vstr d3, [sp, #16]
+; CHECK-NEXT: vstmia sp, {d0, d1}
+; CHECK-NEXT: vld3.32 {d20, d21, d22}, [r0:64]
+; CHECK-NEXT: vorr d26, d21, d21
+; CHECK-NEXT: vorr d25, d20, d20
+; CHECK-NEXT: vorr d20, d22, d22
+; CHECK-NEXT: vtrn.32 d26, d17
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: vtrn.32 d25, d24
+; CHECK-NEXT: @ fake_use: $d25
+; CHECK-NEXT: vtrn.32 d20, d18
+; CHECK-NEXT: @ fake_use: $d20
+; CHECK-NEXT: @ fake_use: $d24
+; CHECK-NEXT: @ fake_use: $d17
+; CHECK-NEXT: @ fake_use: $d18 $q8_q9
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.vector.deinterleave6(<12 x float> %vec)
+ %result0 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 0
+ call void (...) @llvm.fake.use(<2 x float> %result0)
+ %result1 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 1
+ call void (...) @llvm.fake.use(<2 x float> %result1)
+ %result2 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 2
+ call void (...) @llvm.fake.use(<2 x float> %result2)
+ %result3 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 3
+ call void (...) @llvm.fake.use(<2 x float> %result3)
+ %result4 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 4
+ call void (...) @llvm.fake.use(<2 x float> %result4)
+ %result5 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 5
+ call void (...) @llvm.fake.use(<2 x float> %result5)
+ ret void
+}
+
+define void @deinterleave8_v2f32(<16 x float> %vec) {
+; CHECK-LABEL: deinterleave8_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vorr d25, d16, d16
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vorr d26, d18, d18
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: vmov d23, r0, r1
+; CHECK-NEXT: vorr d24, d20, d20
+; CHECK-NEXT: vtrn.32 d25, d17
+; CHECK-NEXT: vtrn.32 d23, d22
+; CHECK-NEXT: vtrn.32 d24, d21
+; CHECK-NEXT: vtrn.32 d26, d19
+; CHECK-NEXT: vtrn.32 d25, d24
+; CHECK-NEXT: vtrn.32 d23, d26
+; CHECK-NEXT: vtrn.32 d17, d21
+; CHECK-NEXT: vtrn.32 d22, d19
+; CHECK-NEXT: vtrn.32 d23, d25
+; CHECK-NEXT: @ fake_use: $d23
+; CHECK-NEXT: vtrn.32 d19, d21
+; CHECK-NEXT: @ fake_use: $d19 $q9
+; CHECK-NEXT: vtrn.32 d22, d17
+; CHECK-NEXT: @ fake_use: $d22
+; CHECK-NEXT: vtrn.32 d26, d24
+; CHECK-NEXT: @ fake_use: $d26
+; CHECK-NEXT: @ fake_use: $d25
+; CHECK-NEXT: @ fake_use: $d17 $q8
+; CHECK-NEXT: @ fake_use: $d24
+; CHECK-NEXT: @ fake_use: $d21 $q10
+; CHECK-NEXT: bx lr
+ %result = call { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.vector.deinterleave8(<16 x float> %vec)
+ %result0 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 0
+ call void (...) @llvm.fake.use(<2 x float> %result0)
+ %result1 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 1
+ call void (...) @llvm.fake.use(<2 x float> %result1)
+ %result2 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 2
+ call void (...) @llvm.fake.use(<2 x float> %result2)
+ %result3 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 3
+ call void (...) @llvm.fake.use(<2 x float> %result3)
+ %result4 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 4
+ call void (...) @llvm.fake.use(<2 x float> %result4)
+ %result5 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 5
+ call void (...) @llvm.fake.use(<2 x float> %result5)
+ %result6 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 6
+ call void (...) @llvm.fake.use(<2 x float> %result6)
+ %result7 = extractvalue { <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float>, <2 x float> } %result, 7
+ call void (...) @llvm.fake.use(<2 x float> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v16i8(<32 x i8> %vec) {
+; CHECK-LABEL: deinterleave2_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d17, r2, r3
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vmov d16, r0, r1
+; CHECK-NEXT: vuzp.8 q8, q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: bx lr
+ %result = call { <16 x i8>, <16 x i8> } @llvm.vector.deinterleave2(<32 x i8> %vec)
+ %result0 = extractvalue { <16 x i8>, <16 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<16 x i8> %result0)
+ %result1 = extractvalue { <16 x i8>, <16 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<16 x i8> %result1)
+ ret void
+}
+
+define void @deinterleave3_v16i8(<48 x i8> %vec) {
+; CHECK-LABEL: deinterleave3_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #116
+; CHECK-NEXT: vld1.8 {d20[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #148
+; CHECK-NEXT: vld1.8 {d21[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #20
+; CHECK-NEXT: vld1.8 {d19[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #52
+; CHECK-NEXT: vld1.8 {d16[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #84
+; CHECK-NEXT: vld1.8 {d17[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #120
+; CHECK-NEXT: vld1.8 {d20[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #152
+; CHECK-NEXT: vld1.8 {d21[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #24
+; CHECK-NEXT: vld1.8 {d19[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #56
+; CHECK-NEXT: vld1.8 {d16[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #88
+; CHECK-NEXT: vld1.8 {d17[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #124
+; CHECK-NEXT: vld1.8 {d20[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #156
+; CHECK-NEXT: vld1.8 {d21[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #28
+; CHECK-NEXT: vld1.8 {d19[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #60
+; CHECK-NEXT: vld1.8 {d16[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #92
+; CHECK-NEXT: vld1.8 {d17[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #128
+; CHECK-NEXT: vld1.8 {d20[3]}, [r12]
+; CHECK-NEXT: vmov.8 d18[0], r0
+; CHECK-NEXT: add r0, r11, #160
+; CHECK-NEXT: vld1.8 {d21[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #32
+; CHECK-NEXT: vmov.8 d18[1], r1
+; CHECK-NEXT: vld1.8 {d19[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #64
+; CHECK-NEXT: vld1.8 {d16[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #96
+; CHECK-NEXT: vld1.8 {d17[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #4
+; CHECK-NEXT: vmov.8 d18[2], r2
+; CHECK-NEXT: vmov.8 d18[3], r3
+; CHECK-NEXT: vld1.8 {d18[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #132
+; CHECK-NEXT: vld1.8 {d20[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #164
+; CHECK-NEXT: vld1.8 {d21[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #36
+; CHECK-NEXT: vld1.8 {d19[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #68
+; CHECK-NEXT: vld1.8 {d16[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #100
+; CHECK-NEXT: vld1.8 {d17[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #8
+; CHECK-NEXT: vld1.8 {d18[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #136
+; CHECK-NEXT: vld1.8 {d20[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #168
+; CHECK-NEXT: vld1.8 {d21[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #40
+; CHECK-NEXT: vld1.8 {d19[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #72
+; CHECK-NEXT: vld1.8 {d16[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #104
+; CHECK-NEXT: vld1.8 {d17[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #12
+; CHECK-NEXT: vld1.8 {d18[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #140
+; CHECK-NEXT: vld1.8 {d20[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #172
+; CHECK-NEXT: vld1.8 {d21[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #44
+; CHECK-NEXT: vld1.8 {d19[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #76
+; CHECK-NEXT: vld1.8 {d16[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #108
+; CHECK-NEXT: vld1.8 {d17[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #16
+; CHECK-NEXT: vld1.8 {d18[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #144
+; CHECK-NEXT: vld1.8 {d20[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #176
+; CHECK-NEXT: vld1.8 {d21[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #48
+; CHECK-NEXT: vld1.8 {d19[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #80
+; CHECK-NEXT: vld1.8 {d16[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #112
+; CHECK-NEXT: vld1.8 {d17[7]}, [r0]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: add r1, r0, #32
+; CHECK-NEXT: vst1.64 {d20, d21}, [r1:128]
+; CHECK-NEXT: mov r1, r0
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r1]
+; CHECK-NEXT: vld3.8 {d16, d18, d20}, [r0:64]!
+; CHECK-NEXT: vld3.8 {d17, d19, d21}, [r0:64]
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q10 $q8_q9_q10_q11
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.vector.deinterleave3(<48 x i8> %vec)
+ %result0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<16 x i8> %result0)
+ %result1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<16 x i8> %result1)
+ %result2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<16 x i8> %result2)
+ ret void
+}
+
+define void @deinterleave4_v16i8(<64 x i8> %vec) {
+; CHECK-LABEL: deinterleave4_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11, lr}
+; CHECK-NEXT: push {r11, lr}
+; CHECK-NEXT: add r12, sp, #40
+; CHECK-NEXT: vmov d21, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #24
+; CHECK-NEXT: add lr, sp, #8
+; CHECK-NEXT: vmov d20, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [lr]
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: vuzp.8 q10, q9
+; CHECK-NEXT: vuzp.8 q11, q8
+; CHECK-NEXT: vuzp.8 q10, q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: vuzp.8 q9, q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: pop {r11, pc}
+ %result = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.vector.deinterleave4(<64 x i8> %vec)
+ %result0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<16 x i8> %result0)
+ %result1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<16 x i8> %result1)
+ %result2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<16 x i8> %result2)
+ %result3 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 3
+ call void (...) @llvm.fake.use(<16 x i8> %result3)
+ ret void
+}
+
+define void @deinterleave6_v16i8(<96 x i8> %vec) {
+; CHECK-LABEL: deinterleave6_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r11, lr}
+; CHECK-NEXT: push {r4, r5, r11, lr}
+; CHECK-NEXT: .setfp r11, sp, #8
+; CHECK-NEXT: add r11, sp, #8
+; CHECK-NEXT: .pad #96
+; CHECK-NEXT: sub sp, sp, #96
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #312
+; CHECK-NEXT: vld1.8 {d26[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #344
+; CHECK-NEXT: vld1.8 {d27[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #184
+; CHECK-NEXT: vld1.8 {d22[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #216
+; CHECK-NEXT: vld1.8 {d23[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #248
+; CHECK-NEXT: vld1.8 {d24[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #280
+; CHECK-NEXT: vld1.8 {d25[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #316
+; CHECK-NEXT: vld1.8 {d26[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #348
+; CHECK-NEXT: vld1.8 {d27[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #188
+; CHECK-NEXT: vld1.8 {d22[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #220
+; CHECK-NEXT: vld1.8 {d23[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #252
+; CHECK-NEXT: vld1.8 {d24[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #284
+; CHECK-NEXT: vld1.8 {d25[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #320
+; CHECK-NEXT: vld1.8 {d26[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #352
+; CHECK-NEXT: vld1.8 {d27[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #192
+; CHECK-NEXT: vld1.8 {d22[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #224
+; CHECK-NEXT: vld1.8 {d23[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #256
+; CHECK-NEXT: vld1.8 {d24[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #288
+; CHECK-NEXT: vld1.8 {d25[2]}, [r12]
+; CHECK-NEXT: add r12, r11, #324
+; CHECK-NEXT: vld1.8 {d26[3]}, [r12]
+; CHECK-NEXT: add r12, r11, #356
+; CHECK-NEXT: vld1.8 {d27[3]}, [r12]
+; CHECK-NEXT: add r12, r11, #196
+; CHECK-NEXT: vld1.8 {d22[3]}, [r12]
+; CHECK-NEXT: add r12, r11, #228
+; CHECK-NEXT: vld1.8 {d23[3]}, [r12]
+; CHECK-NEXT: add r12, r11, #260
+; CHECK-NEXT: vld1.8 {d24[3]}, [r12]
+; CHECK-NEXT: add r12, r11, #292
+; CHECK-NEXT: vld1.8 {d25[3]}, [r12]
+; CHECK-NEXT: add r12, r11, #328
+; CHECK-NEXT: vld1.8 {d26[4]}, [r12]
+; CHECK-NEXT: add r12, r11, #360
+; CHECK-NEXT: vld1.8 {d27[4]}, [r12]
+; CHECK-NEXT: add r12, r11, #200
+; CHECK-NEXT: vld1.8 {d22[4]}, [r12]
+; CHECK-NEXT: add r12, r11, #232
+; CHECK-NEXT: vld1.8 {d23[4]}, [r12]
+; CHECK-NEXT: add r12, r11, #264
+; CHECK-NEXT: vld1.8 {d24[4]}, [r12]
+; CHECK-NEXT: add r12, r11, #296
+; CHECK-NEXT: vld1.8 {d25[4]}, [r12]
+; CHECK-NEXT: add r12, r11, #332
+; CHECK-NEXT: vld1.8 {d26[5]}, [r12]
+; CHECK-NEXT: add r12, r11, #364
+; CHECK-NEXT: vld1.8 {d27[5]}, [r12]
+; CHECK-NEXT: add r12, r11, #204
+; CHECK-NEXT: vld1.8 {d22[5]}, [r12]
+; CHECK-NEXT: add r12, r11, #236
+; CHECK-NEXT: vld1.8 {d23[5]}, [r12]
+; CHECK-NEXT: add r12, r11, #268
+; CHECK-NEXT: vld1.8 {d24[5]}, [r12]
+; CHECK-NEXT: add r12, r11, #300
+; CHECK-NEXT: vld1.8 {d25[5]}, [r12]
+; CHECK-NEXT: add r12, r11, #120
+; CHECK-NEXT: vld1.8 {d16[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #336
+; CHECK-NEXT: vld1.8 {d26[6]}, [r12]
+; CHECK-NEXT: add r12, r11, #368
+; CHECK-NEXT: vld1.8 {d27[6]}, [r12]
+; CHECK-NEXT: add r12, r11, #208
+; CHECK-NEXT: vld1.8 {d22[6]}, [r12]
+; CHECK-NEXT: add r12, r11, #240
+; CHECK-NEXT: vld1.8 {d23[6]}, [r12]
+; CHECK-NEXT: add r12, r11, #272
+; CHECK-NEXT: vld1.8 {d24[6]}, [r12]
+; CHECK-NEXT: add r12, r11, #304
+; CHECK-NEXT: vld1.8 {d25[6]}, [r12]
+; CHECK-NEXT: add r12, r11, #152
+; CHECK-NEXT: vld1.8 {d17[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #24
+; CHECK-NEXT: vld1.8 {d21[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #56
+; CHECK-NEXT: vld1.8 {d18[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #88
+; CHECK-NEXT: vld1.8 {d19[0]}, [r12]
+; CHECK-NEXT: add r12, r11, #124
+; CHECK-NEXT: vld1.8 {d16[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #340
+; CHECK-NEXT: vld1.8 {d26[7]}, [r12]
+; CHECK-NEXT: add r12, r11, #372
+; CHECK-NEXT: vld1.8 {d27[7]}, [r12]
+; CHECK-NEXT: add r12, r11, #212
+; CHECK-NEXT: vld1.8 {d22[7]}, [r12]
+; CHECK-NEXT: add r12, r11, #244
+; CHECK-NEXT: vld1.8 {d23[7]}, [r12]
+; CHECK-NEXT: add r12, r11, #276
+; CHECK-NEXT: vld1.8 {d24[7]}, [r12]
+; CHECK-NEXT: add r12, r11, #308
+; CHECK-NEXT: vld1.8 {d25[7]}, [r12]
+; CHECK-NEXT: add r12, r11, #156
+; CHECK-NEXT: vld1.8 {d17[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #28
+; CHECK-NEXT: vld1.8 {d21[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #60
+; CHECK-NEXT: vld1.8 {d18[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #92
+; CHECK-NEXT: vld1.8 {d19[1]}, [r12]
+; CHECK-NEXT: add r12, r11, #128
+; CHECK-NEXT: vld1.8 {d16[2]}, [r12]
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: add lr, r12, #32
+; CHECK-NEXT: vst1.64 {d26, d27}, [lr:128]
+; CHECK-NEXT: mov lr, r12
+; CHECK-NEXT: vst1.64 {d22, d23}, [lr:128]!
+; CHECK-NEXT: vst1.64 {d24, d25}, [lr]
+; CHECK-NEXT: add lr, r11, #160
+; CHECK-NEXT: vld1.8 {d17[2]}, [lr]
+; CHECK-NEXT: add lr, r11, #32
+; CHECK-NEXT: vld1.8 {d21[2]}, [lr]
+; CHECK-NEXT: add lr, r11, #64
+; CHECK-NEXT: vld1.8 {d18[2]}, [lr]
+; CHECK-NEXT: add lr, r11, #96
+; CHECK-NEXT: vld1.8 {d19[2]}, [lr]
+; CHECK-NEXT: add lr, r11, #132
+; CHECK-NEXT: vld1.8 {d16[3]}, [lr]
+; CHECK-NEXT: vmov.8 d20[0], r0
+; CHECK-NEXT: add r0, r11, #164
+; CHECK-NEXT: vld1.8 {d17[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #36
+; CHECK-NEXT: vmov.8 d20[1], r1
+; CHECK-NEXT: vld1.8 {d21[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #68
+; CHECK-NEXT: vld1.8 {d18[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #100
+; CHECK-NEXT: vld1.8 {d19[3]}, [r0]
+; CHECK-NEXT: add r0, r11, #8
+; CHECK-NEXT: vmov.8 d20[2], r2
+; CHECK-NEXT: vld3.8 {d22, d24, d26}, [r12:64]!
+; CHECK-NEXT: vmov.8 d20[3], r3
+; CHECK-NEXT: vld3.8 {d23, d25, d27}, [r12:64]
+; CHECK-NEXT: vld1.8 {d20[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #136
+; CHECK-NEXT: vld1.8 {d16[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #168
+; CHECK-NEXT: vld1.8 {d17[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #40
+; CHECK-NEXT: vld1.8 {d21[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #72
+; CHECK-NEXT: vld1.8 {d18[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #104
+; CHECK-NEXT: vld1.8 {d19[4]}, [r0]
+; CHECK-NEXT: add r0, r11, #12
+; CHECK-NEXT: vld1.8 {d20[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #140
+; CHECK-NEXT: vld1.8 {d16[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #172
+; CHECK-NEXT: vld1.8 {d17[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #44
+; CHECK-NEXT: vld1.8 {d21[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #76
+; CHECK-NEXT: vld1.8 {d18[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #108
+; CHECK-NEXT: vld1.8 {d19[5]}, [r0]
+; CHECK-NEXT: add r0, r11, #16
+; CHECK-NEXT: vld1.8 {d20[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #144
+; CHECK-NEXT: vld1.8 {d16[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #176
+; CHECK-NEXT: vld1.8 {d17[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #48
+; CHECK-NEXT: vld1.8 {d21[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #80
+; CHECK-NEXT: vld1.8 {d18[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #112
+; CHECK-NEXT: vld1.8 {d19[6]}, [r0]
+; CHECK-NEXT: add r0, r11, #20
+; CHECK-NEXT: vld1.8 {d20[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #148
+; CHECK-NEXT: vld1.8 {d16[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #180
+; CHECK-NEXT: vld1.8 {d17[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #52
+; CHECK-NEXT: vld1.8 {d21[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #84
+; CHECK-NEXT: vld1.8 {d18[7]}, [r0]
+; CHECK-NEXT: add r0, r11, #116
+; CHECK-NEXT: vld1.8 {d19[7]}, [r0]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: add r1, r0, #32
+; CHECK-NEXT: vst1.64 {d16, d17}, [r1:128]
+; CHECK-NEXT: mov r1, r0
+; CHECK-NEXT: vst1.64 {d20, d21}, [r1:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1]
+; CHECK-NEXT: vld3.8 {d0, d2, d4}, [r0:64]!
+; CHECK-NEXT: vld3.8 {d1, d3, d5}, [r0:64]
+; CHECK-NEXT: vorr q8, q0, q0
+; CHECK-NEXT: vorr q9, q1, q1
+; CHECK-NEXT: vorr q15, q2, q2
+; CHECK-NEXT: vuzp.8 q8, q11
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: vuzp.8 q9, q12
+; CHECK-NEXT: vorr q10, q13, q13
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: @ fake_use: $q12 $q11_q12_q13_q14
+; CHECK-NEXT: vuzp.8 q15, q10
+; CHECK-NEXT: @ fake_use: $q15
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: sub sp, r11, #8
+; CHECK-NEXT: pop {r4, r5, r11, pc}
+ %result = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.vector.deinterleave6(<96 x i8> %vec)
+ %result0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<16 x i8> %result0)
+ %result1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<16 x i8> %result1)
+ %result2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<16 x i8> %result2)
+ %result3 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 3
+ call void (...) @llvm.fake.use(<16 x i8> %result3)
+ %result4 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 4
+ call void (...) @llvm.fake.use(<16 x i8> %result4)
+ %result5 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 5
+ call void (...) @llvm.fake.use(<16 x i8> %result5)
+ ret void
+}
+
+define void @deinterleave8_v16i8(<128 x i8> %vec) {
+; CHECK-LABEL: deinterleave8_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #96
+; CHECK-NEXT: vmov d31, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #80
+; CHECK-NEXT: vmov d30, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #64
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vld1.64 {d24, d25}, [r12]
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vld1.64 {d26, d27}, [r12]
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: vld1.64 {d28, d29}, [r12]
+; CHECK-NEXT: vuzp.8 q9, q8
+; CHECK-NEXT: vuzp.8 q14, q10
+; CHECK-NEXT: vuzp.8 q15, q11
+; CHECK-NEXT: vuzp.8 q13, q12
+; CHECK-NEXT: vuzp.8 q14, q9
+; CHECK-NEXT: vuzp.8 q15, q13
+; CHECK-NEXT: vuzp.8 q10, q8
+; CHECK-NEXT: vuzp.8 q11, q12
+; CHECK-NEXT: vuzp.8 q15, q14
+; CHECK-NEXT: @ fake_use: $q15
+; CHECK-NEXT: @ fake_use: $q14
+; CHECK-NEXT: vuzp.8 q11, q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: vuzp.8 q13, q9
+; CHECK-NEXT: @ fake_use: $q13
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: vuzp.8 q12, q8
+; CHECK-NEXT: @ fake_use: $q12
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: bx lr
+ %result = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.vector.deinterleave8(<128 x i8> %vec)
+ %result0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 0
+ call void (...) @llvm.fake.use(<16 x i8> %result0)
+ %result1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 1
+ call void (...) @llvm.fake.use(<16 x i8> %result1)
+ %result2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 2
+ call void (...) @llvm.fake.use(<16 x i8> %result2)
+ %result3 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 3
+ call void (...) @llvm.fake.use(<16 x i8> %result3)
+ %result4 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 4
+ call void (...) @llvm.fake.use(<16 x i8> %result4)
+ %result5 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 5
+ call void (...) @llvm.fake.use(<16 x i8> %result5)
+ %result6 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 6
+ call void (...) @llvm.fake.use(<16 x i8> %result6)
+ %result7 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %result, 7
+ call void (...) @llvm.fake.use(<16 x i8> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v8i16(<16 x i16> %vec) {
+; CHECK-LABEL: deinterleave2_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d17, r2, r3
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vmov d16, r0, r1
+; CHECK-NEXT: vuzp.16 q8, q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i16>, <8 x i16> } @llvm.vector.deinterleave2(<16 x i16> %vec)
+ %result0 = extractvalue { <8 x i16>, <8 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i16> %result0)
+ %result1 = extractvalue { <8 x i16>, <8 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i16> %result1)
+ ret void
+}
+
+define void @deinterleave3_v8i16(<24 x i16> %vec) {
+; CHECK-LABEL: deinterleave3_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #52
+; CHECK-NEXT: vld1.16 {d20[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #68
+; CHECK-NEXT: vld1.16 {d21[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #4
+; CHECK-NEXT: vld1.16 {d19[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #20
+; CHECK-NEXT: vld1.16 {d16[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #36
+; CHECK-NEXT: vld1.16 {d17[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #56
+; CHECK-NEXT: vld1.16 {d20[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #72
+; CHECK-NEXT: vld1.16 {d21[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #8
+; CHECK-NEXT: vld1.16 {d19[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #24
+; CHECK-NEXT: vld1.16 {d16[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #40
+; CHECK-NEXT: vld1.16 {d17[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #60
+; CHECK-NEXT: vld1.16 {d20[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #76
+; CHECK-NEXT: vld1.16 {d21[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #12
+; CHECK-NEXT: vld1.16 {d19[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #28
+; CHECK-NEXT: vld1.16 {d16[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #44
+; CHECK-NEXT: vld1.16 {d17[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #64
+; CHECK-NEXT: vld1.16 {d20[3]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #80
+; CHECK-NEXT: vld1.16 {d21[3]}, [r12:16]
+; CHECK-NEXT: vmov.16 d18[0], r0
+; CHECK-NEXT: add r0, r11, #16
+; CHECK-NEXT: vld1.16 {d19[3]}, [r0:16]
+; CHECK-NEXT: add r0, r11, #32
+; CHECK-NEXT: vld1.16 {d16[3]}, [r0:16]
+; CHECK-NEXT: add r0, r11, #48
+; CHECK-NEXT: vld1.16 {d17[3]}, [r0:16]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vmov.16 d18[1], r1
+; CHECK-NEXT: add r1, r0, #32
+; CHECK-NEXT: vst1.64 {d20, d21}, [r1:128]
+; CHECK-NEXT: mov r1, r0
+; CHECK-NEXT: vmov.16 d18[2], r2
+; CHECK-NEXT: vmov.16 d18[3], r3
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r1]
+; CHECK-NEXT: vld3.16 {d16, d18, d20}, [r0:64]!
+; CHECK-NEXT: vld3.16 {d17, d19, d21}, [r0:64]
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q10 $q8_q9_q10_q11
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.vector.deinterleave3(<24 x i16> %vec)
+ %result0 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i16> %result0)
+ %result1 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i16> %result1)
+ %result2 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i16> %result2)
+ ret void
+}
+
+define void @deinterleave4_v8i16(<32 x i16> %vec) {
+; CHECK-LABEL: deinterleave4_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11, lr}
+; CHECK-NEXT: push {r11, lr}
+; CHECK-NEXT: add r12, sp, #40
+; CHECK-NEXT: vmov d21, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #24
+; CHECK-NEXT: add lr, sp, #8
+; CHECK-NEXT: vmov d20, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [lr]
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: vuzp.16 q10, q9
+; CHECK-NEXT: vuzp.16 q11, q8
+; CHECK-NEXT: vuzp.16 q10, q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: vuzp.16 q9, q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: pop {r11, pc}
+ %result = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.vector.deinterleave4(<32 x i16> %vec)
+ %result0 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i16> %result0)
+ %result1 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i16> %result1)
+ %result2 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i16> %result2)
+ %result3 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 3
+ call void (...) @llvm.fake.use(<8 x i16> %result3)
+ ret void
+}
+
+define void @deinterleave6_v8i16(<48 x i16> %vec) {
+; CHECK-LABEL: deinterleave6_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11, lr}
+; CHECK-NEXT: push {r11, lr}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #104
+; CHECK-NEXT: sub sp, sp, #104
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #152
+; CHECK-NEXT: vld1.16 {d26[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #168
+; CHECK-NEXT: vld1.16 {d27[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #88
+; CHECK-NEXT: vld1.16 {d22[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #104
+; CHECK-NEXT: vld1.16 {d23[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #120
+; CHECK-NEXT: vld1.16 {d24[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #136
+; CHECK-NEXT: vld1.16 {d25[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #156
+; CHECK-NEXT: vld1.16 {d26[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #172
+; CHECK-NEXT: vld1.16 {d27[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #92
+; CHECK-NEXT: vld1.16 {d22[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #108
+; CHECK-NEXT: vld1.16 {d23[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #124
+; CHECK-NEXT: vld1.16 {d24[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #140
+; CHECK-NEXT: vld1.16 {d25[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #56
+; CHECK-NEXT: vld1.16 {d16[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #72
+; CHECK-NEXT: vld1.16 {d17[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #160
+; CHECK-NEXT: vld1.16 {d26[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #176
+; CHECK-NEXT: vld1.16 {d27[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #96
+; CHECK-NEXT: vld1.16 {d22[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #112
+; CHECK-NEXT: vld1.16 {d23[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #128
+; CHECK-NEXT: vld1.16 {d24[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #144
+; CHECK-NEXT: vld1.16 {d25[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #8
+; CHECK-NEXT: vld1.16 {d21[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #24
+; CHECK-NEXT: vld1.16 {d18[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #40
+; CHECK-NEXT: vld1.16 {d19[0]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #60
+; CHECK-NEXT: vld1.16 {d16[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #76
+; CHECK-NEXT: vld1.16 {d17[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #164
+; CHECK-NEXT: vld1.16 {d26[3]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #180
+; CHECK-NEXT: vld1.16 {d27[3]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #100
+; CHECK-NEXT: vld1.16 {d22[3]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #116
+; CHECK-NEXT: vld1.16 {d23[3]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #132
+; CHECK-NEXT: vld1.16 {d24[3]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #148
+; CHECK-NEXT: vld1.16 {d25[3]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #12
+; CHECK-NEXT: vld1.16 {d21[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #28
+; CHECK-NEXT: vld1.16 {d18[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #44
+; CHECK-NEXT: vld1.16 {d19[1]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #64
+; CHECK-NEXT: vld1.16 {d16[2]}, [r12:16]
+; CHECK-NEXT: add r12, r11, #80
+; CHECK-NEXT: vld1.16 {d17[2]}, [r12:16]
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: add lr, r12, #32
+; CHECK-NEXT: vst1.64 {d26, d27}, [lr:128]
+; CHECK-NEXT: mov lr, r12
+; CHECK-NEXT: vst1.64 {d22, d23}, [lr:128]!
+; CHECK-NEXT: vst1.64 {d24, d25}, [lr]
+; CHECK-NEXT: add lr, r11, #16
+; CHECK-NEXT: vld1.16 {d21[2]}, [lr:16]
+; CHECK-NEXT: add lr, r11, #32
+; CHECK-NEXT: vld1.16 {d18[2]}, [lr:16]
+; CHECK-NEXT: add lr, r11, #48
+; CHECK-NEXT: vld1.16 {d19[2]}, [lr:16]
+; CHECK-NEXT: add lr, r11, #68
+; CHECK-NEXT: vld1.16 {d16[3]}, [lr:16]
+; CHECK-NEXT: add lr, r11, #84
+; CHECK-NEXT: vld1.16 {d17[3]}, [lr:16]
+; CHECK-NEXT: vmov.16 d20[0], r0
+; CHECK-NEXT: add r0, r11, #20
+; CHECK-NEXT: vld1.16 {d21[3]}, [r0:16]
+; CHECK-NEXT: add r0, r11, #36
+; CHECK-NEXT: vld1.16 {d18[3]}, [r0:16]
+; CHECK-NEXT: add r0, r11, #52
+; CHECK-NEXT: vld1.16 {d19[3]}, [r0:16]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vmov.16 d20[1], r1
+; CHECK-NEXT: add r1, r0, #32
+; CHECK-NEXT: vld3.16 {d22, d24, d26}, [r12:64]!
+; CHECK-NEXT: vmov.16 d20[2], r2
+; CHECK-NEXT: vld3.16 {d23, d25, d27}, [r12:64]
+; CHECK-NEXT: vorr q15, q12, q12
+; CHECK-NEXT: vmov.16 d20[3], r3
+; CHECK-NEXT: vst1.64 {d16, d17}, [r1:128]
+; CHECK-NEXT: mov r1, r0
+; CHECK-NEXT: vorr q8, q11, q11
+; CHECK-NEXT: vst1.64 {d20, d21}, [r1:128]!
+; CHECK-NEXT: vorr q11, q13, q13
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1]
+; CHECK-NEXT: vld3.16 {d0, d2, d4}, [r0:64]!
+; CHECK-NEXT: vld3.16 {d1, d3, d5}, [r0:64]
+; CHECK-NEXT: vorr q9, q0, q0
+; CHECK-NEXT: vorr q10, q1, q1
+; CHECK-NEXT: vorr q0, q2, q2
+; CHECK-NEXT: vuzp.16 q9, q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: vuzp.16 q10, q15
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: @ fake_use: $q15
+; CHECK-NEXT: vuzp.16 q0, q11
+; CHECK-NEXT: @ fake_use: $q0
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11, pc}
+ %result = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.vector.deinterleave6(<48 x i16> %vec)
+ %result0 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i16> %result0)
+ %result1 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i16> %result1)
+ %result2 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i16> %result2)
+ %result3 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 3
+ call void (...) @llvm.fake.use(<8 x i16> %result3)
+ %result4 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 4
+ call void (...) @llvm.fake.use(<8 x i16> %result4)
+ %result5 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 5
+ call void (...) @llvm.fake.use(<8 x i16> %result5)
+ ret void
+}
+
+define void @deinterleave8_v8i16(<64 x i16> %vec) {
+; CHECK-LABEL: deinterleave8_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #96
+; CHECK-NEXT: vmov d31, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #80
+; CHECK-NEXT: vmov d30, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #64
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vld1.64 {d24, d25}, [r12]
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vld1.64 {d26, d27}, [r12]
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: vld1.64 {d28, d29}, [r12]
+; CHECK-NEXT: vuzp.16 q9, q8
+; CHECK-NEXT: vuzp.16 q14, q10
+; CHECK-NEXT: vuzp.16 q15, q11
+; CHECK-NEXT: vuzp.16 q13, q12
+; CHECK-NEXT: vuzp.16 q14, q9
+; CHECK-NEXT: vuzp.16 q15, q13
+; CHECK-NEXT: vuzp.16 q10, q8
+; CHECK-NEXT: vuzp.16 q11, q12
+; CHECK-NEXT: vuzp.16 q15, q14
+; CHECK-NEXT: @ fake_use: $q15
+; CHECK-NEXT: @ fake_use: $q14
+; CHECK-NEXT: vuzp.16 q11, q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: vuzp.16 q13, q9
+; CHECK-NEXT: @ fake_use: $q13
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: vuzp.16 q12, q8
+; CHECK-NEXT: @ fake_use: $q12
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: bx lr
+ %result = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.vector.deinterleave8(<64 x i16> %vec)
+ %result0 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 0
+ call void (...) @llvm.fake.use(<8 x i16> %result0)
+ %result1 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 1
+ call void (...) @llvm.fake.use(<8 x i16> %result1)
+ %result2 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 2
+ call void (...) @llvm.fake.use(<8 x i16> %result2)
+ %result3 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 3
+ call void (...) @llvm.fake.use(<8 x i16> %result3)
+ %result4 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 4
+ call void (...) @llvm.fake.use(<8 x i16> %result4)
+ %result5 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 5
+ call void (...) @llvm.fake.use(<8 x i16> %result5)
+ %result6 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 6
+ call void (...) @llvm.fake.use(<8 x i16> %result6)
+ %result7 = extractvalue { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %result, 7
+ call void (...) @llvm.fake.use(<8 x i16> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v4i32(<8 x i32> %vec) {
+; CHECK-LABEL: deinterleave2_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d17, r2, r3
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vmov d16, r0, r1
+; CHECK-NEXT: vuzp.32 q8, q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i32>, <4 x i32> } @llvm.vector.deinterleave2(<8 x i32> %vec)
+ %result0 = extractvalue { <4 x i32>, <4 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i32> %result0)
+ %result1 = extractvalue { <4 x i32>, <4 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i32> %result1)
+ ret void
+}
+
+define void @deinterleave3_v4i32(<12 x i32> %vec) {
+; CHECK-LABEL: deinterleave3_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #20
+; CHECK-NEXT: vmov.32 d21[0], r2
+; CHECK-NEXT: add r2, r11, #32
+; CHECK-NEXT: vld1.32 {d16[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #28
+; CHECK-NEXT: vld1.32 {d17[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #4
+; CHECK-NEXT: vld1.32 {d18[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #12
+; CHECK-NEXT: vld1.32 {d19[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #24
+; CHECK-NEXT: vld1.32 {d16[1]}, [r12:32]
+; CHECK-NEXT: vld1.32 {d17[1]}, [r2:32]
+; CHECK-NEXT: vmov.32 d20[0], r0
+; CHECK-NEXT: add r0, r11, #8
+; CHECK-NEXT: vld1.32 {d18[1]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #16
+; CHECK-NEXT: vld1.32 {d19[1]}, [r0:32]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vmov.32 d20[1], r1
+; CHECK-NEXT: add r1, r0, #32
+; CHECK-NEXT: vmov.32 d21[1], r3
+; CHECK-NEXT: vst1.64 {d16, d17}, [r1:128]
+; CHECK-NEXT: mov r1, r0
+; CHECK-NEXT: vst1.64 {d20, d21}, [r1:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1]
+; CHECK-NEXT: vld3.32 {d16, d18, d20}, [r0:64]!
+; CHECK-NEXT: vld3.32 {d17, d19, d21}, [r0:64]
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q10 $q8_q9_q10_q11
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave3(<12 x i32> %vec)
+ %result0 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i32> %result0)
+ %result1 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i32> %result1)
+ %result2 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i32> %result2)
+ ret void
+}
+
+define void @deinterleave4_v4i32(<16 x i32> %vec) {
+; CHECK-LABEL: deinterleave4_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11, lr}
+; CHECK-NEXT: push {r11, lr}
+; CHECK-NEXT: add r12, sp, #40
+; CHECK-NEXT: vmov d21, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #24
+; CHECK-NEXT: add lr, sp, #8
+; CHECK-NEXT: vmov d20, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [lr]
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: vuzp.32 q10, q9
+; CHECK-NEXT: vuzp.32 q11, q8
+; CHECK-NEXT: vuzp.32 q10, q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: vuzp.32 q9, q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: pop {r11, pc}
+ %result = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave4(<16 x i32> %vec)
+ %result0 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i32> %result0)
+ %result1 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i32> %result1)
+ %result2 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i32> %result2)
+ %result3 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 3
+ call void (...) @llvm.fake.use(<4 x i32> %result3)
+ ret void
+}
+
+define void @deinterleave6_v4i32(<24 x i32> %vec) {
+; CHECK-LABEL: deinterleave6_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #108
+; CHECK-NEXT: sub sp, sp, #108
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #20
+; CHECK-NEXT: vmov.32 d21[0], r2
+; CHECK-NEXT: add r2, r11, #32
+; CHECK-NEXT: vld1.32 {d16[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #28
+; CHECK-NEXT: vld1.32 {d17[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #4
+; CHECK-NEXT: vld1.32 {d18[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #12
+; CHECK-NEXT: vld1.32 {d19[0]}, [r12:32]
+; CHECK-NEXT: add r12, r11, #24
+; CHECK-NEXT: vld1.32 {d16[1]}, [r12:32]
+; CHECK-NEXT: vld1.32 {d17[1]}, [r2:32]
+; CHECK-NEXT: vmov.32 d20[0], r0
+; CHECK-NEXT: add r0, r11, #8
+; CHECK-NEXT: vld1.32 {d18[1]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #16
+; CHECK-NEXT: vld1.32 {d19[1]}, [r0:32]
+; CHECK-NEXT: mov r0, sp
+; CHECK-NEXT: vmov.32 d20[1], r1
+; CHECK-NEXT: add r1, r0, #32
+; CHECK-NEXT: vmov.32 d21[1], r3
+; CHECK-NEXT: vst1.64 {d16, d17}, [r1:128]
+; CHECK-NEXT: mov r1, r0
+; CHECK-NEXT: vst1.64 {d20, d21}, [r1:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, r11, #68
+; CHECK-NEXT: vld1.32 {d24[0]}, [r1:32]
+; CHECK-NEXT: add r1, r11, #76
+; CHECK-NEXT: vld1.32 {d25[0]}, [r1:32]
+; CHECK-NEXT: add r1, r11, #36
+; CHECK-NEXT: vld1.32 {d26[0]}, [r1:32]
+; CHECK-NEXT: add r1, r11, #44
+; CHECK-NEXT: vld1.32 {d27[0]}, [r1:32]
+; CHECK-NEXT: add r1, r11, #52
+; CHECK-NEXT: vld1.32 {d28[0]}, [r1:32]
+; CHECK-NEXT: vld3.32 {d16, d18, d20}, [r0:64]!
+; CHECK-NEXT: vld3.32 {d17, d19, d21}, [r0:64]
+; CHECK-NEXT: add r0, r11, #60
+; CHECK-NEXT: vorr q0, q8, q8
+; CHECK-NEXT: vld1.32 {d29[0]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #72
+; CHECK-NEXT: vorr q3, q9, q9
+; CHECK-NEXT: vorr q8, q10, q10
+; CHECK-NEXT: vld1.32 {d24[1]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #80
+; CHECK-NEXT: vld1.32 {d25[1]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #40
+; CHECK-NEXT: vld1.32 {d26[1]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #48
+; CHECK-NEXT: vld1.32 {d27[1]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #56
+; CHECK-NEXT: vld1.32 {d28[1]}, [r0:32]
+; CHECK-NEXT: add r0, r11, #64
+; CHECK-NEXT: vld1.32 {d29[1]}, [r0:32]
+; CHECK-NEXT: add r0, sp, #48
+; CHECK-NEXT: add r1, r0, #32
+; CHECK-NEXT: vst1.64 {d24, d25}, [r1:128]
+; CHECK-NEXT: mov r1, r0
+; CHECK-NEXT: vst1.64 {d26, d27}, [r1:128]!
+; CHECK-NEXT: vst1.64 {d28, d29}, [r1]
+; CHECK-NEXT: vld3.32 {d24, d26, d28}, [r0:64]!
+; CHECK-NEXT: vld3.32 {d25, d27, d29}, [r0:64]
+; CHECK-NEXT: vorr q1, q12, q12
+; CHECK-NEXT: vorr q2, q13, q13
+; CHECK-NEXT: vorr q12, q14, q14
+; CHECK-NEXT: vuzp.32 q0, q1
+; CHECK-NEXT: @ fake_use: $q0
+; CHECK-NEXT: @ fake_use: $q1
+; CHECK-NEXT: vuzp.32 q3, q2
+; CHECK-NEXT: @ fake_use: $q3
+; CHECK-NEXT: @ fake_use: $q2
+; CHECK-NEXT: vuzp.32 q8, q12
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q12
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave6(<24 x i32> %vec)
+ %result0 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i32> %result0)
+ %result1 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i32> %result1)
+ %result2 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i32> %result2)
+ %result3 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 3
+ call void (...) @llvm.fake.use(<4 x i32> %result3)
+ %result4 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 4
+ call void (...) @llvm.fake.use(<4 x i32> %result4)
+ %result5 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 5
+ call void (...) @llvm.fake.use(<4 x i32> %result5)
+ ret void
+}
+
+define void @deinterleave8_v4i32(<32 x i32> %vec) {
+; CHECK-LABEL: deinterleave8_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #96
+; CHECK-NEXT: vmov d31, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #80
+; CHECK-NEXT: vmov d30, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #64
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vld1.64 {d24, d25}, [r12]
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vld1.64 {d26, d27}, [r12]
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: vld1.64 {d28, d29}, [r12]
+; CHECK-NEXT: vuzp.32 q9, q8
+; CHECK-NEXT: vuzp.32 q14, q10
+; CHECK-NEXT: vuzp.32 q15, q11
+; CHECK-NEXT: vuzp.32 q13, q12
+; CHECK-NEXT: vuzp.32 q14, q9
+; CHECK-NEXT: vuzp.32 q15, q13
+; CHECK-NEXT: vuzp.32 q10, q8
+; CHECK-NEXT: vuzp.32 q11, q12
+; CHECK-NEXT: vuzp.32 q15, q14
+; CHECK-NEXT: @ fake_use: $q15
+; CHECK-NEXT: @ fake_use: $q14
+; CHECK-NEXT: vuzp.32 q11, q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: vuzp.32 q13, q9
+; CHECK-NEXT: @ fake_use: $q13
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: vuzp.32 q12, q8
+; CHECK-NEXT: @ fake_use: $q12
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: bx lr
+ %result = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave8(<32 x i32> %vec)
+ %result0 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 0
+ call void (...) @llvm.fake.use(<4 x i32> %result0)
+ %result1 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 1
+ call void (...) @llvm.fake.use(<4 x i32> %result1)
+ %result2 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 2
+ call void (...) @llvm.fake.use(<4 x i32> %result2)
+ %result3 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 3
+ call void (...) @llvm.fake.use(<4 x i32> %result3)
+ %result4 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 4
+ call void (...) @llvm.fake.use(<4 x i32> %result4)
+ %result5 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 5
+ call void (...) @llvm.fake.use(<4 x i32> %result5)
+ %result6 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 6
+ call void (...) @llvm.fake.use(<4 x i32> %result6)
+ %result7 = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %result, 7
+ call void (...) @llvm.fake.use(<4 x i32> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v4f32(<8 x float> %vec) {
+; CHECK-LABEL: deinterleave2_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d17, r2, r3
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: vmov d16, r0, r1
+; CHECK-NEXT: vuzp.32 q8, q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: bx lr
+ %result = call { <4 x float>, <4 x float> } @llvm.vector.deinterleave2(<8 x float> %vec)
+ %result0 = extractvalue { <4 x float>, <4 x float> } %result, 0
+ call void (...) @llvm.fake.use(<4 x float> %result0)
+ %result1 = extractvalue { <4 x float>, <4 x float> } %result, 1
+ call void (...) @llvm.fake.use(<4 x float> %result1)
+ ret void
+}
+
+define void @deinterleave3_v4f32(<12 x float> %vec) {
+; CHECK-LABEL: deinterleave3_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #4
+; CHECK-NEXT: vmov s7, r3
+; CHECK-NEXT: vmov s6, r2
+; CHECK-NEXT: vldmia r12, {s0, s1, s2, s3}
+; CHECK-NEXT: add r12, r11, #20
+; CHECK-NEXT: vmov s5, r1
+; CHECK-NEXT: vldmia r12, {s8, s9, s10, s11}
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vmov s4, r0
+; CHECK-NEXT: add r0, r12, #32
+; CHECK-NEXT: vst1.64 {d4, d5}, [r0:128]
+; CHECK-NEXT: mov r0, r12
+; CHECK-NEXT: vst1.64 {d2, d3}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d0, d1}, [r0]
+; CHECK-NEXT: vld3.32 {d16, d18, d20}, [r12:64]!
+; CHECK-NEXT: vld3.32 {d17, d19, d21}, [r12:64]
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q10 $q8_q9_q10_q11
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call { <4 x float>, <4 x float>, <4 x float> } @llvm.vector.deinterleave3(<12 x float> %vec)
+ %result0 = extractvalue { <4 x float>, <4 x float>, <4 x float> } %result, 0
+ call void (...) @llvm.fake.use(<4 x float> %result0)
+ %result1 = extractvalue { <4 x float>, <4 x float>, <4 x float> } %result, 1
+ call void (...) @llvm.fake.use(<4 x float> %result1)
+ %result2 = extractvalue { <4 x float>, <4 x float>, <4 x float> } %result, 2
+ call void (...) @llvm.fake.use(<4 x float> %result2)
+ ret void
+}
+
+define void @deinterleave4_v4f32(<16 x float> %vec) {
+; CHECK-LABEL: deinterleave4_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11, lr}
+; CHECK-NEXT: push {r11, lr}
+; CHECK-NEXT: add r12, sp, #40
+; CHECK-NEXT: vmov d21, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #24
+; CHECK-NEXT: add lr, sp, #8
+; CHECK-NEXT: vmov d20, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [lr]
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: vuzp.32 q10, q9
+; CHECK-NEXT: vuzp.32 q11, q8
+; CHECK-NEXT: vuzp.32 q10, q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: vuzp.32 q9, q8
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: pop {r11, pc}
+ %result = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.vector.deinterleave4(<16 x float> %vec)
+ %result0 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 0
+ call void (...) @llvm.fake.use(<4 x float> %result0)
+ %result1 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 1
+ call void (...) @llvm.fake.use(<4 x float> %result1)
+ %result2 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 2
+ call void (...) @llvm.fake.use(<4 x float> %result2)
+ %result3 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 3
+ call void (...) @llvm.fake.use(<4 x float> %result3)
+ ret void
+}
+
+define void @deinterleave6_v4f32(<24 x float> %vec) {
+; CHECK-LABEL: deinterleave6_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11, lr}
+; CHECK-NEXT: push {r11, lr}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #104
+; CHECK-NEXT: sub sp, sp, #104
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r12, r11, #40
+; CHECK-NEXT: vldmia r12, {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11}
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: add lr, r12, #32
+; CHECK-NEXT: vst1.64 {d4, d5}, [lr:128]
+; CHECK-NEXT: mov lr, r12
+; CHECK-NEXT: vmov s11, r3
+; CHECK-NEXT: vst1.64 {d0, d1}, [lr:128]!
+; CHECK-NEXT: vmov s10, r2
+; CHECK-NEXT: vmov s9, r1
+; CHECK-NEXT: vst1.64 {d2, d3}, [lr]
+; CHECK-NEXT: add lr, r11, #8
+; CHECK-NEXT: vmov s8, r0
+; CHECK-NEXT: vld3.32 {d16, d18, d20}, [r12:64]!
+; CHECK-NEXT: vld3.32 {d17, d19, d21}, [r12:64]
+; CHECK-NEXT: add r12, r11, #24
+; CHECK-NEXT: vorr q3, q9, q9
+; CHECK-NEXT: vldr s7, [r11, #36]
+; CHECK-NEXT: vldmia r12, {s4, s5, s6}
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: add r0, r12, #32
+; CHECK-NEXT: vldmia lr, {s0, s1, s2, s3}
+; CHECK-NEXT: vst1.64 {d2, d3}, [r0:128]
+; CHECK-NEXT: mov r0, r12
+; CHECK-NEXT: vst1.64 {d4, d5}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d0, d1}, [r0]
+; CHECK-NEXT: vorr q0, q8, q8
+; CHECK-NEXT: vorr q8, q10, q10
+; CHECK-NEXT: vld3.32 {d24, d26, d28}, [r12:64]!
+; CHECK-NEXT: vld3.32 {d25, d27, d29}, [r12:64]
+; CHECK-NEXT: vorr q1, q12, q12
+; CHECK-NEXT: vorr q2, q13, q13
+; CHECK-NEXT: vorr q12, q14, q14
+; CHECK-NEXT: vuzp.32 q1, q0
+; CHECK-NEXT: @ fake_use: $q1
+; CHECK-NEXT: @ fake_use: $q0
+; CHECK-NEXT: vuzp.32 q2, q3
+; CHECK-NEXT: @ fake_use: $q2
+; CHECK-NEXT: @ fake_use: $q3
+; CHECK-NEXT: vuzp.32 q12, q8
+; CHECK-NEXT: @ fake_use: $q12
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11, pc}
+ %result = call { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.vector.deinterleave6(<24 x float> %vec)
+ %result0 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 0
+ call void (...) @llvm.fake.use(<4 x float> %result0)
+ %result1 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 1
+ call void (...) @llvm.fake.use(<4 x float> %result1)
+ %result2 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 2
+ call void (...) @llvm.fake.use(<4 x float> %result2)
+ %result3 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 3
+ call void (...) @llvm.fake.use(<4 x float> %result3)
+ %result4 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 4
+ call void (...) @llvm.fake.use(<4 x float> %result4)
+ %result5 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 5
+ call void (...) @llvm.fake.use(<4 x float> %result5)
+ ret void
+}
+
+define void @deinterleave8_v4f32(<32 x float> %vec) {
+; CHECK-LABEL: deinterleave8_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r12, sp, #96
+; CHECK-NEXT: vmov d31, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
+; CHECK-NEXT: add r12, sp, #80
+; CHECK-NEXT: vmov d30, r0, r1
+; CHECK-NEXT: vld1.64 {d18, d19}, [r12]
+; CHECK-NEXT: add r12, sp, #64
+; CHECK-NEXT: vld1.64 {d20, d21}, [r12]
+; CHECK-NEXT: mov r12, sp
+; CHECK-NEXT: vld1.64 {d22, d23}, [r12]
+; CHECK-NEXT: add r12, sp, #32
+; CHECK-NEXT: vld1.64 {d24, d25}, [r12]
+; CHECK-NEXT: add r12, sp, #16
+; CHECK-NEXT: vld1.64 {d26, d27}, [r12]
+; CHECK-NEXT: add r12, sp, #48
+; CHECK-NEXT: vld1.64 {d28, d29}, [r12]
+; CHECK-NEXT: vuzp.32 q9, q8
+; CHECK-NEXT: vuzp.32 q14, q10
+; CHECK-NEXT: vuzp.32 q15, q11
+; CHECK-NEXT: vuzp.32 q13, q12
+; CHECK-NEXT: vuzp.32 q14, q9
+; CHECK-NEXT: vuzp.32 q15, q13
+; CHECK-NEXT: vuzp.32 q10, q8
+; CHECK-NEXT: vuzp.32 q11, q12
+; CHECK-NEXT: vuzp.32 q15, q14
+; CHECK-NEXT: @ fake_use: $q15
+; CHECK-NEXT: @ fake_use: $q14
+; CHECK-NEXT: vuzp.32 q11, q10
+; CHECK-NEXT: @ fake_use: $q11
+; CHECK-NEXT: @ fake_use: $q10
+; CHECK-NEXT: vuzp.32 q13, q9
+; CHECK-NEXT: @ fake_use: $q13
+; CHECK-NEXT: @ fake_use: $q9
+; CHECK-NEXT: vuzp.32 q12, q8
+; CHECK-NEXT: @ fake_use: $q12
+; CHECK-NEXT: @ fake_use: $q8
+; CHECK-NEXT: bx lr
+ %result = call { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.vector.deinterleave8(<32 x float> %vec)
+ %result0 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 0
+ call void (...) @llvm.fake.use(<4 x float> %result0)
+ %result1 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 1
+ call void (...) @llvm.fake.use(<4 x float> %result1)
+ %result2 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 2
+ call void (...) @llvm.fake.use(<4 x float> %result2)
+ %result3 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 3
+ call void (...) @llvm.fake.use(<4 x float> %result3)
+ %result4 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 4
+ call void (...) @llvm.fake.use(<4 x float> %result4)
+ %result5 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 5
+ call void (...) @llvm.fake.use(<4 x float> %result5)
+ %result6 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 6
+ call void (...) @llvm.fake.use(<4 x float> %result6)
+ %result7 = extractvalue { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> } %result, 7
+ call void (...) @llvm.fake.use(<4 x float> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v4f16(<8 x half> %vec) {
+; CHECK-LABEL: deinterleave2_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r11, lr}
+; CHECK-NEXT: push {r4, r5, r11, lr}
+; CHECK-NEXT: ldrh r12, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh lr, [sp, #20]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r5, [sp, #16]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: pop {r4, r5, r11, pc}
+ %result = call { <4 x half>, <4 x half> } @llvm.vector.deinterleave2(<8 x half> %vec)
+ %result0 = extractvalue { <4 x half>, <4 x half> } %result, 0
+ call void (...) @llvm.fake.use(<4 x half> %result0)
+ %result1 = extractvalue { <4 x half>, <4 x half> } %result, 1
+ call void (...) @llvm.fake.use(<4 x half> %result1)
+ ret void
+}
+
+define void @deinterleave3_v4f16(<12 x half> %vec) {
+; CHECK-LABEL: deinterleave3_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r12, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh lr, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r8, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r7, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r5, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r0, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <4 x half>, <4 x half>, <4 x half> } @llvm.vector.deinterleave3(<12 x half> %vec)
+ %result0 = extractvalue { <4 x half>, <4 x half>, <4 x half> } %result, 0
+ call void (...) @llvm.fake.use(<4 x half> %result0)
+ %result1 = extractvalue { <4 x half>, <4 x half>, <4 x half> } %result, 1
+ call void (...) @llvm.fake.use(<4 x half> %result1)
+ %result2 = extractvalue { <4 x half>, <4 x half>, <4 x half> } %result, 2
+ call void (...) @llvm.fake.use(<4 x half> %result2)
+ ret void
+}
+
+define void @deinterleave4_v4f16(<16 x half> %vec) {
+; CHECK-LABEL: deinterleave4_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r5, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r12, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh lr, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r8, [sp, #44]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r9, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r7, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r5, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r1, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r9
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call { <4 x half>, <4 x half>, <4 x half>, <4 x half> } @llvm.vector.deinterleave4(<16 x half> %vec)
+ %result0 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 0
+ call void (...) @llvm.fake.use(<4 x half> %result0)
+ %result1 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 1
+ call void (...) @llvm.fake.use(<4 x half> %result1)
+ %result2 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 2
+ call void (...) @llvm.fake.use(<4 x half> %result2)
+ %result3 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 3
+ call void (...) @llvm.fake.use(<4 x half> %result3)
+ ret void
+}
+
+define void @deinterleave6_v4f16(<24 x half> %vec) {
+; CHECK-LABEL: deinterleave6_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r4, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r2, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh lr, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } @llvm.vector.deinterleave6(<24 x half> %vec)
+ %result0 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 0
+ call void (...) @llvm.fake.use(<4 x half> %result0)
+ %result1 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 1
+ call void (...) @llvm.fake.use(<4 x half> %result1)
+ %result2 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 2
+ call void (...) @llvm.fake.use(<4 x half> %result2)
+ %result3 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 3
+ call void (...) @llvm.fake.use(<4 x half> %result3)
+ %result4 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 4
+ call void (...) @llvm.fake.use(<4 x half> %result4)
+ %result5 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 5
+ call void (...) @llvm.fake.use(<4 x half> %result5)
+ ret void
+}
+
+define void @deinterleave8_v4f16(<32 x half> %vec) {
+; CHECK-LABEL: deinterleave8_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #108]
+; CHECK-NEXT: ldrh r4, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #112]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #116]
+; CHECK-NEXT: ldrh r2, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh lr, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r8, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r5, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } @llvm.vector.deinterleave8(<32 x half> %vec)
+ %result0 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 0
+ call void (...) @llvm.fake.use(<4 x half> %result0)
+ %result1 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 1
+ call void (...) @llvm.fake.use(<4 x half> %result1)
+ %result2 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 2
+ call void (...) @llvm.fake.use(<4 x half> %result2)
+ %result3 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 3
+ call void (...) @llvm.fake.use(<4 x half> %result3)
+ %result4 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 4
+ call void (...) @llvm.fake.use(<4 x half> %result4)
+ %result5 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 5
+ call void (...) @llvm.fake.use(<4 x half> %result5)
+ %result6 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 6
+ call void (...) @llvm.fake.use(<4 x half> %result6)
+ %result7 = extractvalue { <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half>, <4 x half> } %result, 7
+ call void (...) @llvm.fake.use(<4 x half> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v8f16(<16 x half> %vec) {
+; CHECK-LABEL: deinterleave2_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r4, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r12, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh lr, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r8, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r9, [sp, #60]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r6, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r7, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r5, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r0, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r9
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call { <8 x half>, <8 x half> } @llvm.vector.deinterleave2(<16 x half> %vec)
+ %result0 = extractvalue { <8 x half>, <8 x half> } %result, 0
+ call void (...) @llvm.fake.use(<8 x half> %result0)
+ %result1 = extractvalue { <8 x half>, <8 x half> } %result, 1
+ call void (...) @llvm.fake.use(<8 x half> %result1)
+ ret void
+}
+
+define void @deinterleave3_v8f16(<24 x half> %vec) {
+; CHECK-LABEL: deinterleave3_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r3, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r3, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r7, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r12, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh lr, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <8 x half>, <8 x half>, <8 x half> } @llvm.vector.deinterleave3(<24 x half> %vec)
+ %result0 = extractvalue { <8 x half>, <8 x half>, <8 x half> } %result, 0
+ call void (...) @llvm.fake.use(<8 x half> %result0)
+ %result1 = extractvalue { <8 x half>, <8 x half>, <8 x half> } %result, 1
+ call void (...) @llvm.fake.use(<8 x half> %result1)
+ %result2 = extractvalue { <8 x half>, <8 x half>, <8 x half> } %result, 2
+ call void (...) @llvm.fake.use(<8 x half> %result2)
+ ret void
+}
+
+define void @deinterleave4_v8f16(<32 x half> %vec) {
+; CHECK-LABEL: deinterleave4_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r4, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r4, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #108]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r1, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r7, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r2, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #112]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh lr, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #116]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r5, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r7, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r1, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r2, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <8 x half>, <8 x half>, <8 x half>, <8 x half> } @llvm.vector.deinterleave4(<32 x half> %vec)
+ %result0 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 0
+ call void (...) @llvm.fake.use(<8 x half> %result0)
+ %result1 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 1
+ call void (...) @llvm.fake.use(<8 x half> %result1)
+ %result2 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 2
+ call void (...) @llvm.fake.use(<8 x half> %result2)
+ %result3 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 3
+ call void (...) @llvm.fake.use(<8 x half> %result3)
+ ret void
+}
+
+define void @deinterleave6_v8f16(<48 x half> %vec) {
+; CHECK-LABEL: deinterleave6_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #84]
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #108]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #180]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r4, [sp, #152]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #112]
+; CHECK-NEXT: ldrh r2, [sp, #136]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r1, [sp, #184]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r2, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #156]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #116]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #140]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #164]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #188]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #160]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r2, [sp, #144]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r3, [sp, #168]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #192]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r12, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh lr, [sp, #148]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #172]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r5, [sp, #196]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r7, [sp, #176]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } @llvm.vector.deinterleave6(<48 x half> %vec)
+ %result0 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 0
+ call void (...) @llvm.fake.use(<8 x half> %result0)
+ %result1 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 1
+ call void (...) @llvm.fake.use(<8 x half> %result1)
+ %result2 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 2
+ call void (...) @llvm.fake.use(<8 x half> %result2)
+ %result3 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 3
+ call void (...) @llvm.fake.use(<8 x half> %result3)
+ %result4 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 4
+ call void (...) @llvm.fake.use(<8 x half> %result4)
+ %result5 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 5
+ call void (...) @llvm.fake.use(<8 x half> %result5)
+ ret void
+}
+
+define void @deinterleave8_v8f16(<64 x half> %vec) {
+; CHECK-LABEL: deinterleave8_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #144]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #116]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #244]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #152]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #252]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: add r0, sp, #256
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #148]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #184]
+; CHECK-NEXT: ldrh r0, [r0]
+; CHECK-NEXT: add r4, sp, #256
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #248]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #156]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #188]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: add r0, sp, #256
+; CHECK-NEXT: ldrh r3, [sp, #220]
+; CHECK-NEXT: ldrh r5, [r4, #12]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r3, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #208]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #160]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #192]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r3, [sp, #224]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [r0, #4]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r1, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r2, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r3, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [sp, #136]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r6, [sp, #176]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #212]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: add r0, sp, #256
+; CHECK-NEXT: ldrh r1, [sp, #164]
+; CHECK-NEXT: ldrh r2, [sp, #196]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r3, [sp, #228]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r3, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #112]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #180]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #216]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #168]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r2, [sp, #200]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r3, [sp, #232]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [r0, #8]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #172]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh lr, [sp, #204]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r8, [sp, #236]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r7, [sp, #240]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #108]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #140]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, pc}
+ %result = call { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } @llvm.vector.deinterleave8(<64 x half> %vec)
+ %result0 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 0
+ call void (...) @llvm.fake.use(<8 x half> %result0)
+ %result1 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 1
+ call void (...) @llvm.fake.use(<8 x half> %result1)
+ %result2 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 2
+ call void (...) @llvm.fake.use(<8 x half> %result2)
+ %result3 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 3
+ call void (...) @llvm.fake.use(<8 x half> %result3)
+ %result4 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 4
+ call void (...) @llvm.fake.use(<8 x half> %result4)
+ %result5 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 5
+ call void (...) @llvm.fake.use(<8 x half> %result5)
+ %result6 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 6
+ call void (...) @llvm.fake.use(<8 x half> %result6)
+ %result7 = extractvalue { <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half>, <8 x half> } %result, 7
+ call void (...) @llvm.fake.use(<8 x half> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v4bf16(<8 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave2_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r11, lr}
+; CHECK-NEXT: push {r4, r5, r11, lr}
+; CHECK-NEXT: ldrh r12, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh lr, [sp, #20]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r5, [sp, #16]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: pop {r4, r5, r11, pc}
+ %result = call { <4 x bfloat>, <4 x bfloat> } @llvm.vector.deinterleave2(<8 x bfloat> %vec)
+ %result0 = extractvalue { <4 x bfloat>, <4 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<4 x bfloat> %result0)
+ %result1 = extractvalue { <4 x bfloat>, <4 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<4 x bfloat> %result1)
+ ret void
+}
+
+define void @deinterleave3_v4bf16(<12 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave3_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r12, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh lr, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r8, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r7, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r5, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r0, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } @llvm.vector.deinterleave3(<12 x bfloat> %vec)
+ %result0 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<4 x bfloat> %result0)
+ %result1 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<4 x bfloat> %result1)
+ %result2 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<4 x bfloat> %result2)
+ ret void
+}
+
+define void @deinterleave4_v4bf16(<16 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave4_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r5, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r12, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh lr, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r8, [sp, #44]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r9, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r7, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r5, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r1, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r9
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } @llvm.vector.deinterleave4(<16 x bfloat> %vec)
+ %result0 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<4 x bfloat> %result0)
+ %result1 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<4 x bfloat> %result1)
+ %result2 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<4 x bfloat> %result2)
+ %result3 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 3
+ call void (...) @llvm.fake.use(<4 x bfloat> %result3)
+ ret void
+}
+
+define void @deinterleave6_v4bf16(<24 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave6_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r4, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r2, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh lr, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } @llvm.vector.deinterleave6(<24 x bfloat> %vec)
+ %result0 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<4 x bfloat> %result0)
+ %result1 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<4 x bfloat> %result1)
+ %result2 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<4 x bfloat> %result2)
+ %result3 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 3
+ call void (...) @llvm.fake.use(<4 x bfloat> %result3)
+ %result4 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 4
+ call void (...) @llvm.fake.use(<4 x bfloat> %result4)
+ %result5 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 5
+ call void (...) @llvm.fake.use(<4 x bfloat> %result5)
+ ret void
+}
+
+define void @deinterleave8_v4bf16(<32 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave8_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #108]
+; CHECK-NEXT: ldrh r4, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #112]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #116]
+; CHECK-NEXT: ldrh r2, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh lr, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r8, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r5, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } @llvm.vector.deinterleave8(<32 x bfloat> %vec)
+ %result0 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<4 x bfloat> %result0)
+ %result1 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<4 x bfloat> %result1)
+ %result2 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<4 x bfloat> %result2)
+ %result3 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 3
+ call void (...) @llvm.fake.use(<4 x bfloat> %result3)
+ %result4 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 4
+ call void (...) @llvm.fake.use(<4 x bfloat> %result4)
+ %result5 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 5
+ call void (...) @llvm.fake.use(<4 x bfloat> %result5)
+ %result6 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 6
+ call void (...) @llvm.fake.use(<4 x bfloat> %result6)
+ %result7 = extractvalue { <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat>, <4 x bfloat> } %result, 7
+ call void (...) @llvm.fake.use(<4 x bfloat> %result7)
+ ret void
+}
+
+
+define void @deinterleave2_v8bf16(<16 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave2_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r4, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r12, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh lr, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r8, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r9, [sp, #60]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r6, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r7, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r5, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: ldrh r0, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r9
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call { <8 x bfloat>, <8 x bfloat> } @llvm.vector.deinterleave2(<16 x bfloat> %vec)
+ %result0 = extractvalue { <8 x bfloat>, <8 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<8 x bfloat> %result0)
+ %result1 = extractvalue { <8 x bfloat>, <8 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<8 x bfloat> %result1)
+ ret void
+}
+
+define void @deinterleave3_v8bf16(<24 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave3_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r3, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r3, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r7, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r12, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh lr, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } @llvm.vector.deinterleave3(<24 x bfloat> %vec)
+ %result0 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<8 x bfloat> %result0)
+ %result1 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<8 x bfloat> %result1)
+ %result2 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<8 x bfloat> %result2)
+ ret void
+}
+
+define void @deinterleave4_v8bf16(<32 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave4_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r4, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r4, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #108]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r1, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r7, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r6, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r2, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #112]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh lr, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #116]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r5, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r7, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r1, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r2, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } @llvm.vector.deinterleave4(<32 x bfloat> %vec)
+ %result0 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<8 x bfloat> %result0)
+ %result1 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<8 x bfloat> %result1)
+ %result2 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<8 x bfloat> %result2)
+ %result3 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 3
+ call void (...) @llvm.fake.use(<8 x bfloat> %result3)
+ ret void
+}
+
+define void @deinterleave6_v8bf16(<48 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave6_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #84]
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #108]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #180]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r4, [sp, #152]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #112]
+; CHECK-NEXT: ldrh r2, [sp, #136]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r1, [sp, #184]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r0, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r2, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #156]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #116]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #140]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #164]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #188]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r3, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #160]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r2, [sp, #144]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r3, [sp, #168]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r0, [sp, #192]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r12, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh lr, [sp, #148]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r8, [sp, #172]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r5, [sp, #196]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r7, [sp, #176]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #28]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } @llvm.vector.deinterleave6(<48 x bfloat> %vec)
+ %result0 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<8 x bfloat> %result0)
+ %result1 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<8 x bfloat> %result1)
+ %result2 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<8 x bfloat> %result2)
+ %result3 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 3
+ call void (...) @llvm.fake.use(<8 x bfloat> %result3)
+ %result4 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 4
+ call void (...) @llvm.fake.use(<8 x bfloat> %result4)
+ %result5 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 5
+ call void (...) @llvm.fake.use(<8 x bfloat> %result5)
+ ret void
+}
+
+define void @deinterleave8_v8bf16(<64 x bfloat> %vec) {
+; CHECK-LABEL: deinterleave8_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #144]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #116]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #244]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #152]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #124]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #252]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #128]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: add r0, sp, #256
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #148]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #120]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #184]
+; CHECK-NEXT: ldrh r0, [r0]
+; CHECK-NEXT: add r4, sp, #256
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r1, [sp, #248]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #60]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r0, [sp, #132]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #156]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r2, [sp, #188]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: add r0, sp, #256
+; CHECK-NEXT: ldrh r3, [sp, #220]
+; CHECK-NEXT: ldrh r5, [r4, #12]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #80]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #64]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r3, [sp, #96]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #208]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #160]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #192]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r3, [sp, #224]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [r0, #4]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r1, [sp, #36]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r2, [sp, #68]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r3, [sp, #100]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r0, [sp, #136]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r6, [sp, #176]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r4, [sp, #212]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: add r0, sp, #256
+; CHECK-NEXT: ldrh r1, [sp, #164]
+; CHECK-NEXT: ldrh r2, [sp, #196]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r3, [sp, #228]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r6, [sp, #52]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r4, [sp, #88]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r1, [sp, #40]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r2, [sp, #72]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r3, [sp, #104]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r7, [sp, #112]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r6, [sp, #180]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r4, [sp, #216]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r1, [sp, #168]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r2, [sp, #200]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r3, [sp, #232]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r0, [r0, #8]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r12, [sp, #172]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh lr, [sp, #204]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r8, [sp, #236]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: ldrh r7, [sp, #240]
+; CHECK-NEXT: @ fake_use: $r7
+; CHECK-NEXT: ldrh r6, [sp, #56]
+; CHECK-NEXT: @ fake_use: $r6
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: @ fake_use: $r4
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: @ fake_use: $r1
+; CHECK-NEXT: ldrh r2, [sp, #76]
+; CHECK-NEXT: @ fake_use: $r2
+; CHECK-NEXT: ldrh r3, [sp, #108]
+; CHECK-NEXT: @ fake_use: $r3
+; CHECK-NEXT: ldrh r0, [sp, #140]
+; CHECK-NEXT: @ fake_use: $r0
+; CHECK-NEXT: @ fake_use: $r12
+; CHECK-NEXT: @ fake_use: $lr
+; CHECK-NEXT: @ fake_use: $r8
+; CHECK-NEXT: @ fake_use: $r5
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, pc}
+ %result = call { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } @llvm.vector.deinterleave8(<64 x bfloat> %vec)
+ %result0 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 0
+ call void (...) @llvm.fake.use(<8 x bfloat> %result0)
+ %result1 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 1
+ call void (...) @llvm.fake.use(<8 x bfloat> %result1)
+ %result2 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 2
+ call void (...) @llvm.fake.use(<8 x bfloat> %result2)
+ %result3 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 3
+ call void (...) @llvm.fake.use(<8 x bfloat> %result3)
+ %result4 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 4
+ call void (...) @llvm.fake.use(<8 x bfloat> %result4)
+ %result5 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 5
+ call void (...) @llvm.fake.use(<8 x bfloat> %result5)
+ %result6 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 6
+ call void (...) @llvm.fake.use(<8 x bfloat> %result6)
+ %result7 = extractvalue { <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat>, <8 x bfloat> } %result, 7
+ call void (...) @llvm.fake.use(<8 x bfloat> %result7)
+ ret void
+}
+
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK-IADISABLED: {{.*}}
+; CHECK-IAENABLED: {{.*}}
diff --git a/llvm/test/CodeGen/ARM/fixed-vector-interleave.ll b/llvm/test/CodeGen/ARM/fixed-vector-interleave.ll
new file mode 100644
index 0000000000000..67138f8a21607
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/fixed-vector-interleave.ll
@@ -0,0 +1,2444 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=armv8-none-none-eabi -mattr=+neon %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-IAENABLED
+; RUN: llc -mtriple=armv8-none-none-eabi -mattr=+neon -lower-interleaved-accesses=false %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-IADISABLED
+
+define <16 x i8> @interleave2_v8i8(<8 x i8> %vec0, <8 x i8> %vec1) {
+; CHECK-LABEL: interleave2_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vzip.8 d17, d16
+; CHECK-NEXT: vmov r0, r1, d17
+; CHECK-NEXT: vmov r2, r3, d16
+; CHECK-NEXT: bx lr
+ %result = call <16 x i8> @llvm.vector.interleave2(<8 x i8> %vec0, <8 x i8> %vec1)
+ ret <16 x i8> %result
+}
+
+define <24 x i8> @interleave3_v8i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2) {
+; CHECK-LABEL: interleave3_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: vldr d18, [sp, #32]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vst3.8 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d16, [sp]
+; CHECK-NEXT: vldr d17, [r1]
+; CHECK-NEXT: vldr d18, [sp, #16]
+; CHECK-NEXT: vst1.8 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vstr d18, [r0]
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call <24 x i8> @llvm.vector.interleave3(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2)
+ ret <24 x i8> %result
+}
+
+define <32 x i8> @interleave4_v8i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, <8 x i8> %vec3) {
+; CHECK-LABEL: interleave4_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp, #16]
+; CHECK-NEXT: vldr d19, [sp]
+; CHECK-NEXT: vldr d16, [sp, #8]
+; CHECK-NEXT: vmov d18, r2, r3
+; CHECK-NEXT: vzip.8 d19, d17
+; CHECK-NEXT: vzip.8 d18, d16
+; CHECK-NEXT: vzip.8 d18, d19
+; CHECK-NEXT: vzip.8 d16, d17
+; CHECK-NEXT: vst1.8 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <32 x i8> @llvm.vector.interleave4(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, <8 x i8> %vec3)
+ ret <32 x i8> %result
+}
+
+define <48 x i8> @interleave6_v8i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, <8 x i8> %vec3, <8 x i8> %vec4, <8 x i8> %vec5) {
+; CHECK-LABEL: interleave6_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: vldr d22, [sp, #56]
+; CHECK-NEXT: add r1, sp, #64
+; CHECK-NEXT: vldr d21, [sp, #48]
+; CHECK-NEXT: vmov d20, r2, r3
+; CHECK-NEXT: vldmia r1, {d16, d17, d18}
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vzip.8 d22, d18
+; CHECK-NEXT: mov r3, sp
+; CHECK-NEXT: vzip.8 d21, d17
+; CHECK-NEXT: vzip.8 d20, d16
+; CHECK-NEXT: vst3.8 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vldr d19, [sp, #40]
+; CHECK-NEXT: vst3.8 {d20, d21, d22}, [r3:64], r2
+; CHECK-NEXT: vldr d20, [sp]
+; CHECK-NEXT: vldr d21, [r3]
+; CHECK-NEXT: vldr d16, [sp, #16]
+; CHECK-NEXT: vldr d18, [r1]
+; CHECK-NEXT: vst1.8 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call <48 x i8> @llvm.vector.interleave6(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, <8 x i8> %vec3, <8 x i8> %vec4, <8 x i8> %vec5)
+ ret <48 x i8> %result
+}
+
+define <64 x i8> @interleave8_v8i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, <8 x i8> %vec3, <8 x i8> %vec4, <8 x i8> %vec5, <8 x i8> %vec6, <8 x i8> %vec7) {
+; CHECK-LABEL: interleave8_v8i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vldr d17, [sp, #48]
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vldr d16, [sp, #40]
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vldmia r1, {d18, d19, d20, d21}
+; CHECK-NEXT: vzip.8 d19, d17
+; CHECK-NEXT: vzip.8 d23, d21
+; CHECK-NEXT: vzip.8 d18, d16
+; CHECK-NEXT: vzip.8 d22, d20
+; CHECK-NEXT: vzip.8 d23, d19
+; CHECK-NEXT: vzip.8 d22, d18
+; CHECK-NEXT: vzip.8 d21, d17
+; CHECK-NEXT: vzip.8 d20, d16
+; CHECK-NEXT: vzip.8 d22, d23
+; CHECK-NEXT: vzip.8 d18, d19
+; CHECK-NEXT: vst1.8 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vzip.8 d20, d21
+; CHECK-NEXT: vst1.8 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vzip.8 d16, d17
+; CHECK-NEXT: vst1.8 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <64 x i8> @llvm.vector.interleave8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, <8 x i8> %vec3, <8 x i8> %vec4, <8 x i8> %vec5, <8 x i8> %vec6, <8 x i8> %vec7)
+ ret <64 x i8> %result
+}
+
+
+define <8 x i16> @interleave2_v4i16(<4 x i16> %vec0, <4 x i16> %vec1) {
+; CHECK-LABEL: interleave2_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vzip.16 d17, d16
+; CHECK-NEXT: vmov r0, r1, d17
+; CHECK-NEXT: vmov r2, r3, d16
+; CHECK-NEXT: bx lr
+ %result = call <8 x i16> @llvm.vector.interleave2(<4 x i16> %vec0, <4 x i16> %vec1)
+ ret <8 x i16> %result
+}
+
+define <12 x i16> @interleave3_v4i16(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2) {
+; CHECK-LABEL: interleave3_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: vldr d18, [sp, #32]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vst3.16 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d16, [sp]
+; CHECK-NEXT: vldr d17, [r1]
+; CHECK-NEXT: vldr d18, [sp, #16]
+; CHECK-NEXT: vst1.16 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vstr d18, [r0]
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call <12 x i16> @llvm.vector.interleave3(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2)
+ ret <12 x i16> %result
+}
+
+define <16 x i16> @interleave4_v4i16(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2, <4 x i16> %vec3) {
+; CHECK-LABEL: interleave4_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp, #16]
+; CHECK-NEXT: vldr d19, [sp]
+; CHECK-NEXT: vldr d16, [sp, #8]
+; CHECK-NEXT: vmov d18, r2, r3
+; CHECK-NEXT: vzip.16 d19, d17
+; CHECK-NEXT: vzip.16 d18, d16
+; CHECK-NEXT: vzip.16 d18, d19
+; CHECK-NEXT: vzip.16 d16, d17
+; CHECK-NEXT: vst1.16 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <16 x i16> @llvm.vector.interleave4(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2, <4 x i16> %vec3)
+ ret <16 x i16> %result
+}
+
+define <24 x i16> @interleave6_v4i16(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2, <4 x i16> %vec3, <4 x i16> %vec4, <4 x i16> %vec5) {
+; CHECK-LABEL: interleave6_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: vldr d22, [sp, #56]
+; CHECK-NEXT: add r1, sp, #64
+; CHECK-NEXT: vldr d21, [sp, #48]
+; CHECK-NEXT: vmov d20, r2, r3
+; CHECK-NEXT: vldmia r1, {d16, d17, d18}
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vzip.16 d22, d18
+; CHECK-NEXT: mov r3, sp
+; CHECK-NEXT: vzip.16 d21, d17
+; CHECK-NEXT: vzip.16 d20, d16
+; CHECK-NEXT: vst3.16 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vldr d19, [sp, #40]
+; CHECK-NEXT: vst3.16 {d20, d21, d22}, [r3:64], r2
+; CHECK-NEXT: vldr d20, [sp]
+; CHECK-NEXT: vldr d21, [r3]
+; CHECK-NEXT: vldr d16, [sp, #16]
+; CHECK-NEXT: vldr d18, [r1]
+; CHECK-NEXT: vst1.16 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call <24 x i16> @llvm.vector.interleave6(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2, <4 x i16> %vec3, <4 x i16> %vec4, <4 x i16> %vec5)
+ ret <24 x i16> %result
+}
+
+define <32 x i16> @interleave8_v4i16(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2, <4 x i16> %vec3, <4 x i16> %vec4, <4 x i16> %vec5, <4 x i16> %vec6, <4 x i16> %vec7) {
+; CHECK-LABEL: interleave8_v4i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vldr d17, [sp, #48]
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vldr d16, [sp, #40]
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vldmia r1, {d18, d19, d20, d21}
+; CHECK-NEXT: vzip.16 d19, d17
+; CHECK-NEXT: vzip.16 d23, d21
+; CHECK-NEXT: vzip.16 d18, d16
+; CHECK-NEXT: vzip.16 d22, d20
+; CHECK-NEXT: vzip.16 d23, d19
+; CHECK-NEXT: vzip.16 d22, d18
+; CHECK-NEXT: vzip.16 d21, d17
+; CHECK-NEXT: vzip.16 d20, d16
+; CHECK-NEXT: vzip.16 d22, d23
+; CHECK-NEXT: vzip.16 d18, d19
+; CHECK-NEXT: vst1.16 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vzip.16 d20, d21
+; CHECK-NEXT: vst1.16 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vzip.16 d16, d17
+; CHECK-NEXT: vst1.16 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <32 x i16> @llvm.vector.interleave8(<4 x i16> %vec0, <4 x i16> %vec1, <4 x i16> %vec2, <4 x i16> %vec3, <4 x i16> %vec4, <4 x i16> %vec5, <4 x i16> %vec6, <4 x i16> %vec7)
+ ret <32 x i16> %result
+}
+
+
+define <4 x i32> @interleave2_v2i32(<2 x i32> %vec0, <2 x i32> %vec1) {
+; CHECK-LABEL: interleave2_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vtrn.32 d17, d16
+; CHECK-NEXT: vmov r0, r1, d17
+; CHECK-NEXT: vmov r2, r3, d16
+; CHECK-NEXT: bx lr
+ %result = call <4 x i32> @llvm.vector.interleave2(<2 x i32> %vec0, <2 x i32> %vec1)
+ ret <4 x i32> %result
+}
+
+define <6 x i32> @interleave3_v2i32(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2) {
+; CHECK-LABEL: interleave3_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: vldr d18, [sp, #32]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vst3.32 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d16, [sp]
+; CHECK-NEXT: vldr d17, [r1]
+; CHECK-NEXT: vldr d18, [sp, #16]
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vstr d18, [r0]
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call <6 x i32> @llvm.vector.interleave3(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2)
+ ret <6 x i32> %result
+}
+
+define <8 x i32> @interleave4_v2i32(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2, <2 x i32> %vec3) {
+; CHECK-LABEL: interleave4_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp, #16]
+; CHECK-NEXT: vldr d19, [sp]
+; CHECK-NEXT: vldr d16, [sp, #8]
+; CHECK-NEXT: vmov d18, r2, r3
+; CHECK-NEXT: vtrn.32 d19, d17
+; CHECK-NEXT: vtrn.32 d18, d16
+; CHECK-NEXT: vtrn.32 d18, d19
+; CHECK-NEXT: vtrn.32 d16, d17
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <8 x i32> @llvm.vector.interleave4(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2, <2 x i32> %vec3)
+ ret <8 x i32> %result
+}
+
+define <12 x i32> @interleave6_v2i32(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2, <2 x i32> %vec3, <2 x i32> %vec4, <2 x i32> %vec5) {
+; CHECK-LABEL: interleave6_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: vldr d22, [sp, #56]
+; CHECK-NEXT: add r1, sp, #64
+; CHECK-NEXT: vldr d21, [sp, #48]
+; CHECK-NEXT: vmov d20, r2, r3
+; CHECK-NEXT: vldmia r1, {d16, d17, d18}
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vtrn.32 d22, d18
+; CHECK-NEXT: mov r3, sp
+; CHECK-NEXT: vtrn.32 d21, d17
+; CHECK-NEXT: vtrn.32 d20, d16
+; CHECK-NEXT: vst3.32 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vldr d19, [sp, #40]
+; CHECK-NEXT: vst3.32 {d20, d21, d22}, [r3:64], r2
+; CHECK-NEXT: vldr d20, [sp]
+; CHECK-NEXT: vldr d21, [r3]
+; CHECK-NEXT: vldr d16, [sp, #16]
+; CHECK-NEXT: vldr d18, [r1]
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call <12 x i32> @llvm.vector.interleave6(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2, <2 x i32> %vec3, <2 x i32> %vec4, <2 x i32> %vec5)
+ ret <12 x i32> %result
+}
+
+define <16 x i32> @interleave8_v2i32(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2, <2 x i32> %vec3, <2 x i32> %vec4, <2 x i32> %vec5, <2 x i32> %vec6, <2 x i32> %vec7) {
+; CHECK-LABEL: interleave8_v2i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vldr d17, [sp, #48]
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vldr d16, [sp, #40]
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vldmia r1, {d18, d19, d20, d21}
+; CHECK-NEXT: vtrn.32 d19, d17
+; CHECK-NEXT: vtrn.32 d23, d21
+; CHECK-NEXT: vtrn.32 d18, d16
+; CHECK-NEXT: vtrn.32 d22, d20
+; CHECK-NEXT: vtrn.32 d23, d19
+; CHECK-NEXT: vtrn.32 d22, d18
+; CHECK-NEXT: vtrn.32 d21, d17
+; CHECK-NEXT: vtrn.32 d20, d16
+; CHECK-NEXT: vtrn.32 d22, d23
+; CHECK-NEXT: vtrn.32 d18, d19
+; CHECK-NEXT: vst1.32 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vtrn.32 d20, d21
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vtrn.32 d16, d17
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <16 x i32> @llvm.vector.interleave8(<2 x i32> %vec0, <2 x i32> %vec1, <2 x i32> %vec2, <2 x i32> %vec3, <2 x i32> %vec4, <2 x i32> %vec5, <2 x i32> %vec6, <2 x i32> %vec7)
+ ret <16 x i32> %result
+}
+
+
+define <4 x float> @interleave2_v2f32(<2 x float> %vec0, <2 x float> %vec1) {
+; CHECK-LABEL: interleave2_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vtrn.32 d17, d16
+; CHECK-NEXT: vmov r0, r1, d17
+; CHECK-NEXT: vmov r2, r3, d16
+; CHECK-NEXT: bx lr
+ %result = call <4 x float> @llvm.vector.interleave2(<2 x float> %vec0, <2 x float> %vec1)
+ ret <4 x float> %result
+}
+
+define <6 x float> @interleave3_v2f32(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2) {
+; CHECK-LABEL: interleave3_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #24
+; CHECK-NEXT: sub sp, sp, #24
+; CHECK-NEXT: vldr d18, [sp, #32]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vst3.32 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d16, [sp]
+; CHECK-NEXT: vldr d17, [r1]
+; CHECK-NEXT: vldr d18, [sp, #16]
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vstr d18, [r0]
+; CHECK-NEXT: add sp, sp, #24
+; CHECK-NEXT: bx lr
+ %result = call <6 x float> @llvm.vector.interleave3(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2)
+ ret <6 x float> %result
+}
+
+define <8 x float> @interleave4_v2f32(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2, <2 x float> %vec3) {
+; CHECK-LABEL: interleave4_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp, #16]
+; CHECK-NEXT: vldr d19, [sp]
+; CHECK-NEXT: vldr d16, [sp, #8]
+; CHECK-NEXT: vmov d18, r2, r3
+; CHECK-NEXT: vtrn.32 d19, d17
+; CHECK-NEXT: vtrn.32 d18, d16
+; CHECK-NEXT: vtrn.32 d18, d19
+; CHECK-NEXT: vtrn.32 d16, d17
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <8 x float> @llvm.vector.interleave4(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2, <2 x float> %vec3)
+ ret <8 x float> %result
+}
+
+define <12 x float> @interleave6_v2f32(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2, <2 x float> %vec3, <2 x float> %vec4, <2 x float> %vec5) {
+; CHECK-LABEL: interleave6_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .pad #48
+; CHECK-NEXT: sub sp, sp, #48
+; CHECK-NEXT: vldr d22, [sp, #56]
+; CHECK-NEXT: add r1, sp, #64
+; CHECK-NEXT: vldr d21, [sp, #48]
+; CHECK-NEXT: vmov d20, r2, r3
+; CHECK-NEXT: vldmia r1, {d16, d17, d18}
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: mov r2, #8
+; CHECK-NEXT: vtrn.32 d22, d18
+; CHECK-NEXT: mov r3, sp
+; CHECK-NEXT: vtrn.32 d21, d17
+; CHECK-NEXT: vtrn.32 d20, d16
+; CHECK-NEXT: vst3.32 {d16, d17, d18}, [r1:64], r2
+; CHECK-NEXT: vldr d17, [sp, #24]
+; CHECK-NEXT: vldr d19, [sp, #40]
+; CHECK-NEXT: vst3.32 {d20, d21, d22}, [r3:64], r2
+; CHECK-NEXT: vldr d20, [sp]
+; CHECK-NEXT: vldr d21, [r3]
+; CHECK-NEXT: vldr d16, [sp, #16]
+; CHECK-NEXT: vldr d18, [r1]
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: add sp, sp, #48
+; CHECK-NEXT: bx lr
+ %result = call <12 x float> @llvm.vector.interleave6(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2, <2 x float> %vec3, <2 x float> %vec4, <2 x float> %vec5)
+ ret <12 x float> %result
+}
+
+define <16 x float> @interleave8_v2f32(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2, <2 x float> %vec3, <2 x float> %vec4, <2 x float> %vec5, <2 x float> %vec6, <2 x float> %vec7) {
+; CHECK-LABEL: interleave8_v2f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vldr d17, [sp, #48]
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vldr d16, [sp, #40]
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vldmia r1, {d18, d19, d20, d21}
+; CHECK-NEXT: vtrn.32 d19, d17
+; CHECK-NEXT: vtrn.32 d23, d21
+; CHECK-NEXT: vtrn.32 d18, d16
+; CHECK-NEXT: vtrn.32 d22, d20
+; CHECK-NEXT: vtrn.32 d23, d19
+; CHECK-NEXT: vtrn.32 d22, d18
+; CHECK-NEXT: vtrn.32 d21, d17
+; CHECK-NEXT: vtrn.32 d20, d16
+; CHECK-NEXT: vtrn.32 d22, d23
+; CHECK-NEXT: vtrn.32 d18, d19
+; CHECK-NEXT: vst1.32 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vtrn.32 d20, d21
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vtrn.32 d16, d17
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <16 x float> @llvm.vector.interleave8(<2 x float> %vec0, <2 x float> %vec1, <2 x float> %vec2, <2 x float> %vec3, <2 x float> %vec4, <2 x float> %vec5, <2 x float> %vec6, <2 x float> %vec7)
+ ret <16 x float> %result
+}
+
+
+define <32 x i8> @interleave2_v16i8(<16 x i8> %vec0, <16 x i8> %vec1) {
+; CHECK-LABEL: interleave2_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vzip.8 q8, q9
+; CHECK-NEXT: vst1.8 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <32 x i8> @llvm.vector.interleave2(<16 x i8> %vec0, <16 x i8> %vec1)
+ ret <32 x i8> %result
+}
+
+define <48 x i8> @interleave3_v16i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2) {
+; CHECK-LABEL: interleave3_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vst3.8 {d16, d18, d20}, [r2:64]!
+; CHECK-NEXT: vst3.8 {d17, d19, d21}, [r2:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vst1.8 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d20, d21}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <48 x i8> @llvm.vector.interleave3(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2)
+ ret <48 x i8> %result
+}
+
+define <64 x i8> @interleave4_v16i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3) {
+; CHECK-LABEL: interleave4_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vzip.8 q9, q8
+; CHECK-NEXT: vzip.8 q11, q10
+; CHECK-NEXT: vzip.8 q11, q9
+; CHECK-NEXT: vzip.8 q10, q8
+; CHECK-NEXT: vst1.8 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <64 x i8> @llvm.vector.interleave4(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3)
+ ret <64 x i8> %result
+}
+
+define <96 x i8> @interleave6_v16i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, <16 x i8> %vec4, <16 x i8> %vec5) {
+; CHECK-LABEL: interleave6_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #108
+; CHECK-NEXT: sub sp, sp, #108
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #76
+; CHECK-NEXT: vld1.64 {d28, d29}, [r1]
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #60
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, r11, #44
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #48
+; CHECK-NEXT: vzip.8 q10, q14
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vzip.8 q9, q13
+; CHECK-NEXT: vzip.8 q8, q12
+; CHECK-NEXT: vst3.8 {d24, d26, d28}, [r2:64]!
+; CHECK-NEXT: vst3.8 {d25, d27, d29}, [r2:64]
+; CHECK-NEXT: mov r2, sp
+; CHECK-NEXT: mov r3, r2
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst3.8 {d16, d18, d20}, [r3:64]!
+; CHECK-NEXT: vst3.8 {d17, d19, d21}, [r3:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r2:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r2]!
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: vld1.64 {d26, d27}, [r2]
+; CHECK-NEXT: vst1.8 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d26, d27}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d24, d25}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d22, d23}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <96 x i8> @llvm.vector.interleave6(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, <16 x i8> %vec4, <16 x i8> %vec5)
+ ret <96 x i8> %result
+}
+
+define <128 x i8> @interleave8_v16i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, <16 x i8> %vec4, <16 x i8> %vec5, <16 x i8> %vec6, <16 x i8> %vec7) {
+; CHECK-LABEL: interleave8_v16i8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #104
+; CHECK-NEXT: vldr d29, [sp]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vmov d28, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #72
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, sp, #88
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: add r1, sp, #56
+; CHECK-NEXT: vld1.64 {d30, d31}, [r1]
+; CHECK-NEXT: add r1, r0, #64
+; CHECK-NEXT: vzip.8 q8, q9
+; CHECK-NEXT: vzip.8 q10, q12
+; CHECK-NEXT: vzip.8 q11, q13
+; CHECK-NEXT: vzip.8 q14, q15
+; CHECK-NEXT: vzip.8 q12, q9
+; CHECK-NEXT: vzip.8 q15, q13
+; CHECK-NEXT: vzip.8 q10, q8
+; CHECK-NEXT: vzip.8 q14, q11
+; CHECK-NEXT: vzip.8 q15, q12
+; CHECK-NEXT: vzip.8 q13, q9
+; CHECK-NEXT: vst1.8 {d30, d31}, [r1:128]!
+; CHECK-NEXT: vzip.8 q14, q10
+; CHECK-NEXT: vst1.8 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst1.8 {d26, d27}, [r1:128]!
+; CHECK-NEXT: vzip.8 q11, q8
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1:128]
+; CHECK-NEXT: vst1.8 {d28, d29}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.8 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <128 x i8> @llvm.vector.interleave8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, <16 x i8> %vec4, <16 x i8> %vec5, <16 x i8> %vec6, <16 x i8> %vec7)
+ ret <128 x i8> %result
+}
+
+
+define <16 x i16> @interleave2_v8i16(<8 x i16> %vec0, <8 x i16> %vec1) {
+; CHECK-LABEL: interleave2_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vzip.16 q8, q9
+; CHECK-NEXT: vst1.16 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <16 x i16> @llvm.vector.interleave2(<8 x i16> %vec0, <8 x i16> %vec1)
+ ret <16 x i16> %result
+}
+
+define <24 x i16> @interleave3_v8i16(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2) {
+; CHECK-LABEL: interleave3_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vst3.16 {d16, d18, d20}, [r2:64]!
+; CHECK-NEXT: vst3.16 {d17, d19, d21}, [r2:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vst1.16 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d20, d21}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <24 x i16> @llvm.vector.interleave3(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2)
+ ret <24 x i16> %result
+}
+
+define <32 x i16> @interleave4_v8i16(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2, <8 x i16> %vec3) {
+; CHECK-LABEL: interleave4_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vzip.16 q9, q8
+; CHECK-NEXT: vzip.16 q11, q10
+; CHECK-NEXT: vzip.16 q11, q9
+; CHECK-NEXT: vzip.16 q10, q8
+; CHECK-NEXT: vst1.16 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <32 x i16> @llvm.vector.interleave4(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2, <8 x i16> %vec3)
+ ret <32 x i16> %result
+}
+
+define <48 x i16> @interleave6_v8i16(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2, <8 x i16> %vec3, <8 x i16> %vec4, <8 x i16> %vec5) {
+; CHECK-LABEL: interleave6_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #108
+; CHECK-NEXT: sub sp, sp, #108
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #76
+; CHECK-NEXT: vld1.64 {d28, d29}, [r1]
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #60
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, r11, #44
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #48
+; CHECK-NEXT: vzip.16 q10, q14
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vzip.16 q9, q13
+; CHECK-NEXT: vzip.16 q8, q12
+; CHECK-NEXT: vst3.16 {d24, d26, d28}, [r2:64]!
+; CHECK-NEXT: vst3.16 {d25, d27, d29}, [r2:64]
+; CHECK-NEXT: mov r2, sp
+; CHECK-NEXT: mov r3, r2
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst3.16 {d16, d18, d20}, [r3:64]!
+; CHECK-NEXT: vst3.16 {d17, d19, d21}, [r3:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r2:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r2]!
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: vld1.64 {d26, d27}, [r2]
+; CHECK-NEXT: vst1.16 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d26, d27}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d24, d25}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d22, d23}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <48 x i16> @llvm.vector.interleave6(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2, <8 x i16> %vec3, <8 x i16> %vec4, <8 x i16> %vec5)
+ ret <48 x i16> %result
+}
+
+define <64 x i16> @interleave8_v8i16(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2, <8 x i16> %vec3, <8 x i16> %vec4, <8 x i16> %vec5, <8 x i16> %vec6, <8 x i16> %vec7) {
+; CHECK-LABEL: interleave8_v8i16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #104
+; CHECK-NEXT: vldr d29, [sp]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vmov d28, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #72
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, sp, #88
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: add r1, sp, #56
+; CHECK-NEXT: vld1.64 {d30, d31}, [r1]
+; CHECK-NEXT: add r1, r0, #64
+; CHECK-NEXT: vzip.16 q8, q9
+; CHECK-NEXT: vzip.16 q10, q12
+; CHECK-NEXT: vzip.16 q11, q13
+; CHECK-NEXT: vzip.16 q14, q15
+; CHECK-NEXT: vzip.16 q12, q9
+; CHECK-NEXT: vzip.16 q15, q13
+; CHECK-NEXT: vzip.16 q10, q8
+; CHECK-NEXT: vzip.16 q14, q11
+; CHECK-NEXT: vzip.16 q15, q12
+; CHECK-NEXT: vzip.16 q13, q9
+; CHECK-NEXT: vst1.16 {d30, d31}, [r1:128]!
+; CHECK-NEXT: vzip.16 q14, q10
+; CHECK-NEXT: vst1.16 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst1.16 {d26, d27}, [r1:128]!
+; CHECK-NEXT: vzip.16 q11, q8
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1:128]
+; CHECK-NEXT: vst1.16 {d28, d29}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.16 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <64 x i16> @llvm.vector.interleave8(<8 x i16> %vec0, <8 x i16> %vec1, <8 x i16> %vec2, <8 x i16> %vec3, <8 x i16> %vec4, <8 x i16> %vec5, <8 x i16> %vec6, <8 x i16> %vec7)
+ ret <64 x i16> %result
+}
+
+define <8 x i32> @interleave2_v4i32(<4 x i32> %vec0, <4 x i32> %vec1) {
+; CHECK-LABEL: interleave2_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vzip.32 q8, q9
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <8 x i32> @llvm.vector.interleave2(<4 x i32> %vec0, <4 x i32> %vec1)
+ ret <8 x i32> %result
+}
+
+define <12 x i32> @interleave3_v4i32(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2) {
+; CHECK-LABEL: interleave3_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vst3.32 {d16, d18, d20}, [r2:64]!
+; CHECK-NEXT: vst3.32 {d17, d19, d21}, [r2:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d20, d21}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <12 x i32> @llvm.vector.interleave3(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2)
+ ret <12 x i32> %result
+}
+
+define <16 x i32> @interleave4_v4i32(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2, <4 x i32> %vec3) {
+; CHECK-LABEL: interleave4_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vzip.32 q9, q8
+; CHECK-NEXT: vzip.32 q11, q10
+; CHECK-NEXT: vzip.32 q11, q9
+; CHECK-NEXT: vzip.32 q10, q8
+; CHECK-NEXT: vst1.32 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <16 x i32> @llvm.vector.interleave4(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2, <4 x i32> %vec3)
+ ret <16 x i32> %result
+}
+
+define <24 x i32> @interleave6_v4i32(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2, <4 x i32> %vec3, <4 x i32> %vec4, <4 x i32> %vec5) {
+; CHECK-LABEL: interleave6_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #108
+; CHECK-NEXT: sub sp, sp, #108
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #76
+; CHECK-NEXT: vld1.64 {d28, d29}, [r1]
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #60
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, r11, #44
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #48
+; CHECK-NEXT: vzip.32 q10, q14
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vzip.32 q9, q13
+; CHECK-NEXT: vzip.32 q8, q12
+; CHECK-NEXT: vst3.32 {d24, d26, d28}, [r2:64]!
+; CHECK-NEXT: vst3.32 {d25, d27, d29}, [r2:64]
+; CHECK-NEXT: mov r2, sp
+; CHECK-NEXT: mov r3, r2
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst3.32 {d16, d18, d20}, [r3:64]!
+; CHECK-NEXT: vst3.32 {d17, d19, d21}, [r3:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r2:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r2]!
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: vld1.64 {d26, d27}, [r2]
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d26, d27}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d24, d25}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d22, d23}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <24 x i32> @llvm.vector.interleave6(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2, <4 x i32> %vec3, <4 x i32> %vec4, <4 x i32> %vec5)
+ ret <24 x i32> %result
+}
+
+define <32 x i32> @interleave8_v4i32(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2, <4 x i32> %vec3, <4 x i32> %vec4, <4 x i32> %vec5, <4 x i32> %vec6, <4 x i32> %vec7) {
+; CHECK-LABEL: interleave8_v4i32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #104
+; CHECK-NEXT: vldr d29, [sp]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vmov d28, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #72
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, sp, #88
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: add r1, sp, #56
+; CHECK-NEXT: vld1.64 {d30, d31}, [r1]
+; CHECK-NEXT: add r1, r0, #64
+; CHECK-NEXT: vzip.32 q8, q9
+; CHECK-NEXT: vzip.32 q10, q12
+; CHECK-NEXT: vzip.32 q11, q13
+; CHECK-NEXT: vzip.32 q14, q15
+; CHECK-NEXT: vzip.32 q12, q9
+; CHECK-NEXT: vzip.32 q15, q13
+; CHECK-NEXT: vzip.32 q10, q8
+; CHECK-NEXT: vzip.32 q14, q11
+; CHECK-NEXT: vzip.32 q15, q12
+; CHECK-NEXT: vzip.32 q13, q9
+; CHECK-NEXT: vst1.32 {d30, d31}, [r1:128]!
+; CHECK-NEXT: vzip.32 q14, q10
+; CHECK-NEXT: vst1.32 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst1.32 {d26, d27}, [r1:128]!
+; CHECK-NEXT: vzip.32 q11, q8
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1:128]
+; CHECK-NEXT: vst1.32 {d28, d29}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <32 x i32> @llvm.vector.interleave8(<4 x i32> %vec0, <4 x i32> %vec1, <4 x i32> %vec2, <4 x i32> %vec3, <4 x i32> %vec4, <4 x i32> %vec5, <4 x i32> %vec6, <4 x i32> %vec7)
+ ret <32 x i32> %result
+}
+
+
+define <8 x float> @interleave2_v4f32(<4 x float> %vec0, <4 x float> %vec1) {
+; CHECK-LABEL: interleave2_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: vldr d17, [sp]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: vzip.32 q8, q9
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d18, d19}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <8 x float> @llvm.vector.interleave2(<4 x float> %vec0, <4 x float> %vec1)
+ ret <8 x float> %result
+}
+
+define <12 x float> @interleave3_v4f32(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2) {
+; CHECK-LABEL: interleave3_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #60
+; CHECK-NEXT: sub sp, sp, #60
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: mov r1, sp
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vst3.32 {d16, d18, d20}, [r2:64]!
+; CHECK-NEXT: vst3.32 {d17, d19, d21}, [r2:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d20, d21}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <12 x float> @llvm.vector.interleave3(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2)
+ ret <12 x float> %result
+}
+
+define <16 x float> @interleave4_v4f32(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2, <4 x float> %vec3) {
+; CHECK-LABEL: interleave4_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vldr d23, [sp]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vmov d22, r2, r3
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: vzip.32 q9, q8
+; CHECK-NEXT: vzip.32 q11, q10
+; CHECK-NEXT: vzip.32 q11, q9
+; CHECK-NEXT: vzip.32 q10, q8
+; CHECK-NEXT: vst1.32 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <16 x float> @llvm.vector.interleave4(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2, <4 x float> %vec3)
+ ret <16 x float> %result
+}
+
+define <24 x float> @interleave6_v4f32(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2, <4 x float> %vec3, <4 x float> %vec4, <4 x float> %vec5) {
+; CHECK-LABEL: interleave6_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r11}
+; CHECK-NEXT: push {r11}
+; CHECK-NEXT: .setfp r11, sp
+; CHECK-NEXT: mov r11, sp
+; CHECK-NEXT: .pad #108
+; CHECK-NEXT: sub sp, sp, #108
+; CHECK-NEXT: bfc sp, #0, #4
+; CHECK-NEXT: add r1, r11, #76
+; CHECK-NEXT: vld1.64 {d28, d29}, [r1]
+; CHECK-NEXT: add r1, r11, #28
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, r11, #60
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, r11, #12
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, r11, #44
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #48
+; CHECK-NEXT: vzip.32 q10, q14
+; CHECK-NEXT: vldr d17, [r11, #4]
+; CHECK-NEXT: vmov d16, r2, r3
+; CHECK-NEXT: mov r2, r1
+; CHECK-NEXT: vzip.32 q9, q13
+; CHECK-NEXT: vzip.32 q8, q12
+; CHECK-NEXT: vst3.32 {d24, d26, d28}, [r2:64]!
+; CHECK-NEXT: vst3.32 {d25, d27, d29}, [r2:64]
+; CHECK-NEXT: mov r2, sp
+; CHECK-NEXT: mov r3, r2
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst3.32 {d16, d18, d20}, [r3:64]!
+; CHECK-NEXT: vst3.32 {d17, d19, d21}, [r3:64]
+; CHECK-NEXT: vld1.64 {d16, d17}, [r2:128]!
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]!
+; CHECK-NEXT: vld1.64 {d20, d21}, [r2]!
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: vld1.64 {d26, d27}, [r2]
+; CHECK-NEXT: vst1.32 {d16, d17}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d26, d27}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d24, d25}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d18, d19}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d22, d23}, [r0:128]
+; CHECK-NEXT: mov sp, r11
+; CHECK-NEXT: pop {r11}
+; CHECK-NEXT: bx lr
+ %result = call <24 x float> @llvm.vector.interleave6(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2, <4 x float> %vec3, <4 x float> %vec4, <4 x float> %vec5)
+ ret <24 x float> %result
+}
+
+define <32 x float> @interleave8_v4f32(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2, <4 x float> %vec3, <4 x float> %vec4, <4 x float> %vec5, <4 x float> %vec6, <4 x float> %vec7) {
+; CHECK-LABEL: interleave8_v4f32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: add r1, sp, #104
+; CHECK-NEXT: vldr d29, [sp]
+; CHECK-NEXT: vld1.64 {d18, d19}, [r1]
+; CHECK-NEXT: add r1, sp, #40
+; CHECK-NEXT: vmov d28, r2, r3
+; CHECK-NEXT: vld1.64 {d16, d17}, [r1]
+; CHECK-NEXT: add r1, sp, #72
+; CHECK-NEXT: vld1.64 {d24, d25}, [r1]
+; CHECK-NEXT: add r1, sp, #8
+; CHECK-NEXT: vld1.64 {d20, d21}, [r1]
+; CHECK-NEXT: add r1, sp, #88
+; CHECK-NEXT: vld1.64 {d26, d27}, [r1]
+; CHECK-NEXT: add r1, sp, #24
+; CHECK-NEXT: vld1.64 {d22, d23}, [r1]
+; CHECK-NEXT: add r1, sp, #56
+; CHECK-NEXT: vld1.64 {d30, d31}, [r1]
+; CHECK-NEXT: add r1, r0, #64
+; CHECK-NEXT: vzip.32 q8, q9
+; CHECK-NEXT: vzip.32 q10, q12
+; CHECK-NEXT: vzip.32 q11, q13
+; CHECK-NEXT: vzip.32 q14, q15
+; CHECK-NEXT: vzip.32 q12, q9
+; CHECK-NEXT: vzip.32 q15, q13
+; CHECK-NEXT: vzip.32 q10, q8
+; CHECK-NEXT: vzip.32 q14, q11
+; CHECK-NEXT: vzip.32 q15, q12
+; CHECK-NEXT: vzip.32 q13, q9
+; CHECK-NEXT: vst1.32 {d30, d31}, [r1:128]!
+; CHECK-NEXT: vzip.32 q14, q10
+; CHECK-NEXT: vst1.32 {d24, d25}, [r1:128]!
+; CHECK-NEXT: vst1.32 {d26, d27}, [r1:128]!
+; CHECK-NEXT: vzip.32 q11, q8
+; CHECK-NEXT: vst1.64 {d18, d19}, [r1:128]
+; CHECK-NEXT: vst1.32 {d28, d29}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d20, d21}, [r0:128]!
+; CHECK-NEXT: vst1.32 {d22, d23}, [r0:128]!
+; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
+; CHECK-NEXT: bx lr
+ %result = call <32 x float> @llvm.vector.interleave8(<4 x float> %vec0, <4 x float> %vec1, <4 x float> %vec2, <4 x float> %vec3, <4 x float> %vec4, <4 x float> %vec5, <4 x float> %vec6, <4 x float> %vec7)
+ ret <32 x float> %result
+}
+
+
+define <8 x half> @interleave2_v4f16(<4 x half> %vec0, <4 x half> %vec1) {
+; CHECK-LABEL: interleave2_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, lr}
+; CHECK-NEXT: push {r4, r5, r6, lr}
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: ldrh r1, [sp, #20]
+; CHECK-NEXT: ldrh r12, [sp, #32]
+; CHECK-NEXT: ldrh lr, [sp, #16]
+; CHECK-NEXT: ldrh r4, [sp, #28]
+; CHECK-NEXT: ldrh r5, [sp, #24]
+; CHECK-NEXT: strh r6, [r0, #14]
+; CHECK-NEXT: strh r1, [r0, #12]
+; CHECK-NEXT: strh r12, [r0, #10]
+; CHECK-NEXT: strh lr, [r0, #8]
+; CHECK-NEXT: strh r4, [r0, #6]
+; CHECK-NEXT: strh r3, [r0, #4]
+; CHECK-NEXT: strh r5, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, pc}
+ %result = call <8 x half> @llvm.vector.interleave2(<4 x half> %vec0, <4 x half> %vec1)
+ ret <8 x half> %result
+}
+
+define <12 x half> @interleave3_v4f16(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2) {
+; CHECK-LABEL: interleave3_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r12, [sp, #60]
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: ldrh lr, [sp, #40]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #28]
+; CHECK-NEXT: ldrh r6, [sp, #56]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: ldrh r4, [sp, #52]
+; CHECK-NEXT: ldrh r5, [sp, #36]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r8, [sp, #32]
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: str r7, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r5, r4, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r6, r3, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r8, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call <12 x half> @llvm.vector.interleave3(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2)
+ ret <12 x half> %result
+}
+
+define <16 x half> @interleave4_v4f16(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2, <4 x half> %vec3) {
+; CHECK-LABEL: interleave4_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: .pad #4
+; CHECK-NEXT: sub sp, sp, #4
+; CHECK-NEXT: ldrh r7, [sp, #92]
+; CHECK-NEXT: ldrh r1, [sp, #76]
+; CHECK-NEXT: ldrh r12, [sp, #60]
+; CHECK-NEXT: ldrh lr, [sp, #44]
+; CHECK-NEXT: ldrh r4, [sp, #88]
+; CHECK-NEXT: strh r7, [r0, #30]
+; CHECK-NEXT: strh r1, [r0, #28]
+; CHECK-NEXT: strh r12, [r0, #26]
+; CHECK-NEXT: strh lr, [r0, #24]
+; CHECK-NEXT: strh r4, [r0, #22]
+; CHECK-NEXT: ldrh r9, [sp, #72]
+; CHECK-NEXT: ldrh r8, [sp, #56]
+; CHECK-NEXT: ldrh r10, [sp, #40]
+; CHECK-NEXT: ldrh r11, [sp, #84]
+; CHECK-NEXT: ldrh r6, [sp, #68]
+; CHECK-NEXT: ldrh r5, [sp, #52]
+; CHECK-NEXT: ldrh r4, [sp, #80]
+; CHECK-NEXT: ldrh r7, [sp, #64]
+; CHECK-NEXT: ldrh r1, [sp, #48]
+; CHECK-NEXT: strh r9, [r0, #20]
+; CHECK-NEXT: strh r8, [r0, #18]
+; CHECK-NEXT: strh r10, [r0, #16]
+; CHECK-NEXT: strh r11, [r0, #14]
+; CHECK-NEXT: strh r6, [r0, #12]
+; CHECK-NEXT: strh r5, [r0, #10]
+; CHECK-NEXT: strh r3, [r0, #8]
+; CHECK-NEXT: strh r4, [r0, #6]
+; CHECK-NEXT: strh r7, [r0, #4]
+; CHECK-NEXT: strh r1, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: add sp, sp, #4
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+ %result = call <16 x half> @llvm.vector.interleave4(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2, <4 x half> %vec3)
+ ret <16 x half> %result
+}
+
+define <24 x half> @interleave6_v4f16(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2, <4 x half> %vec3, <4 x half> %vec4, <4 x half> %vec5) {
+; CHECK-LABEL: interleave6_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r12, [sp, #116]
+; CHECK-NEXT: ldrh r1, [sp, #100]
+; CHECK-NEXT: ldrh lr, [sp, #52]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #44]
+; CHECK-NEXT: ldrh r1, [sp, #36]
+; CHECK-NEXT: ldrh r7, [sp, #84]
+; CHECK-NEXT: ldrh r6, [sp, #68]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r9, [sp, #80]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: str r7, [r0, #40]
+; CHECK-NEXT: str r1, [r0, #36]
+; CHECK-NEXT: ldrh r1, [sp, #64]
+; CHECK-NEXT: ldrh r4, [sp, #112]
+; CHECK-NEXT: ldrh r7, [sp, #96]
+; CHECK-NEXT: orr r1, r1, r9, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #108]
+; CHECK-NEXT: orr r7, r7, r4, lsl #16
+; CHECK-NEXT: str r7, [r0, #32]
+; CHECK-NEXT: str r1, [r0, #28]
+; CHECK-NEXT: ldrh r1, [sp, #92]
+; CHECK-NEXT: ldrh r8, [sp, #48]
+; CHECK-NEXT: ldrh r7, [sp, #32]
+; CHECK-NEXT: orr r1, r1, r6, lsl #16
+; CHECK-NEXT: ldrh lr, [sp, #76]
+; CHECK-NEXT: orr r7, r7, r8, lsl #16
+; CHECK-NEXT: str r7, [r0, #24]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: ldrh r12, [sp, #104]
+; CHECK-NEXT: ldrh r7, [sp, #60]
+; CHECK-NEXT: ldrh r9, [sp, #72]
+; CHECK-NEXT: pkhbt r1, r3, r1, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #88]
+; CHECK-NEXT: orr r7, r7, lr, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: str r7, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r5, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r4, r9, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r6, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <24 x half> @llvm.vector.interleave6(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2, <4 x half> %vec3, <4 x half> %vec4, <4 x half> %vec5)
+ ret <24 x half> %result
+}
+
+define <32 x half> @interleave8_v4f16(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2, <4 x half> %vec3, <4 x half> %vec4, <4 x half> %vec5, <4 x half> %vec6, <4 x half> %vec7) {
+; CHECK-LABEL: interleave8_v4f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r7, [sp, #148]
+; CHECK-NEXT: strh r7, [r0, #62]
+; CHECK-NEXT: ldrh r1, [sp, #132]
+; CHECK-NEXT: ldrh r12, [sp, #116]
+; CHECK-NEXT: ldrh lr, [sp, #100]
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: ldrh r9, [sp, #68]
+; CHECK-NEXT: ldrh r8, [sp, #52]
+; CHECK-NEXT: ldrh r7, [sp, #36]
+; CHECK-NEXT: strh r1, [r0, #60]
+; CHECK-NEXT: strh r12, [r0, #58]
+; CHECK-NEXT: strh lr, [r0, #56]
+; CHECK-NEXT: strh r4, [r0, #54]
+; CHECK-NEXT: strh r9, [r0, #52]
+; CHECK-NEXT: strh r8, [r0, #50]
+; CHECK-NEXT: strh r7, [r0, #48]
+; CHECK-NEXT: ldrh r1, [sp, #144]
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: ldrh r5, [sp, #112]
+; CHECK-NEXT: ldrh r4, [sp, #96]
+; CHECK-NEXT: ldrh r12, [sp, #80]
+; CHECK-NEXT: ldrh lr, [sp, #64]
+; CHECK-NEXT: ldrh r7, [sp, #48]
+; CHECK-NEXT: strh r1, [r0, #46]
+; CHECK-NEXT: strh r6, [r0, #44]
+; CHECK-NEXT: strh r5, [r0, #42]
+; CHECK-NEXT: strh r4, [r0, #40]
+; CHECK-NEXT: strh r12, [r0, #38]
+; CHECK-NEXT: strh lr, [r0, #36]
+; CHECK-NEXT: strh r7, [r0, #34]
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: ldrh r6, [sp, #140]
+; CHECK-NEXT: ldrh r5, [sp, #124]
+; CHECK-NEXT: ldrh r4, [sp, #108]
+; CHECK-NEXT: ldrh r12, [sp, #92]
+; CHECK-NEXT: ldrh lr, [sp, #76]
+; CHECK-NEXT: ldrh r7, [sp, #60]
+; CHECK-NEXT: ldrh r9, [sp, #44]
+; CHECK-NEXT: strh r1, [r0, #32]
+; CHECK-NEXT: strh r6, [r0, #30]
+; CHECK-NEXT: strh r5, [r0, #28]
+; CHECK-NEXT: strh r4, [r0, #26]
+; CHECK-NEXT: strh r12, [r0, #24]
+; CHECK-NEXT: strh lr, [r0, #22]
+; CHECK-NEXT: strh r7, [r0, #20]
+; CHECK-NEXT: strh r9, [r0, #18]
+; CHECK-NEXT: strh r3, [r0, #16]
+; CHECK-NEXT: ldrh r8, [sp, #136]
+; CHECK-NEXT: ldrh r5, [sp, #120]
+; CHECK-NEXT: ldrh r4, [sp, #104]
+; CHECK-NEXT: ldrh r6, [sp, #88]
+; CHECK-NEXT: ldrh r1, [sp, #72]
+; CHECK-NEXT: ldrh r7, [sp, #56]
+; CHECK-NEXT: ldrh r3, [sp, #40]
+; CHECK-NEXT: strh r8, [r0, #14]
+; CHECK-NEXT: strh r5, [r0, #12]
+; CHECK-NEXT: strh r4, [r0, #10]
+; CHECK-NEXT: strh r6, [r0, #8]
+; CHECK-NEXT: strh r1, [r0, #6]
+; CHECK-NEXT: strh r7, [r0, #4]
+; CHECK-NEXT: strh r3, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <32 x half> @llvm.vector.interleave8(<4 x half> %vec0, <4 x half> %vec1, <4 x half> %vec2, <4 x half> %vec3, <4 x half> %vec4, <4 x half> %vec5, <4 x half> %vec6, <4 x half> %vec7)
+ ret <32 x half> %result
+}
+
+
+define <16 x half> @interleave2_v8f16(<8 x half> %vec0, <8 x half> %vec1) {
+; CHECK-LABEL: interleave2_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: .pad #4
+; CHECK-NEXT: sub sp, sp, #4
+; CHECK-NEXT: ldrh r7, [sp, #92]
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: ldrh r12, [sp, #88]
+; CHECK-NEXT: ldrh lr, [sp, #56]
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: strh r7, [r0, #30]
+; CHECK-NEXT: strh r1, [r0, #28]
+; CHECK-NEXT: strh r12, [r0, #26]
+; CHECK-NEXT: strh lr, [r0, #24]
+; CHECK-NEXT: strh r4, [r0, #22]
+; CHECK-NEXT: ldrh r9, [sp, #52]
+; CHECK-NEXT: ldrh r8, [sp, #80]
+; CHECK-NEXT: ldrh r10, [sp, #48]
+; CHECK-NEXT: ldrh r11, [sp, #76]
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: ldrh r5, [sp, #72]
+; CHECK-NEXT: ldrh r4, [sp, #40]
+; CHECK-NEXT: ldrh r7, [sp, #68]
+; CHECK-NEXT: ldrh r1, [sp, #64]
+; CHECK-NEXT: strh r9, [r0, #20]
+; CHECK-NEXT: strh r8, [r0, #18]
+; CHECK-NEXT: strh r10, [r0, #16]
+; CHECK-NEXT: strh r11, [r0, #14]
+; CHECK-NEXT: strh r6, [r0, #12]
+; CHECK-NEXT: strh r5, [r0, #10]
+; CHECK-NEXT: strh r4, [r0, #8]
+; CHECK-NEXT: strh r7, [r0, #6]
+; CHECK-NEXT: strh r3, [r0, #4]
+; CHECK-NEXT: strh r1, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: add sp, sp, #4
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+ %result = call <16 x half> @llvm.vector.interleave2(<8 x half> %vec0, <8 x half> %vec1)
+ ret <16 x half> %result
+}
+
+define <24 x half> @interleave3_v8f16(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2) {
+; CHECK-LABEL: interleave3_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: ldrh r12, [sp, #116]
+; CHECK-NEXT: ldrh r1, [sp, #84]
+; CHECK-NEXT: ldrh lr, [sp, #80]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #44]
+; CHECK-NEXT: ldrh r1, [sp, #48]
+; CHECK-NEXT: ldrh r7, [sp, #52]
+; CHECK-NEXT: ldrh r6, [sp, #112]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r9, [sp, #44]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: str r7, [r0, #40]
+; CHECK-NEXT: str r1, [r0, #36]
+; CHECK-NEXT: ldrh r1, [sp, #104]
+; CHECK-NEXT: ldrh r4, [sp, #108]
+; CHECK-NEXT: ldrh r7, [sp, #76]
+; CHECK-NEXT: orr r1, r1, r9, lsl #16
+; CHECK-NEXT: ldrh r10, [sp, #100]
+; CHECK-NEXT: orr r7, r7, r4, lsl #16
+; CHECK-NEXT: str r7, [r0, #32]
+; CHECK-NEXT: str r1, [r0, #28]
+; CHECK-NEXT: ldrh r1, [sp, #68]
+; CHECK-NEXT: ldrh r8, [sp, #72]
+; CHECK-NEXT: ldrh r7, [sp, #40]
+; CHECK-NEXT: orr r1, r1, r10, lsl #16
+; CHECK-NEXT: ldrh lr, [sp, #64]
+; CHECK-NEXT: orr r7, r7, r8, lsl #16
+; CHECK-NEXT: str r7, [r0, #24]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: ldrh r12, [sp, #36]
+; CHECK-NEXT: ldrh r9, [sp, #92]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #96]
+; CHECK-NEXT: ldrh r6, [sp, #60]
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: orr r7, r7, r12, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #88]
+; CHECK-NEXT: str r7, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r6, r9, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r5, r3, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r4, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, pc}
+ %result = call <24 x half> @llvm.vector.interleave3(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2)
+ ret <24 x half> %result
+}
+
+define <32 x half> @interleave4_v8f16(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2, <8 x half> %vec3) {
+; CHECK-LABEL: interleave4_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: ldrh r7, [sp, #148]
+; CHECK-NEXT: strh r7, [r0, #62]
+; CHECK-NEXT: ldrh r1, [sp, #116]
+; CHECK-NEXT: ldrh r12, [sp, #84]
+; CHECK-NEXT: ldrh lr, [sp, #52]
+; CHECK-NEXT: ldrh r4, [sp, #144]
+; CHECK-NEXT: ldrh r9, [sp, #112]
+; CHECK-NEXT: ldrh r8, [sp, #80]
+; CHECK-NEXT: ldrh r7, [sp, #48]
+; CHECK-NEXT: strh r1, [r0, #60]
+; CHECK-NEXT: strh r12, [r0, #58]
+; CHECK-NEXT: strh lr, [r0, #56]
+; CHECK-NEXT: strh r4, [r0, #54]
+; CHECK-NEXT: strh r9, [r0, #52]
+; CHECK-NEXT: strh r8, [r0, #50]
+; CHECK-NEXT: strh r7, [r0, #48]
+; CHECK-NEXT: ldrh r1, [sp, #140]
+; CHECK-NEXT: ldrh r6, [sp, #108]
+; CHECK-NEXT: ldrh r5, [sp, #76]
+; CHECK-NEXT: ldrh r4, [sp, #44]
+; CHECK-NEXT: ldrh r12, [sp, #136]
+; CHECK-NEXT: ldrh lr, [sp, #104]
+; CHECK-NEXT: ldrh r7, [sp, #72]
+; CHECK-NEXT: strh r1, [r0, #46]
+; CHECK-NEXT: strh r6, [r0, #44]
+; CHECK-NEXT: strh r5, [r0, #42]
+; CHECK-NEXT: strh r4, [r0, #40]
+; CHECK-NEXT: strh r12, [r0, #38]
+; CHECK-NEXT: strh lr, [r0, #36]
+; CHECK-NEXT: strh r7, [r0, #34]
+; CHECK-NEXT: ldrh r1, [sp, #40]
+; CHECK-NEXT: ldrh r6, [sp, #132]
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: ldrh r4, [sp, #68]
+; CHECK-NEXT: ldrh r12, [sp, #36]
+; CHECK-NEXT: ldrh lr, [sp, #128]
+; CHECK-NEXT: ldrh r7, [sp, #96]
+; CHECK-NEXT: strh r1, [r0, #32]
+; CHECK-NEXT: strh r6, [r0, #30]
+; CHECK-NEXT: strh r5, [r0, #28]
+; CHECK-NEXT: strh r4, [r0, #26]
+; CHECK-NEXT: strh r12, [r0, #24]
+; CHECK-NEXT: strh lr, [r0, #22]
+; CHECK-NEXT: strh r7, [r0, #20]
+; CHECK-NEXT: ldrh r8, [sp, #64]
+; CHECK-NEXT: ldrh r9, [sp, #32]
+; CHECK-NEXT: ldrh r10, [sp, #124]
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: ldrh r6, [sp, #120]
+; CHECK-NEXT: ldrh r7, [sp, #88]
+; CHECK-NEXT: ldrh r5, [sp, #56]
+; CHECK-NEXT: strh r8, [r0, #18]
+; CHECK-NEXT: strh r9, [r0, #16]
+; CHECK-NEXT: strh r10, [r0, #14]
+; CHECK-NEXT: strh r4, [r0, #12]
+; CHECK-NEXT: strh r1, [r0, #10]
+; CHECK-NEXT: strh r3, [r0, #8]
+; CHECK-NEXT: strh r6, [r0, #6]
+; CHECK-NEXT: strh r7, [r0, #4]
+; CHECK-NEXT: strh r5, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, pc}
+ %result = call <32 x half> @llvm.vector.interleave4(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2, <8 x half> %vec3)
+ ret <32 x half> %result
+}
+
+define <48 x half> @interleave6_v8f16(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2, <8 x half> %vec3, <8 x half> %vec4, <8 x half> %vec5) {
+; CHECK-LABEL: interleave6_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r12, [sp, #212]
+; CHECK-NEXT: ldrh r1, [sp, #180]
+; CHECK-NEXT: ldrh lr, [sp, #84]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #92]
+; CHECK-NEXT: ldrh r1, [sp, #52]
+; CHECK-NEXT: ldrh r7, [sp, #148]
+; CHECK-NEXT: ldrh r6, [sp, #116]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r9, [sp, #144]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: str r7, [r0, #88]
+; CHECK-NEXT: str r1, [r0, #84]
+; CHECK-NEXT: ldrh r1, [sp, #112]
+; CHECK-NEXT: ldrh r4, [sp, #208]
+; CHECK-NEXT: ldrh r7, [sp, #176]
+; CHECK-NEXT: orr r1, r1, r9, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #204]
+; CHECK-NEXT: orr r7, r7, r4, lsl #16
+; CHECK-NEXT: str r7, [r0, #80]
+; CHECK-NEXT: str r1, [r0, #76]
+; CHECK-NEXT: ldrh r1, [sp, #172]
+; CHECK-NEXT: ldrh r8, [sp, #80]
+; CHECK-NEXT: ldrh r7, [sp, #48]
+; CHECK-NEXT: orr r1, r1, r6, lsl #16
+; CHECK-NEXT: ldrh r4, [sp, #76]
+; CHECK-NEXT: orr r7, r7, r8, lsl #16
+; CHECK-NEXT: str r7, [r0, #72]
+; CHECK-NEXT: str r1, [r0, #68]
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: ldrh r5, [sp, #140]
+; CHECK-NEXT: ldrh r7, [sp, #108]
+; CHECK-NEXT: orr r1, r1, r4, lsl #16
+; CHECK-NEXT: ldrh lr, [sp, #136]
+; CHECK-NEXT: orr r5, r7, r5, lsl #16
+; CHECK-NEXT: str r5, [r0, #64]
+; CHECK-NEXT: str r1, [r0, #60]
+; CHECK-NEXT: ldrh r1, [sp, #104]
+; CHECK-NEXT: ldrh r12, [sp, #200]
+; CHECK-NEXT: ldrh r5, [sp, #168]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #196]
+; CHECK-NEXT: orr r5, r5, r12, lsl #16
+; CHECK-NEXT: str r5, [r0, #56]
+; CHECK-NEXT: str r1, [r0, #52]
+; CHECK-NEXT: ldrh r1, [sp, #164]
+; CHECK-NEXT: ldrh r6, [sp, #72]
+; CHECK-NEXT: ldrh r5, [sp, #40]
+; CHECK-NEXT: orr r1, r1, r7, lsl #16
+; CHECK-NEXT: ldrh r12, [sp, #68]
+; CHECK-NEXT: orr r5, r5, r6, lsl #16
+; CHECK-NEXT: str r5, [r0, #48]
+; CHECK-NEXT: str r1, [r0, #44]
+; CHECK-NEXT: ldrh r1, [sp, #36]
+; CHECK-NEXT: ldrh r4, [sp, #132]
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: orr r4, r5, r4, lsl #16
+; CHECK-NEXT: str r4, [r0, #40]
+; CHECK-NEXT: str r1, [r0, #36]
+; CHECK-NEXT: ldrh r1, [sp, #96]
+; CHECK-NEXT: ldrh lr, [sp, #192]
+; CHECK-NEXT: ldrh r4, [sp, #160]
+; CHECK-NEXT: orr r1, r1, r6, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #188]
+; CHECK-NEXT: orr r4, r4, lr, lsl #16
+; CHECK-NEXT: str r4, [r0, #32]
+; CHECK-NEXT: str r1, [r0, #28]
+; CHECK-NEXT: ldrh r1, [sp, #156]
+; CHECK-NEXT: ldrh r7, [sp, #64]
+; CHECK-NEXT: ldrh r4, [sp, #32]
+; CHECK-NEXT: orr r1, r1, r5, lsl #16
+; CHECK-NEXT: ldrh r12, [sp, #124]
+; CHECK-NEXT: orr r4, r4, r7, lsl #16
+; CHECK-NEXT: str r4, [r0, #24]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: ldrh lr, [sp, #184]
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: ldrh r8, [sp, #120]
+; CHECK-NEXT: pkhbt r1, r3, r1, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #152]
+; CHECK-NEXT: orr r4, r4, r12, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #56]
+; CHECK-NEXT: ldrh r6, [sp, #88]
+; CHECK-NEXT: str r4, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r7, lr, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r6, r8, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r5, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <48 x half> @llvm.vector.interleave6(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2, <8 x half> %vec3, <8 x half> %vec4, <8 x half> %vec5)
+ ret <48 x half> %result
+}
+
+define <64 x half> @interleave8_v8f16(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2, <8 x half> %vec3, <8 x half> %vec4, <8 x half> %vec5, <8 x half> %vec6, <8 x half> %vec7) {
+; CHECK-LABEL: interleave8_v8f16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: add r5, sp, #256
+; CHECK-NEXT: ldrh r1, [sp, #244]
+; CHECK-NEXT: ldrh r12, [sp, #212]
+; CHECK-NEXT: ldrh r7, [r5, #20]
+; CHECK-NEXT: strh r7, [r0, #126]
+; CHECK-NEXT: strh r1, [r0, #124]
+; CHECK-NEXT: add r1, sp, #256
+; CHECK-NEXT: ldrh lr, [sp, #180]
+; CHECK-NEXT: ldrh r4, [sp, #148]
+; CHECK-NEXT: ldrh r9, [sp, #116]
+; CHECK-NEXT: ldrh r8, [sp, #84]
+; CHECK-NEXT: ldrh r7, [sp, #52]
+; CHECK-NEXT: ldrh r1, [r1, #16]
+; CHECK-NEXT: ldrh r6, [sp, #240]
+; CHECK-NEXT: strh r12, [r0, #122]
+; CHECK-NEXT: strh lr, [r0, #120]
+; CHECK-NEXT: strh r4, [r0, #118]
+; CHECK-NEXT: strh r9, [r0, #116]
+; CHECK-NEXT: strh r8, [r0, #114]
+; CHECK-NEXT: add r8, sp, #256
+; CHECK-NEXT: strh r7, [r0, #112]
+; CHECK-NEXT: strh r1, [r0, #110]
+; CHECK-NEXT: strh r6, [r0, #108]
+; CHECK-NEXT: add r6, sp, #256
+; CHECK-NEXT: ldrh r5, [sp, #208]
+; CHECK-NEXT: strh r5, [r0, #106]
+; CHECK-NEXT: ldrh r4, [sp, #176]
+; CHECK-NEXT: ldrh r12, [sp, #144]
+; CHECK-NEXT: ldrh lr, [sp, #112]
+; CHECK-NEXT: ldrh r7, [sp, #80]
+; CHECK-NEXT: ldrh r1, [sp, #48]
+; CHECK-NEXT: ldrh r6, [r6, #12]
+; CHECK-NEXT: ldrh r5, [sp, #236]
+; CHECK-NEXT: strh r4, [r0, #104]
+; CHECK-NEXT: strh r12, [r0, #102]
+; CHECK-NEXT: strh lr, [r0, #100]
+; CHECK-NEXT: strh r7, [r0, #98]
+; CHECK-NEXT: strh r1, [r0, #96]
+; CHECK-NEXT: strh r6, [r0, #94]
+; CHECK-NEXT: strh r5, [r0, #92]
+; CHECK-NEXT: add r5, sp, #256
+; CHECK-NEXT: ldrh r4, [sp, #204]
+; CHECK-NEXT: strh r4, [r0, #90]
+; CHECK-NEXT: ldrh r12, [sp, #172]
+; CHECK-NEXT: ldrh lr, [sp, #140]
+; CHECK-NEXT: ldrh r7, [sp, #108]
+; CHECK-NEXT: ldrh r1, [sp, #76]
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: ldrh r5, [r5, #8]
+; CHECK-NEXT: ldrh r4, [sp, #232]
+; CHECK-NEXT: strh r12, [r0, #88]
+; CHECK-NEXT: strh lr, [r0, #86]
+; CHECK-NEXT: strh r7, [r0, #84]
+; CHECK-NEXT: strh r1, [r0, #82]
+; CHECK-NEXT: strh r6, [r0, #80]
+; CHECK-NEXT: strh r5, [r0, #78]
+; CHECK-NEXT: strh r4, [r0, #76]
+; CHECK-NEXT: add r4, sp, #256
+; CHECK-NEXT: ldrh r12, [sp, #200]
+; CHECK-NEXT: strh r12, [r0, #74]
+; CHECK-NEXT: ldrh lr, [sp, #168]
+; CHECK-NEXT: ldrh r7, [sp, #136]
+; CHECK-NEXT: ldrh r1, [sp, #104]
+; CHECK-NEXT: ldrh r6, [sp, #72]
+; CHECK-NEXT: ldrh r5, [sp, #40]
+; CHECK-NEXT: ldrh r4, [r4, #4]
+; CHECK-NEXT: ldrh r12, [sp, #228]
+; CHECK-NEXT: strh lr, [r0, #72]
+; CHECK-NEXT: strh r7, [r0, #70]
+; CHECK-NEXT: strh r1, [r0, #68]
+; CHECK-NEXT: strh r6, [r0, #66]
+; CHECK-NEXT: strh r5, [r0, #64]
+; CHECK-NEXT: strh r4, [r0, #62]
+; CHECK-NEXT: strh r12, [r0, #60]
+; CHECK-NEXT: ldrh lr, [sp, #196]
+; CHECK-NEXT: ldrh r7, [sp, #164]
+; CHECK-NEXT: ldrh r1, [sp, #132]
+; CHECK-NEXT: ldrh r6, [sp, #100]
+; CHECK-NEXT: ldrh r5, [sp, #68]
+; CHECK-NEXT: ldrh r4, [sp, #36]
+; CHECK-NEXT: ldrh r12, [r8]
+; CHECK-NEXT: strh lr, [r0, #58]
+; CHECK-NEXT: strh r7, [r0, #56]
+; CHECK-NEXT: strh r1, [r0, #54]
+; CHECK-NEXT: strh r6, [r0, #52]
+; CHECK-NEXT: strh r5, [r0, #50]
+; CHECK-NEXT: strh r4, [r0, #48]
+; CHECK-NEXT: strh r12, [r0, #46]
+; CHECK-NEXT: ldrh lr, [sp, #224]
+; CHECK-NEXT: ldrh r7, [sp, #192]
+; CHECK-NEXT: ldrh r1, [sp, #160]
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: ldrh r5, [sp, #96]
+; CHECK-NEXT: ldrh r4, [sp, #64]
+; CHECK-NEXT: ldrh r12, [sp, #32]
+; CHECK-NEXT: strh lr, [r0, #44]
+; CHECK-NEXT: strh r7, [r0, #42]
+; CHECK-NEXT: strh r1, [r0, #40]
+; CHECK-NEXT: strh r6, [r0, #38]
+; CHECK-NEXT: strh r5, [r0, #36]
+; CHECK-NEXT: strh r4, [r0, #34]
+; CHECK-NEXT: strh r12, [r0, #32]
+; CHECK-NEXT: ldrh lr, [sp, #252]
+; CHECK-NEXT: ldrh r7, [sp, #220]
+; CHECK-NEXT: ldrh r1, [sp, #188]
+; CHECK-NEXT: ldrh r6, [sp, #156]
+; CHECK-NEXT: ldrh r5, [sp, #124]
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: ldrh r12, [sp, #60]
+; CHECK-NEXT: strh lr, [r0, #30]
+; CHECK-NEXT: strh r7, [r0, #28]
+; CHECK-NEXT: strh r1, [r0, #26]
+; CHECK-NEXT: strh r6, [r0, #24]
+; CHECK-NEXT: strh r5, [r0, #22]
+; CHECK-NEXT: strh r4, [r0, #20]
+; CHECK-NEXT: strh r12, [r0, #18]
+; CHECK-NEXT: strh r3, [r0, #16]
+; CHECK-NEXT: ldrh lr, [sp, #248]
+; CHECK-NEXT: ldrh r7, [sp, #216]
+; CHECK-NEXT: ldrh r1, [sp, #184]
+; CHECK-NEXT: ldrh r6, [sp, #152]
+; CHECK-NEXT: ldrh r5, [sp, #120]
+; CHECK-NEXT: ldrh r4, [sp, #88]
+; CHECK-NEXT: ldrh r3, [sp, #56]
+; CHECK-NEXT: strh lr, [r0, #14]
+; CHECK-NEXT: strh r7, [r0, #12]
+; CHECK-NEXT: strh r1, [r0, #10]
+; CHECK-NEXT: strh r6, [r0, #8]
+; CHECK-NEXT: strh r5, [r0, #6]
+; CHECK-NEXT: strh r4, [r0, #4]
+; CHECK-NEXT: strh r3, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <64 x half> @llvm.vector.interleave8(<8 x half> %vec0, <8 x half> %vec1, <8 x half> %vec2, <8 x half> %vec3, <8 x half> %vec4, <8 x half> %vec5, <8 x half> %vec6, <8 x half> %vec7)
+ ret <64 x half> %result
+}
+
+define <8 x bfloat> @interleave2_v4bf16(<4 x bfloat> %vec0, <4 x bfloat> %vec1) {
+; CHECK-LABEL: interleave2_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, lr}
+; CHECK-NEXT: push {r4, r5, r6, lr}
+; CHECK-NEXT: ldrh r6, [sp, #36]
+; CHECK-NEXT: ldrh r1, [sp, #20]
+; CHECK-NEXT: ldrh r12, [sp, #32]
+; CHECK-NEXT: ldrh lr, [sp, #16]
+; CHECK-NEXT: ldrh r4, [sp, #28]
+; CHECK-NEXT: ldrh r5, [sp, #24]
+; CHECK-NEXT: strh r6, [r0, #14]
+; CHECK-NEXT: strh r1, [r0, #12]
+; CHECK-NEXT: strh r12, [r0, #10]
+; CHECK-NEXT: strh lr, [r0, #8]
+; CHECK-NEXT: strh r4, [r0, #6]
+; CHECK-NEXT: strh r3, [r0, #4]
+; CHECK-NEXT: strh r5, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, pc}
+ %result = call <8 x bfloat> @llvm.vector.interleave2(<4 x bfloat> %vec0, <4 x bfloat> %vec1)
+ ret <8 x bfloat> %result
+}
+
+define <12 x bfloat> @interleave3_v4bf16(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2) {
+; CHECK-LABEL: interleave3_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, lr}
+; CHECK-NEXT: ldrh r12, [sp, #60]
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: ldrh lr, [sp, #40]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #28]
+; CHECK-NEXT: ldrh r6, [sp, #56]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #24]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: ldrh r4, [sp, #52]
+; CHECK-NEXT: ldrh r5, [sp, #36]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r8, [sp, #32]
+; CHECK-NEXT: ldrh r6, [sp, #48]
+; CHECK-NEXT: str r7, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r5, r4, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r6, r3, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r8, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, pc}
+ %result = call <12 x bfloat> @llvm.vector.interleave3(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2)
+ ret <12 x bfloat> %result
+}
+
+define <16 x bfloat> @interleave4_v4bf16(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2, <4 x bfloat> %vec3) {
+; CHECK-LABEL: interleave4_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: .pad #4
+; CHECK-NEXT: sub sp, sp, #4
+; CHECK-NEXT: ldrh r7, [sp, #92]
+; CHECK-NEXT: ldrh r1, [sp, #76]
+; CHECK-NEXT: ldrh r12, [sp, #60]
+; CHECK-NEXT: ldrh lr, [sp, #44]
+; CHECK-NEXT: ldrh r4, [sp, #88]
+; CHECK-NEXT: strh r7, [r0, #30]
+; CHECK-NEXT: strh r1, [r0, #28]
+; CHECK-NEXT: strh r12, [r0, #26]
+; CHECK-NEXT: strh lr, [r0, #24]
+; CHECK-NEXT: strh r4, [r0, #22]
+; CHECK-NEXT: ldrh r9, [sp, #72]
+; CHECK-NEXT: ldrh r8, [sp, #56]
+; CHECK-NEXT: ldrh r10, [sp, #40]
+; CHECK-NEXT: ldrh r11, [sp, #84]
+; CHECK-NEXT: ldrh r6, [sp, #68]
+; CHECK-NEXT: ldrh r5, [sp, #52]
+; CHECK-NEXT: ldrh r4, [sp, #80]
+; CHECK-NEXT: ldrh r7, [sp, #64]
+; CHECK-NEXT: ldrh r1, [sp, #48]
+; CHECK-NEXT: strh r9, [r0, #20]
+; CHECK-NEXT: strh r8, [r0, #18]
+; CHECK-NEXT: strh r10, [r0, #16]
+; CHECK-NEXT: strh r11, [r0, #14]
+; CHECK-NEXT: strh r6, [r0, #12]
+; CHECK-NEXT: strh r5, [r0, #10]
+; CHECK-NEXT: strh r3, [r0, #8]
+; CHECK-NEXT: strh r4, [r0, #6]
+; CHECK-NEXT: strh r7, [r0, #4]
+; CHECK-NEXT: strh r1, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: add sp, sp, #4
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+ %result = call <16 x bfloat> @llvm.vector.interleave4(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2, <4 x bfloat> %vec3)
+ ret <16 x bfloat> %result
+}
+
+define <24 x bfloat> @interleave6_v4bf16(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2, <4 x bfloat> %vec3, <4 x bfloat> %vec4, <4 x bfloat> %vec5) {
+; CHECK-LABEL: interleave6_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r12, [sp, #116]
+; CHECK-NEXT: ldrh r1, [sp, #100]
+; CHECK-NEXT: ldrh lr, [sp, #52]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #44]
+; CHECK-NEXT: ldrh r1, [sp, #36]
+; CHECK-NEXT: ldrh r7, [sp, #84]
+; CHECK-NEXT: ldrh r6, [sp, #68]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r9, [sp, #80]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: str r7, [r0, #40]
+; CHECK-NEXT: str r1, [r0, #36]
+; CHECK-NEXT: ldrh r1, [sp, #64]
+; CHECK-NEXT: ldrh r4, [sp, #112]
+; CHECK-NEXT: ldrh r7, [sp, #96]
+; CHECK-NEXT: orr r1, r1, r9, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #108]
+; CHECK-NEXT: orr r7, r7, r4, lsl #16
+; CHECK-NEXT: str r7, [r0, #32]
+; CHECK-NEXT: str r1, [r0, #28]
+; CHECK-NEXT: ldrh r1, [sp, #92]
+; CHECK-NEXT: ldrh r8, [sp, #48]
+; CHECK-NEXT: ldrh r7, [sp, #32]
+; CHECK-NEXT: orr r1, r1, r6, lsl #16
+; CHECK-NEXT: ldrh lr, [sp, #76]
+; CHECK-NEXT: orr r7, r7, r8, lsl #16
+; CHECK-NEXT: str r7, [r0, #24]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: ldrh r12, [sp, #104]
+; CHECK-NEXT: ldrh r7, [sp, #60]
+; CHECK-NEXT: ldrh r9, [sp, #72]
+; CHECK-NEXT: pkhbt r1, r3, r1, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #88]
+; CHECK-NEXT: orr r7, r7, lr, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #40]
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: str r7, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r5, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r4, r9, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r6, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <24 x bfloat> @llvm.vector.interleave6(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2, <4 x bfloat> %vec3, <4 x bfloat> %vec4, <4 x bfloat> %vec5)
+ ret <24 x bfloat> %result
+}
+
+define <32 x bfloat> @interleave8_v4bf16(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2, <4 x bfloat> %vec3, <4 x bfloat> %vec4, <4 x bfloat> %vec5, <4 x bfloat> %vec6, <4 x bfloat> %vec7) {
+; CHECK-LABEL: interleave8_v4bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r7, [sp, #148]
+; CHECK-NEXT: strh r7, [r0, #62]
+; CHECK-NEXT: ldrh r1, [sp, #132]
+; CHECK-NEXT: ldrh r12, [sp, #116]
+; CHECK-NEXT: ldrh lr, [sp, #100]
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: ldrh r9, [sp, #68]
+; CHECK-NEXT: ldrh r8, [sp, #52]
+; CHECK-NEXT: ldrh r7, [sp, #36]
+; CHECK-NEXT: strh r1, [r0, #60]
+; CHECK-NEXT: strh r12, [r0, #58]
+; CHECK-NEXT: strh lr, [r0, #56]
+; CHECK-NEXT: strh r4, [r0, #54]
+; CHECK-NEXT: strh r9, [r0, #52]
+; CHECK-NEXT: strh r8, [r0, #50]
+; CHECK-NEXT: strh r7, [r0, #48]
+; CHECK-NEXT: ldrh r1, [sp, #144]
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: ldrh r5, [sp, #112]
+; CHECK-NEXT: ldrh r4, [sp, #96]
+; CHECK-NEXT: ldrh r12, [sp, #80]
+; CHECK-NEXT: ldrh lr, [sp, #64]
+; CHECK-NEXT: ldrh r7, [sp, #48]
+; CHECK-NEXT: strh r1, [r0, #46]
+; CHECK-NEXT: strh r6, [r0, #44]
+; CHECK-NEXT: strh r5, [r0, #42]
+; CHECK-NEXT: strh r4, [r0, #40]
+; CHECK-NEXT: strh r12, [r0, #38]
+; CHECK-NEXT: strh lr, [r0, #36]
+; CHECK-NEXT: strh r7, [r0, #34]
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: ldrh r6, [sp, #140]
+; CHECK-NEXT: ldrh r5, [sp, #124]
+; CHECK-NEXT: ldrh r4, [sp, #108]
+; CHECK-NEXT: ldrh r12, [sp, #92]
+; CHECK-NEXT: ldrh lr, [sp, #76]
+; CHECK-NEXT: ldrh r7, [sp, #60]
+; CHECK-NEXT: ldrh r9, [sp, #44]
+; CHECK-NEXT: strh r1, [r0, #32]
+; CHECK-NEXT: strh r6, [r0, #30]
+; CHECK-NEXT: strh r5, [r0, #28]
+; CHECK-NEXT: strh r4, [r0, #26]
+; CHECK-NEXT: strh r12, [r0, #24]
+; CHECK-NEXT: strh lr, [r0, #22]
+; CHECK-NEXT: strh r7, [r0, #20]
+; CHECK-NEXT: strh r9, [r0, #18]
+; CHECK-NEXT: strh r3, [r0, #16]
+; CHECK-NEXT: ldrh r8, [sp, #136]
+; CHECK-NEXT: ldrh r5, [sp, #120]
+; CHECK-NEXT: ldrh r4, [sp, #104]
+; CHECK-NEXT: ldrh r6, [sp, #88]
+; CHECK-NEXT: ldrh r1, [sp, #72]
+; CHECK-NEXT: ldrh r7, [sp, #56]
+; CHECK-NEXT: ldrh r3, [sp, #40]
+; CHECK-NEXT: strh r8, [r0, #14]
+; CHECK-NEXT: strh r5, [r0, #12]
+; CHECK-NEXT: strh r4, [r0, #10]
+; CHECK-NEXT: strh r6, [r0, #8]
+; CHECK-NEXT: strh r1, [r0, #6]
+; CHECK-NEXT: strh r7, [r0, #4]
+; CHECK-NEXT: strh r3, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <32 x bfloat> @llvm.vector.interleave8(<4 x bfloat> %vec0, <4 x bfloat> %vec1, <4 x bfloat> %vec2, <4 x bfloat> %vec3, <4 x bfloat> %vec4, <4 x bfloat> %vec5, <4 x bfloat> %vec6, <4 x bfloat> %vec7)
+ ret <32 x bfloat> %result
+}
+
+define <16 x bfloat> @interleave2_v8bf16(<8 x bfloat> %vec0, <8 x bfloat> %vec1) {
+; CHECK-LABEL: interleave2_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; CHECK-NEXT: .pad #4
+; CHECK-NEXT: sub sp, sp, #4
+; CHECK-NEXT: ldrh r7, [sp, #92]
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: ldrh r12, [sp, #88]
+; CHECK-NEXT: ldrh lr, [sp, #56]
+; CHECK-NEXT: ldrh r4, [sp, #84]
+; CHECK-NEXT: strh r7, [r0, #30]
+; CHECK-NEXT: strh r1, [r0, #28]
+; CHECK-NEXT: strh r12, [r0, #26]
+; CHECK-NEXT: strh lr, [r0, #24]
+; CHECK-NEXT: strh r4, [r0, #22]
+; CHECK-NEXT: ldrh r9, [sp, #52]
+; CHECK-NEXT: ldrh r8, [sp, #80]
+; CHECK-NEXT: ldrh r10, [sp, #48]
+; CHECK-NEXT: ldrh r11, [sp, #76]
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: ldrh r5, [sp, #72]
+; CHECK-NEXT: ldrh r4, [sp, #40]
+; CHECK-NEXT: ldrh r7, [sp, #68]
+; CHECK-NEXT: ldrh r1, [sp, #64]
+; CHECK-NEXT: strh r9, [r0, #20]
+; CHECK-NEXT: strh r8, [r0, #18]
+; CHECK-NEXT: strh r10, [r0, #16]
+; CHECK-NEXT: strh r11, [r0, #14]
+; CHECK-NEXT: strh r6, [r0, #12]
+; CHECK-NEXT: strh r5, [r0, #10]
+; CHECK-NEXT: strh r4, [r0, #8]
+; CHECK-NEXT: strh r7, [r0, #6]
+; CHECK-NEXT: strh r3, [r0, #4]
+; CHECK-NEXT: strh r1, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: add sp, sp, #4
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+ %result = call <16 x bfloat> @llvm.vector.interleave2(<8 x bfloat> %vec0, <8 x bfloat> %vec1)
+ ret <16 x bfloat> %result
+}
+
+define <24 x bfloat> @interleave3_v8bf16(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2) {
+; CHECK-LABEL: interleave3_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: ldrh r12, [sp, #116]
+; CHECK-NEXT: ldrh r1, [sp, #84]
+; CHECK-NEXT: ldrh lr, [sp, #80]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #44]
+; CHECK-NEXT: ldrh r1, [sp, #48]
+; CHECK-NEXT: ldrh r7, [sp, #52]
+; CHECK-NEXT: ldrh r6, [sp, #112]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r9, [sp, #44]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: str r7, [r0, #40]
+; CHECK-NEXT: str r1, [r0, #36]
+; CHECK-NEXT: ldrh r1, [sp, #104]
+; CHECK-NEXT: ldrh r4, [sp, #108]
+; CHECK-NEXT: ldrh r7, [sp, #76]
+; CHECK-NEXT: orr r1, r1, r9, lsl #16
+; CHECK-NEXT: ldrh r10, [sp, #100]
+; CHECK-NEXT: orr r7, r7, r4, lsl #16
+; CHECK-NEXT: str r7, [r0, #32]
+; CHECK-NEXT: str r1, [r0, #28]
+; CHECK-NEXT: ldrh r1, [sp, #68]
+; CHECK-NEXT: ldrh r8, [sp, #72]
+; CHECK-NEXT: ldrh r7, [sp, #40]
+; CHECK-NEXT: orr r1, r1, r10, lsl #16
+; CHECK-NEXT: ldrh lr, [sp, #64]
+; CHECK-NEXT: orr r7, r7, r8, lsl #16
+; CHECK-NEXT: str r7, [r0, #24]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #32]
+; CHECK-NEXT: ldrh r12, [sp, #36]
+; CHECK-NEXT: ldrh r9, [sp, #92]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #96]
+; CHECK-NEXT: ldrh r6, [sp, #60]
+; CHECK-NEXT: ldrh r4, [sp, #56]
+; CHECK-NEXT: orr r7, r7, r12, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #88]
+; CHECK-NEXT: str r7, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r6, r9, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r5, r3, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r4, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, pc}
+ %result = call <24 x bfloat> @llvm.vector.interleave3(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2)
+ ret <24 x bfloat> %result
+}
+
+define <32 x bfloat> @interleave4_v8bf16(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2, <8 x bfloat> %vec3) {
+; CHECK-LABEL: interleave4_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r10, lr}
+; CHECK-NEXT: ldrh r7, [sp, #148]
+; CHECK-NEXT: strh r7, [r0, #62]
+; CHECK-NEXT: ldrh r1, [sp, #116]
+; CHECK-NEXT: ldrh r12, [sp, #84]
+; CHECK-NEXT: ldrh lr, [sp, #52]
+; CHECK-NEXT: ldrh r4, [sp, #144]
+; CHECK-NEXT: ldrh r9, [sp, #112]
+; CHECK-NEXT: ldrh r8, [sp, #80]
+; CHECK-NEXT: ldrh r7, [sp, #48]
+; CHECK-NEXT: strh r1, [r0, #60]
+; CHECK-NEXT: strh r12, [r0, #58]
+; CHECK-NEXT: strh lr, [r0, #56]
+; CHECK-NEXT: strh r4, [r0, #54]
+; CHECK-NEXT: strh r9, [r0, #52]
+; CHECK-NEXT: strh r8, [r0, #50]
+; CHECK-NEXT: strh r7, [r0, #48]
+; CHECK-NEXT: ldrh r1, [sp, #140]
+; CHECK-NEXT: ldrh r6, [sp, #108]
+; CHECK-NEXT: ldrh r5, [sp, #76]
+; CHECK-NEXT: ldrh r4, [sp, #44]
+; CHECK-NEXT: ldrh r12, [sp, #136]
+; CHECK-NEXT: ldrh lr, [sp, #104]
+; CHECK-NEXT: ldrh r7, [sp, #72]
+; CHECK-NEXT: strh r1, [r0, #46]
+; CHECK-NEXT: strh r6, [r0, #44]
+; CHECK-NEXT: strh r5, [r0, #42]
+; CHECK-NEXT: strh r4, [r0, #40]
+; CHECK-NEXT: strh r12, [r0, #38]
+; CHECK-NEXT: strh lr, [r0, #36]
+; CHECK-NEXT: strh r7, [r0, #34]
+; CHECK-NEXT: ldrh r1, [sp, #40]
+; CHECK-NEXT: ldrh r6, [sp, #132]
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: ldrh r4, [sp, #68]
+; CHECK-NEXT: ldrh r12, [sp, #36]
+; CHECK-NEXT: ldrh lr, [sp, #128]
+; CHECK-NEXT: ldrh r7, [sp, #96]
+; CHECK-NEXT: strh r1, [r0, #32]
+; CHECK-NEXT: strh r6, [r0, #30]
+; CHECK-NEXT: strh r5, [r0, #28]
+; CHECK-NEXT: strh r4, [r0, #26]
+; CHECK-NEXT: strh r12, [r0, #24]
+; CHECK-NEXT: strh lr, [r0, #22]
+; CHECK-NEXT: strh r7, [r0, #20]
+; CHECK-NEXT: ldrh r8, [sp, #64]
+; CHECK-NEXT: ldrh r9, [sp, #32]
+; CHECK-NEXT: ldrh r10, [sp, #124]
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: ldrh r6, [sp, #120]
+; CHECK-NEXT: ldrh r7, [sp, #88]
+; CHECK-NEXT: ldrh r5, [sp, #56]
+; CHECK-NEXT: strh r8, [r0, #18]
+; CHECK-NEXT: strh r9, [r0, #16]
+; CHECK-NEXT: strh r10, [r0, #14]
+; CHECK-NEXT: strh r4, [r0, #12]
+; CHECK-NEXT: strh r1, [r0, #10]
+; CHECK-NEXT: strh r3, [r0, #8]
+; CHECK-NEXT: strh r6, [r0, #6]
+; CHECK-NEXT: strh r7, [r0, #4]
+; CHECK-NEXT: strh r5, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, pc}
+ %result = call <32 x bfloat> @llvm.vector.interleave4(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2, <8 x bfloat> %vec3)
+ ret <32 x bfloat> %result
+}
+
+
+define <48 x bfloat> @interleave6_v8bf16(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2, <8 x bfloat> %vec3, <8 x bfloat> %vec4, <8 x bfloat> %vec5) {
+; CHECK-LABEL: interleave6_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: ldrh r12, [sp, #212]
+; CHECK-NEXT: ldrh r1, [sp, #180]
+; CHECK-NEXT: ldrh lr, [sp, #84]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: str r1, [r0, #92]
+; CHECK-NEXT: ldrh r1, [sp, #52]
+; CHECK-NEXT: ldrh r7, [sp, #148]
+; CHECK-NEXT: ldrh r6, [sp, #116]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r9, [sp, #144]
+; CHECK-NEXT: orr r7, r6, r7, lsl #16
+; CHECK-NEXT: str r7, [r0, #88]
+; CHECK-NEXT: str r1, [r0, #84]
+; CHECK-NEXT: ldrh r1, [sp, #112]
+; CHECK-NEXT: ldrh r4, [sp, #208]
+; CHECK-NEXT: ldrh r7, [sp, #176]
+; CHECK-NEXT: orr r1, r1, r9, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #204]
+; CHECK-NEXT: orr r7, r7, r4, lsl #16
+; CHECK-NEXT: str r7, [r0, #80]
+; CHECK-NEXT: str r1, [r0, #76]
+; CHECK-NEXT: ldrh r1, [sp, #172]
+; CHECK-NEXT: ldrh r8, [sp, #80]
+; CHECK-NEXT: ldrh r7, [sp, #48]
+; CHECK-NEXT: orr r1, r1, r6, lsl #16
+; CHECK-NEXT: ldrh r4, [sp, #76]
+; CHECK-NEXT: orr r7, r7, r8, lsl #16
+; CHECK-NEXT: str r7, [r0, #72]
+; CHECK-NEXT: str r1, [r0, #68]
+; CHECK-NEXT: ldrh r1, [sp, #44]
+; CHECK-NEXT: ldrh r5, [sp, #140]
+; CHECK-NEXT: ldrh r7, [sp, #108]
+; CHECK-NEXT: orr r1, r1, r4, lsl #16
+; CHECK-NEXT: ldrh lr, [sp, #136]
+; CHECK-NEXT: orr r5, r7, r5, lsl #16
+; CHECK-NEXT: str r5, [r0, #64]
+; CHECK-NEXT: str r1, [r0, #60]
+; CHECK-NEXT: ldrh r1, [sp, #104]
+; CHECK-NEXT: ldrh r12, [sp, #200]
+; CHECK-NEXT: ldrh r5, [sp, #168]
+; CHECK-NEXT: orr r1, r1, lr, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #196]
+; CHECK-NEXT: orr r5, r5, r12, lsl #16
+; CHECK-NEXT: str r5, [r0, #56]
+; CHECK-NEXT: str r1, [r0, #52]
+; CHECK-NEXT: ldrh r1, [sp, #164]
+; CHECK-NEXT: ldrh r6, [sp, #72]
+; CHECK-NEXT: ldrh r5, [sp, #40]
+; CHECK-NEXT: orr r1, r1, r7, lsl #16
+; CHECK-NEXT: ldrh r12, [sp, #68]
+; CHECK-NEXT: orr r5, r5, r6, lsl #16
+; CHECK-NEXT: str r5, [r0, #48]
+; CHECK-NEXT: str r1, [r0, #44]
+; CHECK-NEXT: ldrh r1, [sp, #36]
+; CHECK-NEXT: ldrh r4, [sp, #132]
+; CHECK-NEXT: ldrh r5, [sp, #100]
+; CHECK-NEXT: orr r1, r1, r12, lsl #16
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: orr r4, r5, r4, lsl #16
+; CHECK-NEXT: str r4, [r0, #40]
+; CHECK-NEXT: str r1, [r0, #36]
+; CHECK-NEXT: ldrh r1, [sp, #96]
+; CHECK-NEXT: ldrh lr, [sp, #192]
+; CHECK-NEXT: ldrh r4, [sp, #160]
+; CHECK-NEXT: orr r1, r1, r6, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #188]
+; CHECK-NEXT: orr r4, r4, lr, lsl #16
+; CHECK-NEXT: str r4, [r0, #32]
+; CHECK-NEXT: str r1, [r0, #28]
+; CHECK-NEXT: ldrh r1, [sp, #156]
+; CHECK-NEXT: ldrh r7, [sp, #64]
+; CHECK-NEXT: ldrh r4, [sp, #32]
+; CHECK-NEXT: orr r1, r1, r5, lsl #16
+; CHECK-NEXT: ldrh r12, [sp, #124]
+; CHECK-NEXT: orr r4, r4, r7, lsl #16
+; CHECK-NEXT: str r4, [r0, #24]
+; CHECK-NEXT: str r1, [r0, #20]
+; CHECK-NEXT: ldrh r1, [sp, #60]
+; CHECK-NEXT: ldrh lr, [sp, #184]
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: ldrh r8, [sp, #120]
+; CHECK-NEXT: pkhbt r1, r3, r1, lsl #16
+; CHECK-NEXT: ldrh r7, [sp, #152]
+; CHECK-NEXT: orr r4, r4, r12, lsl #16
+; CHECK-NEXT: ldrh r5, [sp, #56]
+; CHECK-NEXT: ldrh r6, [sp, #88]
+; CHECK-NEXT: str r4, [r0, #16]
+; CHECK-NEXT: str r1, [r0, #12]
+; CHECK-NEXT: orr r1, r7, lr, lsl #16
+; CHECK-NEXT: str r1, [r0, #8]
+; CHECK-NEXT: orr r1, r6, r8, lsl #16
+; CHECK-NEXT: str r1, [r0, #4]
+; CHECK-NEXT: pkhbt r1, r2, r5, lsl #16
+; CHECK-NEXT: str r1, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <48 x bfloat> @llvm.vector.interleave6(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2, <8 x bfloat> %vec3, <8 x bfloat> %vec4, <8 x bfloat> %vec5)
+ ret <48 x bfloat> %result
+}
+
+define <64 x bfloat> @interleave8_v8bf16(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2, <8 x bfloat> %vec3, <8 x bfloat> %vec4, <8 x bfloat> %vec5, <8 x bfloat> %vec6, <8 x bfloat> %vec7) {
+; CHECK-LABEL: interleave8_v8bf16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: push {r4, r5, r6, r7, r8, r9, r11, lr}
+; CHECK-NEXT: add r5, sp, #256
+; CHECK-NEXT: ldrh r1, [sp, #244]
+; CHECK-NEXT: ldrh r12, [sp, #212]
+; CHECK-NEXT: ldrh r7, [r5, #20]
+; CHECK-NEXT: strh r7, [r0, #126]
+; CHECK-NEXT: strh r1, [r0, #124]
+; CHECK-NEXT: add r1, sp, #256
+; CHECK-NEXT: ldrh lr, [sp, #180]
+; CHECK-NEXT: ldrh r4, [sp, #148]
+; CHECK-NEXT: ldrh r9, [sp, #116]
+; CHECK-NEXT: ldrh r8, [sp, #84]
+; CHECK-NEXT: ldrh r7, [sp, #52]
+; CHECK-NEXT: ldrh r1, [r1, #16]
+; CHECK-NEXT: ldrh r6, [sp, #240]
+; CHECK-NEXT: strh r12, [r0, #122]
+; CHECK-NEXT: strh lr, [r0, #120]
+; CHECK-NEXT: strh r4, [r0, #118]
+; CHECK-NEXT: strh r9, [r0, #116]
+; CHECK-NEXT: strh r8, [r0, #114]
+; CHECK-NEXT: add r8, sp, #256
+; CHECK-NEXT: strh r7, [r0, #112]
+; CHECK-NEXT: strh r1, [r0, #110]
+; CHECK-NEXT: strh r6, [r0, #108]
+; CHECK-NEXT: add r6, sp, #256
+; CHECK-NEXT: ldrh r5, [sp, #208]
+; CHECK-NEXT: strh r5, [r0, #106]
+; CHECK-NEXT: ldrh r4, [sp, #176]
+; CHECK-NEXT: ldrh r12, [sp, #144]
+; CHECK-NEXT: ldrh lr, [sp, #112]
+; CHECK-NEXT: ldrh r7, [sp, #80]
+; CHECK-NEXT: ldrh r1, [sp, #48]
+; CHECK-NEXT: ldrh r6, [r6, #12]
+; CHECK-NEXT: ldrh r5, [sp, #236]
+; CHECK-NEXT: strh r4, [r0, #104]
+; CHECK-NEXT: strh r12, [r0, #102]
+; CHECK-NEXT: strh lr, [r0, #100]
+; CHECK-NEXT: strh r7, [r0, #98]
+; CHECK-NEXT: strh r1, [r0, #96]
+; CHECK-NEXT: strh r6, [r0, #94]
+; CHECK-NEXT: strh r5, [r0, #92]
+; CHECK-NEXT: add r5, sp, #256
+; CHECK-NEXT: ldrh r4, [sp, #204]
+; CHECK-NEXT: strh r4, [r0, #90]
+; CHECK-NEXT: ldrh r12, [sp, #172]
+; CHECK-NEXT: ldrh lr, [sp, #140]
+; CHECK-NEXT: ldrh r7, [sp, #108]
+; CHECK-NEXT: ldrh r1, [sp, #76]
+; CHECK-NEXT: ldrh r6, [sp, #44]
+; CHECK-NEXT: ldrh r5, [r5, #8]
+; CHECK-NEXT: ldrh r4, [sp, #232]
+; CHECK-NEXT: strh r12, [r0, #88]
+; CHECK-NEXT: strh lr, [r0, #86]
+; CHECK-NEXT: strh r7, [r0, #84]
+; CHECK-NEXT: strh r1, [r0, #82]
+; CHECK-NEXT: strh r6, [r0, #80]
+; CHECK-NEXT: strh r5, [r0, #78]
+; CHECK-NEXT: strh r4, [r0, #76]
+; CHECK-NEXT: add r4, sp, #256
+; CHECK-NEXT: ldrh r12, [sp, #200]
+; CHECK-NEXT: strh r12, [r0, #74]
+; CHECK-NEXT: ldrh lr, [sp, #168]
+; CHECK-NEXT: ldrh r7, [sp, #136]
+; CHECK-NEXT: ldrh r1, [sp, #104]
+; CHECK-NEXT: ldrh r6, [sp, #72]
+; CHECK-NEXT: ldrh r5, [sp, #40]
+; CHECK-NEXT: ldrh r4, [r4, #4]
+; CHECK-NEXT: ldrh r12, [sp, #228]
+; CHECK-NEXT: strh lr, [r0, #72]
+; CHECK-NEXT: strh r7, [r0, #70]
+; CHECK-NEXT: strh r1, [r0, #68]
+; CHECK-NEXT: strh r6, [r0, #66]
+; CHECK-NEXT: strh r5, [r0, #64]
+; CHECK-NEXT: strh r4, [r0, #62]
+; CHECK-NEXT: strh r12, [r0, #60]
+; CHECK-NEXT: ldrh lr, [sp, #196]
+; CHECK-NEXT: ldrh r7, [sp, #164]
+; CHECK-NEXT: ldrh r1, [sp, #132]
+; CHECK-NEXT: ldrh r6, [sp, #100]
+; CHECK-NEXT: ldrh r5, [sp, #68]
+; CHECK-NEXT: ldrh r4, [sp, #36]
+; CHECK-NEXT: ldrh r12, [r8]
+; CHECK-NEXT: strh lr, [r0, #58]
+; CHECK-NEXT: strh r7, [r0, #56]
+; CHECK-NEXT: strh r1, [r0, #54]
+; CHECK-NEXT: strh r6, [r0, #52]
+; CHECK-NEXT: strh r5, [r0, #50]
+; CHECK-NEXT: strh r4, [r0, #48]
+; CHECK-NEXT: strh r12, [r0, #46]
+; CHECK-NEXT: ldrh lr, [sp, #224]
+; CHECK-NEXT: ldrh r7, [sp, #192]
+; CHECK-NEXT: ldrh r1, [sp, #160]
+; CHECK-NEXT: ldrh r6, [sp, #128]
+; CHECK-NEXT: ldrh r5, [sp, #96]
+; CHECK-NEXT: ldrh r4, [sp, #64]
+; CHECK-NEXT: ldrh r12, [sp, #32]
+; CHECK-NEXT: strh lr, [r0, #44]
+; CHECK-NEXT: strh r7, [r0, #42]
+; CHECK-NEXT: strh r1, [r0, #40]
+; CHECK-NEXT: strh r6, [r0, #38]
+; CHECK-NEXT: strh r5, [r0, #36]
+; CHECK-NEXT: strh r4, [r0, #34]
+; CHECK-NEXT: strh r12, [r0, #32]
+; CHECK-NEXT: ldrh lr, [sp, #252]
+; CHECK-NEXT: ldrh r7, [sp, #220]
+; CHECK-NEXT: ldrh r1, [sp, #188]
+; CHECK-NEXT: ldrh r6, [sp, #156]
+; CHECK-NEXT: ldrh r5, [sp, #124]
+; CHECK-NEXT: ldrh r4, [sp, #92]
+; CHECK-NEXT: ldrh r12, [sp, #60]
+; CHECK-NEXT: strh lr, [r0, #30]
+; CHECK-NEXT: strh r7, [r0, #28]
+; CHECK-NEXT: strh r1, [r0, #26]
+; CHECK-NEXT: strh r6, [r0, #24]
+; CHECK-NEXT: strh r5, [r0, #22]
+; CHECK-NEXT: strh r4, [r0, #20]
+; CHECK-NEXT: strh r12, [r0, #18]
+; CHECK-NEXT: strh r3, [r0, #16]
+; CHECK-NEXT: ldrh lr, [sp, #248]
+; CHECK-NEXT: ldrh r7, [sp, #216]
+; CHECK-NEXT: ldrh r1, [sp, #184]
+; CHECK-NEXT: ldrh r6, [sp, #152]
+; CHECK-NEXT: ldrh r5, [sp, #120]
+; CHECK-NEXT: ldrh r4, [sp, #88]
+; CHECK-NEXT: ldrh r3, [sp, #56]
+; CHECK-NEXT: strh lr, [r0, #14]
+; CHECK-NEXT: strh r7, [r0, #12]
+; CHECK-NEXT: strh r1, [r0, #10]
+; CHECK-NEXT: strh r6, [r0, #8]
+; CHECK-NEXT: strh r5, [r0, #6]
+; CHECK-NEXT: strh r4, [r0, #4]
+; CHECK-NEXT: strh r3, [r0, #2]
+; CHECK-NEXT: strh r2, [r0]
+; CHECK-NEXT: pop {r4, r5, r6, r7, r8, r9, r11, pc}
+ %result = call <64 x bfloat> @llvm.vector.interleave8(<8 x bfloat> %vec0, <8 x bfloat> %vec1, <8 x bfloat> %vec2, <8 x bfloat> %vec3, <8 x bfloat> %vec4, <8 x bfloat> %vec5, <8 x bfloat> %vec6, <8 x bfloat> %vec7)
+ ret <64 x bfloat> %result
+}
+
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK-IADISABLED: {{.*}}
+; CHECK-IAENABLED: {{.*}}
More information about the llvm-commits
mailing list