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