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 8define <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 23define <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 39define <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 56define <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 79define <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 102define <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 118define <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 134define <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 151define <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 167define <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 182define <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 201define <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 230define <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 261define <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 278define <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 294define <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 310define <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 326define <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 342define <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 362define <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 383define <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 406define <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 422define <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 437define <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 454define <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 477define <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 512define <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 548define <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 565define <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 608define <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 659define <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 734define <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 750define <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 765define <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 802define <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