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