1*9880d681SAndroid Build Coastguard Worker; Test vector truncating stores. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Test a v16i8->v16i1 truncation. 6*9880d681SAndroid Build Coastguard Workerdefine void @f1(<16 x i8> %val, <16 x i1> *%ptr) { 7*9880d681SAndroid Build Coastguard Worker; No expected output, but must compile. 8*9880d681SAndroid Build Coastguard Worker %trunc = trunc <16 x i8> %val to <16 x i1> 9*9880d681SAndroid Build Coastguard Worker store <16 x i1> %trunc, <16 x i1> *%ptr 10*9880d681SAndroid Build Coastguard Worker ret void 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; Test a v8i16->v8i1 truncation. 14*9880d681SAndroid Build Coastguard Workerdefine void @f2(<8 x i16> %val, <8 x i1> *%ptr) { 15*9880d681SAndroid Build Coastguard Worker; No expected output, but must compile. 16*9880d681SAndroid Build Coastguard Worker %trunc = trunc <8 x i16> %val to <8 x i1> 17*9880d681SAndroid Build Coastguard Worker store <8 x i1> %trunc, <8 x i1> *%ptr 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; Test a v8i16->v8i8 truncation. 22*9880d681SAndroid Build Coastguard Workerdefine void @f3(<8 x i16> %val, <8 x i8> *%ptr) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 24*9880d681SAndroid Build Coastguard Worker; CHECK: vpkh [[REG1:%v[0-9]+]], %v24, %v24 25*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg [[REG1]], 0(%r2) 26*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 27*9880d681SAndroid Build Coastguard Worker %trunc = trunc <8 x i16> %val to <8 x i8> 28*9880d681SAndroid Build Coastguard Worker store <8 x i8> %trunc, <8 x i8> *%ptr 29*9880d681SAndroid Build Coastguard Worker ret void 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; Test a v4i32->v4i1 truncation. 33*9880d681SAndroid Build Coastguard Workerdefine void @f4(<4 x i32> %val, <4 x i1> *%ptr) { 34*9880d681SAndroid Build Coastguard Worker; No expected output, but must compile. 35*9880d681SAndroid Build Coastguard Worker %trunc = trunc <4 x i32> %val to <4 x i1> 36*9880d681SAndroid Build Coastguard Worker store <4 x i1> %trunc, <4 x i1> *%ptr 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; Test a v4i32->v4i8 truncation. At the moment we use a VPERM rather than 41*9880d681SAndroid Build Coastguard Worker; a chain of packs. 42*9880d681SAndroid Build Coastguard Workerdefine void @f5(<4 x i32> %val, <4 x i8> *%ptr) { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 44*9880d681SAndroid Build Coastguard Worker; CHECK: vperm [[REG:%v[0-9]+]], 45*9880d681SAndroid Build Coastguard Worker; CHECK: vstef [[REG]], 0(%r2) 46*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 47*9880d681SAndroid Build Coastguard Worker %trunc = trunc <4 x i32> %val to <4 x i8> 48*9880d681SAndroid Build Coastguard Worker store <4 x i8> %trunc, <4 x i8> *%ptr 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; Test a v4i32->v4i16 truncation. 53*9880d681SAndroid Build Coastguard Workerdefine void @f6(<4 x i32> %val, <4 x i16> *%ptr) { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 55*9880d681SAndroid Build Coastguard Worker; CHECK: vpkf [[REG1:%v[0-9]+]], %v24, %v24 56*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg [[REG1]], 0(%r2) 57*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 58*9880d681SAndroid Build Coastguard Worker %trunc = trunc <4 x i32> %val to <4 x i16> 59*9880d681SAndroid Build Coastguard Worker store <4 x i16> %trunc, <4 x i16> *%ptr 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; Test a v2i64->v2i1 truncation. 64*9880d681SAndroid Build Coastguard Workerdefine void @f7(<2 x i64> %val, <2 x i1> *%ptr) { 65*9880d681SAndroid Build Coastguard Worker; No expected output, but must compile. 66*9880d681SAndroid Build Coastguard Worker %trunc = trunc <2 x i64> %val to <2 x i1> 67*9880d681SAndroid Build Coastguard Worker store <2 x i1> %trunc, <2 x i1> *%ptr 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; Test a v2i64->v2i8 truncation. At the moment we use a VPERM rather than 72*9880d681SAndroid Build Coastguard Worker; a chain of packs. 73*9880d681SAndroid Build Coastguard Workerdefine void @f8(<2 x i64> %val, <2 x i8> *%ptr) { 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 75*9880d681SAndroid Build Coastguard Worker; CHECK: vperm [[REG:%v[0-9]+]], 76*9880d681SAndroid Build Coastguard Worker; CHECK: vsteh [[REG]], 0(%r2) 77*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 78*9880d681SAndroid Build Coastguard Worker %trunc = trunc <2 x i64> %val to <2 x i8> 79*9880d681SAndroid Build Coastguard Worker store <2 x i8> %trunc, <2 x i8> *%ptr 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; Test a v2i64->v2i16 truncation. At the moment we use a VPERM rather than 84*9880d681SAndroid Build Coastguard Worker; a chain of packs. 85*9880d681SAndroid Build Coastguard Workerdefine void @f9(<2 x i64> %val, <2 x i16> *%ptr) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 87*9880d681SAndroid Build Coastguard Worker; CHECK: vperm [[REG:%v[0-9]+]], 88*9880d681SAndroid Build Coastguard Worker; CHECK: vstef [[REG]], 0(%r2) 89*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 90*9880d681SAndroid Build Coastguard Worker %trunc = trunc <2 x i64> %val to <2 x i16> 91*9880d681SAndroid Build Coastguard Worker store <2 x i16> %trunc, <2 x i16> *%ptr 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; Test a v2i64->v2i32 truncation. 96*9880d681SAndroid Build Coastguard Workerdefine void @f10(<2 x i64> %val, <2 x i32> *%ptr) { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 98*9880d681SAndroid Build Coastguard Worker; CHECK: vpkg [[REG1:%v[0-9]+]], %v24, %v24 99*9880d681SAndroid Build Coastguard Worker; CHECK: vsteg [[REG1]], 0(%r2) 100*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 101*9880d681SAndroid Build Coastguard Worker %trunc = trunc <2 x i64> %val to <2 x i32> 102*9880d681SAndroid Build Coastguard Worker store <2 x i32> %trunc, <2 x i32> *%ptr 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105