1*9880d681SAndroid Build Coastguard Worker; Test vector extraction to memory. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction from the first element. 6*9880d681SAndroid Build Coastguard Workerdefine void @f1(<16 x i8> %val, i8 *%ptr) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 0(%r2), 0 9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 10*9880d681SAndroid Build Coastguard Worker %element = extractelement <16 x i8> %val, i32 0 11*9880d681SAndroid Build Coastguard Worker store i8 %element, i8 *%ptr 12*9880d681SAndroid Build Coastguard Worker ret void 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction from the last element. 16*9880d681SAndroid Build Coastguard Workerdefine void @f2(<16 x i8> %val, i8 *%ptr) { 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 18*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 0(%r2), 15 19*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 20*9880d681SAndroid Build Coastguard Worker %element = extractelement <16 x i8> %val, i32 15 21*9880d681SAndroid Build Coastguard Worker store i8 %element, i8 *%ptr 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction of an invalid element. This must compile, 26*9880d681SAndroid Build Coastguard Worker; but we don't care what it does. 27*9880d681SAndroid Build Coastguard Workerdefine void @f3(<16 x i8> %val, i8 *%ptr) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 29*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteb %v24, 0(%r2), 16 30*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 31*9880d681SAndroid Build Coastguard Worker %element = extractelement <16 x i8> %val, i32 16 32*9880d681SAndroid Build Coastguard Worker store i8 %element, i8 *%ptr 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction with the highest in-range offset. 37*9880d681SAndroid Build Coastguard Workerdefine void @f4(<16 x i8> %val, i8 *%base) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 39*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 4095(%r2), 10 40*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 41*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i8, i8 *%base, i32 4095 42*9880d681SAndroid Build Coastguard Worker %element = extractelement <16 x i8> %val, i32 10 43*9880d681SAndroid Build Coastguard Worker store i8 %element, i8 *%ptr 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction with the first ouf-of-range offset. 48*9880d681SAndroid Build Coastguard Workerdefine void @f5(<16 x i8> %val, i8 *%base) { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 50*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 51*9880d681SAndroid Build Coastguard Worker; CHECK: vsteb %v24, 0(%r2), 5 52*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 53*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i8, i8 *%base, i32 4096 54*9880d681SAndroid Build Coastguard Worker %element = extractelement <16 x i8> %val, i32 5 55*9880d681SAndroid Build Coastguard Worker store i8 %element, i8 *%ptr 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; Test v16i8 extraction from a variable element. 60*9880d681SAndroid Build Coastguard Workerdefine void @f6(<16 x i8> %val, i8 *%ptr, i32 %index) { 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteb 63*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 64*9880d681SAndroid Build Coastguard Worker %element = extractelement <16 x i8> %val, i32 %index 65*9880d681SAndroid Build Coastguard Worker store i8 %element, i8 *%ptr 66*9880d681SAndroid Build Coastguard Worker ret void 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction from the first element. 70*9880d681SAndroid Build Coastguard Workerdefine void @f7(<8 x i16> %val, i16 *%ptr) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 72*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 0(%r2), 0 73*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 74*9880d681SAndroid Build Coastguard Worker %element = extractelement <8 x i16> %val, i32 0 75*9880d681SAndroid Build Coastguard Worker store i16 %element, i16 *%ptr 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction from the last element. 80*9880d681SAndroid Build Coastguard Workerdefine void @f8(<8 x i16> %val, i16 *%ptr) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 82*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 0(%r2), 7 83*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 84*9880d681SAndroid Build Coastguard Worker %element = extractelement <8 x i16> %val, i32 7 85*9880d681SAndroid Build Coastguard Worker store i16 %element, i16 *%ptr 86*9880d681SAndroid Build Coastguard Worker ret void 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction of an invalid element. This must compile, 90*9880d681SAndroid Build Coastguard Worker; but we don't care what it does. 91*9880d681SAndroid Build Coastguard Workerdefine void @f9(<8 x i16> %val, i16 *%ptr) { 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 93*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteh %v24, 0(%r2), 8 94*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 95*9880d681SAndroid Build Coastguard Worker %element = extractelement <8 x i16> %val, i32 8 96*9880d681SAndroid Build Coastguard Worker store i16 %element, i16 *%ptr 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction with the highest in-range offset. 101*9880d681SAndroid Build Coastguard Workerdefine void @f10(<8 x i16> %val, i16 *%base) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 103*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 4094(%r2), 5 104*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 105*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i32 2047 106*9880d681SAndroid Build Coastguard Worker %element = extractelement <8 x i16> %val, i32 5 107*9880d681SAndroid Build Coastguard Worker store i16 %element, i16 *%ptr 108*9880d681SAndroid Build Coastguard Worker ret void 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction with the first ouf-of-range offset. 112*9880d681SAndroid Build Coastguard Workerdefine void @f11(<8 x i16> %val, i16 *%base) { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 114*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 115*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh %v24, 0(%r2), 1 116*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 117*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i16, i16 *%base, i32 2048 118*9880d681SAndroid Build Coastguard Worker %element = extractelement <8 x i16> %val, i32 1 119*9880d681SAndroid Build Coastguard Worker store i16 %element, i16 *%ptr 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; Test v8i16 extraction from a variable element. 124*9880d681SAndroid Build Coastguard Workerdefine void @f12(<8 x i16> %val, i16 *%ptr, i32 %index) { 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 126*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteh 127*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 128*9880d681SAndroid Build Coastguard Worker %element = extractelement <8 x i16> %val, i32 %index 129*9880d681SAndroid Build Coastguard Worker store i16 %element, i16 *%ptr 130*9880d681SAndroid Build Coastguard Worker ret void 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction from the first element. 134*9880d681SAndroid Build Coastguard Workerdefine void @f13(<4 x i32> %val, i32 *%ptr) { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 136*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 0 137*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 138*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 0 139*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 140*9880d681SAndroid Build Coastguard Worker ret void 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction from the last element. 144*9880d681SAndroid Build Coastguard Workerdefine void @f14(<4 x i32> %val, i32 *%ptr) { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 146*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 3 147*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 148*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 3 149*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 150*9880d681SAndroid Build Coastguard Worker ret void 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction of an invalid element. This must compile, 154*9880d681SAndroid Build Coastguard Worker; but we don't care what it does. 155*9880d681SAndroid Build Coastguard Workerdefine void @f15(<4 x i32> %val, i32 *%ptr) { 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef %v24, 0(%r2), 4 158*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 159*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 4 160*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 161*9880d681SAndroid Build Coastguard Worker ret void 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction with the highest in-range offset. 165*9880d681SAndroid Build Coastguard Workerdefine void @f16(<4 x i32> %val, i32 *%base) { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 167*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 4092(%r2), 2 168*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 169*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i32 1023 170*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 2 171*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction with the first ouf-of-range offset. 176*9880d681SAndroid Build Coastguard Workerdefine void @f17(<4 x i32> %val, i32 *%base) { 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 178*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 179*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 1 180*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 181*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i32, i32 *%base, i32 1024 182*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 1 183*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 184*9880d681SAndroid Build Coastguard Worker ret void 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker; Test v4i32 extraction from a variable element. 188*9880d681SAndroid Build Coastguard Workerdefine void @f18(<4 x i32> %val, i32 *%ptr, i32 %index) { 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 190*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef 191*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 192*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 %index 193*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 194*9880d681SAndroid Build Coastguard Worker ret void 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction from the first element. 198*9880d681SAndroid Build Coastguard Workerdefine void @f19(<2 x i64> %val, i64 *%ptr) { 199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19: 200*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0 201*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 202*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 0 203*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 204*9880d681SAndroid Build Coastguard Worker ret void 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction from the last element. 208*9880d681SAndroid Build Coastguard Workerdefine void @f20(<2 x i64> %val, i64 *%ptr) { 209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20: 210*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 1 211*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 212*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 1 213*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 214*9880d681SAndroid Build Coastguard Worker ret void 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction of an invalid element. This must compile, 218*9880d681SAndroid Build Coastguard Worker; but we don't care what it does. 219*9880d681SAndroid Build Coastguard Workerdefine void @f21(<2 x i64> %val, i64 *%ptr) { 220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21: 221*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteg %v24, 0(%r2), 2 222*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 223*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 2 224*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 225*9880d681SAndroid Build Coastguard Worker ret void 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction with the highest in-range offset. 229*9880d681SAndroid Build Coastguard Workerdefine void @f22(<2 x i64> %val, i64 *%base) { 230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22: 231*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 4088(%r2), 1 232*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 233*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i32 511 234*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 1 235*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 236*9880d681SAndroid Build Coastguard Worker ret void 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction with the first ouf-of-range offset. 240*9880d681SAndroid Build Coastguard Workerdefine void @f23(<2 x i64> %val, i64 *%base) { 241*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23: 242*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 243*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0 244*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 245*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr i64, i64 *%base, i32 512 246*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 0 247*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 248*9880d681SAndroid Build Coastguard Worker ret void 249*9880d681SAndroid Build Coastguard Worker} 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker; Test v2i64 extraction from a variable element. 252*9880d681SAndroid Build Coastguard Workerdefine void @f24(<2 x i64> %val, i64 *%ptr, i32 %index) { 253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24: 254*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteg 255*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 256*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 %index 257*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 258*9880d681SAndroid Build Coastguard Worker ret void 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction from the first element. 262*9880d681SAndroid Build Coastguard Workerdefine void @f25(<4 x float> %val, float *%ptr) { 263*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25: 264*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 0 265*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 266*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 0 267*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 268*9880d681SAndroid Build Coastguard Worker ret void 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction from the last element. 272*9880d681SAndroid Build Coastguard Workerdefine void @f26(<4 x float> %val, float *%ptr) { 273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26: 274*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 3 275*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 276*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 3 277*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 278*9880d681SAndroid Build Coastguard Worker ret void 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction of an invalid element. This must compile, 282*9880d681SAndroid Build Coastguard Worker; but we don't care what it does. 283*9880d681SAndroid Build Coastguard Workerdefine void @f27(<4 x float> %val, float *%ptr) { 284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f27: 285*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef %v24, 0(%r2), 4 286*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 287*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 4 288*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 289*9880d681SAndroid Build Coastguard Worker ret void 290*9880d681SAndroid Build Coastguard Worker} 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction with the highest in-range offset. 293*9880d681SAndroid Build Coastguard Workerdefine void @f28(<4 x float> %val, float *%base) { 294*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f28: 295*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 4092(%r2), 2 296*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 297*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%base, i32 1023 298*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 2 299*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 300*9880d681SAndroid Build Coastguard Worker ret void 301*9880d681SAndroid Build Coastguard Worker} 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction with the first ouf-of-range offset. 304*9880d681SAndroid Build Coastguard Workerdefine void @f29(<4 x float> %val, float *%base) { 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f29: 306*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 307*9880d681SAndroid Build Coastguard Worker; CHECK: vstef %v24, 0(%r2), 1 308*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 309*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr float, float *%base, i32 1024 310*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 1 311*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 312*9880d681SAndroid Build Coastguard Worker ret void 313*9880d681SAndroid Build Coastguard Worker} 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker; Test v4f32 extraction from a variable element. 316*9880d681SAndroid Build Coastguard Workerdefine void @f30(<4 x float> %val, float *%ptr, i32 %index) { 317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f30: 318*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vstef 319*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 320*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 %index 321*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 322*9880d681SAndroid Build Coastguard Worker ret void 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction from the first element. 326*9880d681SAndroid Build Coastguard Workerdefine void @f32(<2 x double> %val, double *%ptr) { 327*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32: 328*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0 329*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 330*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x double> %val, i32 0 331*9880d681SAndroid Build Coastguard Worker store double %element, double *%ptr 332*9880d681SAndroid Build Coastguard Worker ret void 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction from the last element. 336*9880d681SAndroid Build Coastguard Workerdefine void @f33(<2 x double> %val, double *%ptr) { 337*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f33: 338*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 1 339*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 340*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x double> %val, i32 1 341*9880d681SAndroid Build Coastguard Worker store double %element, double *%ptr 342*9880d681SAndroid Build Coastguard Worker ret void 343*9880d681SAndroid Build Coastguard Worker} 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction with the highest in-range offset. 346*9880d681SAndroid Build Coastguard Workerdefine void @f34(<2 x double> %val, double *%base) { 347*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f34: 348*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 4088(%r2), 1 349*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 350*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i32 511 351*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x double> %val, i32 1 352*9880d681SAndroid Build Coastguard Worker store double %element, double *%ptr 353*9880d681SAndroid Build Coastguard Worker ret void 354*9880d681SAndroid Build Coastguard Worker} 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction with the first ouf-of-range offset. 357*9880d681SAndroid Build Coastguard Workerdefine void @f35(<2 x double> %val, double *%base) { 358*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f35: 359*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096 360*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg %v24, 0(%r2), 0 361*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 362*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr double, double *%base, i32 512 363*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x double> %val, i32 0 364*9880d681SAndroid Build Coastguard Worker store double %element, double *%ptr 365*9880d681SAndroid Build Coastguard Worker ret void 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker; Test v2f64 extraction from a variable element. 369*9880d681SAndroid Build Coastguard Workerdefine void @f36(<2 x double> %val, double *%ptr, i32 %index) { 370*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f36: 371*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vsteg 372*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 373*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x double> %val, i32 %index 374*9880d681SAndroid Build Coastguard Worker store double %element, double *%ptr 375*9880d681SAndroid Build Coastguard Worker ret void 376*9880d681SAndroid Build Coastguard Worker} 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker; Test a v4i32 scatter of the first element. 379*9880d681SAndroid Build Coastguard Workerdefine void @f37(<4 x i32> %val, <4 x i32> %index, i64 %base) { 380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f37: 381*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 0 382*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 383*9880d681SAndroid Build Coastguard Worker %elem = extractelement <4 x i32> %index, i32 0 384*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %elem to i64 385*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %ext 386*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i32 * 387*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 0 388*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 389*9880d681SAndroid Build Coastguard Worker ret void 390*9880d681SAndroid Build Coastguard Worker} 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker; Test a v4i32 scatter of the last element. 393*9880d681SAndroid Build Coastguard Workerdefine void @f38(<4 x i32> %val, <4 x i32> %index, i64 %base) { 394*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f38: 395*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 3 396*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 397*9880d681SAndroid Build Coastguard Worker %elem = extractelement <4 x i32> %index, i32 3 398*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %elem to i64 399*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %ext 400*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i32 * 401*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 3 402*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 403*9880d681SAndroid Build Coastguard Worker ret void 404*9880d681SAndroid Build Coastguard Worker} 405*9880d681SAndroid Build Coastguard Worker 406*9880d681SAndroid Build Coastguard Worker; Test a v4i32 scatter with the highest in-range offset. 407*9880d681SAndroid Build Coastguard Workerdefine void @f39(<4 x i32> %val, <4 x i32> %index, i64 %base) { 408*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f39: 409*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 4095(%v26,%r2), 1 410*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 411*9880d681SAndroid Build Coastguard Worker %elem = extractelement <4 x i32> %index, i32 1 412*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %elem to i64 413*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %base, %ext 414*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %add1, 4095 415*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add2 to i32 * 416*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x i32> %val, i32 1 417*9880d681SAndroid Build Coastguard Worker store i32 %element, i32 *%ptr 418*9880d681SAndroid Build Coastguard Worker ret void 419*9880d681SAndroid Build Coastguard Worker} 420*9880d681SAndroid Build Coastguard Worker 421*9880d681SAndroid Build Coastguard Worker; Test a v2i64 scatter of the first element. 422*9880d681SAndroid Build Coastguard Workerdefine void @f40(<2 x i64> %val, <2 x i64> %index, i64 %base) { 423*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f40: 424*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 0 425*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 426*9880d681SAndroid Build Coastguard Worker %elem = extractelement <2 x i64> %index, i32 0 427*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %elem 428*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i64 * 429*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 0 430*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 431*9880d681SAndroid Build Coastguard Worker ret void 432*9880d681SAndroid Build Coastguard Worker} 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Worker; Test a v2i64 scatter of the last element. 435*9880d681SAndroid Build Coastguard Workerdefine void @f41(<2 x i64> %val, <2 x i64> %index, i64 %base) { 436*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f41: 437*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 1 438*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 439*9880d681SAndroid Build Coastguard Worker %elem = extractelement <2 x i64> %index, i32 1 440*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %elem 441*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to i64 * 442*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x i64> %val, i32 1 443*9880d681SAndroid Build Coastguard Worker store i64 %element, i64 *%ptr 444*9880d681SAndroid Build Coastguard Worker ret void 445*9880d681SAndroid Build Coastguard Worker} 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker; Test a v4f32 scatter of the first element. 448*9880d681SAndroid Build Coastguard Workerdefine void @f42(<4 x float> %val, <4 x i32> %index, i64 %base) { 449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f42: 450*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 0 451*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 452*9880d681SAndroid Build Coastguard Worker %elem = extractelement <4 x i32> %index, i32 0 453*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %elem to i64 454*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %ext 455*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to float * 456*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 0 457*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 458*9880d681SAndroid Build Coastguard Worker ret void 459*9880d681SAndroid Build Coastguard Worker} 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker; Test a v4f32 scatter of the last element. 462*9880d681SAndroid Build Coastguard Workerdefine void @f43(<4 x float> %val, <4 x i32> %index, i64 %base) { 463*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f43: 464*9880d681SAndroid Build Coastguard Worker; CHECK: vscef %v24, 0(%v26,%r2), 3 465*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 466*9880d681SAndroid Build Coastguard Worker %elem = extractelement <4 x i32> %index, i32 3 467*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %elem to i64 468*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %ext 469*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to float * 470*9880d681SAndroid Build Coastguard Worker %element = extractelement <4 x float> %val, i32 3 471*9880d681SAndroid Build Coastguard Worker store float %element, float *%ptr 472*9880d681SAndroid Build Coastguard Worker ret void 473*9880d681SAndroid Build Coastguard Worker} 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Worker; Test a v2f64 scatter of the first element. 476*9880d681SAndroid Build Coastguard Workerdefine void @f44(<2 x double> %val, <2 x i64> %index, i64 %base) { 477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f44: 478*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 0 479*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 480*9880d681SAndroid Build Coastguard Worker %elem = extractelement <2 x i64> %index, i32 0 481*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %elem 482*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to double * 483*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x double> %val, i32 0 484*9880d681SAndroid Build Coastguard Worker store double %element, double *%ptr 485*9880d681SAndroid Build Coastguard Worker ret void 486*9880d681SAndroid Build Coastguard Worker} 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Worker; Test a v2f64 scatter of the last element. 489*9880d681SAndroid Build Coastguard Workerdefine void @f45(<2 x double> %val, <2 x i64> %index, i64 %base) { 490*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f45: 491*9880d681SAndroid Build Coastguard Worker; CHECK: vsceg %v24, 0(%v26,%r2), 1 492*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 493*9880d681SAndroid Build Coastguard Worker %elem = extractelement <2 x i64> %index, i32 1 494*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, %elem 495*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i64 %add to double * 496*9880d681SAndroid Build Coastguard Worker %element = extractelement <2 x double> %val, i32 1 497*9880d681SAndroid Build Coastguard Worker store double %element, double *%ptr 498*9880d681SAndroid Build Coastguard Worker ret void 499*9880d681SAndroid Build Coastguard Worker} 500