1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm -mattr=+neon %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @vst1lanei8(i8* %A, <8 x i8>* %B) nounwind { 4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1lanei8: 5*9880d681SAndroid Build Coastguard Worker;Check the (default) alignment. 6*9880d681SAndroid Build Coastguard Worker;CHECK: vst1.8 {d16[3]}, [r0] 7*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %B 8*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <8 x i8> %tmp1, i32 3 9*9880d681SAndroid Build Coastguard Worker store i8 %tmp2, i8* %A, align 8 10*9880d681SAndroid Build Coastguard Worker ret void 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker;Check for a post-increment updating store. 14*9880d681SAndroid Build Coastguard Workerdefine void @vst1lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind { 15*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1lanei8_update: 16*9880d681SAndroid Build Coastguard Worker;CHECK: vst1.8 {d16[3]}, [{{r[0-9]}}]! 17*9880d681SAndroid Build Coastguard Worker %A = load i8*, i8** %ptr 18*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %B 19*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <8 x i8> %tmp1, i32 3 20*9880d681SAndroid Build Coastguard Worker store i8 %tmp2, i8* %A, align 8 21*9880d681SAndroid Build Coastguard Worker %tmp3 = getelementptr i8, i8* %A, i32 1 22*9880d681SAndroid Build Coastguard Worker store i8* %tmp3, i8** %ptr 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine void @vst1lanei16(i16* %A, <4 x i16>* %B) nounwind { 27*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1lanei16: 28*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 16 bits: 29*9880d681SAndroid Build Coastguard Worker;CHECK: vst1.16 {d16[2]}, [r0:16] 30*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %B 31*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <4 x i16> %tmp1, i32 2 32*9880d681SAndroid Build Coastguard Worker store i16 %tmp2, i16* %A, align 8 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine void @vst1lanei32(i32* %A, <2 x i32>* %B) nounwind { 37*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1lanei32: 38*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 32 bits: 39*9880d681SAndroid Build Coastguard Worker;CHECK: vst1.32 {d16[1]}, [r0:32] 40*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %B 41*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <2 x i32> %tmp1, i32 1 42*9880d681SAndroid Build Coastguard Worker store i32 %tmp2, i32* %A, align 8 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine void @vst1lanef(float* %A, <2 x float>* %B) nounwind { 47*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1lanef: 48*9880d681SAndroid Build Coastguard Worker;CHECK: vst1.32 {d16[1]}, [r0:32] 49*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %B 50*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <2 x float> %tmp1, i32 1 51*9880d681SAndroid Build Coastguard Worker store float %tmp2, float* %A 52*9880d681SAndroid Build Coastguard Worker ret void 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine void @vst1laneQi8(i8* %A, <16 x i8>* %B) nounwind { 56*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1laneQi8: 57*9880d681SAndroid Build Coastguard Worker; // Can use scalar load. No need to use vectors. 58*9880d681SAndroid Build Coastguard Worker; // CHE-CK: vst1.8 {d17[1]}, [r0] 59*9880d681SAndroid Build Coastguard Worker %tmp1 = load <16 x i8>, <16 x i8>* %B 60*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <16 x i8> %tmp1, i32 9 61*9880d681SAndroid Build Coastguard Worker store i8 %tmp2, i8* %A, align 8 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine void @vst1laneQi16(i16* %A, <8 x i16>* %B) nounwind { 66*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1laneQi16: 67*9880d681SAndroid Build Coastguard Worker;CHECK: vst1.16 {d17[1]}, [r0:16] 68*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %B 69*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <8 x i16> %tmp1, i32 5 70*9880d681SAndroid Build Coastguard Worker store i16 %tmp2, i16* %A, align 8 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine void @vst1laneQi32(i32* %A, <4 x i32>* %B) nounwind { 75*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1laneQi32: 76*9880d681SAndroid Build Coastguard Worker; // Can use scalar load. No need to use vectors. 77*9880d681SAndroid Build Coastguard Worker; // CHE-CK: vst1.32 {d17[1]}, [r0:32] 78*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %B 79*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <4 x i32> %tmp1, i32 3 80*9880d681SAndroid Build Coastguard Worker store i32 %tmp2, i32* %A, align 8 81*9880d681SAndroid Build Coastguard Worker ret void 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker;Check for a post-increment updating store. 85*9880d681SAndroid Build Coastguard Workerdefine void @vst1laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind { 86*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1laneQi32_update: 87*9880d681SAndroid Build Coastguard Worker; // Can use scalar load. No need to use vectors. 88*9880d681SAndroid Build Coastguard Worker; // CHE-CK: vst1.32 {d17[1]}, [r1:32]! 89*9880d681SAndroid Build Coastguard Worker %A = load i32*, i32** %ptr 90*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %B 91*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <4 x i32> %tmp1, i32 3 92*9880d681SAndroid Build Coastguard Worker store i32 %tmp2, i32* %A, align 8 93*9880d681SAndroid Build Coastguard Worker %tmp3 = getelementptr i32, i32* %A, i32 1 94*9880d681SAndroid Build Coastguard Worker store i32* %tmp3, i32** %ptr 95*9880d681SAndroid Build Coastguard Worker ret void 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine void @vst1laneQf(float* %A, <4 x float>* %B) nounwind { 99*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst1laneQf: 100*9880d681SAndroid Build Coastguard Worker; // Can use scalar load. No need to use vectors. 101*9880d681SAndroid Build Coastguard Worker; // CHE-CK: vst1.32 {d17[1]}, [r0] 102*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x float>, <4 x float>* %B 103*9880d681SAndroid Build Coastguard Worker %tmp2 = extractelement <4 x float> %tmp1, i32 3 104*9880d681SAndroid Build Coastguard Worker store float %tmp2, float* %A 105*9880d681SAndroid Build Coastguard Worker ret void 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind { 109*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2lanei8: 110*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 16 bits: 111*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.8 {d16[1], d17[1]}, [r0:16] 112*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %B 113*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 4) 114*9880d681SAndroid Build Coastguard Worker ret void 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind { 118*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2lanei16: 119*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 32 bits: 120*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.16 {d16[1], d17[1]}, [r0:32] 121*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i16* %A to i8* 122*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %B 123*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 8) 124*9880d681SAndroid Build Coastguard Worker ret void 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker;Check for a post-increment updating store with register increment. 128*9880d681SAndroid Build Coastguard Workerdefine void @vst2lanei16_update(i16** %ptr, <4 x i16>* %B, i32 %inc) nounwind { 129*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2lanei16_update: 130*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.16 {d16[1], d17[1]}, [r1], r2 131*9880d681SAndroid Build Coastguard Worker %A = load i16*, i16** %ptr 132*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i16* %A to i8* 133*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %B 134*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 2) 135*9880d681SAndroid Build Coastguard Worker %tmp2 = getelementptr i16, i16* %A, i32 %inc 136*9880d681SAndroid Build Coastguard Worker store i16* %tmp2, i16** %ptr 137*9880d681SAndroid Build Coastguard Worker ret void 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine void @vst2lanei32(i32* %A, <2 x i32>* %B) nounwind { 141*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2lanei32: 142*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.32 143*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i32* %A to i8* 144*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %B 145*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1) 146*9880d681SAndroid Build Coastguard Worker ret void 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine void @vst2lanef(float* %A, <2 x float>* %B) nounwind { 150*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2lanef: 151*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.32 152*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast float* %A to i8* 153*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %B 154*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1) 155*9880d681SAndroid Build Coastguard Worker ret void 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind { 159*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2laneQi16: 160*9880d681SAndroid Build Coastguard Worker;Check the (default) alignment. 161*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.16 {d17[1], d19[1]}, [r0] 162*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i16* %A to i8* 163*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %B 164*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 5, i32 1) 165*9880d681SAndroid Build Coastguard Worker ret void 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind { 169*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2laneQi32: 170*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 64 bits: 171*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.32 {d17[0], d19[0]}, [r0:64] 172*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i32* %A to i8* 173*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %B 174*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 16) 175*9880d681SAndroid Build Coastguard Worker ret void 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Workerdefine void @vst2laneQf(float* %A, <4 x float>* %B) nounwind { 179*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst2laneQf: 180*9880d681SAndroid Build Coastguard Worker;CHECK: vst2.32 181*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast float* %A to i8* 182*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x float>, <4 x float>* %B 183*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst2lane.p0i8.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, i32 3, i32 1) 184*9880d681SAndroid Build Coastguard Worker ret void 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2lane.p0i8.v8i8(i8*, <8 x i8>, <8 x i8>, i32, i32) nounwind 188*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2lane.p0i8.v4i16(i8*, <4 x i16>, <4 x i16>, i32, i32) nounwind 189*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2lane.p0i8.v2i32(i8*, <2 x i32>, <2 x i32>, i32, i32) nounwind 190*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2lane.p0i8.v2f32(i8*, <2 x float>, <2 x float>, i32, i32) nounwind 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2lane.p0i8.v8i16(i8*, <8 x i16>, <8 x i16>, i32, i32) nounwind 193*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2lane.p0i8.v4i32(i8*, <4 x i32>, <4 x i32>, i32, i32) nounwind 194*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2lane.p0i8.v4f32(i8*, <4 x float>, <4 x float>, i32, i32) nounwind 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdefine void @vst3lanei8(i8* %A, <8 x i8>* %B) nounwind { 197*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3lanei8: 198*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.8 199*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %B 200*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 1) 201*9880d681SAndroid Build Coastguard Worker ret void 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerdefine void @vst3lanei16(i16* %A, <4 x i16>* %B) nounwind { 205*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3lanei16: 206*9880d681SAndroid Build Coastguard Worker;Check the (default) alignment value. VST3 does not support alignment. 207*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.16 {d16[1], d17[1], d18[1]}, [r0] 208*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i16* %A to i8* 209*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %B 210*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 8) 211*9880d681SAndroid Build Coastguard Worker ret void 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdefine void @vst3lanei32(i32* %A, <2 x i32>* %B) nounwind { 215*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3lanei32: 216*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.32 217*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i32* %A to i8* 218*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %B 219*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1) 220*9880d681SAndroid Build Coastguard Worker ret void 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdefine void @vst3lanef(float* %A, <2 x float>* %B) nounwind { 224*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3lanef: 225*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.32 226*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast float* %A to i8* 227*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %B 228*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1) 229*9880d681SAndroid Build Coastguard Worker ret void 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdefine void @vst3laneQi16(i16* %A, <8 x i16>* %B) nounwind { 233*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3laneQi16: 234*9880d681SAndroid Build Coastguard Worker;Check the (default) alignment value. VST3 does not support alignment. 235*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.16 {d17[2], d19[2], d21[2]}, [r0] 236*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i16* %A to i8* 237*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %B 238*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 6, i32 8) 239*9880d681SAndroid Build Coastguard Worker ret void 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Workerdefine void @vst3laneQi32(i32* %A, <4 x i32>* %B) nounwind { 243*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3laneQi32: 244*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.32 245*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i32* %A to i8* 246*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %B 247*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 0, i32 1) 248*9880d681SAndroid Build Coastguard Worker ret void 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker;Check for a post-increment updating store. 252*9880d681SAndroid Build Coastguard Workerdefine void @vst3laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind { 253*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3laneQi32_update: 254*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.32 {d16[0], d18[0], d20[0]}, [r1]! 255*9880d681SAndroid Build Coastguard Worker %A = load i32*, i32** %ptr 256*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i32* %A to i8* 257*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %B 258*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 0, i32 1) 259*9880d681SAndroid Build Coastguard Worker %tmp2 = getelementptr i32, i32* %A, i32 3 260*9880d681SAndroid Build Coastguard Worker store i32* %tmp2, i32** %ptr 261*9880d681SAndroid Build Coastguard Worker ret void 262*9880d681SAndroid Build Coastguard Worker} 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerdefine void @vst3laneQf(float* %A, <4 x float>* %B) nounwind { 265*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst3laneQf: 266*9880d681SAndroid Build Coastguard Worker;CHECK: vst3.32 267*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast float* %A to i8* 268*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x float>, <4 x float>* %B 269*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst3lane.p0i8.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1, i32 1) 270*9880d681SAndroid Build Coastguard Worker ret void 271*9880d681SAndroid Build Coastguard Worker} 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst3lane.p0i8.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind 274*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst3lane.p0i8.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind 275*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst3lane.p0i8.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind 276*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst3lane.p0i8.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst3lane.p0i8.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind 279*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst3lane.p0i8.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind 280*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst3lane.p0i8.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdefine void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind { 284*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4lanei8: 285*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 32 bits: 286*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32] 287*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %B 288*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8) 289*9880d681SAndroid Build Coastguard Worker ret void 290*9880d681SAndroid Build Coastguard Worker} 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker;Check for a post-increment updating store. 293*9880d681SAndroid Build Coastguard Workerdefine void @vst4lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind { 294*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4lanei8_update: 295*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32]! 296*9880d681SAndroid Build Coastguard Worker %A = load i8*, i8** %ptr 297*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %B 298*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8) 299*9880d681SAndroid Build Coastguard Worker %tmp2 = getelementptr i8, i8* %A, i32 4 300*9880d681SAndroid Build Coastguard Worker store i8* %tmp2, i8** %ptr 301*9880d681SAndroid Build Coastguard Worker ret void 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerdefine void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind { 305*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4lanei16: 306*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.16 307*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i16* %A to i8* 308*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %B 309*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 1) 310*9880d681SAndroid Build Coastguard Worker ret void 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerdefine void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind { 314*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4lanei32: 315*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 128 bits: 316*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128] 317*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i32* %A to i8* 318*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %B 319*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 16) 320*9880d681SAndroid Build Coastguard Worker ret void 321*9880d681SAndroid Build Coastguard Worker} 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Workerdefine void @vst4lanef(float* %A, <2 x float>* %B) nounwind { 324*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4lanef: 325*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.32 326*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast float* %A to i8* 327*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %B 328*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1) 329*9880d681SAndroid Build Coastguard Worker ret void 330*9880d681SAndroid Build Coastguard Worker} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerdefine void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind { 333*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4laneQi16: 334*9880d681SAndroid Build Coastguard Worker;Check the alignment value. Max for this instruction is 64 bits: 335*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0:64] 336*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i16* %A to i8* 337*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %B 338*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 7, i32 16) 339*9880d681SAndroid Build Coastguard Worker ret void 340*9880d681SAndroid Build Coastguard Worker} 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Workerdefine void @vst4laneQi32(i32* %A, <4 x i32>* %B) nounwind { 343*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4laneQi32: 344*9880d681SAndroid Build Coastguard Worker;Check the (default) alignment. 345*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0] 346*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast i32* %A to i8* 347*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %B 348*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 1) 349*9880d681SAndroid Build Coastguard Worker ret void 350*9880d681SAndroid Build Coastguard Worker} 351*9880d681SAndroid Build Coastguard Worker 352*9880d681SAndroid Build Coastguard Workerdefine void @vst4laneQf(float* %A, <4 x float>* %B) nounwind { 353*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vst4laneQf: 354*9880d681SAndroid Build Coastguard Worker;CHECK: vst4.32 355*9880d681SAndroid Build Coastguard Worker %tmp0 = bitcast float* %A to i8* 356*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x float>, <4 x float>* %B 357*9880d681SAndroid Build Coastguard Worker call void @llvm.arm.neon.vst4lane.p0i8.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1, i32 1) 358*9880d681SAndroid Build Coastguard Worker ret void 359*9880d681SAndroid Build Coastguard Worker} 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker; Make sure this doesn't crash; PR10258 362*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @variable_insertelement(<8 x i16> %a, i16 %b, i32 %c) nounwind readnone { 363*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: variable_insertelement: 364*9880d681SAndroid Build Coastguard Worker %r = insertelement <8 x i16> %a, i16 %b, i32 %c 365*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %r 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst4lane.p0i8.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind 369*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst4lane.p0i8.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind 370*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst4lane.p0i8.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind 371*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst4lane.p0i8.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst4lane.p0i8.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind 374*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst4lane.p0i8.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind 375*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst4lane.p0i8.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind 376