1; Test vector permutes using VPDI. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 4 5; Test a high1/low2 permute for v16i8. 6define <16 x i8> @f1(<16 x i8> %val1, <16 x i8> %val2) { 7; CHECK-LABEL: f1: 8; CHECK: vpdi %v24, %v24, %v26, 1 9; CHECK: br %r14 10 %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 11 <16 x i32> <i32 0, i32 1, i32 2, i32 3, 12 i32 4, i32 5, i32 6, i32 7, 13 i32 24, i32 25, i32 26, i32 27, 14 i32 28, i32 29, i32 30, i32 31> 15 ret <16 x i8> %ret 16} 17 18; Test a low2/high1 permute for v16i8. 19define <16 x i8> @f2(<16 x i8> %val1, <16 x i8> %val2) { 20; CHECK-LABEL: f2: 21; CHECK: vpdi %v24, %v26, %v24, 4 22; CHECK: br %r14 23 %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 24 <16 x i32> <i32 24, i32 25, i32 26, i32 27, 25 i32 28, i32 29, i32 30, i32 31, 26 i32 0, i32 1, i32 2, i32 3, 27 i32 4, i32 5, i32 6, i32 7> 28 ret <16 x i8> %ret 29} 30 31; Test a low1/high2 permute for v16i8. 32define <16 x i8> @f3(<16 x i8> %val1, <16 x i8> %val2) { 33; CHECK-LABEL: f3: 34; CHECK: vpdi %v24, %v24, %v26, 4 35; CHECK: br %r14 36 %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 37 <16 x i32> <i32 8, i32 9, i32 10, i32 undef, 38 i32 12, i32 undef, i32 14, i32 15, 39 i32 16, i32 17, i32 undef, i32 19, 40 i32 20, i32 21, i32 22, i32 undef> 41 ret <16 x i8> %ret 42} 43 44; Test a high2/low1 permute for v16i8. 45define <16 x i8> @f4(<16 x i8> %val1, <16 x i8> %val2) { 46; CHECK-LABEL: f4: 47; CHECK: vpdi %v24, %v26, %v24, 1 48; CHECK: br %r14 49 %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2, 50 <16 x i32> <i32 16, i32 17, i32 18, i32 19, 51 i32 20, i32 21, i32 22, i32 23, 52 i32 8, i32 9, i32 10, i32 11, 53 i32 12, i32 13, i32 14, i32 15> 54 ret <16 x i8> %ret 55} 56 57; Test reversing two doublewords in a v16i8. 58define <16 x i8> @f5(<16 x i8> %val) { 59; CHECK-LABEL: f5: 60; CHECK: vpdi %v24, %v24, %v24, 4 61; CHECK: br %r14 62 %ret = shufflevector <16 x i8> %val, <16 x i8> undef, 63 <16 x i32> <i32 8, i32 9, i32 10, i32 11, 64 i32 12, i32 13, i32 14, i32 15, 65 i32 0, i32 1, i32 2, i32 3, 66 i32 4, i32 5, i32 6, i32 7> 67 ret <16 x i8> %ret 68} 69 70; Test a high1/low2 permute for v8i16. 71define <8 x i16> @f6(<8 x i16> %val1, <8 x i16> %val2) { 72; CHECK-LABEL: f6: 73; CHECK: vpdi %v24, %v24, %v26, 1 74; CHECK: br %r14 75 %ret = shufflevector <8 x i16> %val1, <8 x i16> %val2, 76 <8 x i32> <i32 0, i32 1, i32 2, i32 3, 77 i32 12, i32 13, i32 14, i32 15> 78 ret <8 x i16> %ret 79} 80 81; Test a low2/high1 permute for v8i16. 82define <8 x i16> @f7(<8 x i16> %val1, <8 x i16> %val2) { 83; CHECK-LABEL: f7: 84; CHECK: vpdi %v24, %v26, %v24, 4 85; CHECK: br %r14 86 %ret = shufflevector <8 x i16> %val1, <8 x i16> %val2, 87 <8 x i32> <i32 12, i32 13, i32 14, i32 15, 88 i32 0, i32 1, i32 2, i32 3> 89 ret <8 x i16> %ret 90} 91 92; Test a high1/low2 permute for v4i32. 93define <4 x i32> @f8(<4 x i32> %val1, <4 x i32> %val2) { 94; CHECK-LABEL: f8: 95; CHECK: vpdi %v24, %v24, %v26, 1 96; CHECK: br %r14 97 %ret = shufflevector <4 x i32> %val1, <4 x i32> %val2, 98 <4 x i32> <i32 0, i32 1, i32 6, i32 7> 99 ret <4 x i32> %ret 100} 101 102; Test a low2/high1 permute for v4i32. 103define <4 x i32> @f9(<4 x i32> %val1, <4 x i32> %val2) { 104; CHECK-LABEL: f9: 105; CHECK: vpdi %v24, %v26, %v24, 4 106; CHECK: br %r14 107 %ret = shufflevector <4 x i32> %val1, <4 x i32> %val2, 108 <4 x i32> <i32 6, i32 7, i32 0, i32 1> 109 ret <4 x i32> %ret 110} 111 112; Test a high1/low2 permute for v2i64. 113define <2 x i64> @f10(<2 x i64> %val1, <2 x i64> %val2) { 114; CHECK-LABEL: f10: 115; CHECK: vpdi %v24, %v24, %v26, 1 116; CHECK: br %r14 117 %ret = shufflevector <2 x i64> %val1, <2 x i64> %val2, 118 <2 x i32> <i32 0, i32 3> 119 ret <2 x i64> %ret 120} 121 122; Test low2/high1 permute for v2i64. 123define <2 x i64> @f11(<2 x i64> %val1, <2 x i64> %val2) { 124; CHECK-LABEL: f11: 125; CHECK: vpdi %v24, %v26, %v24, 4 126; CHECK: br %r14 127 %ret = shufflevector <2 x i64> %val1, <2 x i64> %val2, 128 <2 x i32> <i32 3, i32 0> 129 ret <2 x i64> %ret 130} 131 132; Test a high1/low2 permute for v4f32. 133define <4 x float> @f12(<4 x float> %val1, <4 x float> %val2) { 134; CHECK-LABEL: f12: 135; CHECK: vpdi %v24, %v24, %v26, 1 136; CHECK: br %r14 137 %ret = shufflevector <4 x float> %val1, <4 x float> %val2, 138 <4 x i32> <i32 0, i32 1, i32 6, i32 7> 139 ret <4 x float> %ret 140} 141 142; Test a low2/high1 permute for v4f32. 143define <4 x float> @f13(<4 x float> %val1, <4 x float> %val2) { 144; CHECK-LABEL: f13: 145; CHECK: vpdi %v24, %v26, %v24, 4 146; CHECK: br %r14 147 %ret = shufflevector <4 x float> %val1, <4 x float> %val2, 148 <4 x i32> <i32 6, i32 7, i32 0, i32 1> 149 ret <4 x float> %ret 150} 151 152; Test a high1/low2 permute for v2f64. 153define <2 x double> @f14(<2 x double> %val1, <2 x double> %val2) { 154; CHECK-LABEL: f14: 155; CHECK: vpdi %v24, %v24, %v26, 1 156; CHECK: br %r14 157 %ret = shufflevector <2 x double> %val1, <2 x double> %val2, 158 <2 x i32> <i32 0, i32 3> 159 ret <2 x double> %ret 160} 161 162; Test a low2/high1 permute for v2f64. 163define <2 x double> @f15(<2 x double> %val1, <2 x double> %val2) { 164; CHECK-LABEL: f15: 165; CHECK: vpdi %v24, %v26, %v24, 4 166; CHECK: br %r14 167 %ret = shufflevector <2 x double> %val1, <2 x double> %val2, 168 <2 x i32> <i32 3, i32 0> 169 ret <2 x double> %ret 170} 171