brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.1 KiB · 8d003ef Raw
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