1 ; Test that a vector select with a logic combination of two compares do not 2 ; produce any unnecessary pack, unpack or shift instructions. 3 ; And, Or and Xor are tested. 4 ; 5 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s 6 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s -check-prefix=CHECK-Z14 7 8 define <2 x i8> @fun0(<2 x i8> %val1, <2 x i8> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i8> %val5, <2 x i8> %val6) { 9 ; CHECK-LABEL: fun0: 10 ; CHECK: # %bb.0: 11 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26 12 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v28, %v30 13 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]] 14 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 15 ; CHECK-NEXT: br %r14 16 %cmp0 = icmp eq <2 x i8> %val1, %val2 17 %cmp1 = icmp eq <2 x i8> %val3, %val4 18 %and = and <2 x i1> %cmp0, %cmp1 19 %sel = select <2 x i1> %and, <2 x i8> %val5, <2 x i8> %val6 20 ret <2 x i8> %sel 21 } 22 23 define <2 x i16> @fun1(<2 x i8> %val1, <2 x i8> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i16> %val5, <2 x i16> %val6) { 24 ; CHECK-LABEL: fun1: 25 ; CHECK: # %bb.0: 26 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26 27 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v28, %v30 28 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]] 29 ; CHECK-NEXT: vuphb %v0, %v0 30 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 31 ; CHECK-NEXT: br %r14 32 %cmp0 = icmp eq <2 x i8> %val1, %val2 33 %cmp1 = icmp eq <2 x i8> %val3, %val4 34 %and = and <2 x i1> %cmp0, %cmp1 35 %sel = select <2 x i1> %and, <2 x i16> %val5, <2 x i16> %val6 36 ret <2 x i16> %sel 37 } 38 39 define <16 x i8> @fun2(<16 x i8> %val1, <16 x i8> %val2, <16 x i16> %val3, <16 x i16> %val4, <16 x i8> %val5, <16 x i8> %val6) { 40 ; CHECK-LABEL: fun2: 41 ; CHECK: # %bb.0: 42 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v30, %v27 43 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v25 44 ; CHECK-DAG: vceqb [[REG2:%v[0-9]+]], %v24, %v26 45 ; CHECK-DAG: vpkh [[REG3:%v[0-9]+]], [[REG1]], [[REG0]] 46 ; CHECK-NEXT: vo %v0, [[REG2]], [[REG3]] 47 ; CHECK-NEXT: vsel %v24, %v29, %v31, %v0 48 ; CHECK-NEXT: br %r14 49 %cmp0 = icmp eq <16 x i8> %val1, %val2 50 %cmp1 = icmp eq <16 x i16> %val3, %val4 51 %and = or <16 x i1> %cmp0, %cmp1 52 %sel = select <16 x i1> %and, <16 x i8> %val5, <16 x i8> %val6 53 ret <16 x i8> %sel 54 } 55 56 define <16 x i16> @fun3(<16 x i8> %val1, <16 x i8> %val2, <16 x i16> %val3, <16 x i16> %val4, <16 x i16> %val5, <16 x i16> %val6) { 57 ; CHECK-LABEL: fun3: 58 ; CHECK: # %bb.0: 59 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26 60 ; CHECK-DAG: vuphb [[REG2:%v[0-9]+]], [[REG0]] 61 ; CHECK-DAG: vmrlg [[REG1:%v[0-9]+]], [[REG0]], [[REG0]] 62 ; CHECK-DAG: vuphb [[REG1]], [[REG1]] 63 ; CHECK-DAG: vceqh [[REG3:%v[0-9]+]], %v28, %v25 64 ; CHECK-DAG: vceqh [[REG4:%v[0-9]+]], %v30, %v27 65 ; CHECK-DAG: vl [[REG5:%v[0-9]+]], 176(%r15) 66 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 160(%r15) 67 ; CHECK-DAG: vo [[REG7:%v[0-9]+]], %v2, [[REG4]] 68 ; CHECK-DAG: vo [[REG8:%v[0-9]+]], [[REG2]], [[REG3]] 69 ; CHECK-DAG: vsel %v24, %v29, [[REG6]], [[REG8]] 70 ; CHECK-DAG: vsel %v26, %v31, [[REG5]], [[REG7]] 71 ; CHECK-NEXT: br %r14 72 %cmp0 = icmp eq <16 x i8> %val1, %val2 73 %cmp1 = icmp eq <16 x i16> %val3, %val4 74 %and = or <16 x i1> %cmp0, %cmp1 75 %sel = select <16 x i1> %and, <16 x i16> %val5, <16 x i16> %val6 76 ret <16 x i16> %sel 77 } 78 79 define <32 x i8> @fun4(<32 x i8> %val1, <32 x i8> %val2, <32 x i8> %val3, <32 x i8> %val4, <32 x i8> %val5, <32 x i8> %val6) { 80 ; CHECK-LABEL: fun4: 81 ; CHECK: # %bb.0: 82 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v28 83 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v26, %v30 84 ; CHECK-DAG: vceqb [[REG2:%v[0-9]+]], %v25, %v29 85 ; CHECK-DAG: vceqb [[REG3:%v[0-9]+]], %v27, %v31 86 ; CHECK-DAG: vl [[REG4:%v[0-9]+]], 208(%r15) 87 ; CHECK-DAG: vl [[REG5:%v[0-9]+]], 176(%r15) 88 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 192(%r15) 89 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15) 90 ; CHECK-DAG: vx [[REG8:%v[0-9]+]], [[REG1]], [[REG3]] 91 ; CHECK-DAG: vx [[REG9:%v[0-9]+]], [[REG0]], [[REG2]] 92 ; CHECK-DAG: vsel %v24, [[REG7]], [[REG6]], [[REG9]] 93 ; CHECK-DAG: vsel %v26, [[REG5]], [[REG4]], [[REG8]] 94 ; CHECK-NEXT: br %r14 95 %cmp0 = icmp eq <32 x i8> %val1, %val2 96 %cmp1 = icmp eq <32 x i8> %val3, %val4 97 %and = xor <32 x i1> %cmp0, %cmp1 98 %sel = select <32 x i1> %and, <32 x i8> %val5, <32 x i8> %val6 99 ret <32 x i8> %sel 100 } 101 102 define <2 x i8> @fun5(<2 x i16> %val1, <2 x i16> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i8> %val5, <2 x i8> %val6) { 103 ; CHECK-LABEL: fun5: 104 ; CHECK: # %bb.0: 105 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26 106 ; CHECK-DAG: vpkh [[REG1:%v[0-9]+]], [[REG0]], [[REG0]] 107 ; CHECK-DAG: vceqb [[REG2:%v[0-9]+]], %v28, %v30 108 ; CHECK-DAG: vo %v0, [[REG1]], [[REG2]] 109 ; CHECK-DAG: vsel %v24, %v25, %v27, %v0 110 ; CHECK-NEXT: br %r14 111 %cmp0 = icmp eq <2 x i16> %val1, %val2 112 %cmp1 = icmp eq <2 x i8> %val3, %val4 113 %and = or <2 x i1> %cmp0, %cmp1 114 %sel = select <2 x i1> %and, <2 x i8> %val5, <2 x i8> %val6 115 ret <2 x i8> %sel 116 } 117 118 define <2 x i16> @fun6(<2 x i16> %val1, <2 x i16> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i16> %val5, <2 x i16> %val6) { 119 ; CHECK-LABEL: fun6: 120 ; CHECK: # %bb.0: 121 ; CHECK-NEXT: vceqb %v1, %v28, %v30 122 ; CHECK-NEXT: vceqh %v0, %v24, %v26 123 ; CHECK-NEXT: vuphb %v1, %v1 124 ; CHECK-NEXT: vo %v0, %v0, %v1 125 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 126 ; CHECK-NEXT: br %r14 127 %cmp0 = icmp eq <2 x i16> %val1, %val2 128 %cmp1 = icmp eq <2 x i8> %val3, %val4 129 %and = or <2 x i1> %cmp0, %cmp1 130 %sel = select <2 x i1> %and, <2 x i16> %val5, <2 x i16> %val6 131 ret <2 x i16> %sel 132 } 133 134 define <2 x i32> @fun7(<2 x i16> %val1, <2 x i16> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i32> %val5, <2 x i32> %val6) { 135 ; CHECK-LABEL: fun7: 136 ; CHECK: # %bb.0: 137 ; CHECK-NEXT: vceqb %v1, %v28, %v30 138 ; CHECK-NEXT: vceqh %v0, %v24, %v26 139 ; CHECK-NEXT: vuphb %v1, %v1 140 ; CHECK-NEXT: vo %v0, %v0, %v1 141 ; CHECK-NEXT: vuphh %v0, %v0 142 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 143 ; CHECK-NEXT: br %r14 144 %cmp0 = icmp eq <2 x i16> %val1, %val2 145 %cmp1 = icmp eq <2 x i8> %val3, %val4 146 %and = or <2 x i1> %cmp0, %cmp1 147 %sel = select <2 x i1> %and, <2 x i32> %val5, <2 x i32> %val6 148 ret <2 x i32> %sel 149 } 150 151 define <8 x i8> @fun8(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3, <8 x i16> %val4, <8 x i8> %val5, <8 x i8> %val6) { 152 ; CHECK-LABEL: fun8: 153 ; CHECK: # %bb.0: 154 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26 155 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v30 156 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]] 157 ; CHECK-NEXT: vpkh %v0, %v0, %v0 158 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 159 ; CHECK-NEXT: br %r14 160 %cmp0 = icmp eq <8 x i16> %val1, %val2 161 %cmp1 = icmp eq <8 x i16> %val3, %val4 162 %and = xor <8 x i1> %cmp0, %cmp1 163 %sel = select <8 x i1> %and, <8 x i8> %val5, <8 x i8> %val6 164 ret <8 x i8> %sel 165 } 166 167 define <8 x i16> @fun9(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3, <8 x i16> %val4, <8 x i16> %val5, <8 x i16> %val6) { 168 ; CHECK-LABEL: fun9: 169 ; CHECK: # %bb.0: 170 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26 171 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v30 172 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]] 173 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 174 ; CHECK-NEXT: br %r14 175 %cmp0 = icmp eq <8 x i16> %val1, %val2 176 %cmp1 = icmp eq <8 x i16> %val3, %val4 177 %and = xor <8 x i1> %cmp0, %cmp1 178 %sel = select <8 x i1> %and, <8 x i16> %val5, <8 x i16> %val6 179 ret <8 x i16> %sel 180 } 181 182 define <8 x i32> @fun10(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3, <8 x i16> %val4, <8 x i32> %val5, <8 x i32> %val6) { 183 ; CHECK-LABEL: fun10: 184 ; CHECK: # %bb.0: 185 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26 186 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v30 187 ; CHECK-NEXT: vx [[REG2:%v[0-9]+]], [[REG0]], [[REG1]] 188 ; CHECK-DAG: vuphh [[REG3:%v[0-9]+]], [[REG2]] 189 ; CHECK-DAG: vmrlg [[REG4:%v[0-9]+]], [[REG2]], [[REG2]] 190 ; CHECK-DAG: vuphh [[REG5:%v[0-9]+]], [[REG4]] 191 ; CHECK-NEXT: vsel %v24, %v25, %v29, [[REG3]] 192 ; CHECK-NEXT: vsel %v26, %v27, %v31, [[REG5]] 193 ; CHECK-NEXT: br %r14 194 %cmp0 = icmp eq <8 x i16> %val1, %val2 195 %cmp1 = icmp eq <8 x i16> %val3, %val4 196 %and = xor <8 x i1> %cmp0, %cmp1 197 %sel = select <8 x i1> %and, <8 x i32> %val5, <8 x i32> %val6 198 ret <8 x i32> %sel 199 } 200 201 define <16 x i8> @fun11(<16 x i16> %val1, <16 x i16> %val2, <16 x i32> %val3, <16 x i32> %val4, <16 x i8> %val5, <16 x i8> %val6) { 202 ; CHECK-LABEL: fun11: 203 ; CHECK: # %bb.0: 204 ; CHECK-DAG: vl [[REG0:%v[0-9]+]], 192(%r15) 205 ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 208(%r15) 206 ; CHECK-DAG: vl [[REG2:%v[0-9]+]], 160(%r15) 207 ; CHECK-DAG: vl [[REG3:%v[0-9]+]], 176(%r15) 208 ; CHECK-DAG: vceqf [[REG4:%v[0-9]+]], %v27, [[REG3]] 209 ; CHECK-DAG: vceqf [[REG5:%v[0-9]+]], %v25, [[REG2]] 210 ; CHECK-DAG: vceqf [[REG6:%v[0-9]+]], %v31, [[REG1]] 211 ; CHECK-DAG: vceqf [[REG7:%v[0-9]+]], %v29, [[REG0]] 212 ; CHECK-DAG: vceqh [[REG8:%v[0-9]+]], %v24, %v28 213 ; CHECK-DAG: vceqh [[REG9:%v[0-9]+]], %v26, %v30 214 ; CHECK-DAG: vpkf [[REG10:%v[0-9]+]], [[REG5]], [[REG4]] 215 ; CHECK-DAG: vpkf [[REG11:%v[0-9]+]], [[REG7]], [[REG6]] 216 ; CHECK-DAG: vn [[REG12:%v[0-9]+]], [[REG9]], [[REG11]] 217 ; CHECK-DAG: vn [[REG13:%v[0-9]+]], [[REG8]], [[REG10]] 218 ; CHECK-DAG: vl [[REG14:%v[0-9]+]], 240(%r15) 219 ; CHECK-DAG: vl [[REG15:%v[0-9]+]], 224(%r15) 220 ; CHECK-DAG: vpkh [[REG16:%v[0-9]+]], [[REG13]], [[REG12]] 221 ; CHECK-NEXT: vsel %v24, [[REG15]], [[REG14]], [[REG16]] 222 ; CHECK-NEXT: br %r14 223 %cmp0 = icmp eq <16 x i16> %val1, %val2 224 %cmp1 = icmp eq <16 x i32> %val3, %val4 225 %and = and <16 x i1> %cmp0, %cmp1 226 %sel = select <16 x i1> %and, <16 x i8> %val5, <16 x i8> %val6 227 ret <16 x i8> %sel 228 } 229 230 define <16 x i16> @fun12(<16 x i16> %val1, <16 x i16> %val2, <16 x i32> %val3, <16 x i32> %val4, <16 x i16> %val5, <16 x i16> %val6) { 231 ; CHECK-LABEL: fun12: 232 ; CHECK: # %bb.0: 233 ; CHECK-DAG: vl [[REG0:%v[0-9]+]], 192(%r15) 234 ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 208(%r15) 235 ; CHECK-DAG: vl [[REG2:%v[0-9]+]], 160(%r15) 236 ; CHECK-DAG: vl [[REG3:%v[0-9]+]], 176(%r15) 237 ; CHECK-DAG: vceqf [[REG4:%v[0-9]+]], %v27, [[REG3]] 238 ; CHECK-DAG: vceqf [[REG5:%v[0-9]+]], %v25, [[REG2]] 239 ; CHECK-DAG: vceqf [[REG6:%v[0-9]+]], %v31, [[REG1]] 240 ; CHECK-DAG: vceqf [[REG7:%v[0-9]+]], %v29, [[REG0]] 241 ; CHECK-DAG: vceqh [[REG8:%v[0-9]+]], %v24, %v28 242 ; CHECK-DAG: vceqh [[REG9:%v[0-9]+]], %v26, %v30 243 ; CHECK-DAG: vpkf [[REG10:%v[0-9]+]], [[REG5]], [[REG4]] 244 ; CHECK-DAG: vpkf [[REG11:%v[0-9]+]], [[REG7]], [[REG6]] 245 ; CHECK-DAG: vl [[REG12:%v[0-9]+]], 272(%r15) 246 ; CHECK-DAG: vl [[REG13:%v[0-9]+]], 240(%r15) 247 ; CHECK-DAG: vl [[REG14:%v[0-9]+]], 256(%r15) 248 ; CHECK-DAG: vl [[REG15:%v[0-9]+]], 224(%r15) 249 ; CHECK-DAG: vn [[REG16:%v[0-9]+]], [[REG9]], [[REG11]] 250 ; CHECK-DAG: vn [[REG17:%v[0-9]+]], [[REG8]], [[REG10]] 251 ; CHECK-DAG: vsel %v24, [[REG15]], [[REG14]], [[REG17]] 252 ; CHECK-DAG: vsel %v26, [[REG13]], [[REG12]], [[REG16]] 253 ; CHECK-NEXT: br %r14 254 %cmp0 = icmp eq <16 x i16> %val1, %val2 255 %cmp1 = icmp eq <16 x i32> %val3, %val4 256 %and = and <16 x i1> %cmp0, %cmp1 257 %sel = select <16 x i1> %and, <16 x i16> %val5, <16 x i16> %val6 258 ret <16 x i16> %sel 259 } 260 261 define <2 x i16> @fun13(<2 x i32> %val1, <2 x i32> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i16> %val5, <2 x i16> %val6) { 262 ; CHECK-LABEL: fun13: 263 ; CHECK: # %bb.0: 264 ; CHECK-NEXT: vceqg %v1, %v28, %v30 265 ; CHECK-NEXT: vceqf %v0, %v24, %v26 266 ; CHECK-NEXT: vpkg %v1, %v1, %v1 267 ; CHECK-NEXT: vx %v0, %v0, %v1 268 ; CHECK-NEXT: vpkf %v0, %v0, %v0 269 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 270 ; CHECK-NEXT: br %r14 271 %cmp0 = icmp eq <2 x i32> %val1, %val2 272 %cmp1 = icmp eq <2 x i64> %val3, %val4 273 %and = xor <2 x i1> %cmp0, %cmp1 274 %sel = select <2 x i1> %and, <2 x i16> %val5, <2 x i16> %val6 275 ret <2 x i16> %sel 276 } 277 278 define <2 x i32> @fun14(<2 x i32> %val1, <2 x i32> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i32> %val5, <2 x i32> %val6) { 279 ; CHECK-LABEL: fun14: 280 ; CHECK: # %bb.0: 281 ; CHECK-NEXT: vceqg %v1, %v28, %v30 282 ; CHECK-NEXT: vceqf %v0, %v24, %v26 283 ; CHECK-NEXT: vpkg %v1, %v1, %v1 284 ; CHECK-NEXT: vx %v0, %v0, %v1 285 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 286 ; CHECK-NEXT: br %r14 287 %cmp0 = icmp eq <2 x i32> %val1, %val2 288 %cmp1 = icmp eq <2 x i64> %val3, %val4 289 %and = xor <2 x i1> %cmp0, %cmp1 290 %sel = select <2 x i1> %and, <2 x i32> %val5, <2 x i32> %val6 291 ret <2 x i32> %sel 292 } 293 294 define <2 x i64> @fun15(<2 x i32> %val1, <2 x i32> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i64> %val5, <2 x i64> %val6) { 295 ; CHECK-LABEL: fun15: 296 ; CHECK: # %bb.0: 297 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v26 298 ; CHECK-DAG: vuphf [[REG1:%v[0-9]+]], [[REG0]] 299 ; CHECK-DAG: vceqg [[REG2:%v[0-9]+]], %v28, %v30 300 ; CHECK-NEXT: vx %v0, [[REG1]], [[REG2]] 301 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 302 ; CHECK-NEXT: br %r14 303 %cmp0 = icmp eq <2 x i32> %val1, %val2 304 %cmp1 = icmp eq <2 x i64> %val3, %val4 305 %and = xor <2 x i1> %cmp0, %cmp1 306 %sel = select <2 x i1> %and, <2 x i64> %val5, <2 x i64> %val6 307 ret <2 x i64> %sel 308 } 309 310 define <4 x i16> @fun16(<4 x i32> %val1, <4 x i32> %val2, <4 x i16> %val3, <4 x i16> %val4, <4 x i16> %val5, <4 x i16> %val6) { 311 ; CHECK-LABEL: fun16: 312 ; CHECK: # %bb.0: 313 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v26 314 ; CHECK-DAG: vpkf [[REG1:%v[0-9]+]], [[REG0]], [[REG0]] 315 ; CHECK-DAG: vceqh [[REG2:%v[0-9]+]], %v28, %v30 316 ; CHECK-NEXT: vn %v0, [[REG1]], [[REG2]] 317 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 318 ; CHECK-NEXT: br %r14 319 %cmp0 = icmp eq <4 x i32> %val1, %val2 320 %cmp1 = icmp eq <4 x i16> %val3, %val4 321 %and = and <4 x i1> %cmp0, %cmp1 322 %sel = select <4 x i1> %and, <4 x i16> %val5, <4 x i16> %val6 323 ret <4 x i16> %sel 324 } 325 326 define <4 x i32> @fun17(<4 x i32> %val1, <4 x i32> %val2, <4 x i16> %val3, <4 x i16> %val4, <4 x i32> %val5, <4 x i32> %val6) { 327 ; CHECK-LABEL: fun17: 328 ; CHECK: # %bb.0: 329 ; CHECK-NEXT: vceqh %v1, %v28, %v30 330 ; CHECK-NEXT: vceqf %v0, %v24, %v26 331 ; CHECK-NEXT: vuphh %v1, %v1 332 ; CHECK-NEXT: vn %v0, %v0, %v1 333 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 334 ; CHECK-NEXT: br %r14 335 %cmp0 = icmp eq <4 x i32> %val1, %val2 336 %cmp1 = icmp eq <4 x i16> %val3, %val4 337 %and = and <4 x i1> %cmp0, %cmp1 338 %sel = select <4 x i1> %and, <4 x i32> %val5, <4 x i32> %val6 339 ret <4 x i32> %sel 340 } 341 342 define <4 x i64> @fun18(<4 x i32> %val1, <4 x i32> %val2, <4 x i16> %val3, <4 x i16> %val4, <4 x i64> %val5, <4 x i64> %val6) { 343 ; CHECK-LABEL: fun18: 344 ; CHECK: # %bb.0: 345 ; CHECK-NEXT: vceqh %v1, %v28, %v30 346 ; CHECK-NEXT: vceqf %v0, %v24, %v26 347 ; CHECK-NEXT: vuphh %v1, %v1 348 ; CHECK-NEXT: vn %v0, %v0, %v1 349 ; CHECK-DAG: vuphf [[REG0:%v[0-9]+]], %v0 350 ; CHECK-DAG: vmrlg [[REG1:%v[0-9]+]], %v0, %v0 351 ; CHECK-DAG: vuphf [[REG2:%v[0-9]+]], [[REG1]] 352 ; CHECK-NEXT: vsel %v24, %v25, %v29, [[REG0]] 353 ; CHECK-NEXT: vsel %v26, %v27, %v31, [[REG2]] 354 ; CHECK-NEXT: br %r14 355 %cmp0 = icmp eq <4 x i32> %val1, %val2 356 %cmp1 = icmp eq <4 x i16> %val3, %val4 357 %and = and <4 x i1> %cmp0, %cmp1 358 %sel = select <4 x i1> %and, <4 x i64> %val5, <4 x i64> %val6 359 ret <4 x i64> %sel 360 } 361 362 define <8 x i16> @fun19(<8 x i32> %val1, <8 x i32> %val2, <8 x i32> %val3, <8 x i32> %val4, <8 x i16> %val5, <8 x i16> %val6) { 363 ; CHECK-LABEL: fun19: 364 ; CHECK: # %bb.0: 365 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v28 366 ; CHECK-DAG: vceqf [[REG1:%v[0-9]+]], %v26, %v30 367 ; CHECK-DAG: vceqf [[REG2:%v[0-9]+]], %v25, %v29 368 ; CHECK-DAG: vceqf [[REG3:%v[0-9]+]], %v27, %v31 369 ; CHECK-DAG: vo [[REG4:%v[0-9]+]], [[REG1]], [[REG3]] 370 ; CHECK-DAG: vo [[REG5:%v[0-9]+]], [[REG0]], [[REG2]] 371 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 176(%r15) 372 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15) 373 ; CHECK-DAG: vpkf [[REG8:%v[0-9]+]], [[REG5]], [[REG4]] 374 ; CHECK-NEXT: vsel %v24, [[REG7]], [[REG6]], [[REG8]] 375 ; CHECK-NEXT: br %r14 376 %cmp0 = icmp eq <8 x i32> %val1, %val2 377 %cmp1 = icmp eq <8 x i32> %val3, %val4 378 %and = or <8 x i1> %cmp0, %cmp1 379 %sel = select <8 x i1> %and, <8 x i16> %val5, <8 x i16> %val6 380 ret <8 x i16> %sel 381 } 382 383 define <8 x i32> @fun20(<8 x i32> %val1, <8 x i32> %val2, <8 x i32> %val3, <8 x i32> %val4, <8 x i32> %val5, <8 x i32> %val6) { 384 ; CHECK-LABEL: fun20: 385 ; CHECK: # %bb.0: 386 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v28 387 ; CHECK-DAG: vceqf [[REG1:%v[0-9]+]], %v26, %v30 388 ; CHECK-DAG: vceqf [[REG2:%v[0-9]+]], %v25, %v29 389 ; CHECK-DAG: vceqf [[REG3:%v[0-9]+]], %v27, %v31 390 ; CHECK-DAG: vl [[REG4:%v[0-9]+]], 208(%r15) 391 ; CHECK-DAG: vl [[REG5:%v[0-9]+]], 176(%r15) 392 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 192(%r15) 393 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15) 394 ; CHECK-DAG: vo [[REG8:%v[0-9]+]], [[REG1]], [[REG3]] 395 ; CHECK-DAG: vo [[REG9:%v[0-9]+]], [[REG0]], [[REG2]] 396 ; CHECK-DAG: vsel %v24, [[REG7]], [[REG6]], [[REG9]] 397 ; CHECK-DAG: vsel %v26, [[REG5]], [[REG4]], [[REG8]] 398 ; CHECK-NEXT: br %r14 399 %cmp0 = icmp eq <8 x i32> %val1, %val2 400 %cmp1 = icmp eq <8 x i32> %val3, %val4 401 %and = or <8 x i1> %cmp0, %cmp1 402 %sel = select <8 x i1> %and, <8 x i32> %val5, <8 x i32> %val6 403 ret <8 x i32> %sel 404 } 405 406 define <2 x i32> @fun21(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i32> %val5, <2 x i32> %val6) { 407 ; CHECK-LABEL: fun21: 408 ; CHECK: # %bb.0: 409 ; CHECK-DAG: vceqg [[REG0:%v[0-9]+]], %v24, %v26 410 ; CHECK-DAG: vceqg [[REG1:%v[0-9]+]], %v28, %v30 411 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]] 412 ; CHECK-NEXT: vpkg %v0, %v0, %v0 413 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 414 ; CHECK-NEXT: br %r14 415 %cmp0 = icmp eq <2 x i64> %val1, %val2 416 %cmp1 = icmp eq <2 x i64> %val3, %val4 417 %and = and <2 x i1> %cmp0, %cmp1 418 %sel = select <2 x i1> %and, <2 x i32> %val5, <2 x i32> %val6 419 ret <2 x i32> %sel 420 } 421 422 define <2 x i64> @fun22(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i64> %val5, <2 x i64> %val6) { 423 ; CHECK-LABEL: fun22: 424 ; CHECK: # %bb.0: 425 ; CHECK-DAG: vceqg [[REG0:%v[0-9]+]], %v24, %v26 426 ; CHECK-DAG: vceqg [[REG1:%v[0-9]+]], %v28, %v30 427 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]] 428 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 429 ; CHECK-NEXT: br %r14 430 %cmp0 = icmp eq <2 x i64> %val1, %val2 431 %cmp1 = icmp eq <2 x i64> %val3, %val4 432 %and = and <2 x i1> %cmp0, %cmp1 433 %sel = select <2 x i1> %and, <2 x i64> %val5, <2 x i64> %val6 434 ret <2 x i64> %sel 435 } 436 437 define <4 x i32> @fun23(<4 x i64> %val1, <4 x i64> %val2, <4 x i32> %val3, <4 x i32> %val4, <4 x i32> %val5, <4 x i32> %val6) { 438 ; CHECK-LABEL: fun23: 439 ; CHECK: # %bb.0: 440 ; CHECK-NEXT: vceqg %v0, %v26, %v30 441 ; CHECK-NEXT: vceqg %v1, %v24, %v28 442 ; CHECK-NEXT: vpkg %v0, %v1, %v0 443 ; CHECK-NEXT: vceqf %v1, %v25, %v27 444 ; CHECK-NEXT: vx %v0, %v0, %v1 445 ; CHECK-NEXT: vsel %v24, %v29, %v31, %v0 446 ; CHECK-NEXT: br %r14 447 %cmp0 = icmp eq <4 x i64> %val1, %val2 448 %cmp1 = icmp eq <4 x i32> %val3, %val4 449 %and = xor <4 x i1> %cmp0, %cmp1 450 %sel = select <4 x i1> %and, <4 x i32> %val5, <4 x i32> %val6 451 ret <4 x i32> %sel 452 } 453 454 define <4 x i64> @fun24(<4 x i64> %val1, <4 x i64> %val2, <4 x i32> %val3, <4 x i32> %val4, <4 x i64> %val5, <4 x i64> %val6) { 455 ; CHECK-LABEL: fun24: 456 ; CHECK: # %bb.0: 457 ; CHECK-NEXT: vceqf [[REG0:%v[0-9]+]], %v25, %v27 458 ; CHECK-NEXT: vuphf [[REG1:%v[0-9]+]], [[REG0]] 459 ; CHECK-NEXT: vmrlg [[REG2:%v[0-9]+]], [[REG0]], [[REG0]] 460 ; CHECK-DAG: vceqg [[REG3:%v[0-9]+]], %v24, %v28 461 ; CHECK-DAG: vceqg [[REG4:%v[0-9]+]], %v26, %v30 462 ; CHECK-DAG: vuphf [[REG5:%v[0-9]+]], [[REG2]] 463 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 176(%r15) 464 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15) 465 ; CHECK-DAG: vx [[REG8:%v[0-9]+]], [[REG4]], [[REG5]] 466 ; CHECK-DAG: vx [[REG9:%v[0-9]+]], [[REG3]], [[REG1]] 467 ; CHECK-DAG: vsel %v24, %v29, [[REG7]], [[REG9]] 468 ; CHECK-DAG: vsel %v26, %v31, [[REG6]], [[REG8]] 469 ; CHECK-NEXT: br %r14 470 %cmp0 = icmp eq <4 x i64> %val1, %val2 471 %cmp1 = icmp eq <4 x i32> %val3, %val4 472 %and = xor <4 x i1> %cmp0, %cmp1 473 %sel = select <4 x i1> %and, <4 x i64> %val5, <4 x i64> %val6 474 ret <4 x i64> %sel 475 } 476 477 define <2 x float> @fun25(<2 x float> %val1, <2 x float> %val2, <2 x double> %val3, <2 x double> %val4, <2 x float> %val5, <2 x float> %val6) { 478 ; CHECK-LABEL: fun25: 479 ; CHECK: # %bb.0: 480 ; CHECK-NEXT: vmrlf %v0, %v26, %v26 481 ; CHECK-NEXT: vmrlf %v1, %v24, %v24 482 ; CHECK-NEXT: vldeb %v0, %v0 483 ; CHECK-NEXT: vldeb %v1, %v1 484 ; CHECK-NEXT: vfchdb %v0, %v1, %v0 485 ; CHECK-NEXT: vmrhf %v1, %v26, %v26 486 ; CHECK-NEXT: vmrhf %v2, %v24, %v24 487 ; CHECK-NEXT: vldeb %v1, %v1 488 ; CHECK-NEXT: vldeb %v2, %v2 489 ; CHECK-NEXT: vfchdb %v1, %v2, %v1 490 ; CHECK-NEXT: vpkg %v0, %v1, %v0 491 ; CHECK-NEXT: vfchdb %v1, %v28, %v30 492 ; CHECK-NEXT: vpkg %v1, %v1, %v1 493 ; CHECK-NEXT: vo %v0, %v0, %v1 494 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 495 ; CHECK-NEXT: br %r14 496 ; 497 ; CHECK-Z14-LABEL: fun25: 498 ; CHECK-Z14: # %bb.0: 499 ; CHECK-Z14-NEXT: vfchdb %v1, %v28, %v30 500 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26 501 ; CHECK-Z14-NEXT: vpkg %v1, %v1, %v1 502 ; CHECK-Z14-NEXT: vo %v0, %v0, %v1 503 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v27, %v0 504 ; CHECK-Z14-NEXT: br %r14 505 %cmp0 = fcmp ogt <2 x float> %val1, %val2 506 %cmp1 = fcmp ogt <2 x double> %val3, %val4 507 %and = or <2 x i1> %cmp0, %cmp1 508 %sel = select <2 x i1> %and, <2 x float> %val5, <2 x float> %val6 509 ret <2 x float> %sel 510 } 511 512 define <2 x double> @fun26(<2 x float> %val1, <2 x float> %val2, <2 x double> %val3, <2 x double> %val4, <2 x double> %val5, <2 x double> %val6) { 513 ; CHECK-LABEL: fun26: 514 ; CHECK: # %bb.0: 515 ; CHECK-NEXT: vmrlf %v0, %v26, %v26 516 ; CHECK-NEXT: vmrlf %v1, %v24, %v24 517 ; CHECK-NEXT: vldeb %v0, %v0 518 ; CHECK-NEXT: vldeb %v1, %v1 519 ; CHECK-NEXT: vfchdb %v0, %v1, %v0 520 ; CHECK-NEXT: vmrhf %v1, %v26, %v26 521 ; CHECK-NEXT: vmrhf %v2, %v24, %v24 522 ; CHECK-NEXT: vldeb %v1, %v1 523 ; CHECK-NEXT: vldeb %v2, %v2 524 ; CHECK-NEXT: vfchdb %v1, %v2, %v1 525 ; CHECK-NEXT: vpkg %v0, %v1, %v0 526 ; CHECK-NEXT: vuphf %v0, %v0 527 ; CHECK-NEXT: vfchdb %v1, %v28, %v30 528 ; CHECK-NEXT: vo %v0, %v0, %v1 529 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 530 ; CHECK-NEXT: br %r14 531 ; 532 ; CHECK-Z14-LABEL: fun26: 533 ; CHECK-Z14: # %bb.0: 534 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26 535 ; CHECK-Z14-NEXT: vuphf %v0, %v0 536 ; CHECK-Z14-NEXT: vfchdb %v1, %v28, %v30 537 ; CHECK-Z14-NEXT: vo %v0, %v0, %v1 538 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v27, %v0 539 ; CHECK-Z14-NEXT: br %r14 540 %cmp0 = fcmp ogt <2 x float> %val1, %val2 541 %cmp1 = fcmp ogt <2 x double> %val3, %val4 542 %and = or <2 x i1> %cmp0, %cmp1 543 %sel = select <2 x i1> %and, <2 x double> %val5, <2 x double> %val6 544 ret <2 x double> %sel 545 } 546 547 ; Also check a widening select of a vector of floats 548 define <2 x float> @fun27(<2 x i8> %val1, <2 x i8> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x float> %val5, <2 x float> %val6) { 549 ; CHECK-LABEL: fun27: 550 ; CHECK: # %bb.0: 551 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26 552 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v28, %v30 553 ; CHECK-NEXT: vo %v0, [[REG0]], [[REG1]] 554 ; CHECK-NEXT: vuphb %v0, %v0 555 ; CHECK-NEXT: vuphh %v0, %v0 556 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 557 ; CHECK-NEXT: br %r14 558 %cmp0 = icmp eq <2 x i8> %val1, %val2 559 %cmp1 = icmp eq <2 x i8> %val3, %val4 560 %and = or <2 x i1> %cmp0, %cmp1 561 %sel = select <2 x i1> %and, <2 x float> %val5, <2 x float> %val6 562 ret <2 x float> %sel 563 } 564 565 define <4 x float> @fun28(<4 x float> %val1, <4 x float> %val2, <4 x float> %val3, <4 x float> %val4, <4 x float> %val5, <4 x float> %val6) { 566 ; CHECK-LABEL: fun28: 567 ; CHECK: # %bb.0: 568 ; CHECK-DAG: vmrlf [[REG0:%v[0-9]+]], %v26, %v26 569 ; CHECK-DAG: vmrlf [[REG1:%v[0-9]+]], %v24, %v24 570 ; CHECK-DAG: vldeb [[REG2:%v[0-9]+]], [[REG0]] 571 ; CHECK-DAG: vldeb [[REG3:%v[0-9]+]], [[REG1]] 572 ; CHECK-DAG: vfchdb [[REG4:%v[0-9]+]], [[REG3]], [[REG2]] 573 ; CHECK-DAG: vmrhf [[REG5:%v[0-9]+]], %v26, %v26 574 ; CHECK-DAG: vmrhf [[REG6:%v[0-9]+]], %v24, %v24 575 ; CHECK-DAG: vldeb [[REG7:%v[0-9]+]], [[REG5]] 576 ; CHECK-DAG: vmrhf [[REG8:%v[0-9]+]], %v28, %v28 577 ; CHECK-DAG: vldeb [[REG9:%v[0-9]+]], [[REG6]] 578 ; CHECK-DAG: vfchdb [[REG10:%v[0-9]+]], [[REG9]], [[REG7]] 579 ; CHECK-DAG: vpkg [[REG11:%v[0-9]+]], [[REG10]], [[REG4]] 580 ; CHECK-DAG: vmrlf [[REG12:%v[0-9]+]], %v30, %v30 581 ; CHECK-DAG: vmrlf [[REG13:%v[0-9]+]], %v28, %v28 582 ; CHECK-DAG: vldeb [[REG14:%v[0-9]+]], [[REG12]] 583 ; CHECK-DAG: vldeb [[REG15:%v[0-9]+]], [[REG13]] 584 ; CHECK-DAG: vfchdb [[REG16:%v[0-9]+]], [[REG15]], [[REG14]] 585 ; CHECK-DAG: vmrhf [[REG17:%v[0-9]+]], %v30, %v30 586 ; CHECK-DAG: vldeb [[REG19:%v[0-9]+]], [[REG17]] 587 ; CHECK-DAG: vldeb [[REG20:%v[0-9]+]], [[REG8]] 588 ; CHECK-NEXT: vfchdb %v2, [[REG20]], [[REG19]] 589 ; CHECK-NEXT: vpkg [[REG21:%v[0-9]+]], %v2, [[REG16]] 590 ; CHECK-NEXT: vx %v0, [[REG11]], [[REG21]] 591 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 592 ; CHECK-NEXT: br %r14 593 ; 594 ; CHECK-Z14-LABEL: fun28: 595 ; CHECK-Z14: # %bb.0: 596 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26 597 ; CHECK-Z14-NEXT: vfchsb %v1, %v28, %v30 598 ; CHECK-Z14-NEXT: vx %v0, %v0, %v1 599 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v27, %v0 600 ; CHECK-Z14-NEXT: br %r14 601 %cmp0 = fcmp ogt <4 x float> %val1, %val2 602 %cmp1 = fcmp ogt <4 x float> %val3, %val4 603 %and = xor <4 x i1> %cmp0, %cmp1 604 %sel = select <4 x i1> %and, <4 x float> %val5, <4 x float> %val6 605 ret <4 x float> %sel 606 } 607 608 define <4 x double> @fun29(<4 x float> %val1, <4 x float> %val2, <4 x float> %val3, <4 x float> %val4, <4 x double> %val5, <4 x double> %val6) { 609 ; CHECK-LABEL: fun29: 610 ; CHECK: # %bb.0: 611 ; CHECK-NEXT: vmrlf %v0, %v26, %v26 612 ; CHECK-NEXT: vmrlf %v1, %v24, %v24 613 ; CHECK-NEXT: vldeb %v0, %v0 614 ; CHECK-NEXT: vldeb %v1, %v1 615 ; CHECK-NEXT: vfchdb %v0, %v1, %v0 616 ; CHECK-NEXT: vmrhf %v1, %v26, %v26 617 ; CHECK-NEXT: vmrhf %v2, %v24, %v24 618 ; CHECK-NEXT: vldeb %v1, %v1 619 ; CHECK-NEXT: vmrhf %v3, %v28, %v28 620 ; CHECK-NEXT: vldeb %v2, %v2 621 ; CHECK-NEXT: vfchdb %v1, %v2, %v1 622 ; CHECK-NEXT: vpkg %v0, %v1, %v0 623 ; CHECK-NEXT: vmrlf %v1, %v30, %v30 624 ; CHECK-NEXT: vmrlf %v2, %v28, %v28 625 ; CHECK-NEXT: vldeb %v1, %v1 626 ; CHECK-NEXT: vldeb %v2, %v2 627 ; CHECK-NEXT: vfchdb %v1, %v2, %v1 628 ; CHECK-NEXT: vmrhf %v2, %v30, %v30 629 ; CHECK-NEXT: vldeb %v2, %v2 630 ; CHECK-NEXT: vldeb %v3, %v3 631 ; CHECK-NEXT: vfchdb %v2, %v3, %v2 632 ; CHECK-NEXT: vpkg %v1, %v2, %v1 633 ; CHECK-NEXT: vx %v0, %v0, %v1 634 ; CHECK-NEXT: vmrlg %v1, %v0, %v0 635 ; CHECK-NEXT: vuphf %v1, %v1 636 ; CHECK-NEXT: vuphf %v0, %v0 637 ; CHECK-NEXT: vsel %v24, %v25, %v29, %v0 638 ; CHECK-NEXT: vsel %v26, %v27, %v31, %v1 639 ; CHECK-NEXT: br %r14 640 ; 641 ; CHECK-Z14-LABEL: fun29: 642 ; CHECK-Z14: # %bb.0: 643 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26 644 ; CHECK-Z14-NEXT: vfchsb %v1, %v28, %v30 645 ; CHECK-Z14-NEXT: vx %v0, %v0, %v1 646 ; CHECK-Z14-NEXT: vmrlg %v1, %v0, %v0 647 ; CHECK-Z14-NEXT: vuphf %v1, %v1 648 ; CHECK-Z14-NEXT: vuphf %v0, %v0 649 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v29, %v0 650 ; CHECK-Z14-NEXT: vsel %v26, %v27, %v31, %v1 651 ; CHECK-Z14-NEXT: br %r14 652 %cmp0 = fcmp ogt <4 x float> %val1, %val2 653 %cmp1 = fcmp ogt <4 x float> %val3, %val4 654 %and = xor <4 x i1> %cmp0, %cmp1 655 %sel = select <4 x i1> %and, <4 x double> %val5, <4 x double> %val6 656 ret <4 x double> %sel 657 } 658 659 define <8 x float> @fun30(<8 x float> %val1, <8 x float> %val2, <8 x double> %val3, <8 x double> %val4, <8 x float> %val5, <8 x float> %val6) { 660 ; CHECK-LABEL: fun30: 661 ; CHECK: # %bb.0: 662 ; CHECK-NEXT: vmrlf %v16, %v28, %v28 663 ; CHECK-NEXT: vmrlf %v17, %v24, %v24 664 ; CHECK-NEXT: vldeb %v16, %v16 665 ; CHECK-NEXT: vldeb %v17, %v17 666 ; CHECK-NEXT: vfchdb %v16, %v17, %v16 667 ; CHECK-NEXT: vmrhf %v17, %v28, %v28 668 ; CHECK-NEXT: vmrhf %v18, %v24, %v24 669 ; CHECK-NEXT: vldeb %v17, %v17 670 ; CHECK-NEXT: vl %v4, 192(%r15) 671 ; CHECK-NEXT: vldeb %v18, %v18 672 ; CHECK-NEXT: vl %v5, 208(%r15) 673 ; CHECK-NEXT: vl %v6, 160(%r15) 674 ; CHECK-NEXT: vl %v7, 176(%r15) 675 ; CHECK-NEXT: vl %v0, 272(%r15) 676 ; CHECK-NEXT: vl %v1, 240(%r15) 677 ; CHECK-NEXT: vfchdb %v17, %v18, %v17 678 ; CHECK-NEXT: vl %v2, 256(%r15) 679 ; CHECK-NEXT: vl %v3, 224(%r15) 680 ; CHECK-NEXT: vpkg %v16, %v17, %v16 681 ; CHECK-NEXT: vmrlf %v17, %v30, %v30 682 ; CHECK-NEXT: vmrlf %v18, %v26, %v26 683 ; CHECK-NEXT: vmrhf %v19, %v26, %v26 684 ; CHECK-NEXT: vfchdb %v7, %v27, %v7 685 ; CHECK-NEXT: vfchdb %v6, %v25, %v6 686 ; CHECK-NEXT: vfchdb %v5, %v31, %v5 687 ; CHECK-NEXT: vfchdb %v4, %v29, %v4 688 ; CHECK-NEXT: vpkg %v6, %v6, %v7 689 ; CHECK-NEXT: vpkg %v4, %v4, %v5 690 ; CHECK-NEXT: vn %v5, %v16, %v6 691 ; CHECK-DAG: vsel %v24, %v3, %v2, %v5 692 ; CHECK-DAG: vldeb %v17, %v17 693 ; CHECK-NEXT: vldeb %v18, %v18 694 ; CHECK-NEXT: vfchdb %v17, %v18, %v17 695 ; CHECK-NEXT: vmrhf %v18, %v30, %v30 696 ; CHECK-NEXT: vldeb %v18, %v18 697 ; CHECK-NEXT: vldeb %v19, %v19 698 ; CHECK-NEXT: vfchdb %v18, %v19, %v18 699 ; CHECK-NEXT: vpkg %v17, %v18, %v17 700 ; CHECK-NEXT: vn %v4, %v17, %v4 701 ; CHECK-NEXT: vsel %v26, %v1, %v0, %v4 702 ; CHECK-NEXT: br %r14 703 ; 704 ; CHECK-Z14-LABEL: fun30: 705 ; CHECK-Z14: # %bb.0: 706 ; CHECK-Z14-NEXT: vl %v4, 192(%r15) 707 ; CHECK-Z14-NEXT: vl %v5, 208(%r15) 708 ; CHECK-Z14-NEXT: vl %v6, 160(%r15) 709 ; CHECK-Z14-NEXT: vl %v7, 176(%r15) 710 ; CHECK-Z14-NEXT: vfchdb %v7, %v27, %v7 711 ; CHECK-Z14-NEXT: vfchdb %v6, %v25, %v6 712 ; CHECK-Z14-NEXT: vfchdb %v5, %v31, %v5 713 ; CHECK-Z14-NEXT: vfchdb %v4, %v29, %v4 714 ; CHECK-Z14-DAG: vfchsb %v16, %v24, %v28 715 ; CHECK-Z14-DAG: vfchsb %v17, %v26, %v30 716 ; CHECK-Z14-DAG: vpkg %v6, %v6, %v7 717 ; CHECK-Z14-DAG: vpkg %v4, %v4, %v5 718 ; CHECK-Z14-DAG: vl %v0, 272(%r15) 719 ; CHECK-Z14-DAG: vl %v1, 240(%r15) 720 ; CHECK-Z14-DAG: vl %v2, 256(%r15) 721 ; CHECK-Z14-DAG: vl %v3, 224(%r15) 722 ; CHECK-Z14-NEXT: vn %v4, %v17, %v4 723 ; CHECK-Z14-NEXT: vn %v5, %v16, %v6 724 ; CHECK-Z14-NEXT: vsel %v24, %v3, %v2, %v5 725 ; CHECK-Z14-NEXT: vsel %v26, %v1, %v0, %v4 726 ; CHECK-Z14-NEXT: br %r14 727 %cmp0 = fcmp ogt <8 x float> %val1, %val2 728 %cmp1 = fcmp ogt <8 x double> %val3, %val4 729 %and = and <8 x i1> %cmp0, %cmp1 730 %sel = select <8 x i1> %and, <8 x float> %val5, <8 x float> %val6 731 ret <8 x float> %sel 732 } 733 734 define <2 x float> @fun31(<2 x double> %val1, <2 x double> %val2, <2 x double> %val3, <2 x double> %val4, <2 x float> %val5, <2 x float> %val6) { 735 ; CHECK-LABEL: fun31: 736 ; CHECK: # %bb.0: 737 ; CHECK-DAG: vfchdb [[REG0:%v[0-9]+]], %v24, %v26 738 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v30 739 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]] 740 ; CHECK-NEXT: vpkg %v0, %v0, %v0 741 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 742 ; CHECK-NEXT: br %r14 743 %cmp0 = fcmp ogt <2 x double> %val1, %val2 744 %cmp1 = fcmp ogt <2 x double> %val3, %val4 745 %and = xor <2 x i1> %cmp0, %cmp1 746 %sel = select <2 x i1> %and, <2 x float> %val5, <2 x float> %val6 747 ret <2 x float> %sel 748 } 749 750 define <2 x double> @fun32(<2 x double> %val1, <2 x double> %val2, <2 x double> %val3, <2 x double> %val4, <2 x double> %val5, <2 x double> %val6) { 751 ; CHECK-LABEL: fun32: 752 ; CHECK: # %bb.0: 753 ; CHECK-DAG: vfchdb [[REG0:%v[0-9]+]], %v24, %v26 754 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v30 755 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]] 756 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0 757 ; CHECK-NEXT: br %r14 758 %cmp0 = fcmp ogt <2 x double> %val1, %val2 759 %cmp1 = fcmp ogt <2 x double> %val3, %val4 760 %and = xor <2 x i1> %cmp0, %cmp1 761 %sel = select <2 x i1> %and, <2 x double> %val5, <2 x double> %val6 762 ret <2 x double> %sel 763 } 764 765 define <4 x float> @fun33(<4 x double> %val1, <4 x double> %val2, <4 x float> %val3, <4 x float> %val4, <4 x float> %val5, <4 x float> %val6) { 766 ; CHECK-LABEL: fun33: 767 ; CHECK: # %bb.0: 768 ; CHECK-NEXT: vfchdb %v0, %v26, %v30 769 ; CHECK-NEXT: vfchdb %v1, %v24, %v28 770 ; CHECK-NEXT: vpkg %v0, %v1, %v0 771 ; CHECK-NEXT: vmrlf %v1, %v27, %v27 772 ; CHECK-NEXT: vmrlf %v2, %v25, %v25 773 ; CHECK-NEXT: vldeb %v1, %v1 774 ; CHECK-NEXT: vldeb %v2, %v2 775 ; CHECK-NEXT: vfchdb %v1, %v2, %v1 776 ; CHECK-NEXT: vmrhf %v2, %v27, %v27 777 ; CHECK-NEXT: vmrhf %v3, %v25, %v25 778 ; CHECK-NEXT: vldeb %v2, %v2 779 ; CHECK-NEXT: vldeb %v3, %v3 780 ; CHECK-NEXT: vfchdb %v2, %v3, %v2 781 ; CHECK-NEXT: vpkg %v1, %v2, %v1 782 ; CHECK-NEXT: vn %v0, %v0, %v1 783 ; CHECK-NEXT: vsel %v24, %v29, %v31, %v0 784 ; CHECK-NEXT: br %r14 785 ; 786 ; CHECK-Z14-LABEL: fun33: 787 ; CHECK-Z14: # %bb.0: 788 ; CHECK-Z14-NEXT: vfchdb %v0, %v26, %v30 789 ; CHECK-Z14-NEXT: vfchdb %v1, %v24, %v28 790 ; CHECK-Z14-NEXT: vpkg %v0, %v1, %v0 791 ; CHECK-Z14-NEXT: vfchsb %v1, %v25, %v27 792 ; CHECK-Z14-NEXT: vn %v0, %v0, %v1 793 ; CHECK-Z14-NEXT: vsel %v24, %v29, %v31, %v0 794 ; CHECK-Z14-NEXT: br %r14 795 %cmp0 = fcmp ogt <4 x double> %val1, %val2 796 %cmp1 = fcmp ogt <4 x float> %val3, %val4 797 %and = and <4 x i1> %cmp0, %cmp1 798 %sel = select <4 x i1> %and, <4 x float> %val5, <4 x float> %val6 799 ret <4 x float> %sel 800 } 801 802 define <4 x double> @fun34(<4 x double> %val1, <4 x double> %val2, <4 x float> %val3, <4 x float> %val4, <4 x double> %val5, <4 x double> %val6) { 803 ; CHECK-LABEL: fun34: 804 ; CHECK: # %bb.0: 805 ; CHECK-NEXT: vmrlf [[REG0:%v[0-9]+]], %v27, %v27 806 ; CHECK-NEXT: vmrlf [[REG1:%v[0-9]+]], %v25, %v25 807 ; CHECK-NEXT: vldeb [[REG2:%v[0-9]+]], [[REG0]] 808 ; CHECK-NEXT: vldeb [[REG3:%v[0-9]+]], [[REG1]] 809 ; CHECK-NEXT: vfchdb [[REG4:%v[0-9]+]], [[REG3]], [[REG2]] 810 ; CHECK-NEXT: vmrhf [[REG5:%v[0-9]+]], %v27, %v27 811 ; CHECK-NEXT: vmrhf [[REG6:%v[0-9]+]], %v25, %v25 812 ; CHECK-DAG: vldeb [[REG7:%v[0-9]+]], [[REG5]] 813 ; CHECK-DAG: vl [[REG8:%v[0-9]+]], 176(%r15) 814 ; CHECK-DAG: vldeb [[REG9:%v[0-9]+]], [[REG6]] 815 ; CHECK-DAG: vl [[REG10:%v[0-9]+]], 160(%r15) 816 ; CHECK-DAG: vfchdb [[REG11:%v[0-9]+]], [[REG9]], [[REG7]] 817 ; CHECK-DAG: vpkg [[REG12:%v[0-9]+]], [[REG11]], [[REG4]] 818 ; CHECK-DAG: vuphf [[REG13:%v[0-9]+]], [[REG12]] 819 ; CHECK-DAG: vmrlg [[REG14:%v[0-9]+]], [[REG12]], [[REG12]] 820 ; CHECK-NEXT: vfchdb [[REG15:%v[0-9]+]], %v24, %v28 821 ; CHECK-NEXT: vfchdb [[REG16:%v[0-9]+]], %v26, %v30 822 ; CHECK-NEXT: vuphf [[REG17:%v[0-9]+]], [[REG14]] 823 ; CHECK-NEXT: vn [[REG18:%v[0-9]+]], [[REG16]], [[REG17]] 824 ; CHECK-NEXT: vn [[REG19:%v[0-9]+]], [[REG15]], [[REG13]] 825 ; CHECK-NEXT: vsel %v24, %v29, [[REG10]], [[REG19]] 826 ; CHECK-NEXT: vsel %v26, %v31, [[REG8]], [[REG18]] 827 ; CHECK-NEXT: br %r14 828 ; 829 ; CHECK-Z14-LABEL: fun34: 830 ; CHECK-Z14: # %bb.0: 831 ; CHECK-Z14-NEXT: vfchsb %v4, %v25, %v27 832 ; CHECK-Z14-NEXT: vuphf %v5, %v4 833 ; CHECK-Z14-NEXT: vmrlg %v4, %v4, %v4 834 ; CHECK-Z14-DAG: vfchdb %v2, %v24, %v28 835 ; CHECK-Z14-DAG: vfchdb %v3, %v26, %v30 836 ; CHECK-Z14-DAG: vuphf %v4, %v4 837 ; CHECK-Z14-DAG: vl %v0, 176(%r15) 838 ; CHECK-Z14-DAG: vl %v1, 160(%r15) 839 ; CHECK-Z14-NEXT: vn %v3, %v3, %v4 840 ; CHECK-Z14-NEXT: vn %v2, %v2, %v5 841 ; CHECK-Z14-NEXT: vsel %v24, %v29, %v1, %v2 842 ; CHECK-Z14-NEXT: vsel %v26, %v31, %v0, %v3 843 ; CHECK-Z14-NEXT: br %r14 844 %cmp0 = fcmp ogt <4 x double> %val1, %val2 845 %cmp1 = fcmp ogt <4 x float> %val3, %val4 846 %and = and <4 x i1> %cmp0, %cmp1 847 %sel = select <4 x i1> %and, <4 x double> %val5, <4 x double> %val6 848 ret <4 x double> %sel 849 } 850