1 ; Test vector intrinsics. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 4 5 declare i32 @llvm.s390.lcbb(i8 *, i32) 6 declare <16 x i8> @llvm.s390.vlbb(i8 *, i32) 7 declare <16 x i8> @llvm.s390.vll(i32, i8 *) 8 declare <2 x i64> @llvm.s390.vpdi(<2 x i64>, <2 x i64>, i32) 9 declare <16 x i8> @llvm.s390.vperm(<16 x i8>, <16 x i8>, <16 x i8>) 10 declare <16 x i8> @llvm.s390.vpksh(<8 x i16>, <8 x i16>) 11 declare <8 x i16> @llvm.s390.vpksf(<4 x i32>, <4 x i32>) 12 declare <4 x i32> @llvm.s390.vpksg(<2 x i64>, <2 x i64>) 13 declare {<16 x i8>, i32} @llvm.s390.vpkshs(<8 x i16>, <8 x i16>) 14 declare {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32>, <4 x i32>) 15 declare {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64>, <2 x i64>) 16 declare <16 x i8> @llvm.s390.vpklsh(<8 x i16>, <8 x i16>) 17 declare <8 x i16> @llvm.s390.vpklsf(<4 x i32>, <4 x i32>) 18 declare <4 x i32> @llvm.s390.vpklsg(<2 x i64>, <2 x i64>) 19 declare {<16 x i8>, i32} @llvm.s390.vpklshs(<8 x i16>, <8 x i16>) 20 declare {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32>, <4 x i32>) 21 declare {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64>, <2 x i64>) 22 declare void @llvm.s390.vstl(<16 x i8>, i32, i8 *) 23 declare <8 x i16> @llvm.s390.vuphb(<16 x i8>) 24 declare <4 x i32> @llvm.s390.vuphh(<8 x i16>) 25 declare <2 x i64> @llvm.s390.vuphf(<4 x i32>) 26 declare <8 x i16> @llvm.s390.vuplhb(<16 x i8>) 27 declare <4 x i32> @llvm.s390.vuplhh(<8 x i16>) 28 declare <2 x i64> @llvm.s390.vuplhf(<4 x i32>) 29 declare <8 x i16> @llvm.s390.vuplb(<16 x i8>) 30 declare <4 x i32> @llvm.s390.vuplhw(<8 x i16>) 31 declare <2 x i64> @llvm.s390.vuplf(<4 x i32>) 32 declare <8 x i16> @llvm.s390.vupllb(<16 x i8>) 33 declare <4 x i32> @llvm.s390.vupllh(<8 x i16>) 34 declare <2 x i64> @llvm.s390.vupllf(<4 x i32>) 35 declare <16 x i8> @llvm.s390.vaccb(<16 x i8>, <16 x i8>) 36 declare <8 x i16> @llvm.s390.vacch(<8 x i16>, <8 x i16>) 37 declare <4 x i32> @llvm.s390.vaccf(<4 x i32>, <4 x i32>) 38 declare <2 x i64> @llvm.s390.vaccg(<2 x i64>, <2 x i64>) 39 declare <16 x i8> @llvm.s390.vaq(<16 x i8>, <16 x i8>) 40 declare <16 x i8> @llvm.s390.vacq(<16 x i8>, <16 x i8>, <16 x i8>) 41 declare <16 x i8> @llvm.s390.vaccq(<16 x i8>, <16 x i8>) 42 declare <16 x i8> @llvm.s390.vacccq(<16 x i8>, <16 x i8>, <16 x i8>) 43 declare <16 x i8> @llvm.s390.vavgb(<16 x i8>, <16 x i8>) 44 declare <8 x i16> @llvm.s390.vavgh(<8 x i16>, <8 x i16>) 45 declare <4 x i32> @llvm.s390.vavgf(<4 x i32>, <4 x i32>) 46 declare <2 x i64> @llvm.s390.vavgg(<2 x i64>, <2 x i64>) 47 declare <16 x i8> @llvm.s390.vavglb(<16 x i8>, <16 x i8>) 48 declare <8 x i16> @llvm.s390.vavglh(<8 x i16>, <8 x i16>) 49 declare <4 x i32> @llvm.s390.vavglf(<4 x i32>, <4 x i32>) 50 declare <2 x i64> @llvm.s390.vavglg(<2 x i64>, <2 x i64>) 51 declare <4 x i32> @llvm.s390.vcksm(<4 x i32>, <4 x i32>) 52 declare <8 x i16> @llvm.s390.vgfmb(<16 x i8>, <16 x i8>) 53 declare <4 x i32> @llvm.s390.vgfmh(<8 x i16>, <8 x i16>) 54 declare <2 x i64> @llvm.s390.vgfmf(<4 x i32>, <4 x i32>) 55 declare <16 x i8> @llvm.s390.vgfmg(<2 x i64>, <2 x i64>) 56 declare <8 x i16> @llvm.s390.vgfmab(<16 x i8>, <16 x i8>, <8 x i16>) 57 declare <4 x i32> @llvm.s390.vgfmah(<8 x i16>, <8 x i16>, <4 x i32>) 58 declare <2 x i64> @llvm.s390.vgfmaf(<4 x i32>, <4 x i32>, <2 x i64>) 59 declare <16 x i8> @llvm.s390.vgfmag(<2 x i64>, <2 x i64>, <16 x i8>) 60 declare <16 x i8> @llvm.s390.vmahb(<16 x i8>, <16 x i8>, <16 x i8>) 61 declare <8 x i16> @llvm.s390.vmahh(<8 x i16>, <8 x i16>, <8 x i16>) 62 declare <4 x i32> @llvm.s390.vmahf(<4 x i32>, <4 x i32>, <4 x i32>) 63 declare <16 x i8> @llvm.s390.vmalhb(<16 x i8>, <16 x i8>, <16 x i8>) 64 declare <8 x i16> @llvm.s390.vmalhh(<8 x i16>, <8 x i16>, <8 x i16>) 65 declare <4 x i32> @llvm.s390.vmalhf(<4 x i32>, <4 x i32>, <4 x i32>) 66 declare <8 x i16> @llvm.s390.vmaeb(<16 x i8>, <16 x i8>, <8 x i16>) 67 declare <4 x i32> @llvm.s390.vmaeh(<8 x i16>, <8 x i16>, <4 x i32>) 68 declare <2 x i64> @llvm.s390.vmaef(<4 x i32>, <4 x i32>, <2 x i64>) 69 declare <8 x i16> @llvm.s390.vmaleb(<16 x i8>, <16 x i8>, <8 x i16>) 70 declare <4 x i32> @llvm.s390.vmaleh(<8 x i16>, <8 x i16>, <4 x i32>) 71 declare <2 x i64> @llvm.s390.vmalef(<4 x i32>, <4 x i32>, <2 x i64>) 72 declare <8 x i16> @llvm.s390.vmaob(<16 x i8>, <16 x i8>, <8 x i16>) 73 declare <4 x i32> @llvm.s390.vmaoh(<8 x i16>, <8 x i16>, <4 x i32>) 74 declare <2 x i64> @llvm.s390.vmaof(<4 x i32>, <4 x i32>, <2 x i64>) 75 declare <8 x i16> @llvm.s390.vmalob(<16 x i8>, <16 x i8>, <8 x i16>) 76 declare <4 x i32> @llvm.s390.vmaloh(<8 x i16>, <8 x i16>, <4 x i32>) 77 declare <2 x i64> @llvm.s390.vmalof(<4 x i32>, <4 x i32>, <2 x i64>) 78 declare <16 x i8> @llvm.s390.vmhb(<16 x i8>, <16 x i8>) 79 declare <8 x i16> @llvm.s390.vmhh(<8 x i16>, <8 x i16>) 80 declare <4 x i32> @llvm.s390.vmhf(<4 x i32>, <4 x i32>) 81 declare <16 x i8> @llvm.s390.vmlhb(<16 x i8>, <16 x i8>) 82 declare <8 x i16> @llvm.s390.vmlhh(<8 x i16>, <8 x i16>) 83 declare <4 x i32> @llvm.s390.vmlhf(<4 x i32>, <4 x i32>) 84 declare <8 x i16> @llvm.s390.vmeb(<16 x i8>, <16 x i8>) 85 declare <4 x i32> @llvm.s390.vmeh(<8 x i16>, <8 x i16>) 86 declare <2 x i64> @llvm.s390.vmef(<4 x i32>, <4 x i32>) 87 declare <8 x i16> @llvm.s390.vmleb(<16 x i8>, <16 x i8>) 88 declare <4 x i32> @llvm.s390.vmleh(<8 x i16>, <8 x i16>) 89 declare <2 x i64> @llvm.s390.vmlef(<4 x i32>, <4 x i32>) 90 declare <8 x i16> @llvm.s390.vmob(<16 x i8>, <16 x i8>) 91 declare <4 x i32> @llvm.s390.vmoh(<8 x i16>, <8 x i16>) 92 declare <2 x i64> @llvm.s390.vmof(<4 x i32>, <4 x i32>) 93 declare <8 x i16> @llvm.s390.vmlob(<16 x i8>, <16 x i8>) 94 declare <4 x i32> @llvm.s390.vmloh(<8 x i16>, <8 x i16>) 95 declare <2 x i64> @llvm.s390.vmlof(<4 x i32>, <4 x i32>) 96 declare <16 x i8> @llvm.s390.verllvb(<16 x i8>, <16 x i8>) 97 declare <8 x i16> @llvm.s390.verllvh(<8 x i16>, <8 x i16>) 98 declare <4 x i32> @llvm.s390.verllvf(<4 x i32>, <4 x i32>) 99 declare <2 x i64> @llvm.s390.verllvg(<2 x i64>, <2 x i64>) 100 declare <16 x i8> @llvm.s390.verllb(<16 x i8>, i32) 101 declare <8 x i16> @llvm.s390.verllh(<8 x i16>, i32) 102 declare <4 x i32> @llvm.s390.verllf(<4 x i32>, i32) 103 declare <2 x i64> @llvm.s390.verllg(<2 x i64>, i32) 104 declare <16 x i8> @llvm.s390.verimb(<16 x i8>, <16 x i8>, <16 x i8>, i32) 105 declare <8 x i16> @llvm.s390.verimh(<8 x i16>, <8 x i16>, <8 x i16>, i32) 106 declare <4 x i32> @llvm.s390.verimf(<4 x i32>, <4 x i32>, <4 x i32>, i32) 107 declare <2 x i64> @llvm.s390.verimg(<2 x i64>, <2 x i64>, <2 x i64>, i32) 108 declare <16 x i8> @llvm.s390.vsl(<16 x i8>, <16 x i8>) 109 declare <16 x i8> @llvm.s390.vslb(<16 x i8>, <16 x i8>) 110 declare <16 x i8> @llvm.s390.vsra(<16 x i8>, <16 x i8>) 111 declare <16 x i8> @llvm.s390.vsrab(<16 x i8>, <16 x i8>) 112 declare <16 x i8> @llvm.s390.vsrl(<16 x i8>, <16 x i8>) 113 declare <16 x i8> @llvm.s390.vsrlb(<16 x i8>, <16 x i8>) 114 declare <16 x i8> @llvm.s390.vsldb(<16 x i8>, <16 x i8>, i32) 115 declare <16 x i8> @llvm.s390.vscbib(<16 x i8>, <16 x i8>) 116 declare <8 x i16> @llvm.s390.vscbih(<8 x i16>, <8 x i16>) 117 declare <4 x i32> @llvm.s390.vscbif(<4 x i32>, <4 x i32>) 118 declare <2 x i64> @llvm.s390.vscbig(<2 x i64>, <2 x i64>) 119 declare <16 x i8> @llvm.s390.vsq(<16 x i8>, <16 x i8>) 120 declare <16 x i8> @llvm.s390.vsbiq(<16 x i8>, <16 x i8>, <16 x i8>) 121 declare <16 x i8> @llvm.s390.vscbiq(<16 x i8>, <16 x i8>) 122 declare <16 x i8> @llvm.s390.vsbcbiq(<16 x i8>, <16 x i8>, <16 x i8>) 123 declare <4 x i32> @llvm.s390.vsumb(<16 x i8>, <16 x i8>) 124 declare <4 x i32> @llvm.s390.vsumh(<8 x i16>, <8 x i16>) 125 declare <2 x i64> @llvm.s390.vsumgh(<8 x i16>, <8 x i16>) 126 declare <2 x i64> @llvm.s390.vsumgf(<4 x i32>, <4 x i32>) 127 declare <16 x i8> @llvm.s390.vsumqf(<4 x i32>, <4 x i32>) 128 declare <16 x i8> @llvm.s390.vsumqg(<2 x i64>, <2 x i64>) 129 declare i32 @llvm.s390.vtm(<16 x i8>, <16 x i8>) 130 declare {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8>, <16 x i8>) 131 declare {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16>, <8 x i16>) 132 declare {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32>, <4 x i32>) 133 declare {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64>, <2 x i64>) 134 declare {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8>, <16 x i8>) 135 declare {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16>, <8 x i16>) 136 declare {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32>, <4 x i32>) 137 declare {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64>, <2 x i64>) 138 declare {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8>, <16 x i8>) 139 declare {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16>, <8 x i16>) 140 declare {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32>, <4 x i32>) 141 declare {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64>, <2 x i64>) 142 declare <16 x i8> @llvm.s390.vfaeb(<16 x i8>, <16 x i8>, i32) 143 declare <8 x i16> @llvm.s390.vfaeh(<8 x i16>, <8 x i16>, i32) 144 declare <4 x i32> @llvm.s390.vfaef(<4 x i32>, <4 x i32>, i32) 145 declare {<16 x i8>, i32} @llvm.s390.vfaebs(<16 x i8>, <16 x i8>, i32) 146 declare {<8 x i16>, i32} @llvm.s390.vfaehs(<8 x i16>, <8 x i16>, i32) 147 declare {<4 x i32>, i32} @llvm.s390.vfaefs(<4 x i32>, <4 x i32>, i32) 148 declare <16 x i8> @llvm.s390.vfaezb(<16 x i8>, <16 x i8>, i32) 149 declare <8 x i16> @llvm.s390.vfaezh(<8 x i16>, <8 x i16>, i32) 150 declare <4 x i32> @llvm.s390.vfaezf(<4 x i32>, <4 x i32>, i32) 151 declare {<16 x i8>, i32} @llvm.s390.vfaezbs(<16 x i8>, <16 x i8>, i32) 152 declare {<8 x i16>, i32} @llvm.s390.vfaezhs(<8 x i16>, <8 x i16>, i32) 153 declare {<4 x i32>, i32} @llvm.s390.vfaezfs(<4 x i32>, <4 x i32>, i32) 154 declare <16 x i8> @llvm.s390.vfeeb(<16 x i8>, <16 x i8>) 155 declare <8 x i16> @llvm.s390.vfeeh(<8 x i16>, <8 x i16>) 156 declare <4 x i32> @llvm.s390.vfeef(<4 x i32>, <4 x i32>) 157 declare {<16 x i8>, i32} @llvm.s390.vfeebs(<16 x i8>, <16 x i8>) 158 declare {<8 x i16>, i32} @llvm.s390.vfeehs(<8 x i16>, <8 x i16>) 159 declare {<4 x i32>, i32} @llvm.s390.vfeefs(<4 x i32>, <4 x i32>) 160 declare <16 x i8> @llvm.s390.vfeezb(<16 x i8>, <16 x i8>) 161 declare <8 x i16> @llvm.s390.vfeezh(<8 x i16>, <8 x i16>) 162 declare <4 x i32> @llvm.s390.vfeezf(<4 x i32>, <4 x i32>) 163 declare {<16 x i8>, i32} @llvm.s390.vfeezbs(<16 x i8>, <16 x i8>) 164 declare {<8 x i16>, i32} @llvm.s390.vfeezhs(<8 x i16>, <8 x i16>) 165 declare {<4 x i32>, i32} @llvm.s390.vfeezfs(<4 x i32>, <4 x i32>) 166 declare <16 x i8> @llvm.s390.vfeneb(<16 x i8>, <16 x i8>) 167 declare <8 x i16> @llvm.s390.vfeneh(<8 x i16>, <8 x i16>) 168 declare <4 x i32> @llvm.s390.vfenef(<4 x i32>, <4 x i32>) 169 declare {<16 x i8>, i32} @llvm.s390.vfenebs(<16 x i8>, <16 x i8>) 170 declare {<8 x i16>, i32} @llvm.s390.vfenehs(<8 x i16>, <8 x i16>) 171 declare {<4 x i32>, i32} @llvm.s390.vfenefs(<4 x i32>, <4 x i32>) 172 declare <16 x i8> @llvm.s390.vfenezb(<16 x i8>, <16 x i8>) 173 declare <8 x i16> @llvm.s390.vfenezh(<8 x i16>, <8 x i16>) 174 declare <4 x i32> @llvm.s390.vfenezf(<4 x i32>, <4 x i32>) 175 declare {<16 x i8>, i32} @llvm.s390.vfenezbs(<16 x i8>, <16 x i8>) 176 declare {<8 x i16>, i32} @llvm.s390.vfenezhs(<8 x i16>, <8 x i16>) 177 declare {<4 x i32>, i32} @llvm.s390.vfenezfs(<4 x i32>, <4 x i32>) 178 declare <16 x i8> @llvm.s390.vistrb(<16 x i8>) 179 declare <8 x i16> @llvm.s390.vistrh(<8 x i16>) 180 declare <4 x i32> @llvm.s390.vistrf(<4 x i32>) 181 declare {<16 x i8>, i32} @llvm.s390.vistrbs(<16 x i8>) 182 declare {<8 x i16>, i32} @llvm.s390.vistrhs(<8 x i16>) 183 declare {<4 x i32>, i32} @llvm.s390.vistrfs(<4 x i32>) 184 declare <16 x i8> @llvm.s390.vstrcb(<16 x i8>, <16 x i8>, <16 x i8>, i32) 185 declare <8 x i16> @llvm.s390.vstrch(<8 x i16>, <8 x i16>, <8 x i16>, i32) 186 declare <4 x i32> @llvm.s390.vstrcf(<4 x i32>, <4 x i32>, <4 x i32>, i32) 187 declare {<16 x i8>, i32} @llvm.s390.vstrcbs(<16 x i8>, <16 x i8>, <16 x i8>, 188 i32) 189 declare {<8 x i16>, i32} @llvm.s390.vstrchs(<8 x i16>, <8 x i16>, <8 x i16>, 190 i32) 191 declare {<4 x i32>, i32} @llvm.s390.vstrcfs(<4 x i32>, <4 x i32>, <4 x i32>, 192 i32) 193 declare <16 x i8> @llvm.s390.vstrczb(<16 x i8>, <16 x i8>, <16 x i8>, i32) 194 declare <8 x i16> @llvm.s390.vstrczh(<8 x i16>, <8 x i16>, <8 x i16>, i32) 195 declare <4 x i32> @llvm.s390.vstrczf(<4 x i32>, <4 x i32>, <4 x i32>, i32) 196 declare {<16 x i8>, i32} @llvm.s390.vstrczbs(<16 x i8>, <16 x i8>, <16 x i8>, 197 i32) 198 declare {<8 x i16>, i32} @llvm.s390.vstrczhs(<8 x i16>, <8 x i16>, <8 x i16>, 199 i32) 200 declare {<4 x i32>, i32} @llvm.s390.vstrczfs(<4 x i32>, <4 x i32>, <4 x i32>, 201 i32) 202 declare {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double>, <2 x double>) 203 declare {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double>, <2 x double>) 204 declare {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double>, <2 x double>) 205 declare {<2 x i64>, i32} @llvm.s390.vftcidb(<2 x double>, i32) 206 declare <2 x double> @llvm.s390.vfidb(<2 x double>, i32, i32) 207 208 ; LCBB with the lowest M3 operand. 209 define i32 @test_lcbb1(i8 *%ptr) { 210 ; CHECK-LABEL: test_lcbb1: 211 ; CHECK: lcbb %r2, 0(%r2), 0 212 ; CHECK: br %r14 213 %res = call i32 @llvm.s390.lcbb(i8 *%ptr, i32 0) 214 ret i32 %res 215 } 216 217 ; LCBB with the highest M3 operand. 218 define i32 @test_lcbb2(i8 *%ptr) { 219 ; CHECK-LABEL: test_lcbb2: 220 ; CHECK: lcbb %r2, 0(%r2), 15 221 ; CHECK: br %r14 222 %res = call i32 @llvm.s390.lcbb(i8 *%ptr, i32 15) 223 ret i32 %res 224 } 225 226 ; LCBB with a displacement and index. 227 define i32 @test_lcbb3(i8 *%base, i64 %index) { 228 ; CHECK-LABEL: test_lcbb3: 229 ; CHECK: lcbb %r2, 4095({{%r2,%r3|%r3,%r2}}), 4 230 ; CHECK: br %r14 231 %add = add i64 %index, 4095 232 %ptr = getelementptr i8, i8 *%base, i64 %add 233 %res = call i32 @llvm.s390.lcbb(i8 *%ptr, i32 4) 234 ret i32 %res 235 } 236 237 ; LCBB with an out-of-range displacement. 238 define i32 @test_lcbb4(i8 *%base) { 239 ; CHECK-LABEL: test_lcbb4: 240 ; CHECK: lcbb %r2, 0({{%r[1-5]}}), 5 241 ; CHECK: br %r14 242 %ptr = getelementptr i8, i8 *%base, i64 4096 243 %res = call i32 @llvm.s390.lcbb(i8 *%ptr, i32 5) 244 ret i32 %res 245 } 246 247 ; VLBB with the lowest M3 operand. 248 define <16 x i8> @test_vlbb1(i8 *%ptr) { 249 ; CHECK-LABEL: test_vlbb1: 250 ; CHECK: vlbb %v24, 0(%r2), 0 251 ; CHECK: br %r14 252 %res = call <16 x i8> @llvm.s390.vlbb(i8 *%ptr, i32 0) 253 ret <16 x i8> %res 254 } 255 256 ; VLBB with the highest M3 operand. 257 define <16 x i8> @test_vlbb2(i8 *%ptr) { 258 ; CHECK-LABEL: test_vlbb2: 259 ; CHECK: vlbb %v24, 0(%r2), 15 260 ; CHECK: br %r14 261 %res = call <16 x i8> @llvm.s390.vlbb(i8 *%ptr, i32 15) 262 ret <16 x i8> %res 263 } 264 265 ; VLBB with a displacement and index. 266 define <16 x i8> @test_vlbb3(i8 *%base, i64 %index) { 267 ; CHECK-LABEL: test_vlbb3: 268 ; CHECK: vlbb %v24, 4095({{%r2,%r3|%r3,%r2}}), 4 269 ; CHECK: br %r14 270 %add = add i64 %index, 4095 271 %ptr = getelementptr i8, i8 *%base, i64 %add 272 %res = call <16 x i8> @llvm.s390.vlbb(i8 *%ptr, i32 4) 273 ret <16 x i8> %res 274 } 275 276 ; VLBB with an out-of-range displacement. 277 define <16 x i8> @test_vlbb4(i8 *%base) { 278 ; CHECK-LABEL: test_vlbb4: 279 ; CHECK: vlbb %v24, 0({{%r[1-5]}}), 5 280 ; CHECK: br %r14 281 %ptr = getelementptr i8, i8 *%base, i64 4096 282 %res = call <16 x i8> @llvm.s390.vlbb(i8 *%ptr, i32 5) 283 ret <16 x i8> %res 284 } 285 286 ; VLL with the lowest in-range displacement. 287 define <16 x i8> @test_vll1(i8 *%ptr, i32 %length) { 288 ; CHECK-LABEL: test_vll1: 289 ; CHECK: vll %v24, %r3, 0(%r2) 290 ; CHECK: br %r14 291 %res = call <16 x i8> @llvm.s390.vll(i32 %length, i8 *%ptr) 292 ret <16 x i8> %res 293 } 294 295 ; VLL with the highest in-range displacement. 296 define <16 x i8> @test_vll2(i8 *%base, i32 %length) { 297 ; CHECK-LABEL: test_vll2: 298 ; CHECK: vll %v24, %r3, 4095(%r2) 299 ; CHECK: br %r14 300 %ptr = getelementptr i8, i8 *%base, i64 4095 301 %res = call <16 x i8> @llvm.s390.vll(i32 %length, i8 *%ptr) 302 ret <16 x i8> %res 303 } 304 305 ; VLL with an out-of-range displacementa. 306 define <16 x i8> @test_vll3(i8 *%base, i32 %length) { 307 ; CHECK-LABEL: test_vll3: 308 ; CHECK: vll %v24, %r3, 0({{%r[1-5]}}) 309 ; CHECK: br %r14 310 %ptr = getelementptr i8, i8 *%base, i64 4096 311 %res = call <16 x i8> @llvm.s390.vll(i32 %length, i8 *%ptr) 312 ret <16 x i8> %res 313 } 314 315 ; Check that VLL doesn't allow an index. 316 define <16 x i8> @test_vll4(i8 *%base, i64 %index, i32 %length) { 317 ; CHECK-LABEL: test_vll4: 318 ; CHECK: vll %v24, %r4, 0({{%r[1-5]}}) 319 ; CHECK: br %r14 320 %ptr = getelementptr i8, i8 *%base, i64 %index 321 %res = call <16 x i8> @llvm.s390.vll(i32 %length, i8 *%ptr) 322 ret <16 x i8> %res 323 } 324 325 ; VPDI taking element 0 from each half. 326 define <2 x i64> @test_vpdi1(<2 x i64> %a, <2 x i64> %b) { 327 ; CHECK-LABEL: test_vpdi1: 328 ; CHECK: vpdi %v24, %v24, %v26, 0 329 ; CHECK: br %r14 330 %res = call <2 x i64> @llvm.s390.vpdi(<2 x i64> %a, <2 x i64> %b, i32 0) 331 ret <2 x i64> %res 332 } 333 334 ; VPDI taking element 1 from each half. 335 define <2 x i64> @test_vpdi2(<2 x i64> %a, <2 x i64> %b) { 336 ; CHECK-LABEL: test_vpdi2: 337 ; CHECK: vpdi %v24, %v24, %v26, 10 338 ; CHECK: br %r14 339 %res = call <2 x i64> @llvm.s390.vpdi(<2 x i64> %a, <2 x i64> %b, i32 10) 340 ret <2 x i64> %res 341 } 342 343 ; VPERM. 344 define <16 x i8> @test_vperm(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 345 ; CHECK-LABEL: test_vperm: 346 ; CHECK: vperm %v24, %v24, %v26, %v28 347 ; CHECK: br %r14 348 %res = call <16 x i8> @llvm.s390.vperm(<16 x i8> %a, <16 x i8> %b, 349 <16 x i8> %c) 350 ret <16 x i8> %res 351 } 352 353 ; VPKSH. 354 define <16 x i8> @test_vpksh(<8 x i16> %a, <8 x i16> %b) { 355 ; CHECK-LABEL: test_vpksh: 356 ; CHECK: vpksh %v24, %v24, %v26 357 ; CHECK: br %r14 358 %res = call <16 x i8> @llvm.s390.vpksh(<8 x i16> %a, <8 x i16> %b) 359 ret <16 x i8> %res 360 } 361 362 ; VPKSF. 363 define <8 x i16> @test_vpksf(<4 x i32> %a, <4 x i32> %b) { 364 ; CHECK-LABEL: test_vpksf: 365 ; CHECK: vpksf %v24, %v24, %v26 366 ; CHECK: br %r14 367 %res = call <8 x i16> @llvm.s390.vpksf(<4 x i32> %a, <4 x i32> %b) 368 ret <8 x i16> %res 369 } 370 371 ; VPKSG. 372 define <4 x i32> @test_vpksg(<2 x i64> %a, <2 x i64> %b) { 373 ; CHECK-LABEL: test_vpksg: 374 ; CHECK: vpksg %v24, %v24, %v26 375 ; CHECK: br %r14 376 %res = call <4 x i32> @llvm.s390.vpksg(<2 x i64> %a, <2 x i64> %b) 377 ret <4 x i32> %res 378 } 379 380 ; VPKSHS with no processing of the result. 381 define <16 x i8> @test_vpkshs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 382 ; CHECK-LABEL: test_vpkshs: 383 ; CHECK: vpkshs %v24, %v24, %v26 384 ; CHECK: ipm [[REG:%r[0-5]]] 385 ; CHECK: srl [[REG]], 28 386 ; CHECK: st [[REG]], 0(%r2) 387 ; CHECK: br %r14 388 %call = call {<16 x i8>, i32} @llvm.s390.vpkshs(<8 x i16> %a, <8 x i16> %b) 389 %res = extractvalue {<16 x i8>, i32} %call, 0 390 %cc = extractvalue {<16 x i8>, i32} %call, 1 391 store i32 %cc, i32 *%ccptr 392 ret <16 x i8> %res 393 } 394 395 ; VPKSHS, storing to %ptr if all values were saturated. 396 define <16 x i8> @test_vpkshs_all_store(<8 x i16> %a, <8 x i16> %b, i32 *%ptr) { 397 ; CHECK-LABEL: test_vpkshs_all_store: 398 ; CHECK: vpkshs %v24, %v24, %v26 399 ; CHECK-NEXT: {{bnor|bler}} %r14 400 ; CHECK: mvhi 0(%r2), 0 401 ; CHECK: br %r14 402 %call = call {<16 x i8>, i32} @llvm.s390.vpkshs(<8 x i16> %a, <8 x i16> %b) 403 %res = extractvalue {<16 x i8>, i32} %call, 0 404 %cc = extractvalue {<16 x i8>, i32} %call, 1 405 %cmp = icmp uge i32 %cc, 3 406 br i1 %cmp, label %store, label %exit 407 408 store: 409 store i32 0, i32 *%ptr 410 br label %exit 411 412 exit: 413 ret <16 x i8> %res 414 } 415 416 ; VPKSFS with no processing of the result. 417 define <8 x i16> @test_vpksfs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 418 ; CHECK-LABEL: test_vpksfs: 419 ; CHECK: vpksfs %v24, %v24, %v26 420 ; CHECK: ipm [[REG:%r[0-5]]] 421 ; CHECK: srl [[REG]], 28 422 ; CHECK: st [[REG]], 0(%r2) 423 ; CHECK: br %r14 424 %call = call {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32> %a, <4 x i32> %b) 425 %res = extractvalue {<8 x i16>, i32} %call, 0 426 %cc = extractvalue {<8 x i16>, i32} %call, 1 427 store i32 %cc, i32 *%ccptr 428 ret <8 x i16> %res 429 } 430 431 ; VPKSFS, storing to %ptr if any values were saturated. 432 define <8 x i16> @test_vpksfs_any_store(<4 x i32> %a, <4 x i32> %b, i32 *%ptr) { 433 ; CHECK-LABEL: test_vpksfs_any_store: 434 ; CHECK: vpksfs %v24, %v24, %v26 435 ; CHECK-NEXT: {{bher|ber}} %r14 436 ; CHECK: mvhi 0(%r2), 0 437 ; CHECK: br %r14 438 %call = call {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32> %a, <4 x i32> %b) 439 %res = extractvalue {<8 x i16>, i32} %call, 0 440 %cc = extractvalue {<8 x i16>, i32} %call, 1 441 %cmp = icmp ugt i32 %cc, 0 442 br i1 %cmp, label %store, label %exit 443 444 store: 445 store i32 0, i32 *%ptr 446 br label %exit 447 448 exit: 449 ret <8 x i16> %res 450 } 451 452 ; VPKSGS with no processing of the result. 453 define <4 x i32> @test_vpksgs(<2 x i64> %a, <2 x i64> %b, i32 *%ccptr) { 454 ; CHECK-LABEL: test_vpksgs: 455 ; CHECK: vpksgs %v24, %v24, %v26 456 ; CHECK: ipm [[REG:%r[0-5]]] 457 ; CHECK: srl [[REG]], 28 458 ; CHECK: st [[REG]], 0(%r2) 459 ; CHECK: br %r14 460 %call = call {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64> %a, <2 x i64> %b) 461 %res = extractvalue {<4 x i32>, i32} %call, 0 462 %cc = extractvalue {<4 x i32>, i32} %call, 1 463 store i32 %cc, i32 *%ccptr 464 ret <4 x i32> %res 465 } 466 467 ; VPKSGS, storing to %ptr if no elements were saturated 468 define <4 x i32> @test_vpksgs_none_store(<2 x i64> %a, <2 x i64> %b, 469 i32 *%ptr) { 470 ; CHECK-LABEL: test_vpksgs_none_store: 471 ; CHECK: vpksgs %v24, %v24, %v26 472 ; CHECK-NEXT: {{bnher|bner}} %r14 473 ; CHECK: mvhi 0(%r2), 0 474 ; CHECK: br %r14 475 %call = call {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64> %a, <2 x i64> %b) 476 %res = extractvalue {<4 x i32>, i32} %call, 0 477 %cc = extractvalue {<4 x i32>, i32} %call, 1 478 %cmp = icmp sle i32 %cc, 0 479 br i1 %cmp, label %store, label %exit 480 481 store: 482 store i32 0, i32 *%ptr 483 br label %exit 484 485 exit: 486 ret <4 x i32> %res 487 } 488 489 ; VPKLSH. 490 define <16 x i8> @test_vpklsh(<8 x i16> %a, <8 x i16> %b) { 491 ; CHECK-LABEL: test_vpklsh: 492 ; CHECK: vpklsh %v24, %v24, %v26 493 ; CHECK: br %r14 494 %res = call <16 x i8> @llvm.s390.vpklsh(<8 x i16> %a, <8 x i16> %b) 495 ret <16 x i8> %res 496 } 497 498 ; VPKLSF. 499 define <8 x i16> @test_vpklsf(<4 x i32> %a, <4 x i32> %b) { 500 ; CHECK-LABEL: test_vpklsf: 501 ; CHECK: vpklsf %v24, %v24, %v26 502 ; CHECK: br %r14 503 %res = call <8 x i16> @llvm.s390.vpklsf(<4 x i32> %a, <4 x i32> %b) 504 ret <8 x i16> %res 505 } 506 507 ; VPKLSG. 508 define <4 x i32> @test_vpklsg(<2 x i64> %a, <2 x i64> %b) { 509 ; CHECK-LABEL: test_vpklsg: 510 ; CHECK: vpklsg %v24, %v24, %v26 511 ; CHECK: br %r14 512 %res = call <4 x i32> @llvm.s390.vpklsg(<2 x i64> %a, <2 x i64> %b) 513 ret <4 x i32> %res 514 } 515 516 ; VPKLSHS with no processing of the result. 517 define <16 x i8> @test_vpklshs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 518 ; CHECK-LABEL: test_vpklshs: 519 ; CHECK: vpklshs %v24, %v24, %v26 520 ; CHECK: ipm [[REG:%r[0-5]]] 521 ; CHECK: srl [[REG]], 28 522 ; CHECK: st [[REG]], 0(%r2) 523 ; CHECK: br %r14 524 %call = call {<16 x i8>, i32} @llvm.s390.vpklshs(<8 x i16> %a, <8 x i16> %b) 525 %res = extractvalue {<16 x i8>, i32} %call, 0 526 %cc = extractvalue {<16 x i8>, i32} %call, 1 527 store i32 %cc, i32 *%ccptr 528 ret <16 x i8> %res 529 } 530 531 ; VPKLSHS, storing to %ptr if all values were saturated. 532 define <16 x i8> @test_vpklshs_all_store(<8 x i16> %a, <8 x i16> %b, 533 i32 *%ptr) { 534 ; CHECK-LABEL: test_vpklshs_all_store: 535 ; CHECK: vpklshs %v24, %v24, %v26 536 ; CHECK-NEXT: {{bnor|bler}} %r14 537 ; CHECK: mvhi 0(%r2), 0 538 ; CHECK: br %r14 539 %call = call {<16 x i8>, i32} @llvm.s390.vpklshs(<8 x i16> %a, <8 x i16> %b) 540 %res = extractvalue {<16 x i8>, i32} %call, 0 541 %cc = extractvalue {<16 x i8>, i32} %call, 1 542 %cmp = icmp eq i32 %cc, 3 543 br i1 %cmp, label %store, label %exit 544 545 store: 546 store i32 0, i32 *%ptr 547 br label %exit 548 549 exit: 550 ret <16 x i8> %res 551 } 552 553 ; VPKLSFS with no processing of the result. 554 define <8 x i16> @test_vpklsfs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 555 ; CHECK-LABEL: test_vpklsfs: 556 ; CHECK: vpklsfs %v24, %v24, %v26 557 ; CHECK: ipm [[REG:%r[0-5]]] 558 ; CHECK: srl [[REG]], 28 559 ; CHECK: st [[REG]], 0(%r2) 560 ; CHECK: br %r14 561 %call = call {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32> %a, <4 x i32> %b) 562 %res = extractvalue {<8 x i16>, i32} %call, 0 563 %cc = extractvalue {<8 x i16>, i32} %call, 1 564 store i32 %cc, i32 *%ccptr 565 ret <8 x i16> %res 566 } 567 568 ; VPKLSFS, storing to %ptr if any values were saturated. 569 define <8 x i16> @test_vpklsfs_any_store(<4 x i32> %a, <4 x i32> %b, 570 i32 *%ptr) { 571 ; CHECK-LABEL: test_vpklsfs_any_store: 572 ; CHECK: vpklsfs %v24, %v24, %v26 573 ; CHECK-NEXT: {{bher|ber}} %r14 574 ; CHECK: mvhi 0(%r2), 0 575 ; CHECK: br %r14 576 %call = call {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32> %a, <4 x i32> %b) 577 %res = extractvalue {<8 x i16>, i32} %call, 0 578 %cc = extractvalue {<8 x i16>, i32} %call, 1 579 %cmp = icmp ne i32 %cc, 0 580 br i1 %cmp, label %store, label %exit 581 582 store: 583 store i32 0, i32 *%ptr 584 br label %exit 585 586 exit: 587 ret <8 x i16> %res 588 } 589 590 ; VPKLSGS with no processing of the result. 591 define <4 x i32> @test_vpklsgs(<2 x i64> %a, <2 x i64> %b, i32 *%ccptr) { 592 ; CHECK-LABEL: test_vpklsgs: 593 ; CHECK: vpklsgs %v24, %v24, %v26 594 ; CHECK: ipm [[REG:%r[0-5]]] 595 ; CHECK: srl [[REG]], 28 596 ; CHECK: st [[REG]], 0(%r2) 597 ; CHECK: br %r14 598 %call = call {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64> %a, <2 x i64> %b) 599 %res = extractvalue {<4 x i32>, i32} %call, 0 600 %cc = extractvalue {<4 x i32>, i32} %call, 1 601 store i32 %cc, i32 *%ccptr 602 ret <4 x i32> %res 603 } 604 605 ; VPKLSGS, storing to %ptr if no elements were saturated 606 define <4 x i32> @test_vpklsgs_none_store(<2 x i64> %a, <2 x i64> %b, 607 i32 *%ptr) { 608 ; CHECK-LABEL: test_vpklsgs_none_store: 609 ; CHECK: vpklsgs %v24, %v24, %v26 610 ; CHECK-NEXT: {{bnher|bner}} %r14 611 ; CHECK: mvhi 0(%r2), 0 612 ; CHECK: br %r14 613 %call = call {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64> %a, <2 x i64> %b) 614 %res = extractvalue {<4 x i32>, i32} %call, 0 615 %cc = extractvalue {<4 x i32>, i32} %call, 1 616 %cmp = icmp eq i32 %cc, 0 617 br i1 %cmp, label %store, label %exit 618 619 store: 620 store i32 0, i32 *%ptr 621 br label %exit 622 623 exit: 624 ret <4 x i32> %res 625 } 626 627 ; VSTL with the lowest in-range displacement. 628 define void @test_vstl1(<16 x i8> %vec, i8 *%ptr, i32 %length) { 629 ; CHECK-LABEL: test_vstl1: 630 ; CHECK: vstl %v24, %r3, 0(%r2) 631 ; CHECK: br %r14 632 call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, i8 *%ptr) 633 ret void 634 } 635 636 ; VSTL with the highest in-range displacement. 637 define void @test_vstl2(<16 x i8> %vec, i8 *%base, i32 %length) { 638 ; CHECK-LABEL: test_vstl2: 639 ; CHECK: vstl %v24, %r3, 4095(%r2) 640 ; CHECK: br %r14 641 %ptr = getelementptr i8, i8 *%base, i64 4095 642 call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, i8 *%ptr) 643 ret void 644 } 645 646 ; VSTL with an out-of-range displacement. 647 define void @test_vstl3(<16 x i8> %vec, i8 *%base, i32 %length) { 648 ; CHECK-LABEL: test_vstl3: 649 ; CHECK: vstl %v24, %r3, 0({{%r[1-5]}}) 650 ; CHECK: br %r14 651 %ptr = getelementptr i8, i8 *%base, i64 4096 652 call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, i8 *%ptr) 653 ret void 654 } 655 656 ; Check that VSTL doesn't allow an index. 657 define void @test_vstl4(<16 x i8> %vec, i8 *%base, i64 %index, i32 %length) { 658 ; CHECK-LABEL: test_vstl4: 659 ; CHECK: vstl %v24, %r4, 0({{%r[1-5]}}) 660 ; CHECK: br %r14 661 %ptr = getelementptr i8, i8 *%base, i64 %index 662 call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, i8 *%ptr) 663 ret void 664 } 665 666 ; VUPHB. 667 define <8 x i16> @test_vuphb(<16 x i8> %a) { 668 ; CHECK-LABEL: test_vuphb: 669 ; CHECK: vuphb %v24, %v24 670 ; CHECK: br %r14 671 %res = call <8 x i16> @llvm.s390.vuphb(<16 x i8> %a) 672 ret <8 x i16> %res 673 } 674 675 ; VUPHH. 676 define <4 x i32> @test_vuphh(<8 x i16> %a) { 677 ; CHECK-LABEL: test_vuphh: 678 ; CHECK: vuphh %v24, %v24 679 ; CHECK: br %r14 680 %res = call <4 x i32> @llvm.s390.vuphh(<8 x i16> %a) 681 ret <4 x i32> %res 682 } 683 684 ; VUPHF. 685 define <2 x i64> @test_vuphf(<4 x i32> %a) { 686 ; CHECK-LABEL: test_vuphf: 687 ; CHECK: vuphf %v24, %v24 688 ; CHECK: br %r14 689 %res = call <2 x i64> @llvm.s390.vuphf(<4 x i32> %a) 690 ret <2 x i64> %res 691 } 692 693 ; VUPLHB. 694 define <8 x i16> @test_vuplhb(<16 x i8> %a) { 695 ; CHECK-LABEL: test_vuplhb: 696 ; CHECK: vuplhb %v24, %v24 697 ; CHECK: br %r14 698 %res = call <8 x i16> @llvm.s390.vuplhb(<16 x i8> %a) 699 ret <8 x i16> %res 700 } 701 702 ; VUPLHH. 703 define <4 x i32> @test_vuplhh(<8 x i16> %a) { 704 ; CHECK-LABEL: test_vuplhh: 705 ; CHECK: vuplhh %v24, %v24 706 ; CHECK: br %r14 707 %res = call <4 x i32> @llvm.s390.vuplhh(<8 x i16> %a) 708 ret <4 x i32> %res 709 } 710 711 ; VUPLHF. 712 define <2 x i64> @test_vuplhf(<4 x i32> %a) { 713 ; CHECK-LABEL: test_vuplhf: 714 ; CHECK: vuplhf %v24, %v24 715 ; CHECK: br %r14 716 %res = call <2 x i64> @llvm.s390.vuplhf(<4 x i32> %a) 717 ret <2 x i64> %res 718 } 719 720 ; VUPLB. 721 define <8 x i16> @test_vuplb(<16 x i8> %a) { 722 ; CHECK-LABEL: test_vuplb: 723 ; CHECK: vuplb %v24, %v24 724 ; CHECK: br %r14 725 %res = call <8 x i16> @llvm.s390.vuplb(<16 x i8> %a) 726 ret <8 x i16> %res 727 } 728 729 ; VUPLHW. 730 define <4 x i32> @test_vuplhw(<8 x i16> %a) { 731 ; CHECK-LABEL: test_vuplhw: 732 ; CHECK: vuplhw %v24, %v24 733 ; CHECK: br %r14 734 %res = call <4 x i32> @llvm.s390.vuplhw(<8 x i16> %a) 735 ret <4 x i32> %res 736 } 737 738 ; VUPLF. 739 define <2 x i64> @test_vuplf(<4 x i32> %a) { 740 ; CHECK-LABEL: test_vuplf: 741 ; CHECK: vuplf %v24, %v24 742 ; CHECK: br %r14 743 %res = call <2 x i64> @llvm.s390.vuplf(<4 x i32> %a) 744 ret <2 x i64> %res 745 } 746 747 ; VUPLLB. 748 define <8 x i16> @test_vupllb(<16 x i8> %a) { 749 ; CHECK-LABEL: test_vupllb: 750 ; CHECK: vupllb %v24, %v24 751 ; CHECK: br %r14 752 %res = call <8 x i16> @llvm.s390.vupllb(<16 x i8> %a) 753 ret <8 x i16> %res 754 } 755 756 ; VUPLLH. 757 define <4 x i32> @test_vupllh(<8 x i16> %a) { 758 ; CHECK-LABEL: test_vupllh: 759 ; CHECK: vupllh %v24, %v24 760 ; CHECK: br %r14 761 %res = call <4 x i32> @llvm.s390.vupllh(<8 x i16> %a) 762 ret <4 x i32> %res 763 } 764 765 ; VUPLLF. 766 define <2 x i64> @test_vupllf(<4 x i32> %a) { 767 ; CHECK-LABEL: test_vupllf: 768 ; CHECK: vupllf %v24, %v24 769 ; CHECK: br %r14 770 %res = call <2 x i64> @llvm.s390.vupllf(<4 x i32> %a) 771 ret <2 x i64> %res 772 } 773 774 ; VACCB. 775 define <16 x i8> @test_vaccb(<16 x i8> %a, <16 x i8> %b) { 776 ; CHECK-LABEL: test_vaccb: 777 ; CHECK: vaccb %v24, %v24, %v26 778 ; CHECK: br %r14 779 %res = call <16 x i8> @llvm.s390.vaccb(<16 x i8> %a, <16 x i8> %b) 780 ret <16 x i8> %res 781 } 782 783 ; VACCH. 784 define <8 x i16> @test_vacch(<8 x i16> %a, <8 x i16> %b) { 785 ; CHECK-LABEL: test_vacch: 786 ; CHECK: vacch %v24, %v24, %v26 787 ; CHECK: br %r14 788 %res = call <8 x i16> @llvm.s390.vacch(<8 x i16> %a, <8 x i16> %b) 789 ret <8 x i16> %res 790 } 791 792 ; VACCF. 793 define <4 x i32> @test_vaccf(<4 x i32> %a, <4 x i32> %b) { 794 ; CHECK-LABEL: test_vaccf: 795 ; CHECK: vaccf %v24, %v24, %v26 796 ; CHECK: br %r14 797 %res = call <4 x i32> @llvm.s390.vaccf(<4 x i32> %a, <4 x i32> %b) 798 ret <4 x i32> %res 799 } 800 801 ; VACCG. 802 define <2 x i64> @test_vaccg(<2 x i64> %a, <2 x i64> %b) { 803 ; CHECK-LABEL: test_vaccg: 804 ; CHECK: vaccg %v24, %v24, %v26 805 ; CHECK: br %r14 806 %res = call <2 x i64> @llvm.s390.vaccg(<2 x i64> %a, <2 x i64> %b) 807 ret <2 x i64> %res 808 } 809 810 ; VAQ. 811 define <16 x i8> @test_vaq(<16 x i8> %a, <16 x i8> %b) { 812 ; CHECK-LABEL: test_vaq: 813 ; CHECK: vaq %v24, %v24, %v26 814 ; CHECK: br %r14 815 %res = call <16 x i8> @llvm.s390.vaq(<16 x i8> %a, <16 x i8> %b) 816 ret <16 x i8> %res 817 } 818 819 ; VACQ. 820 define <16 x i8> @test_vacq(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 821 ; CHECK-LABEL: test_vacq: 822 ; CHECK: vacq %v24, %v24, %v26, %v28 823 ; CHECK: br %r14 824 %res = call <16 x i8> @llvm.s390.vacq(<16 x i8> %a, <16 x i8> %b, 825 <16 x i8> %c) 826 ret <16 x i8> %res 827 } 828 829 ; VACCQ. 830 define <16 x i8> @test_vaccq(<16 x i8> %a, <16 x i8> %b) { 831 ; CHECK-LABEL: test_vaccq: 832 ; CHECK: vaccq %v24, %v24, %v26 833 ; CHECK: br %r14 834 %res = call <16 x i8> @llvm.s390.vaccq(<16 x i8> %a, <16 x i8> %b) 835 ret <16 x i8> %res 836 } 837 838 ; VACCCQ. 839 define <16 x i8> @test_vacccq(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 840 ; CHECK-LABEL: test_vacccq: 841 ; CHECK: vacccq %v24, %v24, %v26, %v28 842 ; CHECK: br %r14 843 %res = call <16 x i8> @llvm.s390.vacccq(<16 x i8> %a, <16 x i8> %b, 844 <16 x i8> %c) 845 ret <16 x i8> %res 846 } 847 848 ; VAVGB. 849 define <16 x i8> @test_vavgb(<16 x i8> %a, <16 x i8> %b) { 850 ; CHECK-LABEL: test_vavgb: 851 ; CHECK: vavgb %v24, %v24, %v26 852 ; CHECK: br %r14 853 %res = call <16 x i8> @llvm.s390.vavgb(<16 x i8> %a, <16 x i8> %b) 854 ret <16 x i8> %res 855 } 856 857 ; VAVGH. 858 define <8 x i16> @test_vavgh(<8 x i16> %a, <8 x i16> %b) { 859 ; CHECK-LABEL: test_vavgh: 860 ; CHECK: vavgh %v24, %v24, %v26 861 ; CHECK: br %r14 862 %res = call <8 x i16> @llvm.s390.vavgh(<8 x i16> %a, <8 x i16> %b) 863 ret <8 x i16> %res 864 } 865 866 ; VAVGF. 867 define <4 x i32> @test_vavgf(<4 x i32> %a, <4 x i32> %b) { 868 ; CHECK-LABEL: test_vavgf: 869 ; CHECK: vavgf %v24, %v24, %v26 870 ; CHECK: br %r14 871 %res = call <4 x i32> @llvm.s390.vavgf(<4 x i32> %a, <4 x i32> %b) 872 ret <4 x i32> %res 873 } 874 875 ; VAVGG. 876 define <2 x i64> @test_vavgg(<2 x i64> %a, <2 x i64> %b) { 877 ; CHECK-LABEL: test_vavgg: 878 ; CHECK: vavgg %v24, %v24, %v26 879 ; CHECK: br %r14 880 %res = call <2 x i64> @llvm.s390.vavgg(<2 x i64> %a, <2 x i64> %b) 881 ret <2 x i64> %res 882 } 883 884 ; VAVGLB. 885 define <16 x i8> @test_vavglb(<16 x i8> %a, <16 x i8> %b) { 886 ; CHECK-LABEL: test_vavglb: 887 ; CHECK: vavglb %v24, %v24, %v26 888 ; CHECK: br %r14 889 %res = call <16 x i8> @llvm.s390.vavglb(<16 x i8> %a, <16 x i8> %b) 890 ret <16 x i8> %res 891 } 892 893 ; VAVGLH. 894 define <8 x i16> @test_vavglh(<8 x i16> %a, <8 x i16> %b) { 895 ; CHECK-LABEL: test_vavglh: 896 ; CHECK: vavglh %v24, %v24, %v26 897 ; CHECK: br %r14 898 %res = call <8 x i16> @llvm.s390.vavglh(<8 x i16> %a, <8 x i16> %b) 899 ret <8 x i16> %res 900 } 901 902 ; VAVGLF. 903 define <4 x i32> @test_vavglf(<4 x i32> %a, <4 x i32> %b) { 904 ; CHECK-LABEL: test_vavglf: 905 ; CHECK: vavglf %v24, %v24, %v26 906 ; CHECK: br %r14 907 %res = call <4 x i32> @llvm.s390.vavglf(<4 x i32> %a, <4 x i32> %b) 908 ret <4 x i32> %res 909 } 910 911 ; VAVGLG. 912 define <2 x i64> @test_vavglg(<2 x i64> %a, <2 x i64> %b) { 913 ; CHECK-LABEL: test_vavglg: 914 ; CHECK: vavglg %v24, %v24, %v26 915 ; CHECK: br %r14 916 %res = call <2 x i64> @llvm.s390.vavglg(<2 x i64> %a, <2 x i64> %b) 917 ret <2 x i64> %res 918 } 919 920 ; VCKSM. 921 define <4 x i32> @test_vcksm(<4 x i32> %a, <4 x i32> %b) { 922 ; CHECK-LABEL: test_vcksm: 923 ; CHECK: vcksm %v24, %v24, %v26 924 ; CHECK: br %r14 925 %res = call <4 x i32> @llvm.s390.vcksm(<4 x i32> %a, <4 x i32> %b) 926 ret <4 x i32> %res 927 } 928 929 ; VGFMB. 930 define <8 x i16> @test_vgfmb(<16 x i8> %a, <16 x i8> %b) { 931 ; CHECK-LABEL: test_vgfmb: 932 ; CHECK: vgfmb %v24, %v24, %v26 933 ; CHECK: br %r14 934 %res = call <8 x i16> @llvm.s390.vgfmb(<16 x i8> %a, <16 x i8> %b) 935 ret <8 x i16> %res 936 } 937 938 ; VGFMH. 939 define <4 x i32> @test_vgfmh(<8 x i16> %a, <8 x i16> %b) { 940 ; CHECK-LABEL: test_vgfmh: 941 ; CHECK: vgfmh %v24, %v24, %v26 942 ; CHECK: br %r14 943 %res = call <4 x i32> @llvm.s390.vgfmh(<8 x i16> %a, <8 x i16> %b) 944 ret <4 x i32> %res 945 } 946 947 ; VGFMF. 948 define <2 x i64> @test_vgfmf(<4 x i32> %a, <4 x i32> %b) { 949 ; CHECK-LABEL: test_vgfmf: 950 ; CHECK: vgfmf %v24, %v24, %v26 951 ; CHECK: br %r14 952 %res = call <2 x i64> @llvm.s390.vgfmf(<4 x i32> %a, <4 x i32> %b) 953 ret <2 x i64> %res 954 } 955 956 ; VGFMG. 957 define <16 x i8> @test_vgfmg(<2 x i64> %a, <2 x i64> %b) { 958 ; CHECK-LABEL: test_vgfmg: 959 ; CHECK: vgfmg %v24, %v24, %v26 960 ; CHECK: br %r14 961 %res = call <16 x i8> @llvm.s390.vgfmg(<2 x i64> %a, <2 x i64> %b) 962 ret <16 x i8> %res 963 } 964 965 ; VGFMAB. 966 define <8 x i16> @test_vgfmab(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) { 967 ; CHECK-LABEL: test_vgfmab: 968 ; CHECK: vgfmab %v24, %v24, %v26, %v28 969 ; CHECK: br %r14 970 %res = call <8 x i16> @llvm.s390.vgfmab(<16 x i8> %a, <16 x i8> %b, 971 <8 x i16> %c) 972 ret <8 x i16> %res 973 } 974 975 ; VGFMAH. 976 define <4 x i32> @test_vgfmah(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) { 977 ; CHECK-LABEL: test_vgfmah: 978 ; CHECK: vgfmah %v24, %v24, %v26, %v28 979 ; CHECK: br %r14 980 %res = call <4 x i32> @llvm.s390.vgfmah(<8 x i16> %a, <8 x i16> %b, 981 <4 x i32> %c) 982 ret <4 x i32> %res 983 } 984 985 ; VGFMAF. 986 define <2 x i64> @test_vgfmaf(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) { 987 ; CHECK-LABEL: test_vgfmaf: 988 ; CHECK: vgfmaf %v24, %v24, %v26, %v28 989 ; CHECK: br %r14 990 %res = call <2 x i64> @llvm.s390.vgfmaf(<4 x i32> %a, <4 x i32> %b, 991 <2 x i64> %c) 992 ret <2 x i64> %res 993 } 994 995 ; VGFMAG. 996 define <16 x i8> @test_vgfmag(<2 x i64> %a, <2 x i64> %b, <16 x i8> %c) { 997 ; CHECK-LABEL: test_vgfmag: 998 ; CHECK: vgfmag %v24, %v24, %v26, %v28 999 ; CHECK: br %r14 1000 %res = call <16 x i8> @llvm.s390.vgfmag(<2 x i64> %a, <2 x i64> %b, 1001 <16 x i8> %c) 1002 ret <16 x i8> %res 1003 } 1004 1005 ; VMAHB. 1006 define <16 x i8> @test_vmahb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 1007 ; CHECK-LABEL: test_vmahb: 1008 ; CHECK: vmahb %v24, %v24, %v26, %v28 1009 ; CHECK: br %r14 1010 %res = call <16 x i8> @llvm.s390.vmahb(<16 x i8> %a, <16 x i8> %b, 1011 <16 x i8> %c) 1012 ret <16 x i8> %res 1013 } 1014 1015 ; VMAHH. 1016 define <8 x i16> @test_vmahh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) { 1017 ; CHECK-LABEL: test_vmahh: 1018 ; CHECK: vmahh %v24, %v24, %v26, %v28 1019 ; CHECK: br %r14 1020 %res = call <8 x i16> @llvm.s390.vmahh(<8 x i16> %a, <8 x i16> %b, 1021 <8 x i16> %c) 1022 ret <8 x i16> %res 1023 } 1024 1025 ; VMAHF. 1026 define <4 x i32> @test_vmahf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 1027 ; CHECK-LABEL: test_vmahf: 1028 ; CHECK: vmahf %v24, %v24, %v26, %v28 1029 ; CHECK: br %r14 1030 %res = call <4 x i32> @llvm.s390.vmahf(<4 x i32> %a, <4 x i32> %b, 1031 <4 x i32> %c) 1032 ret <4 x i32> %res 1033 } 1034 1035 ; VMALHB. 1036 define <16 x i8> @test_vmalhb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 1037 ; CHECK-LABEL: test_vmalhb: 1038 ; CHECK: vmalhb %v24, %v24, %v26, %v28 1039 ; CHECK: br %r14 1040 %res = call <16 x i8> @llvm.s390.vmalhb(<16 x i8> %a, <16 x i8> %b, 1041 <16 x i8> %c) 1042 ret <16 x i8> %res 1043 } 1044 1045 ; VMALHH. 1046 define <8 x i16> @test_vmalhh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) { 1047 ; CHECK-LABEL: test_vmalhh: 1048 ; CHECK: vmalhh %v24, %v24, %v26, %v28 1049 ; CHECK: br %r14 1050 %res = call <8 x i16> @llvm.s390.vmalhh(<8 x i16> %a, <8 x i16> %b, 1051 <8 x i16> %c) 1052 ret <8 x i16> %res 1053 } 1054 1055 ; VMALHF. 1056 define <4 x i32> @test_vmalhf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 1057 ; CHECK-LABEL: test_vmalhf: 1058 ; CHECK: vmalhf %v24, %v24, %v26, %v28 1059 ; CHECK: br %r14 1060 %res = call <4 x i32> @llvm.s390.vmalhf(<4 x i32> %a, <4 x i32> %b, 1061 <4 x i32> %c) 1062 ret <4 x i32> %res 1063 } 1064 1065 ; VMAEB. 1066 define <8 x i16> @test_vmaeb(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) { 1067 ; CHECK-LABEL: test_vmaeb: 1068 ; CHECK: vmaeb %v24, %v24, %v26, %v28 1069 ; CHECK: br %r14 1070 %res = call <8 x i16> @llvm.s390.vmaeb(<16 x i8> %a, <16 x i8> %b, 1071 <8 x i16> %c) 1072 ret <8 x i16> %res 1073 } 1074 1075 ; VMAEH. 1076 define <4 x i32> @test_vmaeh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) { 1077 ; CHECK-LABEL: test_vmaeh: 1078 ; CHECK: vmaeh %v24, %v24, %v26, %v28 1079 ; CHECK: br %r14 1080 %res = call <4 x i32> @llvm.s390.vmaeh(<8 x i16> %a, <8 x i16> %b, 1081 <4 x i32> %c) 1082 ret <4 x i32> %res 1083 } 1084 1085 ; VMAEF. 1086 define <2 x i64> @test_vmaef(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) { 1087 ; CHECK-LABEL: test_vmaef: 1088 ; CHECK: vmaef %v24, %v24, %v26, %v28 1089 ; CHECK: br %r14 1090 %res = call <2 x i64> @llvm.s390.vmaef(<4 x i32> %a, <4 x i32> %b, 1091 <2 x i64> %c) 1092 ret <2 x i64> %res 1093 } 1094 1095 ; VMALEB. 1096 define <8 x i16> @test_vmaleb(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) { 1097 ; CHECK-LABEL: test_vmaleb: 1098 ; CHECK: vmaleb %v24, %v24, %v26, %v28 1099 ; CHECK: br %r14 1100 %res = call <8 x i16> @llvm.s390.vmaleb(<16 x i8> %a, <16 x i8> %b, 1101 <8 x i16> %c) 1102 ret <8 x i16> %res 1103 } 1104 1105 ; VMALEH. 1106 define <4 x i32> @test_vmaleh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) { 1107 ; CHECK-LABEL: test_vmaleh: 1108 ; CHECK: vmaleh %v24, %v24, %v26, %v28 1109 ; CHECK: br %r14 1110 %res = call <4 x i32> @llvm.s390.vmaleh(<8 x i16> %a, <8 x i16> %b, 1111 <4 x i32> %c) 1112 ret <4 x i32> %res 1113 } 1114 1115 ; VMALEF. 1116 define <2 x i64> @test_vmalef(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) { 1117 ; CHECK-LABEL: test_vmalef: 1118 ; CHECK: vmalef %v24, %v24, %v26, %v28 1119 ; CHECK: br %r14 1120 %res = call <2 x i64> @llvm.s390.vmalef(<4 x i32> %a, <4 x i32> %b, 1121 <2 x i64> %c) 1122 ret <2 x i64> %res 1123 } 1124 1125 ; VMAOB. 1126 define <8 x i16> @test_vmaob(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) { 1127 ; CHECK-LABEL: test_vmaob: 1128 ; CHECK: vmaob %v24, %v24, %v26, %v28 1129 ; CHECK: br %r14 1130 %res = call <8 x i16> @llvm.s390.vmaob(<16 x i8> %a, <16 x i8> %b, 1131 <8 x i16> %c) 1132 ret <8 x i16> %res 1133 } 1134 1135 ; VMAOH. 1136 define <4 x i32> @test_vmaoh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) { 1137 ; CHECK-LABEL: test_vmaoh: 1138 ; CHECK: vmaoh %v24, %v24, %v26, %v28 1139 ; CHECK: br %r14 1140 %res = call <4 x i32> @llvm.s390.vmaoh(<8 x i16> %a, <8 x i16> %b, 1141 <4 x i32> %c) 1142 ret <4 x i32> %res 1143 } 1144 1145 ; VMAOF. 1146 define <2 x i64> @test_vmaof(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) { 1147 ; CHECK-LABEL: test_vmaof: 1148 ; CHECK: vmaof %v24, %v24, %v26, %v28 1149 ; CHECK: br %r14 1150 %res = call <2 x i64> @llvm.s390.vmaof(<4 x i32> %a, <4 x i32> %b, 1151 <2 x i64> %c) 1152 ret <2 x i64> %res 1153 } 1154 1155 ; VMALOB. 1156 define <8 x i16> @test_vmalob(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) { 1157 ; CHECK-LABEL: test_vmalob: 1158 ; CHECK: vmalob %v24, %v24, %v26, %v28 1159 ; CHECK: br %r14 1160 %res = call <8 x i16> @llvm.s390.vmalob(<16 x i8> %a, <16 x i8> %b, 1161 <8 x i16> %c) 1162 ret <8 x i16> %res 1163 } 1164 1165 ; VMALOH. 1166 define <4 x i32> @test_vmaloh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) { 1167 ; CHECK-LABEL: test_vmaloh: 1168 ; CHECK: vmaloh %v24, %v24, %v26, %v28 1169 ; CHECK: br %r14 1170 %res = call <4 x i32> @llvm.s390.vmaloh(<8 x i16> %a, <8 x i16> %b, 1171 <4 x i32> %c) 1172 ret <4 x i32> %res 1173 } 1174 1175 ; VMALOF. 1176 define <2 x i64> @test_vmalof(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) { 1177 ; CHECK-LABEL: test_vmalof: 1178 ; CHECK: vmalof %v24, %v24, %v26, %v28 1179 ; CHECK: br %r14 1180 %res = call <2 x i64> @llvm.s390.vmalof(<4 x i32> %a, <4 x i32> %b, 1181 <2 x i64> %c) 1182 ret <2 x i64> %res 1183 } 1184 1185 ; VMHB. 1186 define <16 x i8> @test_vmhb(<16 x i8> %a, <16 x i8> %b) { 1187 ; CHECK-LABEL: test_vmhb: 1188 ; CHECK: vmhb %v24, %v24, %v26 1189 ; CHECK: br %r14 1190 %res = call <16 x i8> @llvm.s390.vmhb(<16 x i8> %a, <16 x i8> %b) 1191 ret <16 x i8> %res 1192 } 1193 1194 ; VMHH. 1195 define <8 x i16> @test_vmhh(<8 x i16> %a, <8 x i16> %b) { 1196 ; CHECK-LABEL: test_vmhh: 1197 ; CHECK: vmhh %v24, %v24, %v26 1198 ; CHECK: br %r14 1199 %res = call <8 x i16> @llvm.s390.vmhh(<8 x i16> %a, <8 x i16> %b) 1200 ret <8 x i16> %res 1201 } 1202 1203 ; VMHF. 1204 define <4 x i32> @test_vmhf(<4 x i32> %a, <4 x i32> %b) { 1205 ; CHECK-LABEL: test_vmhf: 1206 ; CHECK: vmhf %v24, %v24, %v26 1207 ; CHECK: br %r14 1208 %res = call <4 x i32> @llvm.s390.vmhf(<4 x i32> %a, <4 x i32> %b) 1209 ret <4 x i32> %res 1210 } 1211 1212 ; VMLHB. 1213 define <16 x i8> @test_vmlhb(<16 x i8> %a, <16 x i8> %b) { 1214 ; CHECK-LABEL: test_vmlhb: 1215 ; CHECK: vmlhb %v24, %v24, %v26 1216 ; CHECK: br %r14 1217 %res = call <16 x i8> @llvm.s390.vmlhb(<16 x i8> %a, <16 x i8> %b) 1218 ret <16 x i8> %res 1219 } 1220 1221 ; VMLHH. 1222 define <8 x i16> @test_vmlhh(<8 x i16> %a, <8 x i16> %b) { 1223 ; CHECK-LABEL: test_vmlhh: 1224 ; CHECK: vmlhh %v24, %v24, %v26 1225 ; CHECK: br %r14 1226 %res = call <8 x i16> @llvm.s390.vmlhh(<8 x i16> %a, <8 x i16> %b) 1227 ret <8 x i16> %res 1228 } 1229 1230 ; VMLHF. 1231 define <4 x i32> @test_vmlhf(<4 x i32> %a, <4 x i32> %b) { 1232 ; CHECK-LABEL: test_vmlhf: 1233 ; CHECK: vmlhf %v24, %v24, %v26 1234 ; CHECK: br %r14 1235 %res = call <4 x i32> @llvm.s390.vmlhf(<4 x i32> %a, <4 x i32> %b) 1236 ret <4 x i32> %res 1237 } 1238 1239 ; VMEB. 1240 define <8 x i16> @test_vmeb(<16 x i8> %a, <16 x i8> %b) { 1241 ; CHECK-LABEL: test_vmeb: 1242 ; CHECK: vmeb %v24, %v24, %v26 1243 ; CHECK: br %r14 1244 %res = call <8 x i16> @llvm.s390.vmeb(<16 x i8> %a, <16 x i8> %b) 1245 ret <8 x i16> %res 1246 } 1247 1248 ; VMEH. 1249 define <4 x i32> @test_vmeh(<8 x i16> %a, <8 x i16> %b) { 1250 ; CHECK-LABEL: test_vmeh: 1251 ; CHECK: vmeh %v24, %v24, %v26 1252 ; CHECK: br %r14 1253 %res = call <4 x i32> @llvm.s390.vmeh(<8 x i16> %a, <8 x i16> %b) 1254 ret <4 x i32> %res 1255 } 1256 1257 ; VMEF. 1258 define <2 x i64> @test_vmef(<4 x i32> %a, <4 x i32> %b) { 1259 ; CHECK-LABEL: test_vmef: 1260 ; CHECK: vmef %v24, %v24, %v26 1261 ; CHECK: br %r14 1262 %res = call <2 x i64> @llvm.s390.vmef(<4 x i32> %a, <4 x i32> %b) 1263 ret <2 x i64> %res 1264 } 1265 1266 ; VMLEB. 1267 define <8 x i16> @test_vmleb(<16 x i8> %a, <16 x i8> %b) { 1268 ; CHECK-LABEL: test_vmleb: 1269 ; CHECK: vmleb %v24, %v24, %v26 1270 ; CHECK: br %r14 1271 %res = call <8 x i16> @llvm.s390.vmleb(<16 x i8> %a, <16 x i8> %b) 1272 ret <8 x i16> %res 1273 } 1274 1275 ; VMLEH. 1276 define <4 x i32> @test_vmleh(<8 x i16> %a, <8 x i16> %b) { 1277 ; CHECK-LABEL: test_vmleh: 1278 ; CHECK: vmleh %v24, %v24, %v26 1279 ; CHECK: br %r14 1280 %res = call <4 x i32> @llvm.s390.vmleh(<8 x i16> %a, <8 x i16> %b) 1281 ret <4 x i32> %res 1282 } 1283 1284 ; VMLEF. 1285 define <2 x i64> @test_vmlef(<4 x i32> %a, <4 x i32> %b) { 1286 ; CHECK-LABEL: test_vmlef: 1287 ; CHECK: vmlef %v24, %v24, %v26 1288 ; CHECK: br %r14 1289 %res = call <2 x i64> @llvm.s390.vmlef(<4 x i32> %a, <4 x i32> %b) 1290 ret <2 x i64> %res 1291 } 1292 1293 ; VMOB. 1294 define <8 x i16> @test_vmob(<16 x i8> %a, <16 x i8> %b) { 1295 ; CHECK-LABEL: test_vmob: 1296 ; CHECK: vmob %v24, %v24, %v26 1297 ; CHECK: br %r14 1298 %res = call <8 x i16> @llvm.s390.vmob(<16 x i8> %a, <16 x i8> %b) 1299 ret <8 x i16> %res 1300 } 1301 1302 ; VMOH. 1303 define <4 x i32> @test_vmoh(<8 x i16> %a, <8 x i16> %b) { 1304 ; CHECK-LABEL: test_vmoh: 1305 ; CHECK: vmoh %v24, %v24, %v26 1306 ; CHECK: br %r14 1307 %res = call <4 x i32> @llvm.s390.vmoh(<8 x i16> %a, <8 x i16> %b) 1308 ret <4 x i32> %res 1309 } 1310 1311 ; VMOF. 1312 define <2 x i64> @test_vmof(<4 x i32> %a, <4 x i32> %b) { 1313 ; CHECK-LABEL: test_vmof: 1314 ; CHECK: vmof %v24, %v24, %v26 1315 ; CHECK: br %r14 1316 %res = call <2 x i64> @llvm.s390.vmof(<4 x i32> %a, <4 x i32> %b) 1317 ret <2 x i64> %res 1318 } 1319 1320 ; VMLOB. 1321 define <8 x i16> @test_vmlob(<16 x i8> %a, <16 x i8> %b) { 1322 ; CHECK-LABEL: test_vmlob: 1323 ; CHECK: vmlob %v24, %v24, %v26 1324 ; CHECK: br %r14 1325 %res = call <8 x i16> @llvm.s390.vmlob(<16 x i8> %a, <16 x i8> %b) 1326 ret <8 x i16> %res 1327 } 1328 1329 ; VMLOH. 1330 define <4 x i32> @test_vmloh(<8 x i16> %a, <8 x i16> %b) { 1331 ; CHECK-LABEL: test_vmloh: 1332 ; CHECK: vmloh %v24, %v24, %v26 1333 ; CHECK: br %r14 1334 %res = call <4 x i32> @llvm.s390.vmloh(<8 x i16> %a, <8 x i16> %b) 1335 ret <4 x i32> %res 1336 } 1337 1338 ; VMLOF. 1339 define <2 x i64> @test_vmlof(<4 x i32> %a, <4 x i32> %b) { 1340 ; CHECK-LABEL: test_vmlof: 1341 ; CHECK: vmlof %v24, %v24, %v26 1342 ; CHECK: br %r14 1343 %res = call <2 x i64> @llvm.s390.vmlof(<4 x i32> %a, <4 x i32> %b) 1344 ret <2 x i64> %res 1345 } 1346 1347 ; VERLLVB. 1348 define <16 x i8> @test_verllvb(<16 x i8> %a, <16 x i8> %b) { 1349 ; CHECK-LABEL: test_verllvb: 1350 ; CHECK: verllvb %v24, %v24, %v26 1351 ; CHECK: br %r14 1352 %res = call <16 x i8> @llvm.s390.verllvb(<16 x i8> %a, <16 x i8> %b) 1353 ret <16 x i8> %res 1354 } 1355 1356 ; VERLLVH. 1357 define <8 x i16> @test_verllvh(<8 x i16> %a, <8 x i16> %b) { 1358 ; CHECK-LABEL: test_verllvh: 1359 ; CHECK: verllvh %v24, %v24, %v26 1360 ; CHECK: br %r14 1361 %res = call <8 x i16> @llvm.s390.verllvh(<8 x i16> %a, <8 x i16> %b) 1362 ret <8 x i16> %res 1363 } 1364 1365 ; VERLLVF. 1366 define <4 x i32> @test_verllvf(<4 x i32> %a, <4 x i32> %b) { 1367 ; CHECK-LABEL: test_verllvf: 1368 ; CHECK: verllvf %v24, %v24, %v26 1369 ; CHECK: br %r14 1370 %res = call <4 x i32> @llvm.s390.verllvf(<4 x i32> %a, <4 x i32> %b) 1371 ret <4 x i32> %res 1372 } 1373 1374 ; VERLLVG. 1375 define <2 x i64> @test_verllvg(<2 x i64> %a, <2 x i64> %b) { 1376 ; CHECK-LABEL: test_verllvg: 1377 ; CHECK: verllvg %v24, %v24, %v26 1378 ; CHECK: br %r14 1379 %res = call <2 x i64> @llvm.s390.verllvg(<2 x i64> %a, <2 x i64> %b) 1380 ret <2 x i64> %res 1381 } 1382 1383 ; VERLLB. 1384 define <16 x i8> @test_verllb(<16 x i8> %a, i32 %b) { 1385 ; CHECK-LABEL: test_verllb: 1386 ; CHECK: verllb %v24, %v24, 0(%r2) 1387 ; CHECK: br %r14 1388 %res = call <16 x i8> @llvm.s390.verllb(<16 x i8> %a, i32 %b) 1389 ret <16 x i8> %res 1390 } 1391 1392 ; VERLLH. 1393 define <8 x i16> @test_verllh(<8 x i16> %a, i32 %b) { 1394 ; CHECK-LABEL: test_verllh: 1395 ; CHECK: verllh %v24, %v24, 0(%r2) 1396 ; CHECK: br %r14 1397 %res = call <8 x i16> @llvm.s390.verllh(<8 x i16> %a, i32 %b) 1398 ret <8 x i16> %res 1399 } 1400 1401 ; VERLLF. 1402 define <4 x i32> @test_verllf(<4 x i32> %a, i32 %b) { 1403 ; CHECK-LABEL: test_verllf: 1404 ; CHECK: verllf %v24, %v24, 0(%r2) 1405 ; CHECK: br %r14 1406 %res = call <4 x i32> @llvm.s390.verllf(<4 x i32> %a, i32 %b) 1407 ret <4 x i32> %res 1408 } 1409 1410 ; VERLLG. 1411 define <2 x i64> @test_verllg(<2 x i64> %a, i32 %b) { 1412 ; CHECK-LABEL: test_verllg: 1413 ; CHECK: verllg %v24, %v24, 0(%r2) 1414 ; CHECK: br %r14 1415 %res = call <2 x i64> @llvm.s390.verllg(<2 x i64> %a, i32 %b) 1416 ret <2 x i64> %res 1417 } 1418 1419 ; VERLLB with the smallest count. 1420 define <16 x i8> @test_verllb_1(<16 x i8> %a) { 1421 ; CHECK-LABEL: test_verllb_1: 1422 ; CHECK: verllb %v24, %v24, 1 1423 ; CHECK: br %r14 1424 %res = call <16 x i8> @llvm.s390.verllb(<16 x i8> %a, i32 1) 1425 ret <16 x i8> %res 1426 } 1427 1428 ; VERLLB with the largest count. 1429 define <16 x i8> @test_verllb_4095(<16 x i8> %a) { 1430 ; CHECK-LABEL: test_verllb_4095: 1431 ; CHECK: verllb %v24, %v24, 4095 1432 ; CHECK: br %r14 1433 %res = call <16 x i8> @llvm.s390.verllb(<16 x i8> %a, i32 4095) 1434 ret <16 x i8> %res 1435 } 1436 1437 ; VERLLB with the largest count + 1. 1438 define <16 x i8> @test_verllb_4096(<16 x i8> %a) { 1439 ; CHECK-LABEL: test_verllb_4096: 1440 ; CHECK: lhi [[REG:%r[1-5]]], 4096 1441 ; CHECK: verllb %v24, %v24, 0([[REG]]) 1442 ; CHECK: br %r14 1443 %res = call <16 x i8> @llvm.s390.verllb(<16 x i8> %a, i32 4096) 1444 ret <16 x i8> %res 1445 } 1446 1447 ; VERIMB. 1448 define <16 x i8> @test_verimb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 1449 ; CHECK-LABEL: test_verimb: 1450 ; CHECK: verimb %v24, %v26, %v28, 1 1451 ; CHECK: br %r14 1452 %res = call <16 x i8> @llvm.s390.verimb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, i32 1) 1453 ret <16 x i8> %res 1454 } 1455 1456 ; VERIMH. 1457 define <8 x i16> @test_verimh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) { 1458 ; CHECK-LABEL: test_verimh: 1459 ; CHECK: verimh %v24, %v26, %v28, 1 1460 ; CHECK: br %r14 1461 %res = call <8 x i16> @llvm.s390.verimh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, i32 1) 1462 ret <8 x i16> %res 1463 } 1464 1465 ; VERIMF. 1466 define <4 x i32> @test_verimf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 1467 ; CHECK-LABEL: test_verimf: 1468 ; CHECK: verimf %v24, %v26, %v28, 1 1469 ; CHECK: br %r14 1470 %res = call <4 x i32> @llvm.s390.verimf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, i32 1) 1471 ret <4 x i32> %res 1472 } 1473 1474 ; VERIMG. 1475 define <2 x i64> @test_verimg(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c) { 1476 ; CHECK-LABEL: test_verimg: 1477 ; CHECK: verimg %v24, %v26, %v28, 1 1478 ; CHECK: br %r14 1479 %res = call <2 x i64> @llvm.s390.verimg(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c, i32 1) 1480 ret <2 x i64> %res 1481 } 1482 1483 ; VERIMB with a different mask. 1484 define <16 x i8> @test_verimb_254(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 1485 ; CHECK-LABEL: test_verimb_254: 1486 ; CHECK: verimb %v24, %v26, %v28, 254 1487 ; CHECK: br %r14 1488 %res = call <16 x i8> @llvm.s390.verimb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, i32 254) 1489 ret <16 x i8> %res 1490 } 1491 1492 ; VSL. 1493 define <16 x i8> @test_vsl(<16 x i8> %a, <16 x i8> %b) { 1494 ; CHECK-LABEL: test_vsl: 1495 ; CHECK: vsl %v24, %v24, %v26 1496 ; CHECK: br %r14 1497 %res = call <16 x i8> @llvm.s390.vsl(<16 x i8> %a, <16 x i8> %b) 1498 ret <16 x i8> %res 1499 } 1500 1501 ; VSLB. 1502 define <16 x i8> @test_vslb(<16 x i8> %a, <16 x i8> %b) { 1503 ; CHECK-LABEL: test_vslb: 1504 ; CHECK: vslb %v24, %v24, %v26 1505 ; CHECK: br %r14 1506 %res = call <16 x i8> @llvm.s390.vslb(<16 x i8> %a, <16 x i8> %b) 1507 ret <16 x i8> %res 1508 } 1509 1510 ; VSRA. 1511 define <16 x i8> @test_vsra(<16 x i8> %a, <16 x i8> %b) { 1512 ; CHECK-LABEL: test_vsra: 1513 ; CHECK: vsra %v24, %v24, %v26 1514 ; CHECK: br %r14 1515 %res = call <16 x i8> @llvm.s390.vsra(<16 x i8> %a, <16 x i8> %b) 1516 ret <16 x i8> %res 1517 } 1518 1519 ; VSRAB. 1520 define <16 x i8> @test_vsrab(<16 x i8> %a, <16 x i8> %b) { 1521 ; CHECK-LABEL: test_vsrab: 1522 ; CHECK: vsrab %v24, %v24, %v26 1523 ; CHECK: br %r14 1524 %res = call <16 x i8> @llvm.s390.vsrab(<16 x i8> %a, <16 x i8> %b) 1525 ret <16 x i8> %res 1526 } 1527 1528 ; VSRL. 1529 define <16 x i8> @test_vsrl(<16 x i8> %a, <16 x i8> %b) { 1530 ; CHECK-LABEL: test_vsrl: 1531 ; CHECK: vsrl %v24, %v24, %v26 1532 ; CHECK: br %r14 1533 %res = call <16 x i8> @llvm.s390.vsrl(<16 x i8> %a, <16 x i8> %b) 1534 ret <16 x i8> %res 1535 } 1536 1537 ; VSRLB. 1538 define <16 x i8> @test_vsrlb(<16 x i8> %a, <16 x i8> %b) { 1539 ; CHECK-LABEL: test_vsrlb: 1540 ; CHECK: vsrlb %v24, %v24, %v26 1541 ; CHECK: br %r14 1542 %res = call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %a, <16 x i8> %b) 1543 ret <16 x i8> %res 1544 } 1545 1546 ; VSLDB with the minimum useful value. 1547 define <16 x i8> @test_vsldb_1(<16 x i8> %a, <16 x i8> %b) { 1548 ; CHECK-LABEL: test_vsldb_1: 1549 ; CHECK: vsldb %v24, %v24, %v26, 1 1550 ; CHECK: br %r14 1551 %res = call <16 x i8> @llvm.s390.vsldb(<16 x i8> %a, <16 x i8> %b, i32 1) 1552 ret <16 x i8> %res 1553 } 1554 1555 ; VSLDB with the maximum value. 1556 define <16 x i8> @test_vsldb_15(<16 x i8> %a, <16 x i8> %b) { 1557 ; CHECK-LABEL: test_vsldb_15: 1558 ; CHECK: vsldb %v24, %v24, %v26, 15 1559 ; CHECK: br %r14 1560 %res = call <16 x i8> @llvm.s390.vsldb(<16 x i8> %a, <16 x i8> %b, i32 15) 1561 ret <16 x i8> %res 1562 } 1563 1564 ; VSCBIB. 1565 define <16 x i8> @test_vscbib(<16 x i8> %a, <16 x i8> %b) { 1566 ; CHECK-LABEL: test_vscbib: 1567 ; CHECK: vscbib %v24, %v24, %v26 1568 ; CHECK: br %r14 1569 %res = call <16 x i8> @llvm.s390.vscbib(<16 x i8> %a, <16 x i8> %b) 1570 ret <16 x i8> %res 1571 } 1572 1573 ; VSCBIH. 1574 define <8 x i16> @test_vscbih(<8 x i16> %a, <8 x i16> %b) { 1575 ; CHECK-LABEL: test_vscbih: 1576 ; CHECK: vscbih %v24, %v24, %v26 1577 ; CHECK: br %r14 1578 %res = call <8 x i16> @llvm.s390.vscbih(<8 x i16> %a, <8 x i16> %b) 1579 ret <8 x i16> %res 1580 } 1581 1582 ; VSCBIF. 1583 define <4 x i32> @test_vscbif(<4 x i32> %a, <4 x i32> %b) { 1584 ; CHECK-LABEL: test_vscbif: 1585 ; CHECK: vscbif %v24, %v24, %v26 1586 ; CHECK: br %r14 1587 %res = call <4 x i32> @llvm.s390.vscbif(<4 x i32> %a, <4 x i32> %b) 1588 ret <4 x i32> %res 1589 } 1590 1591 ; VSCBIG. 1592 define <2 x i64> @test_vscbig(<2 x i64> %a, <2 x i64> %b) { 1593 ; CHECK-LABEL: test_vscbig: 1594 ; CHECK: vscbig %v24, %v24, %v26 1595 ; CHECK: br %r14 1596 %res = call <2 x i64> @llvm.s390.vscbig(<2 x i64> %a, <2 x i64> %b) 1597 ret <2 x i64> %res 1598 } 1599 1600 ; VSQ. 1601 define <16 x i8> @test_vsq(<16 x i8> %a, <16 x i8> %b) { 1602 ; CHECK-LABEL: test_vsq: 1603 ; CHECK: vsq %v24, %v24, %v26 1604 ; CHECK: br %r14 1605 %res = call <16 x i8> @llvm.s390.vsq(<16 x i8> %a, <16 x i8> %b) 1606 ret <16 x i8> %res 1607 } 1608 1609 ; VSBIQ. 1610 define <16 x i8> @test_vsbiq(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 1611 ; CHECK-LABEL: test_vsbiq: 1612 ; CHECK: vsbiq %v24, %v24, %v26, %v28 1613 ; CHECK: br %r14 1614 %res = call <16 x i8> @llvm.s390.vsbiq(<16 x i8> %a, <16 x i8> %b, 1615 <16 x i8> %c) 1616 ret <16 x i8> %res 1617 } 1618 1619 ; VSCBIQ. 1620 define <16 x i8> @test_vscbiq(<16 x i8> %a, <16 x i8> %b) { 1621 ; CHECK-LABEL: test_vscbiq: 1622 ; CHECK: vscbiq %v24, %v24, %v26 1623 ; CHECK: br %r14 1624 %res = call <16 x i8> @llvm.s390.vscbiq(<16 x i8> %a, <16 x i8> %b) 1625 ret <16 x i8> %res 1626 } 1627 1628 ; VSBCBIQ. 1629 define <16 x i8> @test_vsbcbiq(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 1630 ; CHECK-LABEL: test_vsbcbiq: 1631 ; CHECK: vsbcbiq %v24, %v24, %v26, %v28 1632 ; CHECK: br %r14 1633 %res = call <16 x i8> @llvm.s390.vsbcbiq(<16 x i8> %a, <16 x i8> %b, 1634 <16 x i8> %c) 1635 ret <16 x i8> %res 1636 } 1637 1638 ; VSUMB. 1639 define <4 x i32> @test_vsumb(<16 x i8> %a, <16 x i8> %b) { 1640 ; CHECK-LABEL: test_vsumb: 1641 ; CHECK: vsumb %v24, %v24, %v26 1642 ; CHECK: br %r14 1643 %res = call <4 x i32> @llvm.s390.vsumb(<16 x i8> %a, <16 x i8> %b) 1644 ret <4 x i32> %res 1645 } 1646 1647 ; VSUMH. 1648 define <4 x i32> @test_vsumh(<8 x i16> %a, <8 x i16> %b) { 1649 ; CHECK-LABEL: test_vsumh: 1650 ; CHECK: vsumh %v24, %v24, %v26 1651 ; CHECK: br %r14 1652 %res = call <4 x i32> @llvm.s390.vsumh(<8 x i16> %a, <8 x i16> %b) 1653 ret <4 x i32> %res 1654 } 1655 1656 ; VSUMGH. 1657 define <2 x i64> @test_vsumgh(<8 x i16> %a, <8 x i16> %b) { 1658 ; CHECK-LABEL: test_vsumgh: 1659 ; CHECK: vsumgh %v24, %v24, %v26 1660 ; CHECK: br %r14 1661 %res = call <2 x i64> @llvm.s390.vsumgh(<8 x i16> %a, <8 x i16> %b) 1662 ret <2 x i64> %res 1663 } 1664 1665 ; VSUMGF. 1666 define <2 x i64> @test_vsumgf(<4 x i32> %a, <4 x i32> %b) { 1667 ; CHECK-LABEL: test_vsumgf: 1668 ; CHECK: vsumgf %v24, %v24, %v26 1669 ; CHECK: br %r14 1670 %res = call <2 x i64> @llvm.s390.vsumgf(<4 x i32> %a, <4 x i32> %b) 1671 ret <2 x i64> %res 1672 } 1673 1674 ; VSUMQF. 1675 define <16 x i8> @test_vsumqf(<4 x i32> %a, <4 x i32> %b) { 1676 ; CHECK-LABEL: test_vsumqf: 1677 ; CHECK: vsumqf %v24, %v24, %v26 1678 ; CHECK: br %r14 1679 %res = call <16 x i8> @llvm.s390.vsumqf(<4 x i32> %a, <4 x i32> %b) 1680 ret <16 x i8> %res 1681 } 1682 1683 ; VSUMQG. 1684 define <16 x i8> @test_vsumqg(<2 x i64> %a, <2 x i64> %b) { 1685 ; CHECK-LABEL: test_vsumqg: 1686 ; CHECK: vsumqg %v24, %v24, %v26 1687 ; CHECK: br %r14 1688 %res = call <16 x i8> @llvm.s390.vsumqg(<2 x i64> %a, <2 x i64> %b) 1689 ret <16 x i8> %res 1690 } 1691 1692 ; VTM with no processing of the result. 1693 define i32 @test_vtm(<16 x i8> %a, <16 x i8> %b) { 1694 ; CHECK-LABEL: test_vtm: 1695 ; CHECK: vtm %v24, %v26 1696 ; CHECK: ipm %r2 1697 ; CHECK: srl %r2, 28 1698 ; CHECK: br %r14 1699 %res = call i32 @llvm.s390.vtm(<16 x i8> %a, <16 x i8> %b) 1700 ret i32 %res 1701 } 1702 1703 ; VTM, storing to %ptr if all bits are set. 1704 define void @test_vtm_all_store(<16 x i8> %a, <16 x i8> %b, i32 *%ptr) { 1705 ; CHECK-LABEL: test_vtm_all_store: 1706 ; CHECK-NOT: %r 1707 ; CHECK: vtm %v24, %v26 1708 ; CHECK-NEXT: {{bnor|bler}} %r14 1709 ; CHECK: mvhi 0(%r2), 0 1710 ; CHECK: br %r14 1711 %res = call i32 @llvm.s390.vtm(<16 x i8> %a, <16 x i8> %b) 1712 %cmp = icmp sge i32 %res, 3 1713 br i1 %cmp, label %store, label %exit 1714 1715 store: 1716 store i32 0, i32 *%ptr 1717 br label %exit 1718 1719 exit: 1720 ret void 1721 } 1722 1723 ; VCEQBS with no processing of the result. 1724 define i32 @test_vceqbs(<16 x i8> %a, <16 x i8> %b) { 1725 ; CHECK-LABEL: test_vceqbs: 1726 ; CHECK: vceqbs {{%v[0-9]+}}, %v24, %v26 1727 ; CHECK: ipm %r2 1728 ; CHECK: srl %r2, 28 1729 ; CHECK: br %r14 1730 %call = call {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8> %a, <16 x i8> %b) 1731 %res = extractvalue {<16 x i8>, i32} %call, 1 1732 ret i32 %res 1733 } 1734 1735 ; VCEQBS, returning 1 if any elements are equal (CC != 3). 1736 define i32 @test_vceqbs_any_bool(<16 x i8> %a, <16 x i8> %b) { 1737 ; CHECK-LABEL: test_vceqbs_any_bool: 1738 ; CHECK: vceqbs {{%v[0-9]+}}, %v24, %v26 1739 ; CHECK: ipm %r2 1740 ; CHECK: afi %r2, -536870912 1741 ; CHECK: srl %r2, 31 1742 ; CHECK: br %r14 1743 %call = call {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8> %a, <16 x i8> %b) 1744 %res = extractvalue {<16 x i8>, i32} %call, 1 1745 %cmp = icmp ne i32 %res, 3 1746 %ext = zext i1 %cmp to i32 1747 ret i32 %ext 1748 } 1749 1750 ; VCEQBS, storing to %ptr if any elements are equal. 1751 define <16 x i8> @test_vceqbs_any_store(<16 x i8> %a, <16 x i8> %b, i32 *%ptr) { 1752 ; CHECK-LABEL: test_vceqbs_any_store: 1753 ; CHECK-NOT: %r 1754 ; CHECK: vceqbs %v24, %v24, %v26 1755 ; CHECK-NEXT: {{bor|bnler}} %r14 1756 ; CHECK: mvhi 0(%r2), 0 1757 ; CHECK: br %r14 1758 %call = call {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8> %a, <16 x i8> %b) 1759 %res = extractvalue {<16 x i8>, i32} %call, 0 1760 %cc = extractvalue {<16 x i8>, i32} %call, 1 1761 %cmp = icmp ule i32 %cc, 2 1762 br i1 %cmp, label %store, label %exit 1763 1764 store: 1765 store i32 0, i32 *%ptr 1766 br label %exit 1767 1768 exit: 1769 ret <16 x i8> %res 1770 } 1771 1772 ; VCEQHS with no processing of the result. 1773 define i32 @test_vceqhs(<8 x i16> %a, <8 x i16> %b) { 1774 ; CHECK-LABEL: test_vceqhs: 1775 ; CHECK: vceqhs {{%v[0-9]+}}, %v24, %v26 1776 ; CHECK: ipm %r2 1777 ; CHECK: srl %r2, 28 1778 ; CHECK: br %r14 1779 %call = call {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16> %a, <8 x i16> %b) 1780 %res = extractvalue {<8 x i16>, i32} %call, 1 1781 ret i32 %res 1782 } 1783 1784 ; VCEQHS, returning 1 if not all elements are equal. 1785 define i32 @test_vceqhs_notall_bool(<8 x i16> %a, <8 x i16> %b) { 1786 ; CHECK-LABEL: test_vceqhs_notall_bool: 1787 ; CHECK: vceqhs {{%v[0-9]+}}, %v24, %v26 1788 ; CHECK: ipm [[REG:%r[0-5]]] 1789 ; CHECK: risblg %r2, [[REG]], 31, 159, 36 1790 ; CHECK: br %r14 1791 %call = call {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16> %a, <8 x i16> %b) 1792 %res = extractvalue {<8 x i16>, i32} %call, 1 1793 %cmp = icmp sge i32 %res, 1 1794 %ext = zext i1 %cmp to i32 1795 ret i32 %ext 1796 } 1797 1798 ; VCEQHS, storing to %ptr if not all elements are equal. 1799 define <8 x i16> @test_vceqhs_notall_store(<8 x i16> %a, <8 x i16> %b, 1800 i32 *%ptr) { 1801 ; CHECK-LABEL: test_vceqhs_notall_store: 1802 ; CHECK-NOT: %r 1803 ; CHECK: vceqhs %v24, %v24, %v26 1804 ; CHECK-NEXT: {{bher|ber}} %r14 1805 ; CHECK: mvhi 0(%r2), 0 1806 ; CHECK: br %r14 1807 %call = call {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16> %a, <8 x i16> %b) 1808 %res = extractvalue {<8 x i16>, i32} %call, 0 1809 %cc = extractvalue {<8 x i16>, i32} %call, 1 1810 %cmp = icmp ugt i32 %cc, 0 1811 br i1 %cmp, label %store, label %exit 1812 1813 store: 1814 store i32 0, i32 *%ptr 1815 br label %exit 1816 1817 exit: 1818 ret <8 x i16> %res 1819 } 1820 1821 ; VCEQFS with no processing of the result. 1822 define i32 @test_vceqfs(<4 x i32> %a, <4 x i32> %b) { 1823 ; CHECK-LABEL: test_vceqfs: 1824 ; CHECK: vceqfs {{%v[0-9]+}}, %v24, %v26 1825 ; CHECK: ipm %r2 1826 ; CHECK: srl %r2, 28 1827 ; CHECK: br %r14 1828 %call = call {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32> %a, <4 x i32> %b) 1829 %res = extractvalue {<4 x i32>, i32} %call, 1 1830 ret i32 %res 1831 } 1832 1833 ; VCEQFS, returning 1 if no elements are equal. 1834 define i32 @test_vceqfs_none_bool(<4 x i32> %a, <4 x i32> %b) { 1835 ; CHECK-LABEL: test_vceqfs_none_bool: 1836 ; CHECK: vceqfs {{%v[0-9]+}}, %v24, %v26 1837 ; CHECK: ipm [[REG:%r[0-5]]] 1838 ; CHECK: risblg %r2, [[REG]], 31, 159, 35 1839 ; CHECK: br %r14 1840 %call = call {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32> %a, <4 x i32> %b) 1841 %res = extractvalue {<4 x i32>, i32} %call, 1 1842 %cmp = icmp eq i32 %res, 3 1843 %ext = zext i1 %cmp to i32 1844 ret i32 %ext 1845 } 1846 1847 ; VCEQFS, storing to %ptr if no elements are equal. 1848 define <4 x i32> @test_vceqfs_none_store(<4 x i32> %a, <4 x i32> %b, 1849 i32 *%ptr) { 1850 ; CHECK-LABEL: test_vceqfs_none_store: 1851 ; CHECK-NOT: %r 1852 ; CHECK: vceqfs %v24, %v24, %v26 1853 ; CHECK-NEXT: {{bnor|bler}} %r14 1854 ; CHECK: mvhi 0(%r2), 0 1855 ; CHECK: br %r14 1856 %call = call {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32> %a, <4 x i32> %b) 1857 %res = extractvalue {<4 x i32>, i32} %call, 0 1858 %cc = extractvalue {<4 x i32>, i32} %call, 1 1859 %cmp = icmp uge i32 %cc, 3 1860 br i1 %cmp, label %store, label %exit 1861 1862 store: 1863 store i32 0, i32 *%ptr 1864 br label %exit 1865 1866 exit: 1867 ret <4 x i32> %res 1868 } 1869 1870 ; VCEQGS with no processing of the result. 1871 define i32 @test_vceqgs(<2 x i64> %a, <2 x i64> %b) { 1872 ; CHECK-LABEL: test_vceqgs: 1873 ; CHECK: vceqgs {{%v[0-9]+}}, %v24, %v26 1874 ; CHECK: ipm %r2 1875 ; CHECK: srl %r2, 28 1876 ; CHECK: br %r14 1877 %call = call {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64> %a, <2 x i64> %b) 1878 %res = extractvalue {<2 x i64>, i32} %call, 1 1879 ret i32 %res 1880 } 1881 1882 ; VCEQGS returning 1 if all elements are equal (CC == 0). 1883 define i32 @test_vceqgs_all_bool(<2 x i64> %a, <2 x i64> %b) { 1884 ; CHECK-LABEL: test_vceqgs_all_bool: 1885 ; CHECK: vceqgs {{%v[0-9]+}}, %v24, %v26 1886 ; CHECK: ipm %r2 1887 ; CHECK: afi %r2, -268435456 1888 ; CHECK: srl %r2, 31 1889 ; CHECK: br %r14 1890 %call = call {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64> %a, <2 x i64> %b) 1891 %res = extractvalue {<2 x i64>, i32} %call, 1 1892 %cmp = icmp ult i32 %res, 1 1893 %ext = zext i1 %cmp to i32 1894 ret i32 %ext 1895 } 1896 1897 ; VCEQGS, storing to %ptr if all elements are equal. 1898 define <2 x i64> @test_vceqgs_all_store(<2 x i64> %a, <2 x i64> %b, i32 *%ptr) { 1899 ; CHECK-LABEL: test_vceqgs_all_store: 1900 ; CHECK-NOT: %r 1901 ; CHECK: vceqgs %v24, %v24, %v26 1902 ; CHECK-NEXT: {{bnher|bner}} %r14 1903 ; CHECK: mvhi 0(%r2), 0 1904 ; CHECK: br %r14 1905 %call = call {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64> %a, <2 x i64> %b) 1906 %res = extractvalue {<2 x i64>, i32} %call, 0 1907 %cc = extractvalue {<2 x i64>, i32} %call, 1 1908 %cmp = icmp sle i32 %cc, 0 1909 br i1 %cmp, label %store, label %exit 1910 1911 store: 1912 store i32 0, i32 *%ptr 1913 br label %exit 1914 1915 exit: 1916 ret <2 x i64> %res 1917 } 1918 1919 ; VCHBS with no processing of the result. 1920 define i32 @test_vchbs(<16 x i8> %a, <16 x i8> %b) { 1921 ; CHECK-LABEL: test_vchbs: 1922 ; CHECK: vchbs {{%v[0-9]+}}, %v24, %v26 1923 ; CHECK: ipm %r2 1924 ; CHECK: srl %r2, 28 1925 ; CHECK: br %r14 1926 %call = call {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8> %a, <16 x i8> %b) 1927 %res = extractvalue {<16 x i8>, i32} %call, 1 1928 ret i32 %res 1929 } 1930 1931 ; VCHBS, returning 1 if any elements are higher (CC != 3). 1932 define i32 @test_vchbs_any_bool(<16 x i8> %a, <16 x i8> %b) { 1933 ; CHECK-LABEL: test_vchbs_any_bool: 1934 ; CHECK: vchbs {{%v[0-9]+}}, %v24, %v26 1935 ; CHECK: ipm %r2 1936 ; CHECK: afi %r2, -536870912 1937 ; CHECK: srl %r2, 31 1938 ; CHECK: br %r14 1939 %call = call {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8> %a, <16 x i8> %b) 1940 %res = extractvalue {<16 x i8>, i32} %call, 1 1941 %cmp = icmp ne i32 %res, 3 1942 %ext = zext i1 %cmp to i32 1943 ret i32 %ext 1944 } 1945 1946 ; VCHBS, storing to %ptr if any elements are higher. 1947 define <16 x i8> @test_vchbs_any_store(<16 x i8> %a, <16 x i8> %b, i32 *%ptr) { 1948 ; CHECK-LABEL: test_vchbs_any_store: 1949 ; CHECK-NOT: %r 1950 ; CHECK: vchbs %v24, %v24, %v26 1951 ; CHECK-NEXT: {{bor|bnler}} %r14 1952 ; CHECK: mvhi 0(%r2), 0 1953 ; CHECK: br %r14 1954 %call = call {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8> %a, <16 x i8> %b) 1955 %res = extractvalue {<16 x i8>, i32} %call, 0 1956 %cc = extractvalue {<16 x i8>, i32} %call, 1 1957 %cmp = icmp ule i32 %cc, 2 1958 br i1 %cmp, label %store, label %exit 1959 1960 store: 1961 store i32 0, i32 *%ptr 1962 br label %exit 1963 1964 exit: 1965 ret <16 x i8> %res 1966 } 1967 1968 ; VCHHS with no processing of the result. 1969 define i32 @test_vchhs(<8 x i16> %a, <8 x i16> %b) { 1970 ; CHECK-LABEL: test_vchhs: 1971 ; CHECK: vchhs {{%v[0-9]+}}, %v24, %v26 1972 ; CHECK: ipm %r2 1973 ; CHECK: srl %r2, 28 1974 ; CHECK: br %r14 1975 %call = call {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16> %a, <8 x i16> %b) 1976 %res = extractvalue {<8 x i16>, i32} %call, 1 1977 ret i32 %res 1978 } 1979 1980 ; VCHHS, returning 1 if not all elements are higher. 1981 define i32 @test_vchhs_notall_bool(<8 x i16> %a, <8 x i16> %b) { 1982 ; CHECK-LABEL: test_vchhs_notall_bool: 1983 ; CHECK: vchhs {{%v[0-9]+}}, %v24, %v26 1984 ; CHECK: ipm [[REG:%r[0-5]]] 1985 ; CHECK: risblg %r2, [[REG]], 31, 159, 36 1986 ; CHECK: br %r14 1987 %call = call {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16> %a, <8 x i16> %b) 1988 %res = extractvalue {<8 x i16>, i32} %call, 1 1989 %cmp = icmp sge i32 %res, 1 1990 %ext = zext i1 %cmp to i32 1991 ret i32 %ext 1992 } 1993 1994 ; VCHHS, storing to %ptr if not all elements are higher. 1995 define <8 x i16> @test_vchhs_notall_store(<8 x i16> %a, <8 x i16> %b, 1996 i32 *%ptr) { 1997 ; CHECK-LABEL: test_vchhs_notall_store: 1998 ; CHECK-NOT: %r 1999 ; CHECK: vchhs %v24, %v24, %v26 2000 ; CHECK-NEXT: {{bher|ber}} %r14 2001 ; CHECK: mvhi 0(%r2), 0 2002 ; CHECK: br %r14 2003 %call = call {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16> %a, <8 x i16> %b) 2004 %res = extractvalue {<8 x i16>, i32} %call, 0 2005 %cc = extractvalue {<8 x i16>, i32} %call, 1 2006 %cmp = icmp ugt i32 %cc, 0 2007 br i1 %cmp, label %store, label %exit 2008 2009 store: 2010 store i32 0, i32 *%ptr 2011 br label %exit 2012 2013 exit: 2014 ret <8 x i16> %res 2015 } 2016 2017 ; VCHFS with no processing of the result. 2018 define i32 @test_vchfs(<4 x i32> %a, <4 x i32> %b) { 2019 ; CHECK-LABEL: test_vchfs: 2020 ; CHECK: vchfs {{%v[0-9]+}}, %v24, %v26 2021 ; CHECK: ipm %r2 2022 ; CHECK: srl %r2, 28 2023 ; CHECK: br %r14 2024 %call = call {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32> %a, <4 x i32> %b) 2025 %res = extractvalue {<4 x i32>, i32} %call, 1 2026 ret i32 %res 2027 } 2028 2029 ; VCHFS, returning 1 if no elements are higher. 2030 define i32 @test_vchfs_none_bool(<4 x i32> %a, <4 x i32> %b) { 2031 ; CHECK-LABEL: test_vchfs_none_bool: 2032 ; CHECK: vchfs {{%v[0-9]+}}, %v24, %v26 2033 ; CHECK: ipm [[REG:%r[0-5]]] 2034 ; CHECK: risblg %r2, [[REG]], 31, 159, 35 2035 ; CHECK: br %r14 2036 %call = call {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32> %a, <4 x i32> %b) 2037 %res = extractvalue {<4 x i32>, i32} %call, 1 2038 %cmp = icmp eq i32 %res, 3 2039 %ext = zext i1 %cmp to i32 2040 ret i32 %ext 2041 } 2042 2043 ; VCHFS, storing to %ptr if no elements are higher. 2044 define <4 x i32> @test_vchfs_none_store(<4 x i32> %a, <4 x i32> %b, i32 *%ptr) { 2045 ; CHECK-LABEL: test_vchfs_none_store: 2046 ; CHECK-NOT: %r 2047 ; CHECK: vchfs %v24, %v24, %v26 2048 ; CHECK-NEXT: {{bnor|bler}} %r14 2049 ; CHECK: mvhi 0(%r2), 0 2050 ; CHECK: br %r14 2051 %call = call {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32> %a, <4 x i32> %b) 2052 %res = extractvalue {<4 x i32>, i32} %call, 0 2053 %cc = extractvalue {<4 x i32>, i32} %call, 1 2054 %cmp = icmp uge i32 %cc, 3 2055 br i1 %cmp, label %store, label %exit 2056 2057 store: 2058 store i32 0, i32 *%ptr 2059 br label %exit 2060 2061 exit: 2062 ret <4 x i32> %res 2063 } 2064 2065 ; VCHGS with no processing of the result. 2066 define i32 @test_vchgs(<2 x i64> %a, <2 x i64> %b) { 2067 ; CHECK-LABEL: test_vchgs: 2068 ; CHECK: vchgs {{%v[0-9]+}}, %v24, %v26 2069 ; CHECK: ipm %r2 2070 ; CHECK: srl %r2, 28 2071 ; CHECK: br %r14 2072 %call = call {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64> %a, <2 x i64> %b) 2073 %res = extractvalue {<2 x i64>, i32} %call, 1 2074 ret i32 %res 2075 } 2076 2077 ; VCHGS returning 1 if all elements are higher (CC == 0). 2078 define i32 @test_vchgs_all_bool(<2 x i64> %a, <2 x i64> %b) { 2079 ; CHECK-LABEL: test_vchgs_all_bool: 2080 ; CHECK: vchgs {{%v[0-9]+}}, %v24, %v26 2081 ; CHECK: ipm %r2 2082 ; CHECK: afi %r2, -268435456 2083 ; CHECK: srl %r2, 31 2084 ; CHECK: br %r14 2085 %call = call {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64> %a, <2 x i64> %b) 2086 %res = extractvalue {<2 x i64>, i32} %call, 1 2087 %cmp = icmp ult i32 %res, 1 2088 %ext = zext i1 %cmp to i32 2089 ret i32 %ext 2090 } 2091 2092 ; VCHGS, storing to %ptr if all elements are higher. 2093 define <2 x i64> @test_vchgs_all_store(<2 x i64> %a, <2 x i64> %b, i32 *%ptr) { 2094 ; CHECK-LABEL: test_vchgs_all_store: 2095 ; CHECK-NOT: %r 2096 ; CHECK: vchgs %v24, %v24, %v26 2097 ; CHECK-NEXT: {{bnher|bner}} %r14 2098 ; CHECK: mvhi 0(%r2), 0 2099 ; CHECK: br %r14 2100 %call = call {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64> %a, <2 x i64> %b) 2101 %res = extractvalue {<2 x i64>, i32} %call, 0 2102 %cc = extractvalue {<2 x i64>, i32} %call, 1 2103 %cmp = icmp sle i32 %cc, 0 2104 br i1 %cmp, label %store, label %exit 2105 2106 store: 2107 store i32 0, i32 *%ptr 2108 br label %exit 2109 2110 exit: 2111 ret <2 x i64> %res 2112 } 2113 2114 ; VCHLBS with no processing of the result. 2115 define i32 @test_vchlbs(<16 x i8> %a, <16 x i8> %b) { 2116 ; CHECK-LABEL: test_vchlbs: 2117 ; CHECK: vchlbs {{%v[0-9]+}}, %v24, %v26 2118 ; CHECK: ipm %r2 2119 ; CHECK: srl %r2, 28 2120 ; CHECK: br %r14 2121 %call = call {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8> %a, <16 x i8> %b) 2122 %res = extractvalue {<16 x i8>, i32} %call, 1 2123 ret i32 %res 2124 } 2125 2126 ; VCHLBS, returning 1 if any elements are higher (CC != 3). 2127 define i32 @test_vchlbs_any_bool(<16 x i8> %a, <16 x i8> %b) { 2128 ; CHECK-LABEL: test_vchlbs_any_bool: 2129 ; CHECK: vchlbs {{%v[0-9]+}}, %v24, %v26 2130 ; CHECK: ipm %r2 2131 ; CHECK: afi %r2, -536870912 2132 ; CHECK: srl %r2, 31 2133 ; CHECK: br %r14 2134 %call = call {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8> %a, <16 x i8> %b) 2135 %res = extractvalue {<16 x i8>, i32} %call, 1 2136 %cmp = icmp ne i32 %res, 3 2137 %ext = zext i1 %cmp to i32 2138 ret i32 %ext 2139 } 2140 2141 ; VCHLBS, storing to %ptr if any elements are higher. 2142 define <16 x i8> @test_vchlbs_any_store(<16 x i8> %a, <16 x i8> %b, i32 *%ptr) { 2143 ; CHECK-LABEL: test_vchlbs_any_store: 2144 ; CHECK-NOT: %r 2145 ; CHECK: vchlbs %v24, %v24, %v26 2146 ; CHECK-NEXT: {{bor|bnler}} %r14 2147 ; CHECK: mvhi 0(%r2), 0 2148 ; CHECK: br %r14 2149 %call = call {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8> %a, <16 x i8> %b) 2150 %res = extractvalue {<16 x i8>, i32} %call, 0 2151 %cc = extractvalue {<16 x i8>, i32} %call, 1 2152 %cmp = icmp sle i32 %cc, 2 2153 br i1 %cmp, label %store, label %exit 2154 2155 store: 2156 store i32 0, i32 *%ptr 2157 br label %exit 2158 2159 exit: 2160 ret <16 x i8> %res 2161 } 2162 2163 ; VCHLHS with no processing of the result. 2164 define i32 @test_vchlhs(<8 x i16> %a, <8 x i16> %b) { 2165 ; CHECK-LABEL: test_vchlhs: 2166 ; CHECK: vchlhs {{%v[0-9]+}}, %v24, %v26 2167 ; CHECK: ipm %r2 2168 ; CHECK: srl %r2, 28 2169 ; CHECK: br %r14 2170 %call = call {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16> %a, <8 x i16> %b) 2171 %res = extractvalue {<8 x i16>, i32} %call, 1 2172 ret i32 %res 2173 } 2174 2175 ; VCHLHS, returning 1 if not all elements are higher. 2176 define i32 @test_vchlhs_notall_bool(<8 x i16> %a, <8 x i16> %b) { 2177 ; CHECK-LABEL: test_vchlhs_notall_bool: 2178 ; CHECK: vchlhs {{%v[0-9]+}}, %v24, %v26 2179 ; CHECK: ipm [[REG:%r[0-5]]] 2180 ; CHECK: risblg %r2, [[REG]], 31, 159, 36 2181 ; CHECK: br %r14 2182 %call = call {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16> %a, <8 x i16> %b) 2183 %res = extractvalue {<8 x i16>, i32} %call, 1 2184 %cmp = icmp uge i32 %res, 1 2185 %ext = zext i1 %cmp to i32 2186 ret i32 %ext 2187 } 2188 2189 ; VCHLHS, storing to %ptr if not all elements are higher. 2190 define <8 x i16> @test_vchlhs_notall_store(<8 x i16> %a, <8 x i16> %b, 2191 i32 *%ptr) { 2192 ; CHECK-LABEL: test_vchlhs_notall_store: 2193 ; CHECK-NOT: %r 2194 ; CHECK: vchlhs %v24, %v24, %v26 2195 ; CHECK-NEXT: {{bher|ber}} %r14 2196 ; CHECK: mvhi 0(%r2), 0 2197 ; CHECK: br %r14 2198 %call = call {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16> %a, <8 x i16> %b) 2199 %res = extractvalue {<8 x i16>, i32} %call, 0 2200 %cc = extractvalue {<8 x i16>, i32} %call, 1 2201 %cmp = icmp sgt i32 %cc, 0 2202 br i1 %cmp, label %store, label %exit 2203 2204 store: 2205 store i32 0, i32 *%ptr 2206 br label %exit 2207 2208 exit: 2209 ret <8 x i16> %res 2210 } 2211 2212 ; VCHLFS with no processing of the result. 2213 define i32 @test_vchlfs(<4 x i32> %a, <4 x i32> %b) { 2214 ; CHECK-LABEL: test_vchlfs: 2215 ; CHECK: vchlfs {{%v[0-9]+}}, %v24, %v26 2216 ; CHECK: ipm %r2 2217 ; CHECK: srl %r2, 28 2218 ; CHECK: br %r14 2219 %call = call {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32> %a, <4 x i32> %b) 2220 %res = extractvalue {<4 x i32>, i32} %call, 1 2221 ret i32 %res 2222 } 2223 2224 ; VCHLFS, returning 1 if no elements are higher. 2225 define i32 @test_vchlfs_none_bool(<4 x i32> %a, <4 x i32> %b) { 2226 ; CHECK-LABEL: test_vchlfs_none_bool: 2227 ; CHECK: vchlfs {{%v[0-9]+}}, %v24, %v26 2228 ; CHECK: ipm [[REG:%r[0-5]]] 2229 ; CHECK: risblg %r2, [[REG]], 31, 159, 35 2230 ; CHECK: br %r14 2231 %call = call {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32> %a, <4 x i32> %b) 2232 %res = extractvalue {<4 x i32>, i32} %call, 1 2233 %cmp = icmp eq i32 %res, 3 2234 %ext = zext i1 %cmp to i32 2235 ret i32 %ext 2236 } 2237 2238 ; VCHLFS, storing to %ptr if no elements are higher. 2239 define <4 x i32> @test_vchlfs_none_store(<4 x i32> %a, <4 x i32> %b, 2240 i32 *%ptr) { 2241 ; CHECK-LABEL: test_vchlfs_none_store: 2242 ; CHECK-NOT: %r 2243 ; CHECK: vchlfs %v24, %v24, %v26 2244 ; CHECK-NEXT: {{bnor|bler}} %r14 2245 ; CHECK: mvhi 0(%r2), 0 2246 ; CHECK: br %r14 2247 %call = call {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32> %a, <4 x i32> %b) 2248 %res = extractvalue {<4 x i32>, i32} %call, 0 2249 %cc = extractvalue {<4 x i32>, i32} %call, 1 2250 %cmp = icmp sge i32 %cc, 3 2251 br i1 %cmp, label %store, label %exit 2252 2253 store: 2254 store i32 0, i32 *%ptr 2255 br label %exit 2256 2257 exit: 2258 ret <4 x i32> %res 2259 } 2260 2261 ; VCHLGS with no processing of the result. 2262 define i32 @test_vchlgs(<2 x i64> %a, <2 x i64> %b) { 2263 ; CHECK-LABEL: test_vchlgs: 2264 ; CHECK: vchlgs {{%v[0-9]+}}, %v24, %v26 2265 ; CHECK: ipm %r2 2266 ; CHECK: srl %r2, 28 2267 ; CHECK: br %r14 2268 %call = call {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64> %a, <2 x i64> %b) 2269 %res = extractvalue {<2 x i64>, i32} %call, 1 2270 ret i32 %res 2271 } 2272 2273 ; VCHLGS returning 1 if all elements are higher (CC == 0). 2274 define i32 @test_vchlgs_all_bool(<2 x i64> %a, <2 x i64> %b) { 2275 ; CHECK-LABEL: test_vchlgs_all_bool: 2276 ; CHECK: vchlgs {{%v[0-9]+}}, %v24, %v26 2277 ; CHECK: ipm %r2 2278 ; CHECK: afi %r2, -268435456 2279 ; CHECK: srl %r2, 31 2280 ; CHECK: br %r14 2281 %call = call {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64> %a, <2 x i64> %b) 2282 %res = extractvalue {<2 x i64>, i32} %call, 1 2283 %cmp = icmp slt i32 %res, 1 2284 %ext = zext i1 %cmp to i32 2285 ret i32 %ext 2286 } 2287 2288 ; VCHLGS, storing to %ptr if all elements are higher. 2289 define <2 x i64> @test_vchlgs_all_store(<2 x i64> %a, <2 x i64> %b, i32 *%ptr) { 2290 ; CHECK-LABEL: test_vchlgs_all_store: 2291 ; CHECK-NOT: %r 2292 ; CHECK: vchlgs %v24, %v24, %v26 2293 ; CHECK-NEXT: {{bnher|bner}} %r14 2294 ; CHECK: mvhi 0(%r2), 0 2295 ; CHECK: br %r14 2296 %call = call {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64> %a, <2 x i64> %b) 2297 %res = extractvalue {<2 x i64>, i32} %call, 0 2298 %cc = extractvalue {<2 x i64>, i32} %call, 1 2299 %cmp = icmp ule i32 %cc, 0 2300 br i1 %cmp, label %store, label %exit 2301 2302 store: 2303 store i32 0, i32 *%ptr 2304 br label %exit 2305 2306 exit: 2307 ret <2 x i64> %res 2308 } 2309 2310 ; VFAEB with !IN !RT. 2311 define <16 x i8> @test_vfaeb_0(<16 x i8> %a, <16 x i8> %b) { 2312 ; CHECK-LABEL: test_vfaeb_0: 2313 ; CHECK: vfaeb %v24, %v24, %v26, 0 2314 ; CHECK: br %r14 2315 %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 0) 2316 ret <16 x i8> %res 2317 } 2318 2319 ; VFAEB with !IN RT. 2320 define <16 x i8> @test_vfaeb_4(<16 x i8> %a, <16 x i8> %b) { 2321 ; CHECK-LABEL: test_vfaeb_4: 2322 ; CHECK: vfaeb %v24, %v24, %v26, 4 2323 ; CHECK: br %r14 2324 %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 4) 2325 ret <16 x i8> %res 2326 } 2327 2328 ; VFAEB with IN !RT. 2329 define <16 x i8> @test_vfaeb_8(<16 x i8> %a, <16 x i8> %b) { 2330 ; CHECK-LABEL: test_vfaeb_8: 2331 ; CHECK: vfaeb %v24, %v24, %v26, 8 2332 ; CHECK: br %r14 2333 %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 8) 2334 ret <16 x i8> %res 2335 } 2336 2337 ; VFAEB with IN RT. 2338 define <16 x i8> @test_vfaeb_12(<16 x i8> %a, <16 x i8> %b) { 2339 ; CHECK-LABEL: test_vfaeb_12: 2340 ; CHECK: vfaeb %v24, %v24, %v26, 12 2341 ; CHECK: br %r14 2342 %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 12) 2343 ret <16 x i8> %res 2344 } 2345 2346 ; VFAEB with CS -- should be ignored. 2347 define <16 x i8> @test_vfaeb_1(<16 x i8> %a, <16 x i8> %b) { 2348 ; CHECK-LABEL: test_vfaeb_1: 2349 ; CHECK: vfaeb %v24, %v24, %v26, 0 2350 ; CHECK: br %r14 2351 %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 1) 2352 ret <16 x i8> %res 2353 } 2354 2355 ; VFAEH. 2356 define <8 x i16> @test_vfaeh(<8 x i16> %a, <8 x i16> %b) { 2357 ; CHECK-LABEL: test_vfaeh: 2358 ; CHECK: vfaeh %v24, %v24, %v26, 4 2359 ; CHECK: br %r14 2360 %res = call <8 x i16> @llvm.s390.vfaeh(<8 x i16> %a, <8 x i16> %b, i32 4) 2361 ret <8 x i16> %res 2362 } 2363 2364 ; VFAEF. 2365 define <4 x i32> @test_vfaef(<4 x i32> %a, <4 x i32> %b) { 2366 ; CHECK-LABEL: test_vfaef: 2367 ; CHECK: vfaef %v24, %v24, %v26, 8 2368 ; CHECK: br %r14 2369 %res = call <4 x i32> @llvm.s390.vfaef(<4 x i32> %a, <4 x i32> %b, i32 8) 2370 ret <4 x i32> %res 2371 } 2372 2373 ; VFAEBS. 2374 define <16 x i8> @test_vfaebs(<16 x i8> %a, <16 x i8> %b, i32 *%ccptr) { 2375 ; CHECK-LABEL: test_vfaebs: 2376 ; CHECK: vfaebs %v24, %v24, %v26, 0 2377 ; CHECK: ipm [[REG:%r[0-5]]] 2378 ; CHECK: srl [[REG]], 28 2379 ; CHECK: st [[REG]], 0(%r2) 2380 ; CHECK: br %r14 2381 %call = call {<16 x i8>, i32} @llvm.s390.vfaebs(<16 x i8> %a, <16 x i8> %b, 2382 i32 0) 2383 %res = extractvalue {<16 x i8>, i32} %call, 0 2384 %cc = extractvalue {<16 x i8>, i32} %call, 1 2385 store i32 %cc, i32 *%ccptr 2386 ret <16 x i8> %res 2387 } 2388 2389 ; VFAEHS. 2390 define <8 x i16> @test_vfaehs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 2391 ; CHECK-LABEL: test_vfaehs: 2392 ; CHECK: vfaehs %v24, %v24, %v26, 4 2393 ; CHECK: ipm [[REG:%r[0-5]]] 2394 ; CHECK: srl [[REG]], 28 2395 ; CHECK: st [[REG]], 0(%r2) 2396 ; CHECK: br %r14 2397 %call = call {<8 x i16>, i32} @llvm.s390.vfaehs(<8 x i16> %a, <8 x i16> %b, 2398 i32 4) 2399 %res = extractvalue {<8 x i16>, i32} %call, 0 2400 %cc = extractvalue {<8 x i16>, i32} %call, 1 2401 store i32 %cc, i32 *%ccptr 2402 ret <8 x i16> %res 2403 } 2404 2405 ; VFAEFS. 2406 define <4 x i32> @test_vfaefs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 2407 ; CHECK-LABEL: test_vfaefs: 2408 ; CHECK: vfaefs %v24, %v24, %v26, 8 2409 ; CHECK: ipm [[REG:%r[0-5]]] 2410 ; CHECK: srl [[REG]], 28 2411 ; CHECK: st [[REG]], 0(%r2) 2412 ; CHECK: br %r14 2413 %call = call {<4 x i32>, i32} @llvm.s390.vfaefs(<4 x i32> %a, <4 x i32> %b, 2414 i32 8) 2415 %res = extractvalue {<4 x i32>, i32} %call, 0 2416 %cc = extractvalue {<4 x i32>, i32} %call, 1 2417 store i32 %cc, i32 *%ccptr 2418 ret <4 x i32> %res 2419 } 2420 2421 ; VFAEZB with !IN !RT. 2422 define <16 x i8> @test_vfaezb_0(<16 x i8> %a, <16 x i8> %b) { 2423 ; CHECK-LABEL: test_vfaezb_0: 2424 ; CHECK: vfaezb %v24, %v24, %v26, 0 2425 ; CHECK: br %r14 2426 %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 0) 2427 ret <16 x i8> %res 2428 } 2429 2430 ; VFAEZB with !IN RT. 2431 define <16 x i8> @test_vfaezb_4(<16 x i8> %a, <16 x i8> %b) { 2432 ; CHECK-LABEL: test_vfaezb_4: 2433 ; CHECK: vfaezb %v24, %v24, %v26, 4 2434 ; CHECK: br %r14 2435 %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 4) 2436 ret <16 x i8> %res 2437 } 2438 2439 ; VFAEZB with IN !RT. 2440 define <16 x i8> @test_vfaezb_8(<16 x i8> %a, <16 x i8> %b) { 2441 ; CHECK-LABEL: test_vfaezb_8: 2442 ; CHECK: vfaezb %v24, %v24, %v26, 8 2443 ; CHECK: br %r14 2444 %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 8) 2445 ret <16 x i8> %res 2446 } 2447 2448 ; VFAEZB with IN RT. 2449 define <16 x i8> @test_vfaezb_12(<16 x i8> %a, <16 x i8> %b) { 2450 ; CHECK-LABEL: test_vfaezb_12: 2451 ; CHECK: vfaezb %v24, %v24, %v26, 12 2452 ; CHECK: br %r14 2453 %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 12) 2454 ret <16 x i8> %res 2455 } 2456 2457 ; VFAEZB with CS -- should be ignored. 2458 define <16 x i8> @test_vfaezb_1(<16 x i8> %a, <16 x i8> %b) { 2459 ; CHECK-LABEL: test_vfaezb_1: 2460 ; CHECK: vfaezb %v24, %v24, %v26, 0 2461 ; CHECK: br %r14 2462 %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 1) 2463 ret <16 x i8> %res 2464 } 2465 2466 ; VFAEZH. 2467 define <8 x i16> @test_vfaezh(<8 x i16> %a, <8 x i16> %b) { 2468 ; CHECK-LABEL: test_vfaezh: 2469 ; CHECK: vfaezh %v24, %v24, %v26, 4 2470 ; CHECK: br %r14 2471 %res = call <8 x i16> @llvm.s390.vfaezh(<8 x i16> %a, <8 x i16> %b, i32 4) 2472 ret <8 x i16> %res 2473 } 2474 2475 ; VFAEZF. 2476 define <4 x i32> @test_vfaezf(<4 x i32> %a, <4 x i32> %b) { 2477 ; CHECK-LABEL: test_vfaezf: 2478 ; CHECK: vfaezf %v24, %v24, %v26, 8 2479 ; CHECK: br %r14 2480 %res = call <4 x i32> @llvm.s390.vfaezf(<4 x i32> %a, <4 x i32> %b, i32 8) 2481 ret <4 x i32> %res 2482 } 2483 2484 ; VFAEZBS. 2485 define <16 x i8> @test_vfaezbs(<16 x i8> %a, <16 x i8> %b, i32 *%ccptr) { 2486 ; CHECK-LABEL: test_vfaezbs: 2487 ; CHECK: vfaezbs %v24, %v24, %v26, 0 2488 ; CHECK: ipm [[REG:%r[0-5]]] 2489 ; CHECK: srl [[REG]], 28 2490 ; CHECK: st [[REG]], 0(%r2) 2491 ; CHECK: br %r14 2492 %call = call {<16 x i8>, i32} @llvm.s390.vfaezbs(<16 x i8> %a, <16 x i8> %b, 2493 i32 0) 2494 %res = extractvalue {<16 x i8>, i32} %call, 0 2495 %cc = extractvalue {<16 x i8>, i32} %call, 1 2496 store i32 %cc, i32 *%ccptr 2497 ret <16 x i8> %res 2498 } 2499 2500 ; VFAEZHS. 2501 define <8 x i16> @test_vfaezhs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 2502 ; CHECK-LABEL: test_vfaezhs: 2503 ; CHECK: vfaezhs %v24, %v24, %v26, 4 2504 ; CHECK: ipm [[REG:%r[0-5]]] 2505 ; CHECK: srl [[REG]], 28 2506 ; CHECK: st [[REG]], 0(%r2) 2507 ; CHECK: br %r14 2508 %call = call {<8 x i16>, i32} @llvm.s390.vfaezhs(<8 x i16> %a, <8 x i16> %b, 2509 i32 4) 2510 %res = extractvalue {<8 x i16>, i32} %call, 0 2511 %cc = extractvalue {<8 x i16>, i32} %call, 1 2512 store i32 %cc, i32 *%ccptr 2513 ret <8 x i16> %res 2514 } 2515 2516 ; VFAEZFS. 2517 define <4 x i32> @test_vfaezfs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 2518 ; CHECK-LABEL: test_vfaezfs: 2519 ; CHECK: vfaezfs %v24, %v24, %v26, 8 2520 ; CHECK: ipm [[REG:%r[0-5]]] 2521 ; CHECK: srl [[REG]], 28 2522 ; CHECK: st [[REG]], 0(%r2) 2523 ; CHECK: br %r14 2524 %call = call {<4 x i32>, i32} @llvm.s390.vfaezfs(<4 x i32> %a, <4 x i32> %b, 2525 i32 8) 2526 %res = extractvalue {<4 x i32>, i32} %call, 0 2527 %cc = extractvalue {<4 x i32>, i32} %call, 1 2528 store i32 %cc, i32 *%ccptr 2529 ret <4 x i32> %res 2530 } 2531 2532 ; VFEEB. 2533 define <16 x i8> @test_vfeeb_0(<16 x i8> %a, <16 x i8> %b) { 2534 ; CHECK-LABEL: test_vfeeb_0: 2535 ; CHECK: vfeeb %v24, %v24, %v26 2536 ; CHECK: br %r14 2537 %res = call <16 x i8> @llvm.s390.vfeeb(<16 x i8> %a, <16 x i8> %b) 2538 ret <16 x i8> %res 2539 } 2540 2541 ; VFEEH. 2542 define <8 x i16> @test_vfeeh(<8 x i16> %a, <8 x i16> %b) { 2543 ; CHECK-LABEL: test_vfeeh: 2544 ; CHECK: vfeeh %v24, %v24, %v26 2545 ; CHECK: br %r14 2546 %res = call <8 x i16> @llvm.s390.vfeeh(<8 x i16> %a, <8 x i16> %b) 2547 ret <8 x i16> %res 2548 } 2549 2550 ; VFEEF. 2551 define <4 x i32> @test_vfeef(<4 x i32> %a, <4 x i32> %b) { 2552 ; CHECK-LABEL: test_vfeef: 2553 ; CHECK: vfeef %v24, %v24, %v26 2554 ; CHECK: br %r14 2555 %res = call <4 x i32> @llvm.s390.vfeef(<4 x i32> %a, <4 x i32> %b) 2556 ret <4 x i32> %res 2557 } 2558 2559 ; VFEEBS. 2560 define <16 x i8> @test_vfeebs(<16 x i8> %a, <16 x i8> %b, i32 *%ccptr) { 2561 ; CHECK-LABEL: test_vfeebs: 2562 ; CHECK: vfeebs %v24, %v24, %v26 2563 ; CHECK: ipm [[REG:%r[0-5]]] 2564 ; CHECK: srl [[REG]], 28 2565 ; CHECK: st [[REG]], 0(%r2) 2566 ; CHECK: br %r14 2567 %call = call {<16 x i8>, i32} @llvm.s390.vfeebs(<16 x i8> %a, <16 x i8> %b) 2568 %res = extractvalue {<16 x i8>, i32} %call, 0 2569 %cc = extractvalue {<16 x i8>, i32} %call, 1 2570 store i32 %cc, i32 *%ccptr 2571 ret <16 x i8> %res 2572 } 2573 2574 ; VFEEHS. 2575 define <8 x i16> @test_vfeehs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 2576 ; CHECK-LABEL: test_vfeehs: 2577 ; CHECK: vfeehs %v24, %v24, %v26 2578 ; CHECK: ipm [[REG:%r[0-5]]] 2579 ; CHECK: srl [[REG]], 28 2580 ; CHECK: st [[REG]], 0(%r2) 2581 ; CHECK: br %r14 2582 %call = call {<8 x i16>, i32} @llvm.s390.vfeehs(<8 x i16> %a, <8 x i16> %b) 2583 %res = extractvalue {<8 x i16>, i32} %call, 0 2584 %cc = extractvalue {<8 x i16>, i32} %call, 1 2585 store i32 %cc, i32 *%ccptr 2586 ret <8 x i16> %res 2587 } 2588 2589 ; VFEEFS. 2590 define <4 x i32> @test_vfeefs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 2591 ; CHECK-LABEL: test_vfeefs: 2592 ; CHECK: vfeefs %v24, %v24, %v26 2593 ; CHECK: ipm [[REG:%r[0-5]]] 2594 ; CHECK: srl [[REG]], 28 2595 ; CHECK: st [[REG]], 0(%r2) 2596 ; CHECK: br %r14 2597 %call = call {<4 x i32>, i32} @llvm.s390.vfeefs(<4 x i32> %a, <4 x i32> %b) 2598 %res = extractvalue {<4 x i32>, i32} %call, 0 2599 %cc = extractvalue {<4 x i32>, i32} %call, 1 2600 store i32 %cc, i32 *%ccptr 2601 ret <4 x i32> %res 2602 } 2603 2604 ; VFEEZB. 2605 define <16 x i8> @test_vfeezb(<16 x i8> %a, <16 x i8> %b) { 2606 ; CHECK-LABEL: test_vfeezb: 2607 ; CHECK: vfeezb %v24, %v24, %v26 2608 ; CHECK: br %r14 2609 %res = call <16 x i8> @llvm.s390.vfeezb(<16 x i8> %a, <16 x i8> %b) 2610 ret <16 x i8> %res 2611 } 2612 2613 ; VFEEZH. 2614 define <8 x i16> @test_vfeezh(<8 x i16> %a, <8 x i16> %b) { 2615 ; CHECK-LABEL: test_vfeezh: 2616 ; CHECK: vfeezh %v24, %v24, %v26 2617 ; CHECK: br %r14 2618 %res = call <8 x i16> @llvm.s390.vfeezh(<8 x i16> %a, <8 x i16> %b) 2619 ret <8 x i16> %res 2620 } 2621 2622 ; VFEEZF. 2623 define <4 x i32> @test_vfeezf(<4 x i32> %a, <4 x i32> %b) { 2624 ; CHECK-LABEL: test_vfeezf: 2625 ; CHECK: vfeezf %v24, %v24, %v26 2626 ; CHECK: br %r14 2627 %res = call <4 x i32> @llvm.s390.vfeezf(<4 x i32> %a, <4 x i32> %b) 2628 ret <4 x i32> %res 2629 } 2630 2631 ; VFEEZBS. 2632 define <16 x i8> @test_vfeezbs(<16 x i8> %a, <16 x i8> %b, i32 *%ccptr) { 2633 ; CHECK-LABEL: test_vfeezbs: 2634 ; CHECK: vfeezbs %v24, %v24, %v26 2635 ; CHECK: ipm [[REG:%r[0-5]]] 2636 ; CHECK: srl [[REG]], 28 2637 ; CHECK: st [[REG]], 0(%r2) 2638 ; CHECK: br %r14 2639 %call = call {<16 x i8>, i32} @llvm.s390.vfeezbs(<16 x i8> %a, <16 x i8> %b) 2640 %res = extractvalue {<16 x i8>, i32} %call, 0 2641 %cc = extractvalue {<16 x i8>, i32} %call, 1 2642 store i32 %cc, i32 *%ccptr 2643 ret <16 x i8> %res 2644 } 2645 2646 ; VFEEZHS. 2647 define <8 x i16> @test_vfeezhs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 2648 ; CHECK-LABEL: test_vfeezhs: 2649 ; CHECK: vfeezhs %v24, %v24, %v26 2650 ; CHECK: ipm [[REG:%r[0-5]]] 2651 ; CHECK: srl [[REG]], 28 2652 ; CHECK: st [[REG]], 0(%r2) 2653 ; CHECK: br %r14 2654 %call = call {<8 x i16>, i32} @llvm.s390.vfeezhs(<8 x i16> %a, <8 x i16> %b) 2655 %res = extractvalue {<8 x i16>, i32} %call, 0 2656 %cc = extractvalue {<8 x i16>, i32} %call, 1 2657 store i32 %cc, i32 *%ccptr 2658 ret <8 x i16> %res 2659 } 2660 2661 ; VFEEZFS. 2662 define <4 x i32> @test_vfeezfs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 2663 ; CHECK-LABEL: test_vfeezfs: 2664 ; CHECK: vfeezfs %v24, %v24, %v26 2665 ; CHECK: ipm [[REG:%r[0-5]]] 2666 ; CHECK: srl [[REG]], 28 2667 ; CHECK: st [[REG]], 0(%r2) 2668 ; CHECK: br %r14 2669 %call = call {<4 x i32>, i32} @llvm.s390.vfeezfs(<4 x i32> %a, <4 x i32> %b) 2670 %res = extractvalue {<4 x i32>, i32} %call, 0 2671 %cc = extractvalue {<4 x i32>, i32} %call, 1 2672 store i32 %cc, i32 *%ccptr 2673 ret <4 x i32> %res 2674 } 2675 2676 ; VFENEB. 2677 define <16 x i8> @test_vfeneb_0(<16 x i8> %a, <16 x i8> %b) { 2678 ; CHECK-LABEL: test_vfeneb_0: 2679 ; CHECK: vfeneb %v24, %v24, %v26 2680 ; CHECK: br %r14 2681 %res = call <16 x i8> @llvm.s390.vfeneb(<16 x i8> %a, <16 x i8> %b) 2682 ret <16 x i8> %res 2683 } 2684 2685 ; VFENEH. 2686 define <8 x i16> @test_vfeneh(<8 x i16> %a, <8 x i16> %b) { 2687 ; CHECK-LABEL: test_vfeneh: 2688 ; CHECK: vfeneh %v24, %v24, %v26 2689 ; CHECK: br %r14 2690 %res = call <8 x i16> @llvm.s390.vfeneh(<8 x i16> %a, <8 x i16> %b) 2691 ret <8 x i16> %res 2692 } 2693 2694 ; VFENEF. 2695 define <4 x i32> @test_vfenef(<4 x i32> %a, <4 x i32> %b) { 2696 ; CHECK-LABEL: test_vfenef: 2697 ; CHECK: vfenef %v24, %v24, %v26 2698 ; CHECK: br %r14 2699 %res = call <4 x i32> @llvm.s390.vfenef(<4 x i32> %a, <4 x i32> %b) 2700 ret <4 x i32> %res 2701 } 2702 2703 ; VFENEBS. 2704 define <16 x i8> @test_vfenebs(<16 x i8> %a, <16 x i8> %b, i32 *%ccptr) { 2705 ; CHECK-LABEL: test_vfenebs: 2706 ; CHECK: vfenebs %v24, %v24, %v26 2707 ; CHECK: ipm [[REG:%r[0-5]]] 2708 ; CHECK: srl [[REG]], 28 2709 ; CHECK: st [[REG]], 0(%r2) 2710 ; CHECK: br %r14 2711 %call = call {<16 x i8>, i32} @llvm.s390.vfenebs(<16 x i8> %a, <16 x i8> %b) 2712 %res = extractvalue {<16 x i8>, i32} %call, 0 2713 %cc = extractvalue {<16 x i8>, i32} %call, 1 2714 store i32 %cc, i32 *%ccptr 2715 ret <16 x i8> %res 2716 } 2717 2718 ; VFENEHS. 2719 define <8 x i16> @test_vfenehs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 2720 ; CHECK-LABEL: test_vfenehs: 2721 ; CHECK: vfenehs %v24, %v24, %v26 2722 ; CHECK: ipm [[REG:%r[0-5]]] 2723 ; CHECK: srl [[REG]], 28 2724 ; CHECK: st [[REG]], 0(%r2) 2725 ; CHECK: br %r14 2726 %call = call {<8 x i16>, i32} @llvm.s390.vfenehs(<8 x i16> %a, <8 x i16> %b) 2727 %res = extractvalue {<8 x i16>, i32} %call, 0 2728 %cc = extractvalue {<8 x i16>, i32} %call, 1 2729 store i32 %cc, i32 *%ccptr 2730 ret <8 x i16> %res 2731 } 2732 2733 ; VFENEFS. 2734 define <4 x i32> @test_vfenefs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 2735 ; CHECK-LABEL: test_vfenefs: 2736 ; CHECK: vfenefs %v24, %v24, %v26 2737 ; CHECK: ipm [[REG:%r[0-5]]] 2738 ; CHECK: srl [[REG]], 28 2739 ; CHECK: st [[REG]], 0(%r2) 2740 ; CHECK: br %r14 2741 %call = call {<4 x i32>, i32} @llvm.s390.vfenefs(<4 x i32> %a, <4 x i32> %b) 2742 %res = extractvalue {<4 x i32>, i32} %call, 0 2743 %cc = extractvalue {<4 x i32>, i32} %call, 1 2744 store i32 %cc, i32 *%ccptr 2745 ret <4 x i32> %res 2746 } 2747 2748 ; VFENEZB. 2749 define <16 x i8> @test_vfenezb(<16 x i8> %a, <16 x i8> %b) { 2750 ; CHECK-LABEL: test_vfenezb: 2751 ; CHECK: vfenezb %v24, %v24, %v26 2752 ; CHECK: br %r14 2753 %res = call <16 x i8> @llvm.s390.vfenezb(<16 x i8> %a, <16 x i8> %b) 2754 ret <16 x i8> %res 2755 } 2756 2757 ; VFENEZH. 2758 define <8 x i16> @test_vfenezh(<8 x i16> %a, <8 x i16> %b) { 2759 ; CHECK-LABEL: test_vfenezh: 2760 ; CHECK: vfenezh %v24, %v24, %v26 2761 ; CHECK: br %r14 2762 %res = call <8 x i16> @llvm.s390.vfenezh(<8 x i16> %a, <8 x i16> %b) 2763 ret <8 x i16> %res 2764 } 2765 2766 ; VFENEZF. 2767 define <4 x i32> @test_vfenezf(<4 x i32> %a, <4 x i32> %b) { 2768 ; CHECK-LABEL: test_vfenezf: 2769 ; CHECK: vfenezf %v24, %v24, %v26 2770 ; CHECK: br %r14 2771 %res = call <4 x i32> @llvm.s390.vfenezf(<4 x i32> %a, <4 x i32> %b) 2772 ret <4 x i32> %res 2773 } 2774 2775 ; VFENEZBS. 2776 define <16 x i8> @test_vfenezbs(<16 x i8> %a, <16 x i8> %b, i32 *%ccptr) { 2777 ; CHECK-LABEL: test_vfenezbs: 2778 ; CHECK: vfenezbs %v24, %v24, %v26 2779 ; CHECK: ipm [[REG:%r[0-5]]] 2780 ; CHECK: srl [[REG]], 28 2781 ; CHECK: st [[REG]], 0(%r2) 2782 ; CHECK: br %r14 2783 %call = call {<16 x i8>, i32} @llvm.s390.vfenezbs(<16 x i8> %a, <16 x i8> %b) 2784 %res = extractvalue {<16 x i8>, i32} %call, 0 2785 %cc = extractvalue {<16 x i8>, i32} %call, 1 2786 store i32 %cc, i32 *%ccptr 2787 ret <16 x i8> %res 2788 } 2789 2790 ; VFENEZHS. 2791 define <8 x i16> @test_vfenezhs(<8 x i16> %a, <8 x i16> %b, i32 *%ccptr) { 2792 ; CHECK-LABEL: test_vfenezhs: 2793 ; CHECK: vfenezhs %v24, %v24, %v26 2794 ; CHECK: ipm [[REG:%r[0-5]]] 2795 ; CHECK: srl [[REG]], 28 2796 ; CHECK: st [[REG]], 0(%r2) 2797 ; CHECK: br %r14 2798 %call = call {<8 x i16>, i32} @llvm.s390.vfenezhs(<8 x i16> %a, <8 x i16> %b) 2799 %res = extractvalue {<8 x i16>, i32} %call, 0 2800 %cc = extractvalue {<8 x i16>, i32} %call, 1 2801 store i32 %cc, i32 *%ccptr 2802 ret <8 x i16> %res 2803 } 2804 2805 ; VFENEZFS. 2806 define <4 x i32> @test_vfenezfs(<4 x i32> %a, <4 x i32> %b, i32 *%ccptr) { 2807 ; CHECK-LABEL: test_vfenezfs: 2808 ; CHECK: vfenezfs %v24, %v24, %v26 2809 ; CHECK: ipm [[REG:%r[0-5]]] 2810 ; CHECK: srl [[REG]], 28 2811 ; CHECK: st [[REG]], 0(%r2) 2812 ; CHECK: br %r14 2813 %call = call {<4 x i32>, i32} @llvm.s390.vfenezfs(<4 x i32> %a, <4 x i32> %b) 2814 %res = extractvalue {<4 x i32>, i32} %call, 0 2815 %cc = extractvalue {<4 x i32>, i32} %call, 1 2816 store i32 %cc, i32 *%ccptr 2817 ret <4 x i32> %res 2818 } 2819 2820 ; VISTRB. 2821 define <16 x i8> @test_vistrb(<16 x i8> %a) { 2822 ; CHECK-LABEL: test_vistrb: 2823 ; CHECK: vistrb %v24, %v24 2824 ; CHECK: br %r14 2825 %res = call <16 x i8> @llvm.s390.vistrb(<16 x i8> %a) 2826 ret <16 x i8> %res 2827 } 2828 2829 ; VISTRH. 2830 define <8 x i16> @test_vistrh(<8 x i16> %a) { 2831 ; CHECK-LABEL: test_vistrh: 2832 ; CHECK: vistrh %v24, %v24 2833 ; CHECK: br %r14 2834 %res = call <8 x i16> @llvm.s390.vistrh(<8 x i16> %a) 2835 ret <8 x i16> %res 2836 } 2837 2838 ; VISTRF. 2839 define <4 x i32> @test_vistrf(<4 x i32> %a) { 2840 ; CHECK-LABEL: test_vistrf: 2841 ; CHECK: vistrf %v24, %v24 2842 ; CHECK: br %r14 2843 %res = call <4 x i32> @llvm.s390.vistrf(<4 x i32> %a) 2844 ret <4 x i32> %res 2845 } 2846 2847 ; VISTRBS. 2848 define <16 x i8> @test_vistrbs(<16 x i8> %a, i32 *%ccptr) { 2849 ; CHECK-LABEL: test_vistrbs: 2850 ; CHECK: vistrbs %v24, %v24 2851 ; CHECK: ipm [[REG:%r[0-5]]] 2852 ; CHECK: srl [[REG]], 28 2853 ; CHECK: st [[REG]], 0(%r2) 2854 ; CHECK: br %r14 2855 %call = call {<16 x i8>, i32} @llvm.s390.vistrbs(<16 x i8> %a) 2856 %res = extractvalue {<16 x i8>, i32} %call, 0 2857 %cc = extractvalue {<16 x i8>, i32} %call, 1 2858 store i32 %cc, i32 *%ccptr 2859 ret <16 x i8> %res 2860 } 2861 2862 ; VISTRHS. 2863 define <8 x i16> @test_vistrhs(<8 x i16> %a, i32 *%ccptr) { 2864 ; CHECK-LABEL: test_vistrhs: 2865 ; CHECK: vistrhs %v24, %v24 2866 ; CHECK: ipm [[REG:%r[0-5]]] 2867 ; CHECK: srl [[REG]], 28 2868 ; CHECK: st [[REG]], 0(%r2) 2869 ; CHECK: br %r14 2870 %call = call {<8 x i16>, i32} @llvm.s390.vistrhs(<8 x i16> %a) 2871 %res = extractvalue {<8 x i16>, i32} %call, 0 2872 %cc = extractvalue {<8 x i16>, i32} %call, 1 2873 store i32 %cc, i32 *%ccptr 2874 ret <8 x i16> %res 2875 } 2876 2877 ; VISTRFS. 2878 define <4 x i32> @test_vistrfs(<4 x i32> %a, i32 *%ccptr) { 2879 ; CHECK-LABEL: test_vistrfs: 2880 ; CHECK: vistrfs %v24, %v24 2881 ; CHECK: ipm [[REG:%r[0-5]]] 2882 ; CHECK: srl [[REG]], 28 2883 ; CHECK: st [[REG]], 0(%r2) 2884 ; CHECK: br %r14 2885 %call = call {<4 x i32>, i32} @llvm.s390.vistrfs(<4 x i32> %a) 2886 %res = extractvalue {<4 x i32>, i32} %call, 0 2887 %cc = extractvalue {<4 x i32>, i32} %call, 1 2888 store i32 %cc, i32 *%ccptr 2889 ret <4 x i32> %res 2890 } 2891 2892 ; VSTRCB with !IN !RT. 2893 define <16 x i8> @test_vstrcb_0(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 2894 ; CHECK-LABEL: test_vstrcb_0: 2895 ; CHECK: vstrcb %v24, %v24, %v26, %v28, 0 2896 ; CHECK: br %r14 2897 %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b, 2898 <16 x i8> %c, i32 0) 2899 ret <16 x i8> %res 2900 } 2901 2902 ; VSTRCB with !IN RT. 2903 define <16 x i8> @test_vstrcb_4(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 2904 ; CHECK-LABEL: test_vstrcb_4: 2905 ; CHECK: vstrcb %v24, %v24, %v26, %v28, 4 2906 ; CHECK: br %r14 2907 %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b, 2908 <16 x i8> %c, i32 4) 2909 ret <16 x i8> %res 2910 } 2911 2912 ; VSTRCB with IN !RT. 2913 define <16 x i8> @test_vstrcb_8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 2914 ; CHECK-LABEL: test_vstrcb_8: 2915 ; CHECK: vstrcb %v24, %v24, %v26, %v28, 8 2916 ; CHECK: br %r14 2917 %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b, 2918 <16 x i8> %c, i32 8) 2919 ret <16 x i8> %res 2920 } 2921 2922 ; VSTRCB with IN RT. 2923 define <16 x i8> @test_vstrcb_12(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 2924 ; CHECK-LABEL: test_vstrcb_12: 2925 ; CHECK: vstrcb %v24, %v24, %v26, %v28, 12 2926 ; CHECK: br %r14 2927 %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b, 2928 <16 x i8> %c, i32 12) 2929 ret <16 x i8> %res 2930 } 2931 2932 ; VSTRCB with CS -- should be ignored. 2933 define <16 x i8> @test_vstrcb_1(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 2934 ; CHECK-LABEL: test_vstrcb_1: 2935 ; CHECK: vstrcb %v24, %v24, %v26, %v28, 0 2936 ; CHECK: br %r14 2937 %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b, 2938 <16 x i8> %c, i32 1) 2939 ret <16 x i8> %res 2940 } 2941 2942 ; VSTRCH. 2943 define <8 x i16> @test_vstrch(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) { 2944 ; CHECK-LABEL: test_vstrch: 2945 ; CHECK: vstrch %v24, %v24, %v26, %v28, 4 2946 ; CHECK: br %r14 2947 %res = call <8 x i16> @llvm.s390.vstrch(<8 x i16> %a, <8 x i16> %b, 2948 <8 x i16> %c, i32 4) 2949 ret <8 x i16> %res 2950 } 2951 2952 ; VSTRCF. 2953 define <4 x i32> @test_vstrcf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 2954 ; CHECK-LABEL: test_vstrcf: 2955 ; CHECK: vstrcf %v24, %v24, %v26, %v28, 8 2956 ; CHECK: br %r14 2957 %res = call <4 x i32> @llvm.s390.vstrcf(<4 x i32> %a, <4 x i32> %b, 2958 <4 x i32> %c, i32 8) 2959 ret <4 x i32> %res 2960 } 2961 2962 ; VSTRCBS. 2963 define <16 x i8> @test_vstrcbs(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, 2964 i32 *%ccptr) { 2965 ; CHECK-LABEL: test_vstrcbs: 2966 ; CHECK: vstrcbs %v24, %v24, %v26, %v28, 0 2967 ; CHECK: ipm [[REG:%r[0-5]]] 2968 ; CHECK: srl [[REG]], 28 2969 ; CHECK: st [[REG]], 0(%r2) 2970 ; CHECK: br %r14 2971 %call = call {<16 x i8>, i32} @llvm.s390.vstrcbs(<16 x i8> %a, <16 x i8> %b, 2972 <16 x i8> %c, i32 0) 2973 %res = extractvalue {<16 x i8>, i32} %call, 0 2974 %cc = extractvalue {<16 x i8>, i32} %call, 1 2975 store i32 %cc, i32 *%ccptr 2976 ret <16 x i8> %res 2977 } 2978 2979 ; VSTRCHS. 2980 define <8 x i16> @test_vstrchs(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, 2981 i32 *%ccptr) { 2982 ; CHECK-LABEL: test_vstrchs: 2983 ; CHECK: vstrchs %v24, %v24, %v26, %v28, 4 2984 ; CHECK: ipm [[REG:%r[0-5]]] 2985 ; CHECK: srl [[REG]], 28 2986 ; CHECK: st [[REG]], 0(%r2) 2987 ; CHECK: br %r14 2988 %call = call {<8 x i16>, i32} @llvm.s390.vstrchs(<8 x i16> %a, <8 x i16> %b, 2989 <8 x i16> %c, i32 4) 2990 %res = extractvalue {<8 x i16>, i32} %call, 0 2991 %cc = extractvalue {<8 x i16>, i32} %call, 1 2992 store i32 %cc, i32 *%ccptr 2993 ret <8 x i16> %res 2994 } 2995 2996 ; VSTRCFS. 2997 define <4 x i32> @test_vstrcfs(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, 2998 i32 *%ccptr) { 2999 ; CHECK-LABEL: test_vstrcfs: 3000 ; CHECK: vstrcfs %v24, %v24, %v26, %v28, 8 3001 ; CHECK: ipm [[REG:%r[0-5]]] 3002 ; CHECK: srl [[REG]], 28 3003 ; CHECK: st [[REG]], 0(%r2) 3004 ; CHECK: br %r14 3005 %call = call {<4 x i32>, i32} @llvm.s390.vstrcfs(<4 x i32> %a, <4 x i32> %b, 3006 <4 x i32> %c, i32 8) 3007 %res = extractvalue {<4 x i32>, i32} %call, 0 3008 %cc = extractvalue {<4 x i32>, i32} %call, 1 3009 store i32 %cc, i32 *%ccptr 3010 ret <4 x i32> %res 3011 } 3012 3013 ; VSTRCZB with !IN !RT. 3014 define <16 x i8> @test_vstrczb_0(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 3015 ; CHECK-LABEL: test_vstrczb_0: 3016 ; CHECK: vstrczb %v24, %v24, %v26, %v28, 0 3017 ; CHECK: br %r14 3018 %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b, 3019 <16 x i8> %c, i32 0) 3020 ret <16 x i8> %res 3021 } 3022 3023 ; VSTRCZB with !IN RT. 3024 define <16 x i8> @test_vstrczb_4(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 3025 ; CHECK-LABEL: test_vstrczb_4: 3026 ; CHECK: vstrczb %v24, %v24, %v26, %v28, 4 3027 ; CHECK: br %r14 3028 %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b, 3029 <16 x i8> %c, i32 4) 3030 ret <16 x i8> %res 3031 } 3032 3033 ; VSTRCZB with IN !RT. 3034 define <16 x i8> @test_vstrczb_8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 3035 ; CHECK-LABEL: test_vstrczb_8: 3036 ; CHECK: vstrczb %v24, %v24, %v26, %v28, 8 3037 ; CHECK: br %r14 3038 %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b, 3039 <16 x i8> %c, i32 8) 3040 ret <16 x i8> %res 3041 } 3042 3043 ; VSTRCZB with IN RT. 3044 define <16 x i8> @test_vstrczb_12(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 3045 ; CHECK-LABEL: test_vstrczb_12: 3046 ; CHECK: vstrczb %v24, %v24, %v26, %v28, 12 3047 ; CHECK: br %r14 3048 %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b, 3049 <16 x i8> %c, i32 12) 3050 ret <16 x i8> %res 3051 } 3052 3053 ; VSTRCZB with CS -- should be ignored. 3054 define <16 x i8> @test_vstrczb_1(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) { 3055 ; CHECK-LABEL: test_vstrczb_1: 3056 ; CHECK: vstrczb %v24, %v24, %v26, %v28, 0 3057 ; CHECK: br %r14 3058 %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b, 3059 <16 x i8> %c, i32 1) 3060 ret <16 x i8> %res 3061 } 3062 3063 ; VSTRCZH. 3064 define <8 x i16> @test_vstrczh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) { 3065 ; CHECK-LABEL: test_vstrczh: 3066 ; CHECK: vstrczh %v24, %v24, %v26, %v28, 4 3067 ; CHECK: br %r14 3068 %res = call <8 x i16> @llvm.s390.vstrczh(<8 x i16> %a, <8 x i16> %b, 3069 <8 x i16> %c, i32 4) 3070 ret <8 x i16> %res 3071 } 3072 3073 ; VSTRCZF. 3074 define <4 x i32> @test_vstrczf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 3075 ; CHECK-LABEL: test_vstrczf: 3076 ; CHECK: vstrczf %v24, %v24, %v26, %v28, 8 3077 ; CHECK: br %r14 3078 %res = call <4 x i32> @llvm.s390.vstrczf(<4 x i32> %a, <4 x i32> %b, 3079 <4 x i32> %c, i32 8) 3080 ret <4 x i32> %res 3081 } 3082 3083 ; VSTRCZBS. 3084 define <16 x i8> @test_vstrczbs(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, 3085 i32 *%ccptr) { 3086 ; CHECK-LABEL: test_vstrczbs: 3087 ; CHECK: vstrczbs %v24, %v24, %v26, %v28, 0 3088 ; CHECK: ipm [[REG:%r[0-5]]] 3089 ; CHECK: srl [[REG]], 28 3090 ; CHECK: st [[REG]], 0(%r2) 3091 ; CHECK: br %r14 3092 %call = call {<16 x i8>, i32} @llvm.s390.vstrczbs(<16 x i8> %a, <16 x i8> %b, 3093 <16 x i8> %c, i32 0) 3094 %res = extractvalue {<16 x i8>, i32} %call, 0 3095 %cc = extractvalue {<16 x i8>, i32} %call, 1 3096 store i32 %cc, i32 *%ccptr 3097 ret <16 x i8> %res 3098 } 3099 3100 ; VSTRCZHS. 3101 define <8 x i16> @test_vstrczhs(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, 3102 i32 *%ccptr) { 3103 ; CHECK-LABEL: test_vstrczhs: 3104 ; CHECK: vstrczhs %v24, %v24, %v26, %v28, 4 3105 ; CHECK: ipm [[REG:%r[0-5]]] 3106 ; CHECK: srl [[REG]], 28 3107 ; CHECK: st [[REG]], 0(%r2) 3108 ; CHECK: br %r14 3109 %call = call {<8 x i16>, i32} @llvm.s390.vstrczhs(<8 x i16> %a, <8 x i16> %b, 3110 <8 x i16> %c, i32 4) 3111 %res = extractvalue {<8 x i16>, i32} %call, 0 3112 %cc = extractvalue {<8 x i16>, i32} %call, 1 3113 store i32 %cc, i32 *%ccptr 3114 ret <8 x i16> %res 3115 } 3116 3117 ; VSTRCZFS. 3118 define <4 x i32> @test_vstrczfs(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, 3119 i32 *%ccptr) { 3120 ; CHECK-LABEL: test_vstrczfs: 3121 ; CHECK: vstrczfs %v24, %v24, %v26, %v28, 8 3122 ; CHECK: ipm [[REG:%r[0-5]]] 3123 ; CHECK: srl [[REG]], 28 3124 ; CHECK: st [[REG]], 0(%r2) 3125 ; CHECK: br %r14 3126 %call = call {<4 x i32>, i32} @llvm.s390.vstrczfs(<4 x i32> %a, <4 x i32> %b, 3127 <4 x i32> %c, i32 8) 3128 %res = extractvalue {<4 x i32>, i32} %call, 0 3129 %cc = extractvalue {<4 x i32>, i32} %call, 1 3130 store i32 %cc, i32 *%ccptr 3131 ret <4 x i32> %res 3132 } 3133 3134 ; VFCEDBS with no processing of the result. 3135 define i32 @test_vfcedbs(<2 x double> %a, <2 x double> %b) { 3136 ; CHECK-LABEL: test_vfcedbs: 3137 ; CHECK: vfcedbs {{%v[0-9]+}}, %v24, %v26 3138 ; CHECK: ipm %r2 3139 ; CHECK: srl %r2, 28 3140 ; CHECK: br %r14 3141 %call = call {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double> %a, 3142 <2 x double> %b) 3143 %res = extractvalue {<2 x i64>, i32} %call, 1 3144 ret i32 %res 3145 } 3146 3147 ; VFCEDBS, returning 1 if any elements are equal (CC != 3). 3148 define i32 @test_vfcedbs_any_bool(<2 x double> %a, <2 x double> %b) { 3149 ; CHECK-LABEL: test_vfcedbs_any_bool: 3150 ; CHECK: vfcedbs {{%v[0-9]+}}, %v24, %v26 3151 ; CHECK: ipm %r2 3152 ; CHECK: afi %r2, -536870912 3153 ; CHECK: srl %r2, 31 3154 ; CHECK: br %r14 3155 %call = call {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double> %a, 3156 <2 x double> %b) 3157 %res = extractvalue {<2 x i64>, i32} %call, 1 3158 %cmp = icmp ne i32 %res, 3 3159 %ext = zext i1 %cmp to i32 3160 ret i32 %ext 3161 } 3162 3163 ; VFCEDBS, storing to %ptr if any elements are equal. 3164 define <2 x i64> @test_vfcedbs_any_store(<2 x double> %a, <2 x double> %b, 3165 i32 *%ptr) { 3166 ; CHECK-LABEL: test_vfcedbs_any_store: 3167 ; CHECK-NOT: %r 3168 ; CHECK: vfcedbs %v24, %v24, %v26 3169 ; CHECK-NEXT: {{bor|bnler}} %r14 3170 ; CHECK: mvhi 0(%r2), 0 3171 ; CHECK: br %r14 3172 %call = call {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double> %a, 3173 <2 x double> %b) 3174 %res = extractvalue {<2 x i64>, i32} %call, 0 3175 %cc = extractvalue {<2 x i64>, i32} %call, 1 3176 %cmp = icmp ule i32 %cc, 2 3177 br i1 %cmp, label %store, label %exit 3178 3179 store: 3180 store i32 0, i32 *%ptr 3181 br label %exit 3182 3183 exit: 3184 ret <2 x i64> %res 3185 } 3186 3187 ; VFCHDBS with no processing of the result. 3188 define i32 @test_vfchdbs(<2 x double> %a, <2 x double> %b) { 3189 ; CHECK-LABEL: test_vfchdbs: 3190 ; CHECK: vfchdbs {{%v[0-9]+}}, %v24, %v26 3191 ; CHECK: ipm %r2 3192 ; CHECK: srl %r2, 28 3193 ; CHECK: br %r14 3194 %call = call {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double> %a, 3195 <2 x double> %b) 3196 %res = extractvalue {<2 x i64>, i32} %call, 1 3197 ret i32 %res 3198 } 3199 3200 ; VFCHDBS, returning 1 if not all elements are higher. 3201 define i32 @test_vfchdbs_notall_bool(<2 x double> %a, <2 x double> %b) { 3202 ; CHECK-LABEL: test_vfchdbs_notall_bool: 3203 ; CHECK: vfchdbs {{%v[0-9]+}}, %v24, %v26 3204 ; CHECK: ipm [[REG:%r[0-5]]] 3205 ; CHECK: risblg %r2, [[REG]], 31, 159, 36 3206 ; CHECK: br %r14 3207 %call = call {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double> %a, 3208 <2 x double> %b) 3209 %res = extractvalue {<2 x i64>, i32} %call, 1 3210 %cmp = icmp sge i32 %res, 1 3211 %ext = zext i1 %cmp to i32 3212 ret i32 %ext 3213 } 3214 3215 ; VFCHDBS, storing to %ptr if not all elements are higher. 3216 define <2 x i64> @test_vfchdbs_notall_store(<2 x double> %a, <2 x double> %b, 3217 i32 *%ptr) { 3218 ; CHECK-LABEL: test_vfchdbs_notall_store: 3219 ; CHECK-NOT: %r 3220 ; CHECK: vfchdbs %v24, %v24, %v26 3221 ; CHECK-NEXT: {{bher|ber}} %r14 3222 ; CHECK: mvhi 0(%r2), 0 3223 ; CHECK: br %r14 3224 %call = call {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double> %a, 3225 <2 x double> %b) 3226 %res = extractvalue {<2 x i64>, i32} %call, 0 3227 %cc = extractvalue {<2 x i64>, i32} %call, 1 3228 %cmp = icmp ugt i32 %cc, 0 3229 br i1 %cmp, label %store, label %exit 3230 3231 store: 3232 store i32 0, i32 *%ptr 3233 br label %exit 3234 3235 exit: 3236 ret <2 x i64> %res 3237 } 3238 3239 ; VFCHEDBS with no processing of the result. 3240 define i32 @test_vfchedbs(<2 x double> %a, <2 x double> %b) { 3241 ; CHECK-LABEL: test_vfchedbs: 3242 ; CHECK: vfchedbs {{%v[0-9]+}}, %v24, %v26 3243 ; CHECK: ipm %r2 3244 ; CHECK: srl %r2, 28 3245 ; CHECK: br %r14 3246 %call = call {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double> %a, 3247 <2 x double> %b) 3248 %res = extractvalue {<2 x i64>, i32} %call, 1 3249 ret i32 %res 3250 } 3251 3252 ; VFCHEDBS, returning 1 if neither element is higher or equal. 3253 define i32 @test_vfchedbs_none_bool(<2 x double> %a, <2 x double> %b) { 3254 ; CHECK-LABEL: test_vfchedbs_none_bool: 3255 ; CHECK: vfchedbs {{%v[0-9]+}}, %v24, %v26 3256 ; CHECK: ipm [[REG:%r[0-5]]] 3257 ; CHECK: risblg %r2, [[REG]], 31, 159, 35 3258 ; CHECK: br %r14 3259 %call = call {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double> %a, 3260 <2 x double> %b) 3261 %res = extractvalue {<2 x i64>, i32} %call, 1 3262 %cmp = icmp eq i32 %res, 3 3263 %ext = zext i1 %cmp to i32 3264 ret i32 %ext 3265 } 3266 3267 ; VFCHEDBS, storing to %ptr if neither element is higher or equal. 3268 define <2 x i64> @test_vfchedbs_none_store(<2 x double> %a, <2 x double> %b, 3269 i32 *%ptr) { 3270 ; CHECK-LABEL: test_vfchedbs_none_store: 3271 ; CHECK-NOT: %r 3272 ; CHECK: vfchedbs %v24, %v24, %v26 3273 ; CHECK-NEXT: {{bnor|bler}} %r14 3274 ; CHECK: mvhi 0(%r2), 0 3275 ; CHECK: br %r14 3276 %call = call {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double> %a, 3277 <2 x double> %b) 3278 %res = extractvalue {<2 x i64>, i32} %call, 0 3279 %cc = extractvalue {<2 x i64>, i32} %call, 1 3280 %cmp = icmp uge i32 %cc, 3 3281 br i1 %cmp, label %store, label %exit 3282 3283 store: 3284 store i32 0, i32 *%ptr 3285 br label %exit 3286 3287 exit: 3288 ret <2 x i64> %res 3289 } 3290 3291 ; VFTCIDB with the lowest useful class selector and no processing of the result. 3292 define i32 @test_vftcidb(<2 x double> %a) { 3293 ; CHECK-LABEL: test_vftcidb: 3294 ; CHECK: vftcidb {{%v[0-9]+}}, %v24, 1 3295 ; CHECK: ipm %r2 3296 ; CHECK: srl %r2, 28 3297 ; CHECK: br %r14 3298 %call = call {<2 x i64>, i32} @llvm.s390.vftcidb(<2 x double> %a, i32 1) 3299 %res = extractvalue {<2 x i64>, i32} %call, 1 3300 ret i32 %res 3301 } 3302 3303 ; VFTCIDB with the highest useful class selector, returning 1 if all elements 3304 ; have the right class (CC == 0). 3305 define i32 @test_vftcidb_all_bool(<2 x double> %a) { 3306 ; CHECK-LABEL: test_vftcidb_all_bool: 3307 ; CHECK: vftcidb {{%v[0-9]+}}, %v24, 4094 3308 ; CHECK: afi %r2, -268435456 3309 ; CHECK: srl %r2, 31 3310 ; CHECK: br %r14 3311 %call = call {<2 x i64>, i32} @llvm.s390.vftcidb(<2 x double> %a, i32 4094) 3312 %res = extractvalue {<2 x i64>, i32} %call, 1 3313 %cmp = icmp eq i32 %res, 0 3314 %ext = zext i1 %cmp to i32 3315 ret i32 %ext 3316 } 3317 3318 ; VFIDB with a rounding mode not usable via standard intrinsics. 3319 define <2 x double> @test_vfidb_0_4(<2 x double> %a) { 3320 ; CHECK-LABEL: test_vfidb_0_4: 3321 ; CHECK: vfidb %v24, %v24, 0, 4 3322 ; CHECK: br %r14 3323 %res = call <2 x double> @llvm.s390.vfidb(<2 x double> %a, i32 0, i32 4) 3324 ret <2 x double> %res 3325 } 3326 3327 ; VFIDB with IEEE-inexact exception suppressed. 3328 define <2 x double> @test_vfidb_4_0(<2 x double> %a) { 3329 ; CHECK-LABEL: test_vfidb_4_0: 3330 ; CHECK: vfidb %v24, %v24, 4, 0 3331 ; CHECK: br %r14 3332 %res = call <2 x double> @llvm.s390.vfidb(<2 x double> %a, i32 4, i32 0) 3333 ret <2 x double> %res 3334 } 3335 3336