276 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; Test that DAGCombiner gets helped by ComputeNumSignBitsForTargetNode() with3; vector intrinsics.4;5; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 < %s | FileCheck %s6 7declare {<16 x i8>, i32} @llvm.s390.vpkshs(<8 x i16>, <8 x i16>)8declare {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32>, <4 x i32>)9declare {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64>, <2 x i64>)10 11; PACKS_CC: i64 -> i3212define <4 x i32> @f0() {13; CHECK-LABEL: f0:14; CHECK: # %bb.0:15; CHECK-NEXT: larl %r1, .LCPI0_016; CHECK-NEXT: vl %v0, 0(%r1), 317; CHECK-NEXT: vpksgs %v24, %v0, %v018; CHECK-NEXT: br %r1419 %call = call {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64> <i64 0, i64 1>, <2 x i64> <i64 0, i64 1>)20 %extr = extractvalue {<4 x i32>, i32} %call, 021 %trunc = trunc <4 x i32> %extr to <4 x i16>22 %ret = sext <4 x i16> %trunc to <4 x i32>23 ret <4 x i32> %ret24}25 26; PACKS_CC: i32 -> i1627define <8 x i16> @f1() {28; CHECK-LABEL: f1:29; CHECK: # %bb.0:30; CHECK-NEXT: larl %r1, .LCPI1_031; CHECK-NEXT: vl %v0, 0(%r1), 332; CHECK-NEXT: vpksfs %v24, %v0, %v033; CHECK-NEXT: br %r1434 %call = call {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32> <i32 0, i32 1, i32 1, i32 0>,35 <4 x i32> <i32 0, i32 1, i32 1, i32 0>)36 %extr = extractvalue {<8 x i16>, i32} %call, 037 %trunc = trunc <8 x i16> %extr to <8 x i8>38 %ret = sext <8 x i8> %trunc to <8 x i16>39 ret <8 x i16> %ret40}41 42; PACKS_CC: i16 -> i843define <16 x i8> @f2() {44; CHECK-LABEL: f2:45; CHECK: # %bb.0:46; CHECK-NEXT: larl %r1, .LCPI2_047; CHECK-NEXT: vl %v0, 0(%r1), 348; CHECK-NEXT: vpkshs %v24, %v0, %v049; CHECK-NEXT: br %r1450 %call = call {<16 x i8>, i32} @llvm.s390.vpkshs(51 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>,52 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>)53 %extr = extractvalue {<16 x i8>, i32} %call, 054 %trunc = trunc <16 x i8> %extr to <16 x i4>55 %ret = sext <16 x i4> %trunc to <16 x i8>56 ret <16 x i8> %ret57}58 59declare {<16 x i8>, i32} @llvm.s390.vpklshs(<8 x i16>, <8 x i16>)60declare {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32>, <4 x i32>)61declare {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64>, <2 x i64>)62 63; PACKLS_CC: i64 -> i3264define <4 x i32> @f3() {65; CHECK-LABEL: f3:66; CHECK: # %bb.0:67; CHECK-NEXT: larl %r1, .LCPI3_068; CHECK-NEXT: vl %v0, 0(%r1), 369; CHECK-NEXT: larl %r1, .LCPI3_170; CHECK-NEXT: vl %v1, 0(%r1), 371; CHECK-NEXT: vpklsgs %v24, %v1, %v072; CHECK-NEXT: br %r1473 %call = call {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64> <i64 0, i64 1>, <2 x i64> <i64 1, i64 0>)74 %extr = extractvalue {<4 x i32>, i32} %call, 075 %trunc = trunc <4 x i32> %extr to <4 x i16>76 %ret = sext <4 x i16> %trunc to <4 x i32>77 ret <4 x i32> %ret78}79 80; PACKLS_CC: i32 -> i1681define <8 x i16> @f4() {82; CHECK-LABEL: f4:83; CHECK: # %bb.0:84; CHECK-NEXT: larl %r1, .LCPI4_085; CHECK-NEXT: vl %v0, 0(%r1), 386; CHECK-NEXT: vpklsfs %v24, %v0, %v087; CHECK-NEXT: br %r1488 %call = call {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32> <i32 0, i32 1, i32 1, i32 0>,89 <4 x i32> <i32 0, i32 1, i32 1, i32 0>)90 %extr = extractvalue {<8 x i16>, i32} %call, 091 %trunc = trunc <8 x i16> %extr to <8 x i8>92 %ret = sext <8 x i8> %trunc to <8 x i16>93 ret <8 x i16> %ret94}95 96; PACKLS_CC: i16 -> i897define <16 x i8> @f5() {98; CHECK-LABEL: f5:99; CHECK: # %bb.0:100; CHECK-NEXT: larl %r1, .LCPI5_0101; CHECK-NEXT: vl %v0, 0(%r1), 3102; CHECK-NEXT: vpklshs %v24, %v0, %v0103; CHECK-NEXT: br %r14104 %call = call {<16 x i8>, i32} @llvm.s390.vpklshs(105 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>,106 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>)107 %extr = extractvalue {<16 x i8>, i32} %call, 0108 %trunc = trunc <16 x i8> %extr to <16 x i4>109 %ret = sext <16 x i4> %trunc to <16 x i8>110 ret <16 x i8> %ret111}112 113declare <16 x i8> @llvm.s390.vpksh(<8 x i16>, <8 x i16>)114declare <8 x i16> @llvm.s390.vpksf(<4 x i32>, <4 x i32>)115declare <4 x i32> @llvm.s390.vpksg(<2 x i64>, <2 x i64>)116 117; PACKS: i64 -> i32118define <4 x i32> @f6() {119; CHECK-LABEL: f6:120; CHECK: # %bb.0:121; CHECK-NEXT: larl %r1, .LCPI6_0122; CHECK-NEXT: vl %v0, 0(%r1), 3123; CHECK-NEXT: larl %r1, .LCPI6_1124; CHECK-NEXT: vl %v1, 0(%r1), 3125; CHECK-NEXT: vpksg %v24, %v1, %v0126; CHECK-NEXT: br %r14127 %call = call <4 x i32> @llvm.s390.vpksg(<2 x i64> <i64 0, i64 1>, <2 x i64> <i64 1, i64 0>)128 %trunc = trunc <4 x i32> %call to <4 x i16>129 %ret = sext <4 x i16> %trunc to <4 x i32>130 ret <4 x i32> %ret131}132 133; PACKS: i32 -> i16134define <8 x i16> @f7() {135; CHECK-LABEL: f7:136; CHECK: # %bb.0:137; CHECK-NEXT: larl %r1, .LCPI7_0138; CHECK-NEXT: vl %v0, 0(%r1), 3139; CHECK-NEXT: vpksf %v24, %v0, %v0140; CHECK-NEXT: br %r14141 %call = call <8 x i16> @llvm.s390.vpksf(<4 x i32> <i32 0, i32 1, i32 1, i32 0>,142 <4 x i32> <i32 0, i32 1, i32 1, i32 0>)143 %trunc = trunc <8 x i16> %call to <8 x i8>144 %ret = sext <8 x i8> %trunc to <8 x i16>145 ret <8 x i16> %ret146}147 148; PACKS: i16 -> i8149define <16 x i8> @f8() {150; CHECK-LABEL: f8:151; CHECK: # %bb.0:152; CHECK-NEXT: larl %r1, .LCPI8_0153; CHECK-NEXT: vl %v0, 0(%r1), 3154; CHECK-NEXT: vpksh %v24, %v0, %v0155; CHECK-NEXT: br %r14156 %call = call <16 x i8> @llvm.s390.vpksh(157 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>,158 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>)159 %trunc = trunc <16 x i8> %call to <16 x i4>160 %ret = sext <16 x i4> %trunc to <16 x i8>161 ret <16 x i8> %ret162}163 164declare <16 x i8> @llvm.s390.vpklsh(<8 x i16>, <8 x i16>)165declare <8 x i16> @llvm.s390.vpklsf(<4 x i32>, <4 x i32>)166declare <4 x i32> @llvm.s390.vpklsg(<2 x i64>, <2 x i64>)167 168; PACKLS: i64 -> i32169define <4 x i32> @f9() {170; CHECK-LABEL: f9:171; CHECK: # %bb.0:172; CHECK-NEXT: larl %r1, .LCPI9_0173; CHECK-NEXT: vl %v0, 0(%r1), 3174; CHECK-NEXT: larl %r1, .LCPI9_1175; CHECK-NEXT: vl %v1, 0(%r1), 3176; CHECK-NEXT: vpklsg %v24, %v1, %v0177; CHECK-NEXT: br %r14178 %call = call <4 x i32> @llvm.s390.vpklsg(<2 x i64> <i64 0, i64 1>, <2 x i64> <i64 1, i64 0>)179 %trunc = trunc <4 x i32> %call to <4 x i16>180 %ret = sext <4 x i16> %trunc to <4 x i32>181 ret <4 x i32> %ret182}183 184; PACKLS: i32 -> i16185define <8 x i16> @f10() {186; CHECK-LABEL: f10:187; CHECK: # %bb.0:188; CHECK-NEXT: larl %r1, .LCPI10_0189; CHECK-NEXT: vl %v0, 0(%r1), 3190; CHECK-NEXT: vpklsf %v24, %v0, %v0191; CHECK-NEXT: br %r14192 %call = call <8 x i16> @llvm.s390.vpklsf(<4 x i32> <i32 0, i32 1, i32 1, i32 0>,193 <4 x i32> <i32 0, i32 1, i32 1, i32 0>)194 %trunc = trunc <8 x i16> %call to <8 x i8>195 %ret = sext <8 x i8> %trunc to <8 x i16>196 ret <8 x i16> %ret197}198 199; PACKLS: i16 -> i8200define <16 x i8> @f11() {201; CHECK-LABEL: f11:202; CHECK: # %bb.0:203; CHECK-NEXT: larl %r1, .LCPI11_0204; CHECK-NEXT: vl %v0, 0(%r1), 3205; CHECK-NEXT: vpklsh %v24, %v0, %v0206; CHECK-NEXT: br %r14207 %call = call <16 x i8> @llvm.s390.vpklsh(208 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>,209 <8 x i16> <i16 0, i16 0, i16 1, i16 1, i16 0, i16 0, i16 1, i16 1>)210 %trunc = trunc <16 x i8> %call to <16 x i4>211 %ret = sext <16 x i4> %trunc to <16 x i8>212 ret <16 x i8> %ret213}214 215declare <2 x i64> @llvm.s390.vpdi(<2 x i64>, <2 x i64>, i32)216 217; VPDI:218define <2 x i64> @f12() {219; CHECK-LABEL: f12:220; CHECK: # %bb.0:221; CHECK-NEXT: larl %r1, .LCPI12_0222; CHECK-NEXT: vl %v0, 0(%r1), 3223; CHECK-NEXT: larl %r1, .LCPI12_1224; CHECK-NEXT: vl %v1, 0(%r1), 3225; CHECK-NEXT: vpdi %v24, %v1, %v0, 0226; CHECK-NEXT: br %r14227 %perm = call <2 x i64> @llvm.s390.vpdi(<2 x i64> <i64 0, i64 1>,228 <2 x i64> <i64 1, i64 0>, i32 0)229 %trunc = trunc <2 x i64> %perm to <2 x i32>230 %ret = sext <2 x i32> %trunc to <2 x i64>231 ret <2 x i64> %ret232}233 234declare <16 x i8> @llvm.s390.vsldb(<16 x i8>, <16 x i8>, i32)235 236; VSLDB:237define <16 x i8> @f13() {238; CHECK-LABEL: f13:239; CHECK: # %bb.0:240; CHECK-NEXT: larl %r1, .LCPI13_0241; CHECK-NEXT: vl %v0, 0(%r1), 3242; CHECK-NEXT: vsldb %v24, %v0, %v0, 1243; CHECK-NEXT: br %r14244 %shfd = call <16 x i8> @llvm.s390.vsldb(<16 x i8>245 <i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1,246 i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1>, <16 x i8>247 <i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1,248 i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1>,249 i32 1)250 %trunc = trunc <16 x i8> %shfd to <16 x i4>251 %ret = sext <16 x i4> %trunc to <16 x i8>252 ret <16 x i8> %ret253}254 255declare <16 x i8> @llvm.s390.vperm(<16 x i8>, <16 x i8>, <16 x i8>)256 257; Test VPERM:258define <16 x i8> @f14() {259; CHECK-LABEL: f14:260; CHECK: # %bb.0:261; CHECK-NEXT: larl %r1, .LCPI14_0262; CHECK-NEXT: vl %v0, 0(%r1), 3263; CHECK-NEXT: vperm %v24, %v0, %v0, %v0264; CHECK-NEXT: br %r14265 %perm = call <16 x i8> @llvm.s390.vperm(266 <16 x i8> <i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1,267 i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1>,268 <16 x i8> <i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1,269 i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1>,270 <16 x i8> <i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1,271 i8 0, i8 0, i8 1, i8 1, i8 0, i8 1, i8 1, i8 1>)272 %trunc = trunc <16 x i8> %perm to <16 x i4>273 %ret = sext <16 x i4> %trunc to <16 x i8>274 ret <16 x i8> %ret275}276