139 lines · plain
1; Test insertions of memory values into 0.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s4 5; Test VLLEZB.6define <16 x i8> @f1(ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: vllezb %v24, 0(%r2)9; CHECK: br %r1410 %val = load i8, ptr %ptr11 %ret = insertelement <16 x i8> zeroinitializer, i8 %val, i32 712 ret <16 x i8> %ret13}14 15; Test VLLEZB with the highest in-range offset.16define <16 x i8> @f2(ptr %base) {17; CHECK-LABEL: f2:18; CHECK: vllezb %v24, 4095(%r2)19; CHECK: br %r1420 %ptr = getelementptr i8, ptr %base, i64 409521 %val = load i8, ptr %ptr22 %ret = insertelement <16 x i8> zeroinitializer, i8 %val, i32 723 ret <16 x i8> %ret24}25 26; Test VLLEZB with the next highest offset.27define <16 x i8> @f3(ptr %base) {28; CHECK-LABEL: f3:29; CHECK-NOT: vllezb %v24, 4096(%r2)30; CHECK: br %r1431 %ptr = getelementptr i8, ptr %base, i64 409632 %val = load i8, ptr %ptr33 %ret = insertelement <16 x i8> zeroinitializer, i8 %val, i32 734 ret <16 x i8> %ret35}36 37; Test that VLLEZB allows an index.38define <16 x i8> @f4(ptr %base, i64 %index) {39; CHECK-LABEL: f4:40; CHECK: vllezb %v24, 0({{%r2,%r3|%r3,%r2}})41; CHECK: br %r1442 %ptr = getelementptr i8, ptr %base, i64 %index43 %val = load i8, ptr %ptr44 %ret = insertelement <16 x i8> zeroinitializer, i8 %val, i32 745 ret <16 x i8> %ret46}47 48; Test VLLEZH.49define <8 x i16> @f5(ptr %ptr) {50; CHECK-LABEL: f5:51; CHECK: vllezh %v24, 0(%r2)52; CHECK: br %r1453 %val = load i16, ptr %ptr54 %ret = insertelement <8 x i16> zeroinitializer, i16 %val, i32 355 ret <8 x i16> %ret56}57 58; Test VLLEZF.59define <4 x i32> @f6(ptr %ptr) {60; CHECK-LABEL: f6:61; CHECK: vllezf %v24, 0(%r2)62; CHECK: br %r1463 %val = load i32, ptr %ptr64 %ret = insertelement <4 x i32> zeroinitializer, i32 %val, i32 165 ret <4 x i32> %ret66}67 68; Test VLLEZG.69define <2 x i64> @f7(ptr %ptr) {70; CHECK-LABEL: f7:71; CHECK: vllezg %v24, 0(%r2)72; CHECK: br %r1473 %val = load i64, ptr %ptr74 %ret = insertelement <2 x i64> zeroinitializer, i64 %val, i32 075 ret <2 x i64> %ret76}77 78; Test VLLEZF with a float.79define <4 x float> @f8(ptr %ptr) {80; CHECK-LABEL: f8:81; CHECK: vllezf %v24, 0(%r2)82; CHECK: br %r1483 %val = load float, ptr %ptr84 %ret = insertelement <4 x float> zeroinitializer, float %val, i32 185 ret <4 x float> %ret86}87 88; Test VLLEZG with a double.89define <2 x double> @f9(ptr %ptr) {90; CHECK-LABEL: f9:91; CHECK: vllezg %v24, 0(%r2)92; CHECK: br %r1493 %val = load double, ptr %ptr94 %ret = insertelement <2 x double> zeroinitializer, double %val, i32 095 ret <2 x double> %ret96}97 98; Test VLLEZF with a float when the result is stored to memory.99define void @f10(ptr %ptr, ptr %res) {100; CHECK-LABEL: f10:101; CHECK: vllezf [[REG:%v[0-9]+]], 0(%r2)102; CHECK: vst [[REG]], 0(%r3)103; CHECK: br %r14104 %val = load float, ptr %ptr105 %ret = insertelement <4 x float> zeroinitializer, float %val, i32 1106 store <4 x float> %ret, ptr %res107 ret void108}109 110; Test VLLEZG with a double when the result is stored to memory.111define void @f11(ptr %ptr, ptr %res) {112; CHECK-LABEL: f11:113; CHECK: vllezg [[REG:%v[0-9]+]], 0(%r2)114; CHECK: vst [[REG]], 0(%r3)115; CHECK: br %r14116 %val = load double, ptr %ptr117 %ret = insertelement <2 x double> zeroinitializer, double %val, i32 0118 store <2 x double> %ret, ptr %res119 ret void120}121 122; Test VLLEZG when the zeroinitializer is shared.123define void @f12(ptr %ptr, ptr %res) {124; CHECK-LABEL: f12:125; CHECK: vllezg [[REG:%v[0-9]+]], 0(%r2)126; CHECK: vst [[REG]], 0(%r3)127; CHECK: vllezg [[REG1:%v[0-9]+]], 0(%r2)128; CHECK: vst [[REG1]], 0(%r3)129; CHECK: br %r14130 %val = load volatile i64, ptr %ptr131 %ret = insertelement <2 x i64> zeroinitializer, i64 %val, i32 0132 store volatile <2 x i64> %ret, ptr %res133 %val1 = load volatile i64, ptr %ptr134 %ret1 = insertelement <2 x i64> zeroinitializer, i64 %val1, i32 0135 store volatile <2 x i64> %ret1, ptr %res136 ret void137}138 139