477 lines · plain
1; Test vector insertion of memory values.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s4 5; Test v16i8 insertion into the first element.6define <16 x i8> @f1(<16 x i8> %val, ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: vleb %v24, 0(%r2), 09; CHECK: br %r1410 %element = load i8, ptr %ptr11 %ret = insertelement <16 x i8> %val, i8 %element, i32 012 ret <16 x i8> %ret13}14 15; Test v16i8 insertion into the last element.16define <16 x i8> @f2(<16 x i8> %val, ptr %ptr) {17; CHECK-LABEL: f2:18; CHECK: vleb %v24, 0(%r2), 1519; CHECK: br %r1420 %element = load i8, ptr %ptr21 %ret = insertelement <16 x i8> %val, i8 %element, i32 1522 ret <16 x i8> %ret23}24 25; Test v16i8 insertion with the highest in-range offset.26define <16 x i8> @f3(<16 x i8> %val, ptr %base) {27; CHECK-LABEL: f3:28; CHECK: vleb %v24, 4095(%r2), 1029; CHECK: br %r1430 %ptr = getelementptr i8, ptr %base, i32 409531 %element = load i8, ptr %ptr32 %ret = insertelement <16 x i8> %val, i8 %element, i32 1033 ret <16 x i8> %ret34}35 36; Test v16i8 insertion with the first ouf-of-range offset.37define <16 x i8> @f4(<16 x i8> %val, ptr %base) {38; CHECK-LABEL: f4:39; CHECK: aghi %r2, 409640; CHECK: vleb %v24, 0(%r2), 541; CHECK: br %r1442 %ptr = getelementptr i8, ptr %base, i32 409643 %element = load i8, ptr %ptr44 %ret = insertelement <16 x i8> %val, i8 %element, i32 545 ret <16 x i8> %ret46}47 48; Test v16i8 insertion into a variable element.49define <16 x i8> @f5(<16 x i8> %val, ptr %ptr, i32 %index) {50; CHECK-LABEL: f5:51; CHECK-NOT: vleb52; CHECK: br %r1453 %element = load i8, ptr %ptr54 %ret = insertelement <16 x i8> %val, i8 %element, i32 %index55 ret <16 x i8> %ret56}57 58; Test v8i16 insertion into the first element.59define <8 x i16> @f6(<8 x i16> %val, ptr %ptr) {60; CHECK-LABEL: f6:61; CHECK: vleh %v24, 0(%r2), 062; CHECK: br %r1463 %element = load i16, ptr %ptr64 %ret = insertelement <8 x i16> %val, i16 %element, i32 065 ret <8 x i16> %ret66}67 68; Test v8i16 insertion into the last element.69define <8 x i16> @f7(<8 x i16> %val, ptr %ptr) {70; CHECK-LABEL: f7:71; CHECK: vleh %v24, 0(%r2), 772; CHECK: br %r1473 %element = load i16, ptr %ptr74 %ret = insertelement <8 x i16> %val, i16 %element, i32 775 ret <8 x i16> %ret76}77 78; Test v8i16 insertion with the highest in-range offset.79define <8 x i16> @f8(<8 x i16> %val, ptr %base) {80; CHECK-LABEL: f8:81; CHECK: vleh %v24, 4094(%r2), 582; CHECK: br %r1483 %ptr = getelementptr i16, ptr %base, i32 204784 %element = load i16, ptr %ptr85 %ret = insertelement <8 x i16> %val, i16 %element, i32 586 ret <8 x i16> %ret87}88 89; Test v8i16 insertion with the first ouf-of-range offset.90define <8 x i16> @f9(<8 x i16> %val, ptr %base) {91; CHECK-LABEL: f9:92; CHECK: aghi %r2, 409693; CHECK: vleh %v24, 0(%r2), 194; CHECK: br %r1495 %ptr = getelementptr i16, ptr %base, i32 204896 %element = load i16, ptr %ptr97 %ret = insertelement <8 x i16> %val, i16 %element, i32 198 ret <8 x i16> %ret99}100 101; Test v8i16 insertion into a variable element.102define <8 x i16> @f10(<8 x i16> %val, ptr %ptr, i32 %index) {103; CHECK-LABEL: f10:104; CHECK-NOT: vleh105; CHECK: br %r14106 %element = load i16, ptr %ptr107 %ret = insertelement <8 x i16> %val, i16 %element, i32 %index108 ret <8 x i16> %ret109}110 111; Test v4i32 insertion into the first element.112define <4 x i32> @f11(<4 x i32> %val, ptr %ptr) {113; CHECK-LABEL: f11:114; CHECK: vlef %v24, 0(%r2), 0115; CHECK: br %r14116 %element = load i32, ptr %ptr117 %ret = insertelement <4 x i32> %val, i32 %element, i32 0118 ret <4 x i32> %ret119}120 121; Test v4i32 insertion into the last element.122define <4 x i32> @f12(<4 x i32> %val, ptr %ptr) {123; CHECK-LABEL: f12:124; CHECK: vlef %v24, 0(%r2), 3125; CHECK: br %r14126 %element = load i32, ptr %ptr127 %ret = insertelement <4 x i32> %val, i32 %element, i32 3128 ret <4 x i32> %ret129}130 131; Test v4i32 insertion with the highest in-range offset.132define <4 x i32> @f13(<4 x i32> %val, ptr %base) {133; CHECK-LABEL: f13:134; CHECK: vlef %v24, 4092(%r2), 2135; CHECK: br %r14136 %ptr = getelementptr i32, ptr %base, i32 1023137 %element = load i32, ptr %ptr138 %ret = insertelement <4 x i32> %val, i32 %element, i32 2139 ret <4 x i32> %ret140}141 142; Test v4i32 insertion with the first ouf-of-range offset.143define <4 x i32> @f14(<4 x i32> %val, ptr %base) {144; CHECK-LABEL: f14:145; CHECK: aghi %r2, 4096146; CHECK: vlef %v24, 0(%r2), 1147; CHECK: br %r14148 %ptr = getelementptr i32, ptr %base, i32 1024149 %element = load i32, ptr %ptr150 %ret = insertelement <4 x i32> %val, i32 %element, i32 1151 ret <4 x i32> %ret152}153 154; Test v4i32 insertion into a variable element.155define <4 x i32> @f15(<4 x i32> %val, ptr %ptr, i32 %index) {156; CHECK-LABEL: f15:157; CHECK-NOT: vlef158; CHECK: br %r14159 %element = load i32, ptr %ptr160 %ret = insertelement <4 x i32> %val, i32 %element, i32 %index161 ret <4 x i32> %ret162}163 164; Test v2i64 insertion into the first element.165define <2 x i64> @f16(<2 x i64> %val, ptr %ptr) {166; CHECK-LABEL: f16:167; CHECK: vleg %v24, 0(%r2), 0168; CHECK: br %r14169 %element = load i64, ptr %ptr170 %ret = insertelement <2 x i64> %val, i64 %element, i32 0171 ret <2 x i64> %ret172}173 174; Test v2i64 insertion into the last element.175define <2 x i64> @f17(<2 x i64> %val, ptr %ptr) {176; CHECK-LABEL: f17:177; CHECK: vleg %v24, 0(%r2), 1178; CHECK: br %r14179 %element = load i64, ptr %ptr180 %ret = insertelement <2 x i64> %val, i64 %element, i32 1181 ret <2 x i64> %ret182}183 184; Test v2i64 insertion with the highest in-range offset.185define <2 x i64> @f18(<2 x i64> %val, ptr %base) {186; CHECK-LABEL: f18:187; CHECK: vleg %v24, 4088(%r2), 1188; CHECK: br %r14189 %ptr = getelementptr i64, ptr %base, i32 511190 %element = load i64, ptr %ptr191 %ret = insertelement <2 x i64> %val, i64 %element, i32 1192 ret <2 x i64> %ret193}194 195; Test v2i64 insertion with the first ouf-of-range offset.196define <2 x i64> @f19(<2 x i64> %val, ptr %base) {197; CHECK-LABEL: f19:198; CHECK: aghi %r2, 4096199; CHECK: vleg %v24, 0(%r2), 0200; CHECK: br %r14201 %ptr = getelementptr i64, ptr %base, i32 512202 %element = load i64, ptr %ptr203 %ret = insertelement <2 x i64> %val, i64 %element, i32 0204 ret <2 x i64> %ret205}206 207; Test v2i64 insertion into a variable element.208define <2 x i64> @f20(<2 x i64> %val, ptr %ptr, i32 %index) {209; CHECK-LABEL: f20:210; CHECK-NOT: vleg211; CHECK: br %r14212 %element = load i64, ptr %ptr213 %ret = insertelement <2 x i64> %val, i64 %element, i32 %index214 ret <2 x i64> %ret215}216 217; Test v4f32 insertion into the first element.218define <4 x float> @f21(<4 x float> %val, ptr %ptr) {219; CHECK-LABEL: f21:220; CHECK: vlef %v24, 0(%r2), 0221; CHECK: br %r14222 %element = load float, ptr %ptr223 %ret = insertelement <4 x float> %val, float %element, i32 0224 ret <4 x float> %ret225}226 227; Test v4f32 insertion into the last element.228define <4 x float> @f22(<4 x float> %val, ptr %ptr) {229; CHECK-LABEL: f22:230; CHECK: vlef %v24, 0(%r2), 3231; CHECK: br %r14232 %element = load float, ptr %ptr233 %ret = insertelement <4 x float> %val, float %element, i32 3234 ret <4 x float> %ret235}236 237; Test v4f32 insertion with the highest in-range offset.238define <4 x float> @f23(<4 x float> %val, ptr %base) {239; CHECK-LABEL: f23:240; CHECK: vlef %v24, 4092(%r2), 2241; CHECK: br %r14242 %ptr = getelementptr float, ptr %base, i32 1023243 %element = load float, ptr %ptr244 %ret = insertelement <4 x float> %val, float %element, i32 2245 ret <4 x float> %ret246}247 248; Test v4f32 insertion with the first ouf-of-range offset.249define <4 x float> @f24(<4 x float> %val, ptr %base) {250; CHECK-LABEL: f24:251; CHECK: aghi %r2, 4096252; CHECK: vlef %v24, 0(%r2), 1253; CHECK: br %r14254 %ptr = getelementptr float, ptr %base, i32 1024255 %element = load float, ptr %ptr256 %ret = insertelement <4 x float> %val, float %element, i32 1257 ret <4 x float> %ret258}259 260; Test v4f32 insertion into a variable element.261define <4 x float> @f25(<4 x float> %val, ptr %ptr, i32 %index) {262; CHECK-LABEL: f25:263; CHECK-NOT: vlef264; CHECK: br %r14265 %element = load float, ptr %ptr266 %ret = insertelement <4 x float> %val, float %element, i32 %index267 ret <4 x float> %ret268}269 270; Test v2f64 insertion into the first element.271define <2 x double> @f26(<2 x double> %val, ptr %ptr) {272; CHECK-LABEL: f26:273; CHECK: vleg %v24, 0(%r2), 0274; CHECK: br %r14275 %element = load double, ptr %ptr276 %ret = insertelement <2 x double> %val, double %element, i32 0277 ret <2 x double> %ret278}279 280; Test v2f64 insertion into the last element.281define <2 x double> @f27(<2 x double> %val, ptr %ptr) {282; CHECK-LABEL: f27:283; CHECK: vleg %v24, 0(%r2), 1284; CHECK: br %r14285 %element = load double, ptr %ptr286 %ret = insertelement <2 x double> %val, double %element, i32 1287 ret <2 x double> %ret288}289 290; Test v2f64 insertion with the highest in-range offset.291define <2 x double> @f28(<2 x double> %val, ptr %base) {292; CHECK-LABEL: f28:293; CHECK: vleg %v24, 4088(%r2), 1294; CHECK: br %r14295 %ptr = getelementptr double, ptr %base, i32 511296 %element = load double, ptr %ptr297 %ret = insertelement <2 x double> %val, double %element, i32 1298 ret <2 x double> %ret299}300 301; Test v2f64 insertion with the first ouf-of-range offset.302define <2 x double> @f29(<2 x double> %val, ptr %base) {303; CHECK-LABEL: f29:304; CHECK: aghi %r2, 4096305; CHECK: vleg %v24, 0(%r2), 0306; CHECK: br %r14307 %ptr = getelementptr double, ptr %base, i32 512308 %element = load double, ptr %ptr309 %ret = insertelement <2 x double> %val, double %element, i32 0310 ret <2 x double> %ret311}312 313; Test v2f64 insertion into a variable element.314define <2 x double> @f30(<2 x double> %val, ptr %ptr, i32 %index) {315; CHECK-LABEL: f30:316; CHECK-NOT: vleg317; CHECK: br %r14318 %element = load double, ptr %ptr319 %ret = insertelement <2 x double> %val, double %element, i32 %index320 ret <2 x double> %ret321}322 323; Test a v4i32 gather of the first element.324define <4 x i32> @f31(<4 x i32> %val, <4 x i32> %index, i64 %base) {325; CHECK-LABEL: f31:326; CHECK: vgef %v24, 0(%v26,%r2), 0327; CHECK: br %r14328 %elem = extractelement <4 x i32> %index, i32 0329 %ext = zext i32 %elem to i64330 %add = add i64 %base, %ext331 %ptr = inttoptr i64 %add to ptr332 %element = load i32, ptr %ptr333 %ret = insertelement <4 x i32> %val, i32 %element, i32 0334 ret <4 x i32> %ret335}336 337; Test a v4i32 gather of the last element.338define <4 x i32> @f32(<4 x i32> %val, <4 x i32> %index, i64 %base) {339; CHECK-LABEL: f32:340; CHECK: vgef %v24, 0(%v26,%r2), 3341; CHECK: br %r14342 %elem = extractelement <4 x i32> %index, i32 3343 %ext = zext i32 %elem to i64344 %add = add i64 %base, %ext345 %ptr = inttoptr i64 %add to ptr346 %element = load i32, ptr %ptr347 %ret = insertelement <4 x i32> %val, i32 %element, i32 3348 ret <4 x i32> %ret349}350 351; Test a v4i32 gather with the highest in-range offset.352define <4 x i32> @f33(<4 x i32> %val, <4 x i32> %index, i64 %base) {353; CHECK-LABEL: f33:354; CHECK: vgef %v24, 4095(%v26,%r2), 1355; CHECK: br %r14356 %elem = extractelement <4 x i32> %index, i32 1357 %ext = zext i32 %elem to i64358 %add1 = add i64 %base, %ext359 %add2 = add i64 %add1, 4095360 %ptr = inttoptr i64 %add2 to ptr361 %element = load i32, ptr %ptr362 %ret = insertelement <4 x i32> %val, i32 %element, i32 1363 ret <4 x i32> %ret364}365 366; Test a v2i64 gather of the first element.367define <2 x i64> @f34(<2 x i64> %val, <2 x i64> %index, i64 %base) {368; CHECK-LABEL: f34:369; CHECK: vgeg %v24, 0(%v26,%r2), 0370; CHECK: br %r14371 %elem = extractelement <2 x i64> %index, i32 0372 %add = add i64 %base, %elem373 %ptr = inttoptr i64 %add to ptr374 %element = load i64, ptr %ptr375 %ret = insertelement <2 x i64> %val, i64 %element, i32 0376 ret <2 x i64> %ret377}378 379; Test a v2i64 gather of the last element.380define <2 x i64> @f35(<2 x i64> %val, <2 x i64> %index, i64 %base) {381; CHECK-LABEL: f35:382; CHECK: vgeg %v24, 0(%v26,%r2), 1383; CHECK: br %r14384 %elem = extractelement <2 x i64> %index, i32 1385 %add = add i64 %base, %elem386 %ptr = inttoptr i64 %add to ptr387 %element = load i64, ptr %ptr388 %ret = insertelement <2 x i64> %val, i64 %element, i32 1389 ret <2 x i64> %ret390}391 392; Test a v4f32 gather of the first element.393define <4 x float> @f36(<4 x float> %val, <4 x i32> %index, i64 %base) {394; CHECK-LABEL: f36:395; CHECK: vgef %v24, 0(%v26,%r2), 0396; CHECK: br %r14397 %elem = extractelement <4 x i32> %index, i32 0398 %ext = zext i32 %elem to i64399 %add = add i64 %base, %ext400 %ptr = inttoptr i64 %add to ptr401 %element = load float, ptr %ptr402 %ret = insertelement <4 x float> %val, float %element, i32 0403 ret <4 x float> %ret404}405 406; Test a v4f32 gather of the last element.407define <4 x float> @f37(<4 x float> %val, <4 x i32> %index, i64 %base) {408; CHECK-LABEL: f37:409; CHECK: vgef %v24, 0(%v26,%r2), 3410; CHECK: br %r14411 %elem = extractelement <4 x i32> %index, i32 3412 %ext = zext i32 %elem to i64413 %add = add i64 %base, %ext414 %ptr = inttoptr i64 %add to ptr415 %element = load float, ptr %ptr416 %ret = insertelement <4 x float> %val, float %element, i32 3417 ret <4 x float> %ret418}419 420; Test a v2f64 gather of the first element.421define <2 x double> @f38(<2 x double> %val, <2 x i64> %index, i64 %base) {422; CHECK-LABEL: f38:423; CHECK: vgeg %v24, 0(%v26,%r2), 0424; CHECK: br %r14425 %elem = extractelement <2 x i64> %index, i32 0426 %add = add i64 %base, %elem427 %ptr = inttoptr i64 %add to ptr428 %element = load double, ptr %ptr429 %ret = insertelement <2 x double> %val, double %element, i32 0430 ret <2 x double> %ret431}432 433; Test a v2f64 gather of the last element.434define <2 x double> @f39(<2 x double> %val, <2 x i64> %index, i64 %base) {435; CHECK-LABEL: f39:436; CHECK: vgeg %v24, 0(%v26,%r2), 1437; CHECK: br %r14438 %elem = extractelement <2 x i64> %index, i32 1439 %add = add i64 %base, %elem440 %ptr = inttoptr i64 %add to ptr441 %element = load double, ptr %ptr442 %ret = insertelement <2 x double> %val, double %element, i32 1443 ret <2 x double> %ret444}445 446; Test a v4i32 gather where the load is chained.447define void @f40(<4 x i32> %val, <4 x i32> %index, i64 %base, ptr %res) {448; CHECK-LABEL: f40:449; CHECK: vgef %v24, 0(%v26,%r2), 1450; CHECK: vst %v24, 0(%r3)451; CHECK: br %r14452 %elem = extractelement <4 x i32> %index, i32 1453 %ext = zext i32 %elem to i64454 %add = add i64 %base, %ext455 %ptr = inttoptr i64 %add to ptr456 %element = load i32, ptr %ptr457 %ret = insertelement <4 x i32> %val, i32 %element, i32 1458 store <4 x i32> %ret, ptr %res459 ret void460}461 462; Test a v2i64 gather where the load is chained.463define void @f41(<2 x i64> %val, <2 x i64> %index, i64 %base, ptr %res) {464; CHECK-LABEL: f41:465; CHECK: vgeg %v24, 0(%v26,%r2), 1466; CHECK: vst %v24, 0(%r3)467; CHECK: br %r14468 %elem = extractelement <2 x i64> %index, i32 1469 %add = add i64 %base, %elem470 %ptr = inttoptr i64 %add to ptr471 %element = load i64, ptr %ptr472 %ret = insertelement <2 x i64> %val, i64 %element, i32 1473 store <2 x i64> %ret, ptr %res474 ret void475}476 477