; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z17 | FileCheck %s ; ; Test that zero extension is not made after a vector element extraction. define i16 @fun0(<16 x i8> %Arg) { ; CHECK-LABEL: fun0: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r2, %v24, 0 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i16 ret i16 %Ext } define i32 @fun1(<16 x i8> %Arg) { ; CHECK-LABEL: fun1: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r2, %v24, 0 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i32 ret i32 %Ext } define i64 @fun2(<16 x i8> %Arg) { ; CHECK-LABEL: fun2: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r2, %v24, 0 ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i64 ret i64 %Ext } define i128 @fun3(<16 x i8> %Arg) { ; CHECK-LABEL: fun3: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r0, %v24, 0 ; CHECK-NEXT: vgbm %v0, 0 ; CHECK-NEXT: vlvgb %v0, %r0, 15 ; CHECK-NEXT: vst %v0, 0(%r2), 3 ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i128 ret i128 %Ext } define i32 @fun4(<8 x i16> %Arg) { ; CHECK-LABEL: fun4: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvh %r2, %v24, 0 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d ; CHECK-NEXT: br %r14 %Elt = extractelement <8 x i16> %Arg, i32 0 %Ext = zext i16 %Elt to i32 ret i32 %Ext } define i64 @fun5(<8 x i16> %Arg) { ; CHECK-LABEL: fun5: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvh %r2, %v24, 0 ; CHECK-NEXT: br %r14 %Elt = extractelement <8 x i16> %Arg, i32 0 %Ext = zext i16 %Elt to i64 ret i64 %Ext } define i128 @fun6(<8 x i16> %Arg) { ; CHECK-LABEL: fun6: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvh %r0, %v24, 0 ; CHECK-NEXT: vgbm %v0, 0 ; CHECK-NEXT: vlvgh %v0, %r0, 7 ; CHECK-NEXT: vst %v0, 0(%r2), 3 ; CHECK-NEXT: br %r14 %Elt = extractelement <8 x i16> %Arg, i32 0 %Ext = zext i16 %Elt to i128 ret i128 %Ext } define i64 @fun7(<4 x i32> %Arg) { ; CHECK-LABEL: fun7: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvf %r2, %v24, 0 ; CHECK-NEXT: br %r14 %Elt = extractelement <4 x i32> %Arg, i32 0 %Ext = zext i32 %Elt to i64 ret i64 %Ext } define i128 @fun8(<4 x i32> %Arg) { ; CHECK-LABEL: fun8: ; CHECK: # %bb.0: ; CHECK-NEXT: vuplhf %v0, %v24 ; CHECK-NEXT: vuplhg %v0, %v0 ; CHECK-NEXT: vst %v0, 0(%r2), 3 ; CHECK-NEXT: br %r14 %Elt = extractelement <4 x i32> %Arg, i32 0 %Ext = zext i32 %Elt to i128 ret i128 %Ext } define i16 @fun9(<16 x i8> %Arg, i32 %index) { ; CHECK-LABEL: fun9: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r2, %v24, 0 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i16 ret i16 %Ext } define i32 @fun10(<16 x i8> %Arg, i32 %index) { ; CHECK-LABEL: fun10: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r2, %v24, 0 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i32 ret i32 %Ext } define i64 @fun11(<16 x i8> %Arg, i32 %index) { ; CHECK-LABEL: fun11: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r2, %v24, 0 ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i64 ret i64 %Ext } define i128 @fun12(<16 x i8> %Arg, i32 %index) { ; CHECK-LABEL: fun12: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvb %r0, %v24, 0 ; CHECK-NEXT: vgbm %v0, 0 ; CHECK-NEXT: vlvgb %v0, %r0, 15 ; CHECK-NEXT: vst %v0, 0(%r2), 3 ; CHECK-NEXT: br %r14 %Elt = extractelement <16 x i8> %Arg, i32 0 %Ext = zext i8 %Elt to i128 ret i128 %Ext } define i32 @fun13(<8 x i16> %Arg, i32 %index) { ; CHECK-LABEL: fun13: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvh %r2, %v24, 0 ; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d ; CHECK-NEXT: br %r14 %Elt = extractelement <8 x i16> %Arg, i32 0 %Ext = zext i16 %Elt to i32 ret i32 %Ext } define i64 @fun14(<8 x i16> %Arg, i32 %index) { ; CHECK-LABEL: fun14: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvh %r2, %v24, 0 ; CHECK-NEXT: br %r14 %Elt = extractelement <8 x i16> %Arg, i32 0 %Ext = zext i16 %Elt to i64 ret i64 %Ext } define i128 @fun15(<8 x i16> %Arg, i32 %index) { ; CHECK-LABEL: fun15: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvh %r0, %v24, 0 ; CHECK-NEXT: vgbm %v0, 0 ; CHECK-NEXT: vlvgh %v0, %r0, 7 ; CHECK-NEXT: vst %v0, 0(%r2), 3 ; CHECK-NEXT: br %r14 %Elt = extractelement <8 x i16> %Arg, i32 0 %Ext = zext i16 %Elt to i128 ret i128 %Ext } define i64 @fun16(<4 x i32> %Arg, i32 %index) { ; CHECK-LABEL: fun16: ; CHECK: # %bb.0: ; CHECK-NEXT: vlgvf %r2, %v24, 0 ; CHECK-NEXT: br %r14 %Elt = extractelement <4 x i32> %Arg, i32 0 %Ext = zext i32 %Elt to i64 ret i64 %Ext } define i128 @fun17(<4 x i32> %Arg, i32 %index) { ; CHECK-LABEL: fun17: ; CHECK: # %bb.0: ; CHECK-NEXT: vuplhf %v0, %v24 ; CHECK-NEXT: vuplhg %v0, %v0 ; CHECK-NEXT: vst %v0, 0(%r2), 3 ; CHECK-NEXT: br %r14 %Elt = extractelement <4 x i32> %Arg, i32 0 %Ext = zext i32 %Elt to i128 ret i128 %Ext }