1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=sse2 -machine-combiner-verify-pattern-order=true < %s | FileCheck %s --check-prefix=SSE 3; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=avx2 -machine-combiner-verify-pattern-order=true < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 4; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=avx512vl,avx512bw -machine-combiner-verify-pattern-order=true < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 5 6; Verify that 128-bit vector logical ops are reassociated. 7 8define <4 x i32> @reassociate_and_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 9; SSE-LABEL: reassociate_and_v4i32: 10; SSE: # %bb.0: 11; SSE-NEXT: paddd %xmm1, %xmm0 12; SSE-NEXT: pand %xmm3, %xmm2 13; SSE-NEXT: pand %xmm2, %xmm0 14; SSE-NEXT: retq 15; 16; AVX2-LABEL: reassociate_and_v4i32: 17; AVX2: # %bb.0: 18; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 19; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm1 20; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 21; AVX2-NEXT: retq 22; 23; AVX512-LABEL: reassociate_and_v4i32: 24; AVX512: # %bb.0: 25; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0 26; AVX512-NEXT: vpternlogd $128, %xmm2, %xmm3, %xmm0 27; AVX512-NEXT: retq 28 29 %t0 = add <4 x i32> %x0, %x1 30 %t1 = and <4 x i32> %x2, %t0 31 %t2 = and <4 x i32> %x3, %t1 32 ret <4 x i32> %t2 33} 34 35define <4 x i32> @reassociate_or_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 36; SSE-LABEL: reassociate_or_v4i32: 37; SSE: # %bb.0: 38; SSE-NEXT: paddd %xmm1, %xmm0 39; SSE-NEXT: por %xmm3, %xmm2 40; SSE-NEXT: por %xmm2, %xmm0 41; SSE-NEXT: retq 42; 43; AVX2-LABEL: reassociate_or_v4i32: 44; AVX2: # %bb.0: 45; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 46; AVX2-NEXT: vpor %xmm3, %xmm2, %xmm1 47; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 48; AVX2-NEXT: retq 49; 50; AVX512-LABEL: reassociate_or_v4i32: 51; AVX512: # %bb.0: 52; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0 53; AVX512-NEXT: vpternlogd $254, %xmm2, %xmm3, %xmm0 54; AVX512-NEXT: retq 55 56 %t0 = add <4 x i32> %x0, %x1 57 %t1 = or <4 x i32> %x2, %t0 58 %t2 = or <4 x i32> %x3, %t1 59 ret <4 x i32> %t2 60} 61 62define <4 x i32> @reassociate_xor_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 63; SSE-LABEL: reassociate_xor_v4i32: 64; SSE: # %bb.0: 65; SSE-NEXT: paddd %xmm1, %xmm0 66; SSE-NEXT: pxor %xmm3, %xmm2 67; SSE-NEXT: pxor %xmm2, %xmm0 68; SSE-NEXT: retq 69; 70; AVX2-LABEL: reassociate_xor_v4i32: 71; AVX2: # %bb.0: 72; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 73; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm1 74; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 75; AVX2-NEXT: retq 76; 77; AVX512-LABEL: reassociate_xor_v4i32: 78; AVX512: # %bb.0: 79; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0 80; AVX512-NEXT: vpternlogd $150, %xmm2, %xmm3, %xmm0 81; AVX512-NEXT: retq 82 83 %t0 = add <4 x i32> %x0, %x1 84 %t1 = xor <4 x i32> %x2, %t0 85 %t2 = xor <4 x i32> %x3, %t1 86 ret <4 x i32> %t2 87} 88 89; Verify that 256-bit vector logical ops are reassociated. 90 91define <8 x i32> @reassociate_and_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 92; SSE-LABEL: reassociate_and_v8i32: 93; SSE: # %bb.0: 94; SSE-NEXT: paddd %xmm2, %xmm0 95; SSE-NEXT: pand %xmm6, %xmm4 96; SSE-NEXT: pand %xmm4, %xmm0 97; SSE-NEXT: paddd %xmm3, %xmm1 98; SSE-NEXT: pand %xmm7, %xmm5 99; SSE-NEXT: pand %xmm5, %xmm1 100; SSE-NEXT: retq 101; 102; AVX2-LABEL: reassociate_and_v8i32: 103; AVX2: # %bb.0: 104; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 105; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm1 106; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 107; AVX2-NEXT: retq 108; 109; AVX512-LABEL: reassociate_and_v8i32: 110; AVX512: # %bb.0: 111; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0 112; AVX512-NEXT: vpternlogd $128, %ymm2, %ymm3, %ymm0 113; AVX512-NEXT: retq 114 115 %t0 = add <8 x i32> %x0, %x1 116 %t1 = and <8 x i32> %x2, %t0 117 %t2 = and <8 x i32> %x3, %t1 118 ret <8 x i32> %t2 119} 120 121define <8 x i32> @reassociate_or_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 122; SSE-LABEL: reassociate_or_v8i32: 123; SSE: # %bb.0: 124; SSE-NEXT: paddd %xmm2, %xmm0 125; SSE-NEXT: por %xmm6, %xmm4 126; SSE-NEXT: por %xmm4, %xmm0 127; SSE-NEXT: paddd %xmm3, %xmm1 128; SSE-NEXT: por %xmm7, %xmm5 129; SSE-NEXT: por %xmm5, %xmm1 130; SSE-NEXT: retq 131; 132; AVX2-LABEL: reassociate_or_v8i32: 133; AVX2: # %bb.0: 134; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 135; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm1 136; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 137; AVX2-NEXT: retq 138; 139; AVX512-LABEL: reassociate_or_v8i32: 140; AVX512: # %bb.0: 141; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0 142; AVX512-NEXT: vpternlogd $254, %ymm2, %ymm3, %ymm0 143; AVX512-NEXT: retq 144 145 %t0 = add <8 x i32> %x0, %x1 146 %t1 = or <8 x i32> %x2, %t0 147 %t2 = or <8 x i32> %x3, %t1 148 ret <8 x i32> %t2 149} 150 151define <8 x i32> @reassociate_xor_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 152; SSE-LABEL: reassociate_xor_v8i32: 153; SSE: # %bb.0: 154; SSE-NEXT: paddd %xmm2, %xmm0 155; SSE-NEXT: pxor %xmm6, %xmm4 156; SSE-NEXT: pxor %xmm4, %xmm0 157; SSE-NEXT: paddd %xmm3, %xmm1 158; SSE-NEXT: pxor %xmm7, %xmm5 159; SSE-NEXT: pxor %xmm5, %xmm1 160; SSE-NEXT: retq 161; 162; AVX2-LABEL: reassociate_xor_v8i32: 163; AVX2: # %bb.0: 164; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 165; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm1 166; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 167; AVX2-NEXT: retq 168; 169; AVX512-LABEL: reassociate_xor_v8i32: 170; AVX512: # %bb.0: 171; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0 172; AVX512-NEXT: vpternlogd $150, %ymm2, %ymm3, %ymm0 173; AVX512-NEXT: retq 174 175 %t0 = add <8 x i32> %x0, %x1 176 %t1 = xor <8 x i32> %x2, %t0 177 %t2 = xor <8 x i32> %x3, %t1 178 ret <8 x i32> %t2 179} 180 181 182; Verify that 512-bit vector logical ops are reassociated. 183 184define <16 x i32> @reassociate_and_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) { 185; SSE-LABEL: reassociate_and_v16i32: 186; SSE: # %bb.0: 187; SSE-NEXT: paddd %xmm4, %xmm0 188; SSE-NEXT: paddd %xmm5, %xmm1 189; SSE-NEXT: paddd %xmm6, %xmm2 190; SSE-NEXT: paddd %xmm7, %xmm3 191; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm3 192; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm2 193; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm1 194; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm0 195; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm0 196; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm1 197; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm2 198; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm3 199; SSE-NEXT: retq 200; 201; AVX2-LABEL: reassociate_and_v16i32: 202; AVX2: # %bb.0: 203; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 204; AVX2-NEXT: vpand %ymm6, %ymm4, %ymm2 205; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 206; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 207; AVX2-NEXT: vpand %ymm7, %ymm5, %ymm2 208; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 209; AVX2-NEXT: retq 210; 211; AVX512-LABEL: reassociate_and_v16i32: 212; AVX512: # %bb.0: 213; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 214; AVX512-NEXT: vpternlogd $128, %zmm2, %zmm3, %zmm0 215; AVX512-NEXT: retq 216 217 %t0 = add <16 x i32> %x0, %x1 218 %t1 = and <16 x i32> %x2, %t0 219 %t2 = and <16 x i32> %x3, %t1 220 ret <16 x i32> %t2 221} 222 223define <16 x i32> @reassociate_or_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) { 224; SSE-LABEL: reassociate_or_v16i32: 225; SSE: # %bb.0: 226; SSE-NEXT: paddd %xmm4, %xmm0 227; SSE-NEXT: paddd %xmm5, %xmm1 228; SSE-NEXT: paddd %xmm6, %xmm2 229; SSE-NEXT: paddd %xmm7, %xmm3 230; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm3 231; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm2 232; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm1 233; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm0 234; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm0 235; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm1 236; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm2 237; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm3 238; SSE-NEXT: retq 239; 240; AVX2-LABEL: reassociate_or_v16i32: 241; AVX2: # %bb.0: 242; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 243; AVX2-NEXT: vpor %ymm6, %ymm4, %ymm2 244; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 245; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 246; AVX2-NEXT: vpor %ymm7, %ymm5, %ymm2 247; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 248; AVX2-NEXT: retq 249; 250; AVX512-LABEL: reassociate_or_v16i32: 251; AVX512: # %bb.0: 252; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 253; AVX512-NEXT: vpternlogd $254, %zmm2, %zmm3, %zmm0 254; AVX512-NEXT: retq 255 256 %t0 = add <16 x i32> %x0, %x1 257 %t1 = or <16 x i32> %x2, %t0 258 %t2 = or <16 x i32> %x3, %t1 259 ret <16 x i32> %t2 260} 261 262define <16 x i32> @reassociate_xor_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) { 263; SSE-LABEL: reassociate_xor_v16i32: 264; SSE: # %bb.0: 265; SSE-NEXT: paddd %xmm4, %xmm0 266; SSE-NEXT: paddd %xmm5, %xmm1 267; SSE-NEXT: paddd %xmm6, %xmm2 268; SSE-NEXT: paddd %xmm7, %xmm3 269; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm3 270; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm2 271; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm1 272; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm0 273; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm0 274; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm1 275; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm2 276; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm3 277; SSE-NEXT: retq 278; 279; AVX2-LABEL: reassociate_xor_v16i32: 280; AVX2: # %bb.0: 281; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 282; AVX2-NEXT: vpxor %ymm6, %ymm4, %ymm2 283; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 284; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 285; AVX2-NEXT: vpxor %ymm7, %ymm5, %ymm2 286; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 287; AVX2-NEXT: retq 288; 289; AVX512-LABEL: reassociate_xor_v16i32: 290; AVX512: # %bb.0: 291; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 292; AVX512-NEXT: vpternlogd $150, %zmm2, %zmm3, %zmm0 293; AVX512-NEXT: retq 294 295 %t0 = add <16 x i32> %x0, %x1 296 %t1 = xor <16 x i32> %x2, %t0 297 %t2 = xor <16 x i32> %x3, %t1 298 ret <16 x i32> %t2 299} 300 301; Verify that 128-bit vector min/max are reassociated. 302 303define <16 x i8> @reassociate_umax_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) { 304; SSE-LABEL: reassociate_umax_v16i8: 305; SSE: # %bb.0: 306; SSE-NEXT: paddb %xmm1, %xmm0 307; SSE-NEXT: pmaxub %xmm3, %xmm2 308; SSE-NEXT: pmaxub %xmm2, %xmm0 309; SSE-NEXT: retq 310; 311; AVX-LABEL: reassociate_umax_v16i8: 312; AVX: # %bb.0: 313; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0 314; AVX-NEXT: vpmaxub %xmm3, %xmm2, %xmm1 315; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm0 316; AVX-NEXT: retq 317 318 %t0 = add <16 x i8> %x0, %x1 319 %t1 = icmp ugt <16 x i8> %x2, %t0 320 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0 321 %t3 = icmp ugt <16 x i8> %x3, %t2 322 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2 323 ret <16 x i8> %t4 324} 325 326define <8 x i16> @reassociate_umax_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) { 327; SSE-LABEL: reassociate_umax_v8i16: 328; SSE: # %bb.0: 329; SSE-NEXT: paddw %xmm1, %xmm0 330; SSE-NEXT: psubusw %xmm2, %xmm0 331; SSE-NEXT: paddw %xmm2, %xmm0 332; SSE-NEXT: psubusw %xmm3, %xmm0 333; SSE-NEXT: paddw %xmm3, %xmm0 334; SSE-NEXT: retq 335; 336; AVX-LABEL: reassociate_umax_v8i16: 337; AVX: # %bb.0: 338; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 339; AVX-NEXT: vpmaxuw %xmm3, %xmm2, %xmm1 340; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0 341; AVX-NEXT: retq 342 343 %t0 = add <8 x i16> %x0, %x1 344 %t1 = icmp ugt <8 x i16> %x2, %t0 345 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0 346 %t3 = icmp ugt <8 x i16> %x3, %t2 347 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2 348 ret <8 x i16> %t4 349} 350 351define <4 x i32> @reassociate_umax_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 352; SSE-LABEL: reassociate_umax_v4i32: 353; SSE: # %bb.0: 354; SSE-NEXT: paddd %xmm1, %xmm0 355; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648] 356; SSE-NEXT: movdqa %xmm2, %xmm4 357; SSE-NEXT: pxor %xmm1, %xmm4 358; SSE-NEXT: movdqa %xmm0, %xmm5 359; SSE-NEXT: pxor %xmm1, %xmm5 360; SSE-NEXT: pcmpgtd %xmm5, %xmm4 361; SSE-NEXT: pand %xmm4, %xmm2 362; SSE-NEXT: pandn %xmm0, %xmm4 363; SSE-NEXT: por %xmm2, %xmm4 364; SSE-NEXT: movdqa %xmm4, %xmm0 365; SSE-NEXT: pxor %xmm1, %xmm0 366; SSE-NEXT: pxor %xmm3, %xmm1 367; SSE-NEXT: pcmpgtd %xmm0, %xmm1 368; SSE-NEXT: pand %xmm1, %xmm3 369; SSE-NEXT: pandn %xmm4, %xmm1 370; SSE-NEXT: por %xmm3, %xmm1 371; SSE-NEXT: movdqa %xmm1, %xmm0 372; SSE-NEXT: retq 373; 374; AVX-LABEL: reassociate_umax_v4i32: 375; AVX: # %bb.0: 376; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 377; AVX-NEXT: vpmaxud %xmm3, %xmm2, %xmm1 378; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm0 379; AVX-NEXT: retq 380 381 %t0 = add <4 x i32> %x0, %x1 382 %t1 = icmp ugt <4 x i32> %x2, %t0 383 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0 384 %t3 = icmp ugt <4 x i32> %x3, %t2 385 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2 386 ret <4 x i32> %t4 387} 388 389define <2 x i64> @reassociate_umax_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) { 390; SSE-LABEL: reassociate_umax_v2i64: 391; SSE: # %bb.0: 392; SSE-NEXT: paddq %xmm1, %xmm0 393; SSE-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456] 394; SSE-NEXT: movdqa %xmm2, %xmm4 395; SSE-NEXT: pxor %xmm1, %xmm4 396; SSE-NEXT: movdqa %xmm0, %xmm5 397; SSE-NEXT: pxor %xmm1, %xmm5 398; SSE-NEXT: movdqa %xmm4, %xmm6 399; SSE-NEXT: pcmpgtd %xmm5, %xmm6 400; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 401; SSE-NEXT: pcmpeqd %xmm4, %xmm5 402; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 403; SSE-NEXT: pand %xmm7, %xmm4 404; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 405; SSE-NEXT: por %xmm4, %xmm5 406; SSE-NEXT: pand %xmm5, %xmm2 407; SSE-NEXT: pandn %xmm0, %xmm5 408; SSE-NEXT: por %xmm2, %xmm5 409; SSE-NEXT: movdqa %xmm5, %xmm0 410; SSE-NEXT: pxor %xmm1, %xmm0 411; SSE-NEXT: pxor %xmm3, %xmm1 412; SSE-NEXT: movdqa %xmm1, %xmm2 413; SSE-NEXT: pcmpgtd %xmm0, %xmm2 414; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 415; SSE-NEXT: pcmpeqd %xmm0, %xmm1 416; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 417; SSE-NEXT: pand %xmm4, %xmm1 418; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 419; SSE-NEXT: por %xmm1, %xmm0 420; SSE-NEXT: pand %xmm0, %xmm3 421; SSE-NEXT: pandn %xmm5, %xmm0 422; SSE-NEXT: por %xmm3, %xmm0 423; SSE-NEXT: retq 424; 425; AVX2-LABEL: reassociate_umax_v2i64: 426; AVX2: # %bb.0: 427; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 428; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808] 429; AVX2-NEXT: vpxor %xmm1, %xmm2, %xmm4 430; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm5 431; AVX2-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm4 432; AVX2-NEXT: vblendvpd %xmm4, %xmm2, %xmm0, %xmm0 433; AVX2-NEXT: vxorpd %xmm1, %xmm0, %xmm2 434; AVX2-NEXT: vpxor %xmm1, %xmm3, %xmm1 435; AVX2-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm1 436; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0 437; AVX2-NEXT: retq 438; 439; AVX512-LABEL: reassociate_umax_v2i64: 440; AVX512: # %bb.0: 441; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 442; AVX512-NEXT: vpmaxuq %xmm3, %xmm2, %xmm1 443; AVX512-NEXT: vpmaxuq %xmm1, %xmm0, %xmm0 444; AVX512-NEXT: retq 445 446 %t0 = add <2 x i64> %x0, %x1 447 %t1 = icmp ugt <2 x i64> %x2, %t0 448 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0 449 %t3 = icmp ugt <2 x i64> %x3, %t2 450 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2 451 ret <2 x i64> %t4 452} 453 454define <16 x i8> @reassociate_smax_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) { 455; SSE-LABEL: reassociate_smax_v16i8: 456; SSE: # %bb.0: 457; SSE-NEXT: paddb %xmm1, %xmm0 458; SSE-NEXT: movdqa %xmm2, %xmm1 459; SSE-NEXT: pcmpgtb %xmm0, %xmm1 460; SSE-NEXT: pand %xmm1, %xmm2 461; SSE-NEXT: pandn %xmm0, %xmm1 462; SSE-NEXT: por %xmm2, %xmm1 463; SSE-NEXT: movdqa %xmm3, %xmm0 464; SSE-NEXT: pcmpgtb %xmm1, %xmm0 465; SSE-NEXT: pand %xmm0, %xmm3 466; SSE-NEXT: pandn %xmm1, %xmm0 467; SSE-NEXT: por %xmm3, %xmm0 468; SSE-NEXT: retq 469; 470; AVX-LABEL: reassociate_smax_v16i8: 471; AVX: # %bb.0: 472; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0 473; AVX-NEXT: vpmaxsb %xmm3, %xmm2, %xmm1 474; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 475; AVX-NEXT: retq 476 477 %t0 = add <16 x i8> %x0, %x1 478 %t1 = icmp sgt <16 x i8> %x2, %t0 479 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0 480 %t3 = icmp sgt <16 x i8> %x3, %t2 481 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2 482 ret <16 x i8> %t4 483} 484 485define <8 x i16> @reassociate_smax_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) { 486; SSE-LABEL: reassociate_smax_v8i16: 487; SSE: # %bb.0: 488; SSE-NEXT: paddw %xmm1, %xmm0 489; SSE-NEXT: pmaxsw %xmm3, %xmm2 490; SSE-NEXT: pmaxsw %xmm2, %xmm0 491; SSE-NEXT: retq 492; 493; AVX-LABEL: reassociate_smax_v8i16: 494; AVX: # %bb.0: 495; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 496; AVX-NEXT: vpmaxsw %xmm3, %xmm2, %xmm1 497; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 498; AVX-NEXT: retq 499 500 %t0 = add <8 x i16> %x0, %x1 501 %t1 = icmp sgt <8 x i16> %x2, %t0 502 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0 503 %t3 = icmp sgt <8 x i16> %x3, %t2 504 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2 505 ret <8 x i16> %t4 506} 507 508define <4 x i32> @reassociate_smax_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 509; SSE-LABEL: reassociate_smax_v4i32: 510; SSE: # %bb.0: 511; SSE-NEXT: paddd %xmm1, %xmm0 512; SSE-NEXT: movdqa %xmm2, %xmm1 513; SSE-NEXT: pcmpgtd %xmm0, %xmm1 514; SSE-NEXT: pand %xmm1, %xmm2 515; SSE-NEXT: pandn %xmm0, %xmm1 516; SSE-NEXT: por %xmm2, %xmm1 517; SSE-NEXT: movdqa %xmm3, %xmm0 518; SSE-NEXT: pcmpgtd %xmm1, %xmm0 519; SSE-NEXT: pand %xmm0, %xmm3 520; SSE-NEXT: pandn %xmm1, %xmm0 521; SSE-NEXT: por %xmm3, %xmm0 522; SSE-NEXT: retq 523; 524; AVX-LABEL: reassociate_smax_v4i32: 525; AVX: # %bb.0: 526; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 527; AVX-NEXT: vpmaxsd %xmm3, %xmm2, %xmm1 528; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 529; AVX-NEXT: retq 530 531 %t0 = add <4 x i32> %x0, %x1 532 %t1 = icmp sgt <4 x i32> %x2, %t0 533 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0 534 %t3 = icmp sgt <4 x i32> %x3, %t2 535 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2 536 ret <4 x i32> %t4 537} 538 539define <2 x i64> @reassociate_smax_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) { 540; SSE-LABEL: reassociate_smax_v2i64: 541; SSE: # %bb.0: 542; SSE-NEXT: paddq %xmm1, %xmm0 543; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 544; SSE-NEXT: movdqa %xmm2, %xmm4 545; SSE-NEXT: pxor %xmm1, %xmm4 546; SSE-NEXT: movdqa %xmm0, %xmm5 547; SSE-NEXT: pxor %xmm1, %xmm5 548; SSE-NEXT: movdqa %xmm4, %xmm6 549; SSE-NEXT: pcmpgtd %xmm5, %xmm6 550; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 551; SSE-NEXT: pcmpeqd %xmm4, %xmm5 552; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 553; SSE-NEXT: pand %xmm7, %xmm4 554; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 555; SSE-NEXT: por %xmm4, %xmm5 556; SSE-NEXT: pand %xmm5, %xmm2 557; SSE-NEXT: pandn %xmm0, %xmm5 558; SSE-NEXT: por %xmm2, %xmm5 559; SSE-NEXT: movdqa %xmm5, %xmm0 560; SSE-NEXT: pxor %xmm1, %xmm0 561; SSE-NEXT: pxor %xmm3, %xmm1 562; SSE-NEXT: movdqa %xmm1, %xmm2 563; SSE-NEXT: pcmpgtd %xmm0, %xmm2 564; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 565; SSE-NEXT: pcmpeqd %xmm0, %xmm1 566; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 567; SSE-NEXT: pand %xmm4, %xmm1 568; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 569; SSE-NEXT: por %xmm1, %xmm0 570; SSE-NEXT: pand %xmm0, %xmm3 571; SSE-NEXT: pandn %xmm5, %xmm0 572; SSE-NEXT: por %xmm3, %xmm0 573; SSE-NEXT: retq 574; 575; AVX2-LABEL: reassociate_smax_v2i64: 576; AVX2: # %bb.0: 577; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 578; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1 579; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0 580; AVX2-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm1 581; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0 582; AVX2-NEXT: retq 583; 584; AVX512-LABEL: reassociate_smax_v2i64: 585; AVX512: # %bb.0: 586; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 587; AVX512-NEXT: vpmaxsq %xmm3, %xmm2, %xmm1 588; AVX512-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 589; AVX512-NEXT: retq 590 591 %t0 = add <2 x i64> %x0, %x1 592 %t1 = icmp sgt <2 x i64> %x2, %t0 593 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0 594 %t3 = icmp sgt <2 x i64> %x3, %t2 595 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2 596 ret <2 x i64> %t4 597} 598 599define <16 x i8> @reassociate_umin_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) { 600; SSE-LABEL: reassociate_umin_v16i8: 601; SSE: # %bb.0: 602; SSE-NEXT: paddb %xmm1, %xmm0 603; SSE-NEXT: pminub %xmm3, %xmm2 604; SSE-NEXT: pminub %xmm2, %xmm0 605; SSE-NEXT: retq 606; 607; AVX-LABEL: reassociate_umin_v16i8: 608; AVX: # %bb.0: 609; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0 610; AVX-NEXT: vpminub %xmm3, %xmm2, %xmm1 611; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0 612; AVX-NEXT: retq 613 614 %t0 = add <16 x i8> %x0, %x1 615 %t1 = icmp ult <16 x i8> %x2, %t0 616 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0 617 %t3 = icmp ult <16 x i8> %x3, %t2 618 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2 619 ret <16 x i8> %t4 620} 621 622define <8 x i16> @reassociate_umin_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) { 623; SSE-LABEL: reassociate_umin_v8i16: 624; SSE: # %bb.0: 625; SSE-NEXT: paddw %xmm1, %xmm0 626; SSE-NEXT: movdqa %xmm2, %xmm1 627; SSE-NEXT: psubusw %xmm0, %xmm1 628; SSE-NEXT: psubw %xmm1, %xmm2 629; SSE-NEXT: movdqa %xmm3, %xmm0 630; SSE-NEXT: psubusw %xmm2, %xmm0 631; SSE-NEXT: psubw %xmm0, %xmm3 632; SSE-NEXT: movdqa %xmm3, %xmm0 633; SSE-NEXT: retq 634; 635; AVX-LABEL: reassociate_umin_v8i16: 636; AVX: # %bb.0: 637; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 638; AVX-NEXT: vpminuw %xmm3, %xmm2, %xmm1 639; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm0 640; AVX-NEXT: retq 641 642 %t0 = add <8 x i16> %x0, %x1 643 %t1 = icmp ult <8 x i16> %x2, %t0 644 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0 645 %t3 = icmp ult <8 x i16> %x3, %t2 646 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2 647 ret <8 x i16> %t4 648} 649 650define <4 x i32> @reassociate_umin_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 651; SSE-LABEL: reassociate_umin_v4i32: 652; SSE: # %bb.0: 653; SSE-NEXT: paddd %xmm1, %xmm0 654; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648] 655; SSE-NEXT: movdqa %xmm2, %xmm4 656; SSE-NEXT: pxor %xmm1, %xmm4 657; SSE-NEXT: movdqa %xmm0, %xmm5 658; SSE-NEXT: pxor %xmm1, %xmm5 659; SSE-NEXT: pcmpgtd %xmm4, %xmm5 660; SSE-NEXT: pand %xmm5, %xmm2 661; SSE-NEXT: pandn %xmm0, %xmm5 662; SSE-NEXT: por %xmm2, %xmm5 663; SSE-NEXT: movdqa %xmm5, %xmm0 664; SSE-NEXT: pxor %xmm1, %xmm0 665; SSE-NEXT: pxor %xmm3, %xmm1 666; SSE-NEXT: pcmpgtd %xmm1, %xmm0 667; SSE-NEXT: pand %xmm0, %xmm3 668; SSE-NEXT: pandn %xmm5, %xmm0 669; SSE-NEXT: por %xmm3, %xmm0 670; SSE-NEXT: retq 671; 672; AVX-LABEL: reassociate_umin_v4i32: 673; AVX: # %bb.0: 674; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 675; AVX-NEXT: vpminud %xmm3, %xmm2, %xmm1 676; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0 677; AVX-NEXT: retq 678 679 %t0 = add <4 x i32> %x0, %x1 680 %t1 = icmp ult <4 x i32> %x2, %t0 681 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0 682 %t3 = icmp ult <4 x i32> %x3, %t2 683 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2 684 ret <4 x i32> %t4 685} 686 687define <2 x i64> @reassociate_umin_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) { 688; SSE-LABEL: reassociate_umin_v2i64: 689; SSE: # %bb.0: 690; SSE-NEXT: paddq %xmm1, %xmm0 691; SSE-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456] 692; SSE-NEXT: movdqa %xmm2, %xmm4 693; SSE-NEXT: pxor %xmm1, %xmm4 694; SSE-NEXT: movdqa %xmm0, %xmm5 695; SSE-NEXT: pxor %xmm1, %xmm5 696; SSE-NEXT: movdqa %xmm5, %xmm6 697; SSE-NEXT: pcmpgtd %xmm4, %xmm6 698; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 699; SSE-NEXT: pcmpeqd %xmm4, %xmm5 700; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 701; SSE-NEXT: pand %xmm7, %xmm4 702; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 703; SSE-NEXT: por %xmm4, %xmm5 704; SSE-NEXT: pand %xmm5, %xmm2 705; SSE-NEXT: pandn %xmm0, %xmm5 706; SSE-NEXT: por %xmm2, %xmm5 707; SSE-NEXT: movdqa %xmm5, %xmm0 708; SSE-NEXT: pxor %xmm1, %xmm0 709; SSE-NEXT: pxor %xmm3, %xmm1 710; SSE-NEXT: movdqa %xmm0, %xmm2 711; SSE-NEXT: pcmpgtd %xmm1, %xmm2 712; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 713; SSE-NEXT: pcmpeqd %xmm0, %xmm1 714; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 715; SSE-NEXT: pand %xmm4, %xmm1 716; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 717; SSE-NEXT: por %xmm1, %xmm0 718; SSE-NEXT: pand %xmm0, %xmm3 719; SSE-NEXT: pandn %xmm5, %xmm0 720; SSE-NEXT: por %xmm3, %xmm0 721; SSE-NEXT: retq 722; 723; AVX2-LABEL: reassociate_umin_v2i64: 724; AVX2: # %bb.0: 725; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 726; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808] 727; AVX2-NEXT: vpxor %xmm1, %xmm2, %xmm4 728; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm5 729; AVX2-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 730; AVX2-NEXT: vblendvpd %xmm4, %xmm2, %xmm0, %xmm0 731; AVX2-NEXT: vxorpd %xmm1, %xmm0, %xmm2 732; AVX2-NEXT: vpxor %xmm1, %xmm3, %xmm1 733; AVX2-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1 734; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0 735; AVX2-NEXT: retq 736; 737; AVX512-LABEL: reassociate_umin_v2i64: 738; AVX512: # %bb.0: 739; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 740; AVX512-NEXT: vpminuq %xmm3, %xmm2, %xmm1 741; AVX512-NEXT: vpminuq %xmm1, %xmm0, %xmm0 742; AVX512-NEXT: retq 743 744 %t0 = add <2 x i64> %x0, %x1 745 %t1 = icmp ult <2 x i64> %x2, %t0 746 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0 747 %t3 = icmp ult <2 x i64> %x3, %t2 748 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2 749 ret <2 x i64> %t4 750} 751 752define <16 x i8> @reassociate_smin_v16i8(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, <16 x i8> %x3) { 753; SSE-LABEL: reassociate_smin_v16i8: 754; SSE: # %bb.0: 755; SSE-NEXT: paddb %xmm1, %xmm0 756; SSE-NEXT: movdqa %xmm0, %xmm1 757; SSE-NEXT: pcmpgtb %xmm2, %xmm1 758; SSE-NEXT: pand %xmm1, %xmm2 759; SSE-NEXT: pandn %xmm0, %xmm1 760; SSE-NEXT: por %xmm2, %xmm1 761; SSE-NEXT: movdqa %xmm1, %xmm0 762; SSE-NEXT: pcmpgtb %xmm3, %xmm0 763; SSE-NEXT: pand %xmm0, %xmm3 764; SSE-NEXT: pandn %xmm1, %xmm0 765; SSE-NEXT: por %xmm3, %xmm0 766; SSE-NEXT: retq 767; 768; AVX-LABEL: reassociate_smin_v16i8: 769; AVX: # %bb.0: 770; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0 771; AVX-NEXT: vpminsb %xmm3, %xmm2, %xmm1 772; AVX-NEXT: vpminsb %xmm1, %xmm0, %xmm0 773; AVX-NEXT: retq 774 775 %t0 = add <16 x i8> %x0, %x1 776 %t1 = icmp slt <16 x i8> %x2, %t0 777 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0 778 %t3 = icmp slt <16 x i8> %x3, %t2 779 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2 780 ret <16 x i8> %t4 781} 782 783define <8 x i16> @reassociate_smin_v8i16(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %x2, <8 x i16> %x3) { 784; SSE-LABEL: reassociate_smin_v8i16: 785; SSE: # %bb.0: 786; SSE-NEXT: paddw %xmm1, %xmm0 787; SSE-NEXT: pminsw %xmm3, %xmm2 788; SSE-NEXT: pminsw %xmm2, %xmm0 789; SSE-NEXT: retq 790; 791; AVX-LABEL: reassociate_smin_v8i16: 792; AVX: # %bb.0: 793; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 794; AVX-NEXT: vpminsw %xmm3, %xmm2, %xmm1 795; AVX-NEXT: vpminsw %xmm1, %xmm0, %xmm0 796; AVX-NEXT: retq 797 798 %t0 = add <8 x i16> %x0, %x1 799 %t1 = icmp slt <8 x i16> %x2, %t0 800 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0 801 %t3 = icmp slt <8 x i16> %x3, %t2 802 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2 803 ret <8 x i16> %t4 804} 805 806define <4 x i32> @reassociate_smin_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 807; SSE-LABEL: reassociate_smin_v4i32: 808; SSE: # %bb.0: 809; SSE-NEXT: paddd %xmm1, %xmm0 810; SSE-NEXT: movdqa %xmm0, %xmm1 811; SSE-NEXT: pcmpgtd %xmm2, %xmm1 812; SSE-NEXT: pand %xmm1, %xmm2 813; SSE-NEXT: pandn %xmm0, %xmm1 814; SSE-NEXT: por %xmm2, %xmm1 815; SSE-NEXT: movdqa %xmm1, %xmm0 816; SSE-NEXT: pcmpgtd %xmm3, %xmm0 817; SSE-NEXT: pand %xmm0, %xmm3 818; SSE-NEXT: pandn %xmm1, %xmm0 819; SSE-NEXT: por %xmm3, %xmm0 820; SSE-NEXT: retq 821; 822; AVX-LABEL: reassociate_smin_v4i32: 823; AVX: # %bb.0: 824; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 825; AVX-NEXT: vpminsd %xmm3, %xmm2, %xmm1 826; AVX-NEXT: vpminsd %xmm1, %xmm0, %xmm0 827; AVX-NEXT: retq 828 829 %t0 = add <4 x i32> %x0, %x1 830 %t1 = icmp slt <4 x i32> %x2, %t0 831 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0 832 %t3 = icmp slt <4 x i32> %x3, %t2 833 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2 834 ret <4 x i32> %t4 835} 836 837define <2 x i64> @reassociate_smin_v2i64(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %x2, <2 x i64> %x3) { 838; SSE-LABEL: reassociate_smin_v2i64: 839; SSE: # %bb.0: 840; SSE-NEXT: paddq %xmm1, %xmm0 841; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 842; SSE-NEXT: movdqa %xmm2, %xmm4 843; SSE-NEXT: pxor %xmm1, %xmm4 844; SSE-NEXT: movdqa %xmm0, %xmm5 845; SSE-NEXT: pxor %xmm1, %xmm5 846; SSE-NEXT: movdqa %xmm5, %xmm6 847; SSE-NEXT: pcmpgtd %xmm4, %xmm6 848; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 849; SSE-NEXT: pcmpeqd %xmm4, %xmm5 850; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 851; SSE-NEXT: pand %xmm7, %xmm4 852; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 853; SSE-NEXT: por %xmm4, %xmm5 854; SSE-NEXT: pand %xmm5, %xmm2 855; SSE-NEXT: pandn %xmm0, %xmm5 856; SSE-NEXT: por %xmm2, %xmm5 857; SSE-NEXT: movdqa %xmm5, %xmm0 858; SSE-NEXT: pxor %xmm1, %xmm0 859; SSE-NEXT: pxor %xmm3, %xmm1 860; SSE-NEXT: movdqa %xmm0, %xmm2 861; SSE-NEXT: pcmpgtd %xmm1, %xmm2 862; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 863; SSE-NEXT: pcmpeqd %xmm0, %xmm1 864; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 865; SSE-NEXT: pand %xmm4, %xmm1 866; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 867; SSE-NEXT: por %xmm1, %xmm0 868; SSE-NEXT: pand %xmm0, %xmm3 869; SSE-NEXT: pandn %xmm5, %xmm0 870; SSE-NEXT: por %xmm3, %xmm0 871; SSE-NEXT: retq 872; 873; AVX2-LABEL: reassociate_smin_v2i64: 874; AVX2: # %bb.0: 875; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 876; AVX2-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm1 877; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0 878; AVX2-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm1 879; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0 880; AVX2-NEXT: retq 881; 882; AVX512-LABEL: reassociate_smin_v2i64: 883; AVX512: # %bb.0: 884; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 885; AVX512-NEXT: vpminsq %xmm3, %xmm2, %xmm1 886; AVX512-NEXT: vpminsq %xmm1, %xmm0, %xmm0 887; AVX512-NEXT: retq 888 889 %t0 = add <2 x i64> %x0, %x1 890 %t1 = icmp slt <2 x i64> %x2, %t0 891 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0 892 %t3 = icmp slt <2 x i64> %x3, %t2 893 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2 894 ret <2 x i64> %t4 895} 896 897; Verify that 256-bit vector min/max are reassociated. 898 899define <32 x i8> @reassociate_umax_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) { 900; SSE-LABEL: reassociate_umax_v32i8: 901; SSE: # %bb.0: 902; SSE-NEXT: paddb %xmm2, %xmm0 903; SSE-NEXT: paddb %xmm3, %xmm1 904; SSE-NEXT: pmaxub %xmm6, %xmm4 905; SSE-NEXT: pmaxub %xmm4, %xmm0 906; SSE-NEXT: pmaxub %xmm7, %xmm5 907; SSE-NEXT: pmaxub %xmm5, %xmm1 908; SSE-NEXT: retq 909; 910; AVX-LABEL: reassociate_umax_v32i8: 911; AVX: # %bb.0: 912; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm0 913; AVX-NEXT: vpmaxub %ymm3, %ymm2, %ymm1 914; AVX-NEXT: vpmaxub %ymm1, %ymm0, %ymm0 915; AVX-NEXT: retq 916 917 %t0 = add <32 x i8> %x0, %x1 918 %t1 = icmp ugt <32 x i8> %x2, %t0 919 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0 920 %t3 = icmp ugt <32 x i8> %x3, %t2 921 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2 922 ret <32 x i8> %t4 923} 924 925define <16 x i16> @reassociate_umax_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) { 926; SSE-LABEL: reassociate_umax_v16i16: 927; SSE: # %bb.0: 928; SSE-NEXT: paddw %xmm2, %xmm0 929; SSE-NEXT: paddw %xmm3, %xmm1 930; SSE-NEXT: psubusw %xmm5, %xmm1 931; SSE-NEXT: paddw %xmm5, %xmm1 932; SSE-NEXT: psubusw %xmm4, %xmm0 933; SSE-NEXT: paddw %xmm4, %xmm0 934; SSE-NEXT: psubusw %xmm6, %xmm0 935; SSE-NEXT: paddw %xmm6, %xmm0 936; SSE-NEXT: psubusw %xmm7, %xmm1 937; SSE-NEXT: paddw %xmm7, %xmm1 938; SSE-NEXT: retq 939; 940; AVX-LABEL: reassociate_umax_v16i16: 941; AVX: # %bb.0: 942; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm0 943; AVX-NEXT: vpmaxuw %ymm3, %ymm2, %ymm1 944; AVX-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0 945; AVX-NEXT: retq 946 947 %t0 = add <16 x i16> %x0, %x1 948 %t1 = icmp ugt <16 x i16> %x2, %t0 949 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0 950 %t3 = icmp ugt <16 x i16> %x3, %t2 951 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2 952 ret <16 x i16> %t4 953} 954 955define <8 x i32> @reassociate_umax_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 956; SSE-LABEL: reassociate_umax_v8i32: 957; SSE: # %bb.0: 958; SSE-NEXT: movdqa %xmm1, %xmm8 959; SSE-NEXT: paddd %xmm2, %xmm0 960; SSE-NEXT: paddd %xmm3, %xmm8 961; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648] 962; SSE-NEXT: movdqa %xmm5, %xmm2 963; SSE-NEXT: pxor %xmm1, %xmm2 964; SSE-NEXT: movdqa %xmm8, %xmm3 965; SSE-NEXT: pxor %xmm1, %xmm3 966; SSE-NEXT: pcmpgtd %xmm3, %xmm2 967; SSE-NEXT: pand %xmm2, %xmm5 968; SSE-NEXT: pandn %xmm8, %xmm2 969; SSE-NEXT: por %xmm5, %xmm2 970; SSE-NEXT: movdqa %xmm4, %xmm3 971; SSE-NEXT: pxor %xmm1, %xmm3 972; SSE-NEXT: movdqa %xmm0, %xmm5 973; SSE-NEXT: pxor %xmm1, %xmm5 974; SSE-NEXT: pcmpgtd %xmm5, %xmm3 975; SSE-NEXT: pand %xmm3, %xmm4 976; SSE-NEXT: pandn %xmm0, %xmm3 977; SSE-NEXT: por %xmm4, %xmm3 978; SSE-NEXT: movdqa %xmm3, %xmm4 979; SSE-NEXT: pxor %xmm1, %xmm4 980; SSE-NEXT: movdqa %xmm6, %xmm0 981; SSE-NEXT: pxor %xmm1, %xmm0 982; SSE-NEXT: pcmpgtd %xmm4, %xmm0 983; SSE-NEXT: pand %xmm0, %xmm6 984; SSE-NEXT: pandn %xmm3, %xmm0 985; SSE-NEXT: por %xmm6, %xmm0 986; SSE-NEXT: movdqa %xmm2, %xmm3 987; SSE-NEXT: pxor %xmm1, %xmm3 988; SSE-NEXT: pxor %xmm7, %xmm1 989; SSE-NEXT: pcmpgtd %xmm3, %xmm1 990; SSE-NEXT: pand %xmm1, %xmm7 991; SSE-NEXT: pandn %xmm2, %xmm1 992; SSE-NEXT: por %xmm7, %xmm1 993; SSE-NEXT: retq 994; 995; AVX-LABEL: reassociate_umax_v8i32: 996; AVX: # %bb.0: 997; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 998; AVX-NEXT: vpmaxud %ymm3, %ymm2, %ymm1 999; AVX-NEXT: vpmaxud %ymm1, %ymm0, %ymm0 1000; AVX-NEXT: retq 1001 1002 %t0 = add <8 x i32> %x0, %x1 1003 %t1 = icmp ugt <8 x i32> %x2, %t0 1004 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0 1005 %t3 = icmp ugt <8 x i32> %x3, %t2 1006 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2 1007 ret <8 x i32> %t4 1008} 1009 1010define <4 x i64> @reassociate_umax_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) { 1011; SSE-LABEL: reassociate_umax_v4i64: 1012; SSE: # %bb.0: 1013; SSE-NEXT: paddq %xmm2, %xmm0 1014; SSE-NEXT: paddq %xmm3, %xmm1 1015; SSE-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456] 1016; SSE-NEXT: movdqa %xmm5, %xmm3 1017; SSE-NEXT: pxor %xmm8, %xmm3 1018; SSE-NEXT: movdqa %xmm1, %xmm2 1019; SSE-NEXT: pxor %xmm8, %xmm2 1020; SSE-NEXT: movdqa %xmm3, %xmm9 1021; SSE-NEXT: pcmpgtd %xmm2, %xmm9 1022; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2] 1023; SSE-NEXT: pcmpeqd %xmm3, %xmm2 1024; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1025; SSE-NEXT: pand %xmm10, %xmm2 1026; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3] 1027; SSE-NEXT: por %xmm2, %xmm3 1028; SSE-NEXT: pand %xmm3, %xmm5 1029; SSE-NEXT: pandn %xmm1, %xmm3 1030; SSE-NEXT: por %xmm5, %xmm3 1031; SSE-NEXT: movdqa %xmm4, %xmm1 1032; SSE-NEXT: pxor %xmm8, %xmm1 1033; SSE-NEXT: movdqa %xmm0, %xmm2 1034; SSE-NEXT: pxor %xmm8, %xmm2 1035; SSE-NEXT: movdqa %xmm1, %xmm5 1036; SSE-NEXT: pcmpgtd %xmm2, %xmm5 1037; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1038; SSE-NEXT: pcmpeqd %xmm1, %xmm2 1039; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1040; SSE-NEXT: pand %xmm9, %xmm1 1041; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1042; SSE-NEXT: por %xmm1, %xmm2 1043; SSE-NEXT: pand %xmm2, %xmm4 1044; SSE-NEXT: pandn %xmm0, %xmm2 1045; SSE-NEXT: por %xmm4, %xmm2 1046; SSE-NEXT: movdqa %xmm2, %xmm0 1047; SSE-NEXT: pxor %xmm8, %xmm0 1048; SSE-NEXT: movdqa %xmm6, %xmm1 1049; SSE-NEXT: pxor %xmm8, %xmm1 1050; SSE-NEXT: movdqa %xmm1, %xmm4 1051; SSE-NEXT: pcmpgtd %xmm0, %xmm4 1052; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1053; SSE-NEXT: pcmpeqd %xmm0, %xmm1 1054; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1055; SSE-NEXT: pand %xmm5, %xmm1 1056; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1057; SSE-NEXT: por %xmm1, %xmm0 1058; SSE-NEXT: pand %xmm0, %xmm6 1059; SSE-NEXT: pandn %xmm2, %xmm0 1060; SSE-NEXT: por %xmm6, %xmm0 1061; SSE-NEXT: movdqa %xmm3, %xmm1 1062; SSE-NEXT: pxor %xmm8, %xmm1 1063; SSE-NEXT: pxor %xmm7, %xmm8 1064; SSE-NEXT: movdqa %xmm8, %xmm2 1065; SSE-NEXT: pcmpgtd %xmm1, %xmm2 1066; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1067; SSE-NEXT: pcmpeqd %xmm1, %xmm8 1068; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1069; SSE-NEXT: pand %xmm4, %xmm5 1070; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1071; SSE-NEXT: por %xmm5, %xmm1 1072; SSE-NEXT: pand %xmm1, %xmm7 1073; SSE-NEXT: pandn %xmm3, %xmm1 1074; SSE-NEXT: por %xmm7, %xmm1 1075; SSE-NEXT: retq 1076; 1077; AVX2-LABEL: reassociate_umax_v4i64: 1078; AVX2: # %bb.0: 1079; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1080; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1081; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm4 1082; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm5 1083; AVX2-NEXT: vpcmpgtq %ymm5, %ymm4, %ymm4 1084; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm0, %ymm0 1085; AVX2-NEXT: vxorpd %ymm1, %ymm0, %ymm2 1086; AVX2-NEXT: vpxor %ymm1, %ymm3, %ymm1 1087; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm1 1088; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm0 1089; AVX2-NEXT: retq 1090; 1091; AVX512-LABEL: reassociate_umax_v4i64: 1092; AVX512: # %bb.0: 1093; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1094; AVX512-NEXT: vpmaxuq %ymm3, %ymm2, %ymm1 1095; AVX512-NEXT: vpmaxuq %ymm1, %ymm0, %ymm0 1096; AVX512-NEXT: retq 1097 1098 %t0 = add <4 x i64> %x0, %x1 1099 %t1 = icmp ugt <4 x i64> %x2, %t0 1100 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0 1101 %t3 = icmp ugt <4 x i64> %x3, %t2 1102 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2 1103 ret <4 x i64> %t4 1104} 1105 1106define <32 x i8> @reassociate_smax_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) { 1107; SSE-LABEL: reassociate_smax_v32i8: 1108; SSE: # %bb.0: 1109; SSE-NEXT: paddb %xmm2, %xmm0 1110; SSE-NEXT: paddb %xmm3, %xmm1 1111; SSE-NEXT: movdqa %xmm5, %xmm2 1112; SSE-NEXT: pcmpgtb %xmm1, %xmm2 1113; SSE-NEXT: pand %xmm2, %xmm5 1114; SSE-NEXT: pandn %xmm1, %xmm2 1115; SSE-NEXT: por %xmm5, %xmm2 1116; SSE-NEXT: movdqa %xmm4, %xmm1 1117; SSE-NEXT: pcmpgtb %xmm0, %xmm1 1118; SSE-NEXT: pand %xmm1, %xmm4 1119; SSE-NEXT: pandn %xmm0, %xmm1 1120; SSE-NEXT: por %xmm4, %xmm1 1121; SSE-NEXT: movdqa %xmm6, %xmm0 1122; SSE-NEXT: pcmpgtb %xmm1, %xmm0 1123; SSE-NEXT: pand %xmm0, %xmm6 1124; SSE-NEXT: pandn %xmm1, %xmm0 1125; SSE-NEXT: por %xmm6, %xmm0 1126; SSE-NEXT: movdqa %xmm7, %xmm1 1127; SSE-NEXT: pcmpgtb %xmm2, %xmm1 1128; SSE-NEXT: pand %xmm1, %xmm7 1129; SSE-NEXT: pandn %xmm2, %xmm1 1130; SSE-NEXT: por %xmm7, %xmm1 1131; SSE-NEXT: retq 1132; 1133; AVX-LABEL: reassociate_smax_v32i8: 1134; AVX: # %bb.0: 1135; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm0 1136; AVX-NEXT: vpmaxsb %ymm3, %ymm2, %ymm1 1137; AVX-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0 1138; AVX-NEXT: retq 1139 1140 %t0 = add <32 x i8> %x0, %x1 1141 %t1 = icmp sgt <32 x i8> %x2, %t0 1142 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0 1143 %t3 = icmp sgt <32 x i8> %x3, %t2 1144 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2 1145 ret <32 x i8> %t4 1146} 1147 1148define <16 x i16> @reassociate_smax_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) { 1149; SSE-LABEL: reassociate_smax_v16i16: 1150; SSE: # %bb.0: 1151; SSE-NEXT: paddw %xmm2, %xmm0 1152; SSE-NEXT: paddw %xmm3, %xmm1 1153; SSE-NEXT: pmaxsw %xmm6, %xmm4 1154; SSE-NEXT: pmaxsw %xmm4, %xmm0 1155; SSE-NEXT: pmaxsw %xmm7, %xmm5 1156; SSE-NEXT: pmaxsw %xmm5, %xmm1 1157; SSE-NEXT: retq 1158; 1159; AVX-LABEL: reassociate_smax_v16i16: 1160; AVX: # %bb.0: 1161; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm0 1162; AVX-NEXT: vpmaxsw %ymm3, %ymm2, %ymm1 1163; AVX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 1164; AVX-NEXT: retq 1165 1166 %t0 = add <16 x i16> %x0, %x1 1167 %t1 = icmp sgt <16 x i16> %x2, %t0 1168 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0 1169 %t3 = icmp sgt <16 x i16> %x3, %t2 1170 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2 1171 ret <16 x i16> %t4 1172} 1173 1174define <8 x i32> @reassociate_smax_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 1175; SSE-LABEL: reassociate_smax_v8i32: 1176; SSE: # %bb.0: 1177; SSE-NEXT: paddd %xmm2, %xmm0 1178; SSE-NEXT: paddd %xmm3, %xmm1 1179; SSE-NEXT: movdqa %xmm5, %xmm2 1180; SSE-NEXT: pcmpgtd %xmm1, %xmm2 1181; SSE-NEXT: pand %xmm2, %xmm5 1182; SSE-NEXT: pandn %xmm1, %xmm2 1183; SSE-NEXT: por %xmm5, %xmm2 1184; SSE-NEXT: movdqa %xmm4, %xmm1 1185; SSE-NEXT: pcmpgtd %xmm0, %xmm1 1186; SSE-NEXT: pand %xmm1, %xmm4 1187; SSE-NEXT: pandn %xmm0, %xmm1 1188; SSE-NEXT: por %xmm4, %xmm1 1189; SSE-NEXT: movdqa %xmm6, %xmm0 1190; SSE-NEXT: pcmpgtd %xmm1, %xmm0 1191; SSE-NEXT: pand %xmm0, %xmm6 1192; SSE-NEXT: pandn %xmm1, %xmm0 1193; SSE-NEXT: por %xmm6, %xmm0 1194; SSE-NEXT: movdqa %xmm7, %xmm1 1195; SSE-NEXT: pcmpgtd %xmm2, %xmm1 1196; SSE-NEXT: pand %xmm1, %xmm7 1197; SSE-NEXT: pandn %xmm2, %xmm1 1198; SSE-NEXT: por %xmm7, %xmm1 1199; SSE-NEXT: retq 1200; 1201; AVX-LABEL: reassociate_smax_v8i32: 1202; AVX: # %bb.0: 1203; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 1204; AVX-NEXT: vpmaxsd %ymm3, %ymm2, %ymm1 1205; AVX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 1206; AVX-NEXT: retq 1207 1208 %t0 = add <8 x i32> %x0, %x1 1209 %t1 = icmp sgt <8 x i32> %x2, %t0 1210 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0 1211 %t3 = icmp sgt <8 x i32> %x3, %t2 1212 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2 1213 ret <8 x i32> %t4 1214} 1215 1216define <4 x i64> @reassociate_smax_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) { 1217; SSE-LABEL: reassociate_smax_v4i64: 1218; SSE: # %bb.0: 1219; SSE-NEXT: paddq %xmm2, %xmm0 1220; SSE-NEXT: paddq %xmm3, %xmm1 1221; SSE-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648] 1222; SSE-NEXT: movdqa %xmm5, %xmm3 1223; SSE-NEXT: pxor %xmm8, %xmm3 1224; SSE-NEXT: movdqa %xmm1, %xmm2 1225; SSE-NEXT: pxor %xmm8, %xmm2 1226; SSE-NEXT: movdqa %xmm3, %xmm9 1227; SSE-NEXT: pcmpgtd %xmm2, %xmm9 1228; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2] 1229; SSE-NEXT: pcmpeqd %xmm3, %xmm2 1230; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1231; SSE-NEXT: pand %xmm10, %xmm2 1232; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3] 1233; SSE-NEXT: por %xmm2, %xmm3 1234; SSE-NEXT: pand %xmm3, %xmm5 1235; SSE-NEXT: pandn %xmm1, %xmm3 1236; SSE-NEXT: por %xmm5, %xmm3 1237; SSE-NEXT: movdqa %xmm4, %xmm1 1238; SSE-NEXT: pxor %xmm8, %xmm1 1239; SSE-NEXT: movdqa %xmm0, %xmm2 1240; SSE-NEXT: pxor %xmm8, %xmm2 1241; SSE-NEXT: movdqa %xmm1, %xmm5 1242; SSE-NEXT: pcmpgtd %xmm2, %xmm5 1243; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1244; SSE-NEXT: pcmpeqd %xmm1, %xmm2 1245; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1246; SSE-NEXT: pand %xmm9, %xmm1 1247; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1248; SSE-NEXT: por %xmm1, %xmm2 1249; SSE-NEXT: pand %xmm2, %xmm4 1250; SSE-NEXT: pandn %xmm0, %xmm2 1251; SSE-NEXT: por %xmm4, %xmm2 1252; SSE-NEXT: movdqa %xmm2, %xmm0 1253; SSE-NEXT: pxor %xmm8, %xmm0 1254; SSE-NEXT: movdqa %xmm6, %xmm1 1255; SSE-NEXT: pxor %xmm8, %xmm1 1256; SSE-NEXT: movdqa %xmm1, %xmm4 1257; SSE-NEXT: pcmpgtd %xmm0, %xmm4 1258; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1259; SSE-NEXT: pcmpeqd %xmm0, %xmm1 1260; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1261; SSE-NEXT: pand %xmm5, %xmm1 1262; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1263; SSE-NEXT: por %xmm1, %xmm0 1264; SSE-NEXT: pand %xmm0, %xmm6 1265; SSE-NEXT: pandn %xmm2, %xmm0 1266; SSE-NEXT: por %xmm6, %xmm0 1267; SSE-NEXT: movdqa %xmm3, %xmm1 1268; SSE-NEXT: pxor %xmm8, %xmm1 1269; SSE-NEXT: pxor %xmm7, %xmm8 1270; SSE-NEXT: movdqa %xmm8, %xmm2 1271; SSE-NEXT: pcmpgtd %xmm1, %xmm2 1272; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1273; SSE-NEXT: pcmpeqd %xmm1, %xmm8 1274; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1275; SSE-NEXT: pand %xmm4, %xmm5 1276; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1277; SSE-NEXT: por %xmm5, %xmm1 1278; SSE-NEXT: pand %xmm1, %xmm7 1279; SSE-NEXT: pandn %xmm3, %xmm1 1280; SSE-NEXT: por %xmm7, %xmm1 1281; SSE-NEXT: retq 1282; 1283; AVX2-LABEL: reassociate_smax_v4i64: 1284; AVX2: # %bb.0: 1285; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1286; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm1 1287; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm0 1288; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm1 1289; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm0 1290; AVX2-NEXT: retq 1291; 1292; AVX512-LABEL: reassociate_smax_v4i64: 1293; AVX512: # %bb.0: 1294; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1295; AVX512-NEXT: vpmaxsq %ymm3, %ymm2, %ymm1 1296; AVX512-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 1297; AVX512-NEXT: retq 1298 1299 %t0 = add <4 x i64> %x0, %x1 1300 %t1 = icmp sgt <4 x i64> %x2, %t0 1301 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0 1302 %t3 = icmp sgt <4 x i64> %x3, %t2 1303 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2 1304 ret <4 x i64> %t4 1305} 1306 1307define <32 x i8> @reassociate_umin_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) { 1308; SSE-LABEL: reassociate_umin_v32i8: 1309; SSE: # %bb.0: 1310; SSE-NEXT: paddb %xmm2, %xmm0 1311; SSE-NEXT: paddb %xmm3, %xmm1 1312; SSE-NEXT: pminub %xmm6, %xmm4 1313; SSE-NEXT: pminub %xmm4, %xmm0 1314; SSE-NEXT: pminub %xmm7, %xmm5 1315; SSE-NEXT: pminub %xmm5, %xmm1 1316; SSE-NEXT: retq 1317; 1318; AVX-LABEL: reassociate_umin_v32i8: 1319; AVX: # %bb.0: 1320; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm0 1321; AVX-NEXT: vpminub %ymm3, %ymm2, %ymm1 1322; AVX-NEXT: vpminub %ymm1, %ymm0, %ymm0 1323; AVX-NEXT: retq 1324 1325 %t0 = add <32 x i8> %x0, %x1 1326 %t1 = icmp ult <32 x i8> %x2, %t0 1327 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0 1328 %t3 = icmp ult <32 x i8> %x3, %t2 1329 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2 1330 ret <32 x i8> %t4 1331} 1332 1333define <16 x i16> @reassociate_umin_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) { 1334; SSE-LABEL: reassociate_umin_v16i16: 1335; SSE: # %bb.0: 1336; SSE-NEXT: paddw %xmm2, %xmm0 1337; SSE-NEXT: paddw %xmm3, %xmm1 1338; SSE-NEXT: movdqa %xmm5, %xmm2 1339; SSE-NEXT: psubusw %xmm1, %xmm2 1340; SSE-NEXT: psubw %xmm2, %xmm5 1341; SSE-NEXT: movdqa %xmm4, %xmm1 1342; SSE-NEXT: psubusw %xmm0, %xmm1 1343; SSE-NEXT: psubw %xmm1, %xmm4 1344; SSE-NEXT: movdqa %xmm6, %xmm0 1345; SSE-NEXT: psubusw %xmm4, %xmm0 1346; SSE-NEXT: psubw %xmm0, %xmm6 1347; SSE-NEXT: movdqa %xmm7, %xmm0 1348; SSE-NEXT: psubusw %xmm5, %xmm0 1349; SSE-NEXT: psubw %xmm0, %xmm7 1350; SSE-NEXT: movdqa %xmm6, %xmm0 1351; SSE-NEXT: movdqa %xmm7, %xmm1 1352; SSE-NEXT: retq 1353; 1354; AVX-LABEL: reassociate_umin_v16i16: 1355; AVX: # %bb.0: 1356; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm0 1357; AVX-NEXT: vpminuw %ymm3, %ymm2, %ymm1 1358; AVX-NEXT: vpminuw %ymm1, %ymm0, %ymm0 1359; AVX-NEXT: retq 1360 1361 %t0 = add <16 x i16> %x0, %x1 1362 %t1 = icmp ult <16 x i16> %x2, %t0 1363 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0 1364 %t3 = icmp ult <16 x i16> %x3, %t2 1365 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2 1366 ret <16 x i16> %t4 1367} 1368 1369define <8 x i32> @reassociate_umin_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 1370; SSE-LABEL: reassociate_umin_v8i32: 1371; SSE: # %bb.0: 1372; SSE-NEXT: paddd %xmm2, %xmm0 1373; SSE-NEXT: paddd %xmm3, %xmm1 1374; SSE-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 1375; SSE-NEXT: movdqa %xmm5, %xmm8 1376; SSE-NEXT: pxor %xmm3, %xmm8 1377; SSE-NEXT: movdqa %xmm1, %xmm2 1378; SSE-NEXT: pxor %xmm3, %xmm2 1379; SSE-NEXT: pcmpgtd %xmm8, %xmm2 1380; SSE-NEXT: pand %xmm2, %xmm5 1381; SSE-NEXT: pandn %xmm1, %xmm2 1382; SSE-NEXT: por %xmm5, %xmm2 1383; SSE-NEXT: movdqa %xmm4, %xmm1 1384; SSE-NEXT: pxor %xmm3, %xmm1 1385; SSE-NEXT: movdqa %xmm0, %xmm5 1386; SSE-NEXT: pxor %xmm3, %xmm5 1387; SSE-NEXT: pcmpgtd %xmm1, %xmm5 1388; SSE-NEXT: pand %xmm5, %xmm4 1389; SSE-NEXT: pandn %xmm0, %xmm5 1390; SSE-NEXT: por %xmm4, %xmm5 1391; SSE-NEXT: movdqa %xmm5, %xmm0 1392; SSE-NEXT: pxor %xmm3, %xmm0 1393; SSE-NEXT: movdqa %xmm6, %xmm1 1394; SSE-NEXT: pxor %xmm3, %xmm1 1395; SSE-NEXT: pcmpgtd %xmm1, %xmm0 1396; SSE-NEXT: pand %xmm0, %xmm6 1397; SSE-NEXT: pandn %xmm5, %xmm0 1398; SSE-NEXT: por %xmm6, %xmm0 1399; SSE-NEXT: movdqa %xmm2, %xmm1 1400; SSE-NEXT: pxor %xmm3, %xmm1 1401; SSE-NEXT: pxor %xmm7, %xmm3 1402; SSE-NEXT: pcmpgtd %xmm3, %xmm1 1403; SSE-NEXT: pand %xmm1, %xmm7 1404; SSE-NEXT: pandn %xmm2, %xmm1 1405; SSE-NEXT: por %xmm7, %xmm1 1406; SSE-NEXT: retq 1407; 1408; AVX-LABEL: reassociate_umin_v8i32: 1409; AVX: # %bb.0: 1410; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 1411; AVX-NEXT: vpminud %ymm3, %ymm2, %ymm1 1412; AVX-NEXT: vpminud %ymm1, %ymm0, %ymm0 1413; AVX-NEXT: retq 1414 1415 %t0 = add <8 x i32> %x0, %x1 1416 %t1 = icmp ult <8 x i32> %x2, %t0 1417 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0 1418 %t3 = icmp ult <8 x i32> %x3, %t2 1419 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2 1420 ret <8 x i32> %t4 1421} 1422 1423define <4 x i64> @reassociate_umin_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) { 1424; SSE-LABEL: reassociate_umin_v4i64: 1425; SSE: # %bb.0: 1426; SSE-NEXT: paddq %xmm2, %xmm0 1427; SSE-NEXT: paddq %xmm3, %xmm1 1428; SSE-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456] 1429; SSE-NEXT: movdqa %xmm5, %xmm3 1430; SSE-NEXT: pxor %xmm8, %xmm3 1431; SSE-NEXT: movdqa %xmm1, %xmm2 1432; SSE-NEXT: pxor %xmm8, %xmm2 1433; SSE-NEXT: movdqa %xmm2, %xmm9 1434; SSE-NEXT: pcmpgtd %xmm3, %xmm9 1435; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2] 1436; SSE-NEXT: pcmpeqd %xmm3, %xmm2 1437; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1438; SSE-NEXT: pand %xmm10, %xmm2 1439; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3] 1440; SSE-NEXT: por %xmm2, %xmm3 1441; SSE-NEXT: pand %xmm3, %xmm5 1442; SSE-NEXT: pandn %xmm1, %xmm3 1443; SSE-NEXT: por %xmm5, %xmm3 1444; SSE-NEXT: movdqa %xmm4, %xmm1 1445; SSE-NEXT: pxor %xmm8, %xmm1 1446; SSE-NEXT: movdqa %xmm0, %xmm2 1447; SSE-NEXT: pxor %xmm8, %xmm2 1448; SSE-NEXT: movdqa %xmm2, %xmm5 1449; SSE-NEXT: pcmpgtd %xmm1, %xmm5 1450; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1451; SSE-NEXT: pcmpeqd %xmm1, %xmm2 1452; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1453; SSE-NEXT: pand %xmm9, %xmm1 1454; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1455; SSE-NEXT: por %xmm1, %xmm2 1456; SSE-NEXT: pand %xmm2, %xmm4 1457; SSE-NEXT: pandn %xmm0, %xmm2 1458; SSE-NEXT: por %xmm4, %xmm2 1459; SSE-NEXT: movdqa %xmm2, %xmm0 1460; SSE-NEXT: pxor %xmm8, %xmm0 1461; SSE-NEXT: movdqa %xmm6, %xmm1 1462; SSE-NEXT: pxor %xmm8, %xmm1 1463; SSE-NEXT: movdqa %xmm0, %xmm4 1464; SSE-NEXT: pcmpgtd %xmm1, %xmm4 1465; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1466; SSE-NEXT: pcmpeqd %xmm0, %xmm1 1467; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1468; SSE-NEXT: pand %xmm5, %xmm1 1469; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1470; SSE-NEXT: por %xmm1, %xmm0 1471; SSE-NEXT: pand %xmm0, %xmm6 1472; SSE-NEXT: pandn %xmm2, %xmm0 1473; SSE-NEXT: por %xmm6, %xmm0 1474; SSE-NEXT: movdqa %xmm3, %xmm1 1475; SSE-NEXT: pxor %xmm8, %xmm1 1476; SSE-NEXT: pxor %xmm7, %xmm8 1477; SSE-NEXT: movdqa %xmm1, %xmm2 1478; SSE-NEXT: pcmpgtd %xmm8, %xmm2 1479; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1480; SSE-NEXT: pcmpeqd %xmm1, %xmm8 1481; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1482; SSE-NEXT: pand %xmm4, %xmm5 1483; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1484; SSE-NEXT: por %xmm5, %xmm1 1485; SSE-NEXT: pand %xmm1, %xmm7 1486; SSE-NEXT: pandn %xmm3, %xmm1 1487; SSE-NEXT: por %xmm7, %xmm1 1488; SSE-NEXT: retq 1489; 1490; AVX2-LABEL: reassociate_umin_v4i64: 1491; AVX2: # %bb.0: 1492; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1493; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1494; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm4 1495; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm5 1496; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 1497; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm0, %ymm0 1498; AVX2-NEXT: vxorpd %ymm1, %ymm0, %ymm2 1499; AVX2-NEXT: vpxor %ymm1, %ymm3, %ymm1 1500; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1 1501; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm0 1502; AVX2-NEXT: retq 1503; 1504; AVX512-LABEL: reassociate_umin_v4i64: 1505; AVX512: # %bb.0: 1506; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1507; AVX512-NEXT: vpminuq %ymm3, %ymm2, %ymm1 1508; AVX512-NEXT: vpminuq %ymm1, %ymm0, %ymm0 1509; AVX512-NEXT: retq 1510 1511 %t0 = add <4 x i64> %x0, %x1 1512 %t1 = icmp ult <4 x i64> %x2, %t0 1513 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0 1514 %t3 = icmp ult <4 x i64> %x3, %t2 1515 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2 1516 ret <4 x i64> %t4 1517} 1518 1519define <32 x i8> @reassociate_smin_v32i8(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, <32 x i8> %x3) { 1520; SSE-LABEL: reassociate_smin_v32i8: 1521; SSE: # %bb.0: 1522; SSE-NEXT: paddb %xmm2, %xmm0 1523; SSE-NEXT: paddb %xmm3, %xmm1 1524; SSE-NEXT: movdqa %xmm1, %xmm2 1525; SSE-NEXT: pcmpgtb %xmm5, %xmm2 1526; SSE-NEXT: pand %xmm2, %xmm5 1527; SSE-NEXT: pandn %xmm1, %xmm2 1528; SSE-NEXT: por %xmm5, %xmm2 1529; SSE-NEXT: movdqa %xmm0, %xmm1 1530; SSE-NEXT: pcmpgtb %xmm4, %xmm1 1531; SSE-NEXT: pand %xmm1, %xmm4 1532; SSE-NEXT: pandn %xmm0, %xmm1 1533; SSE-NEXT: por %xmm4, %xmm1 1534; SSE-NEXT: movdqa %xmm1, %xmm0 1535; SSE-NEXT: pcmpgtb %xmm6, %xmm0 1536; SSE-NEXT: pand %xmm0, %xmm6 1537; SSE-NEXT: pandn %xmm1, %xmm0 1538; SSE-NEXT: por %xmm6, %xmm0 1539; SSE-NEXT: movdqa %xmm2, %xmm1 1540; SSE-NEXT: pcmpgtb %xmm7, %xmm1 1541; SSE-NEXT: pand %xmm1, %xmm7 1542; SSE-NEXT: pandn %xmm2, %xmm1 1543; SSE-NEXT: por %xmm7, %xmm1 1544; SSE-NEXT: retq 1545; 1546; AVX-LABEL: reassociate_smin_v32i8: 1547; AVX: # %bb.0: 1548; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm0 1549; AVX-NEXT: vpminsb %ymm3, %ymm2, %ymm1 1550; AVX-NEXT: vpminsb %ymm1, %ymm0, %ymm0 1551; AVX-NEXT: retq 1552 1553 %t0 = add <32 x i8> %x0, %x1 1554 %t1 = icmp slt <32 x i8> %x2, %t0 1555 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0 1556 %t3 = icmp slt <32 x i8> %x3, %t2 1557 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2 1558 ret <32 x i8> %t4 1559} 1560 1561define <16 x i16> @reassociate_smin_v16i16(<16 x i16> %x0, <16 x i16> %x1, <16 x i16> %x2, <16 x i16> %x3) { 1562; SSE-LABEL: reassociate_smin_v16i16: 1563; SSE: # %bb.0: 1564; SSE-NEXT: paddw %xmm2, %xmm0 1565; SSE-NEXT: paddw %xmm3, %xmm1 1566; SSE-NEXT: pminsw %xmm6, %xmm4 1567; SSE-NEXT: pminsw %xmm4, %xmm0 1568; SSE-NEXT: pminsw %xmm7, %xmm5 1569; SSE-NEXT: pminsw %xmm5, %xmm1 1570; SSE-NEXT: retq 1571; 1572; AVX-LABEL: reassociate_smin_v16i16: 1573; AVX: # %bb.0: 1574; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm0 1575; AVX-NEXT: vpminsw %ymm3, %ymm2, %ymm1 1576; AVX-NEXT: vpminsw %ymm1, %ymm0, %ymm0 1577; AVX-NEXT: retq 1578 1579 %t0 = add <16 x i16> %x0, %x1 1580 %t1 = icmp slt <16 x i16> %x2, %t0 1581 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0 1582 %t3 = icmp slt <16 x i16> %x3, %t2 1583 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2 1584 ret <16 x i16> %t4 1585} 1586 1587define <8 x i32> @reassociate_smin_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 1588; SSE-LABEL: reassociate_smin_v8i32: 1589; SSE: # %bb.0: 1590; SSE-NEXT: paddd %xmm2, %xmm0 1591; SSE-NEXT: paddd %xmm3, %xmm1 1592; SSE-NEXT: movdqa %xmm1, %xmm2 1593; SSE-NEXT: pcmpgtd %xmm5, %xmm2 1594; SSE-NEXT: pand %xmm2, %xmm5 1595; SSE-NEXT: pandn %xmm1, %xmm2 1596; SSE-NEXT: por %xmm5, %xmm2 1597; SSE-NEXT: movdqa %xmm0, %xmm1 1598; SSE-NEXT: pcmpgtd %xmm4, %xmm1 1599; SSE-NEXT: pand %xmm1, %xmm4 1600; SSE-NEXT: pandn %xmm0, %xmm1 1601; SSE-NEXT: por %xmm4, %xmm1 1602; SSE-NEXT: movdqa %xmm1, %xmm0 1603; SSE-NEXT: pcmpgtd %xmm6, %xmm0 1604; SSE-NEXT: pand %xmm0, %xmm6 1605; SSE-NEXT: pandn %xmm1, %xmm0 1606; SSE-NEXT: por %xmm6, %xmm0 1607; SSE-NEXT: movdqa %xmm2, %xmm1 1608; SSE-NEXT: pcmpgtd %xmm7, %xmm1 1609; SSE-NEXT: pand %xmm1, %xmm7 1610; SSE-NEXT: pandn %xmm2, %xmm1 1611; SSE-NEXT: por %xmm7, %xmm1 1612; SSE-NEXT: retq 1613; 1614; AVX-LABEL: reassociate_smin_v8i32: 1615; AVX: # %bb.0: 1616; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 1617; AVX-NEXT: vpminsd %ymm3, %ymm2, %ymm1 1618; AVX-NEXT: vpminsd %ymm1, %ymm0, %ymm0 1619; AVX-NEXT: retq 1620 1621 %t0 = add <8 x i32> %x0, %x1 1622 %t1 = icmp slt <8 x i32> %x2, %t0 1623 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t0 1624 %t3 = icmp slt <8 x i32> %x3, %t2 1625 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t2 1626 ret <8 x i32> %t4 1627} 1628 1629define <4 x i64> @reassociate_smin_v4i64(<4 x i64> %x0, <4 x i64> %x1, <4 x i64> %x2, <4 x i64> %x3) { 1630; SSE-LABEL: reassociate_smin_v4i64: 1631; SSE: # %bb.0: 1632; SSE-NEXT: paddq %xmm2, %xmm0 1633; SSE-NEXT: paddq %xmm3, %xmm1 1634; SSE-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648] 1635; SSE-NEXT: movdqa %xmm5, %xmm3 1636; SSE-NEXT: pxor %xmm8, %xmm3 1637; SSE-NEXT: movdqa %xmm1, %xmm2 1638; SSE-NEXT: pxor %xmm8, %xmm2 1639; SSE-NEXT: movdqa %xmm2, %xmm9 1640; SSE-NEXT: pcmpgtd %xmm3, %xmm9 1641; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2] 1642; SSE-NEXT: pcmpeqd %xmm3, %xmm2 1643; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1644; SSE-NEXT: pand %xmm10, %xmm2 1645; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3] 1646; SSE-NEXT: por %xmm2, %xmm3 1647; SSE-NEXT: pand %xmm3, %xmm5 1648; SSE-NEXT: pandn %xmm1, %xmm3 1649; SSE-NEXT: por %xmm5, %xmm3 1650; SSE-NEXT: movdqa %xmm4, %xmm1 1651; SSE-NEXT: pxor %xmm8, %xmm1 1652; SSE-NEXT: movdqa %xmm0, %xmm2 1653; SSE-NEXT: pxor %xmm8, %xmm2 1654; SSE-NEXT: movdqa %xmm2, %xmm5 1655; SSE-NEXT: pcmpgtd %xmm1, %xmm5 1656; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1657; SSE-NEXT: pcmpeqd %xmm1, %xmm2 1658; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1659; SSE-NEXT: pand %xmm9, %xmm1 1660; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1661; SSE-NEXT: por %xmm1, %xmm2 1662; SSE-NEXT: pand %xmm2, %xmm4 1663; SSE-NEXT: pandn %xmm0, %xmm2 1664; SSE-NEXT: por %xmm4, %xmm2 1665; SSE-NEXT: movdqa %xmm2, %xmm0 1666; SSE-NEXT: pxor %xmm8, %xmm0 1667; SSE-NEXT: movdqa %xmm6, %xmm1 1668; SSE-NEXT: pxor %xmm8, %xmm1 1669; SSE-NEXT: movdqa %xmm0, %xmm4 1670; SSE-NEXT: pcmpgtd %xmm1, %xmm4 1671; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1672; SSE-NEXT: pcmpeqd %xmm0, %xmm1 1673; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1674; SSE-NEXT: pand %xmm5, %xmm1 1675; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1676; SSE-NEXT: por %xmm1, %xmm0 1677; SSE-NEXT: pand %xmm0, %xmm6 1678; SSE-NEXT: pandn %xmm2, %xmm0 1679; SSE-NEXT: por %xmm6, %xmm0 1680; SSE-NEXT: movdqa %xmm3, %xmm1 1681; SSE-NEXT: pxor %xmm8, %xmm1 1682; SSE-NEXT: pxor %xmm7, %xmm8 1683; SSE-NEXT: movdqa %xmm1, %xmm2 1684; SSE-NEXT: pcmpgtd %xmm8, %xmm2 1685; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1686; SSE-NEXT: pcmpeqd %xmm1, %xmm8 1687; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1688; SSE-NEXT: pand %xmm4, %xmm5 1689; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1690; SSE-NEXT: por %xmm5, %xmm1 1691; SSE-NEXT: pand %xmm1, %xmm7 1692; SSE-NEXT: pandn %xmm3, %xmm1 1693; SSE-NEXT: por %xmm7, %xmm1 1694; SSE-NEXT: retq 1695; 1696; AVX2-LABEL: reassociate_smin_v4i64: 1697; AVX2: # %bb.0: 1698; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1699; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm1 1700; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm0 1701; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm1 1702; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm0 1703; AVX2-NEXT: retq 1704; 1705; AVX512-LABEL: reassociate_smin_v4i64: 1706; AVX512: # %bb.0: 1707; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1708; AVX512-NEXT: vpminsq %ymm3, %ymm2, %ymm1 1709; AVX512-NEXT: vpminsq %ymm1, %ymm0, %ymm0 1710; AVX512-NEXT: retq 1711 1712 %t0 = add <4 x i64> %x0, %x1 1713 %t1 = icmp slt <4 x i64> %x2, %t0 1714 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t0 1715 %t3 = icmp slt <4 x i64> %x3, %t2 1716 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t2 1717 ret <4 x i64> %t4 1718} 1719 1720; Verify that 512-bit vector min/max are reassociated. 1721 1722define <64 x i8> @reassociate_umax_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) { 1723; SSE-LABEL: reassociate_umax_v64i8: 1724; SSE: # %bb.0: 1725; SSE-NEXT: paddb %xmm4, %xmm0 1726; SSE-NEXT: paddb %xmm5, %xmm1 1727; SSE-NEXT: paddb %xmm6, %xmm2 1728; SSE-NEXT: paddb %xmm7, %xmm3 1729; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm3 1730; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm2 1731; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm1 1732; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm0 1733; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm0 1734; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm1 1735; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm2 1736; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm3 1737; SSE-NEXT: retq 1738; 1739; AVX2-LABEL: reassociate_umax_v64i8: 1740; AVX2: # %bb.0: 1741; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0 1742; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1 1743; AVX2-NEXT: vpmaxub %ymm6, %ymm4, %ymm2 1744; AVX2-NEXT: vpmaxub %ymm2, %ymm0, %ymm0 1745; AVX2-NEXT: vpmaxub %ymm7, %ymm5, %ymm2 1746; AVX2-NEXT: vpmaxub %ymm2, %ymm1, %ymm1 1747; AVX2-NEXT: retq 1748; 1749; AVX512-LABEL: reassociate_umax_v64i8: 1750; AVX512: # %bb.0: 1751; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm0 1752; AVX512-NEXT: vpmaxub %zmm3, %zmm2, %zmm1 1753; AVX512-NEXT: vpmaxub %zmm1, %zmm0, %zmm0 1754; AVX512-NEXT: retq 1755 1756 %t0 = add <64 x i8> %x0, %x1 1757 %t1 = icmp ugt <64 x i8> %x2, %t0 1758 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0 1759 %t3 = icmp ugt <64 x i8> %x3, %t2 1760 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2 1761 ret <64 x i8> %t4 1762} 1763 1764define <32 x i16> @reassociate_umax_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) { 1765; SSE-LABEL: reassociate_umax_v32i16: 1766; SSE: # %bb.0: 1767; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 1768; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 1769; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 1770; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 1771; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 1772; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 1773; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 1774; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 1775; SSE-NEXT: paddw %xmm4, %xmm0 1776; SSE-NEXT: paddw %xmm5, %xmm1 1777; SSE-NEXT: paddw %xmm6, %xmm2 1778; SSE-NEXT: paddw %xmm7, %xmm3 1779; SSE-NEXT: psubusw %xmm15, %xmm3 1780; SSE-NEXT: paddw %xmm15, %xmm3 1781; SSE-NEXT: psubusw %xmm14, %xmm2 1782; SSE-NEXT: paddw %xmm14, %xmm2 1783; SSE-NEXT: psubusw %xmm13, %xmm1 1784; SSE-NEXT: paddw %xmm13, %xmm1 1785; SSE-NEXT: psubusw %xmm12, %xmm0 1786; SSE-NEXT: paddw %xmm12, %xmm0 1787; SSE-NEXT: psubusw %xmm11, %xmm0 1788; SSE-NEXT: paddw %xmm11, %xmm0 1789; SSE-NEXT: psubusw %xmm10, %xmm1 1790; SSE-NEXT: paddw %xmm10, %xmm1 1791; SSE-NEXT: psubusw %xmm9, %xmm2 1792; SSE-NEXT: paddw %xmm9, %xmm2 1793; SSE-NEXT: psubusw %xmm8, %xmm3 1794; SSE-NEXT: paddw %xmm8, %xmm3 1795; SSE-NEXT: retq 1796; 1797; AVX2-LABEL: reassociate_umax_v32i16: 1798; AVX2: # %bb.0: 1799; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 1800; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm1 1801; AVX2-NEXT: vpmaxuw %ymm6, %ymm4, %ymm2 1802; AVX2-NEXT: vpmaxuw %ymm2, %ymm0, %ymm0 1803; AVX2-NEXT: vpmaxuw %ymm7, %ymm5, %ymm2 1804; AVX2-NEXT: vpmaxuw %ymm2, %ymm1, %ymm1 1805; AVX2-NEXT: retq 1806; 1807; AVX512-LABEL: reassociate_umax_v32i16: 1808; AVX512: # %bb.0: 1809; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm0 1810; AVX512-NEXT: vpmaxuw %zmm3, %zmm2, %zmm1 1811; AVX512-NEXT: vpmaxuw %zmm1, %zmm0, %zmm0 1812; AVX512-NEXT: retq 1813 1814 %t0 = add <32 x i16> %x0, %x1 1815 %t1 = icmp ugt <32 x i16> %x2, %t0 1816 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0 1817 %t3 = icmp ugt <32 x i16> %x3, %t2 1818 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2 1819 ret <32 x i16> %t4 1820} 1821 1822define <16 x i32> @reassociate_umax_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) { 1823; SSE-LABEL: reassociate_umax_v16i32: 1824; SSE: # %bb.0: 1825; SSE-NEXT: movdqa %xmm7, %xmm9 1826; SSE-NEXT: movdqa %xmm4, %xmm7 1827; SSE-NEXT: movdqa %xmm3, %xmm8 1828; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 1829; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 1830; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 1831; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 1832; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 1833; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 1834; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm4 1835; SSE-NEXT: paddd %xmm7, %xmm0 1836; SSE-NEXT: paddd %xmm5, %xmm1 1837; SSE-NEXT: paddd %xmm6, %xmm2 1838; SSE-NEXT: paddd %xmm9, %xmm8 1839; SSE-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 1840; SSE-NEXT: movdqa %xmm4, %xmm6 1841; SSE-NEXT: pxor %xmm3, %xmm6 1842; SSE-NEXT: movdqa %xmm8, %xmm5 1843; SSE-NEXT: pxor %xmm3, %xmm5 1844; SSE-NEXT: pcmpgtd %xmm5, %xmm6 1845; SSE-NEXT: pand %xmm6, %xmm4 1846; SSE-NEXT: pandn %xmm8, %xmm6 1847; SSE-NEXT: por %xmm4, %xmm6 1848; SSE-NEXT: movdqa %xmm15, %xmm5 1849; SSE-NEXT: pxor %xmm3, %xmm5 1850; SSE-NEXT: movdqa %xmm2, %xmm4 1851; SSE-NEXT: pxor %xmm3, %xmm4 1852; SSE-NEXT: pcmpgtd %xmm4, %xmm5 1853; SSE-NEXT: pand %xmm5, %xmm15 1854; SSE-NEXT: pandn %xmm2, %xmm5 1855; SSE-NEXT: por %xmm15, %xmm5 1856; SSE-NEXT: movdqa %xmm14, %xmm2 1857; SSE-NEXT: pxor %xmm3, %xmm2 1858; SSE-NEXT: movdqa %xmm1, %xmm4 1859; SSE-NEXT: pxor %xmm3, %xmm4 1860; SSE-NEXT: pcmpgtd %xmm4, %xmm2 1861; SSE-NEXT: pand %xmm2, %xmm14 1862; SSE-NEXT: pandn %xmm1, %xmm2 1863; SSE-NEXT: por %xmm14, %xmm2 1864; SSE-NEXT: movdqa %xmm13, %xmm1 1865; SSE-NEXT: pxor %xmm3, %xmm1 1866; SSE-NEXT: movdqa %xmm0, %xmm4 1867; SSE-NEXT: pxor %xmm3, %xmm4 1868; SSE-NEXT: pcmpgtd %xmm4, %xmm1 1869; SSE-NEXT: pand %xmm1, %xmm13 1870; SSE-NEXT: pandn %xmm0, %xmm1 1871; SSE-NEXT: por %xmm13, %xmm1 1872; SSE-NEXT: movdqa %xmm1, %xmm4 1873; SSE-NEXT: pxor %xmm3, %xmm4 1874; SSE-NEXT: movdqa %xmm12, %xmm0 1875; SSE-NEXT: pxor %xmm3, %xmm0 1876; SSE-NEXT: pcmpgtd %xmm4, %xmm0 1877; SSE-NEXT: pand %xmm0, %xmm12 1878; SSE-NEXT: pandn %xmm1, %xmm0 1879; SSE-NEXT: por %xmm12, %xmm0 1880; SSE-NEXT: movdqa %xmm2, %xmm4 1881; SSE-NEXT: pxor %xmm3, %xmm4 1882; SSE-NEXT: movdqa %xmm11, %xmm1 1883; SSE-NEXT: pxor %xmm3, %xmm1 1884; SSE-NEXT: pcmpgtd %xmm4, %xmm1 1885; SSE-NEXT: pand %xmm1, %xmm11 1886; SSE-NEXT: pandn %xmm2, %xmm1 1887; SSE-NEXT: por %xmm11, %xmm1 1888; SSE-NEXT: movdqa %xmm5, %xmm4 1889; SSE-NEXT: pxor %xmm3, %xmm4 1890; SSE-NEXT: movdqa %xmm10, %xmm2 1891; SSE-NEXT: pxor %xmm3, %xmm2 1892; SSE-NEXT: pcmpgtd %xmm4, %xmm2 1893; SSE-NEXT: pand %xmm2, %xmm10 1894; SSE-NEXT: pandn %xmm5, %xmm2 1895; SSE-NEXT: por %xmm10, %xmm2 1896; SSE-NEXT: movdqa %xmm6, %xmm4 1897; SSE-NEXT: pxor %xmm3, %xmm4 1898; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 1899; SSE-NEXT: pxor %xmm5, %xmm3 1900; SSE-NEXT: pcmpgtd %xmm4, %xmm3 1901; SSE-NEXT: pand %xmm3, %xmm5 1902; SSE-NEXT: pandn %xmm6, %xmm3 1903; SSE-NEXT: por %xmm5, %xmm3 1904; SSE-NEXT: retq 1905; 1906; AVX2-LABEL: reassociate_umax_v16i32: 1907; AVX2: # %bb.0: 1908; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 1909; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 1910; AVX2-NEXT: vpmaxud %ymm6, %ymm4, %ymm2 1911; AVX2-NEXT: vpmaxud %ymm2, %ymm0, %ymm0 1912; AVX2-NEXT: vpmaxud %ymm7, %ymm5, %ymm2 1913; AVX2-NEXT: vpmaxud %ymm2, %ymm1, %ymm1 1914; AVX2-NEXT: retq 1915; 1916; AVX512-LABEL: reassociate_umax_v16i32: 1917; AVX512: # %bb.0: 1918; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 1919; AVX512-NEXT: vpmaxud %zmm3, %zmm2, %zmm1 1920; AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm0 1921; AVX512-NEXT: retq 1922 1923 %t0 = add <16 x i32> %x0, %x1 1924 %t1 = icmp ugt <16 x i32> %x2, %t0 1925 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0 1926 %t3 = icmp ugt <16 x i32> %x3, %t2 1927 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2 1928 ret <16 x i32> %t4 1929} 1930 1931define <8 x i64> @reassociate_umax_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) { 1932; SSE-LABEL: reassociate_umax_v8i64: 1933; SSE: # %bb.0: 1934; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 1935; SSE-NEXT: paddq %xmm4, %xmm0 1936; SSE-NEXT: paddq %xmm5, %xmm1 1937; SSE-NEXT: paddq %xmm6, %xmm2 1938; SSE-NEXT: paddq %xmm7, %xmm3 1939; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] 1940; SSE-NEXT: movdqa %xmm8, %xmm5 1941; SSE-NEXT: pxor %xmm4, %xmm5 1942; SSE-NEXT: movdqa %xmm3, %xmm6 1943; SSE-NEXT: pxor %xmm4, %xmm6 1944; SSE-NEXT: movdqa %xmm5, %xmm7 1945; SSE-NEXT: pcmpgtd %xmm6, %xmm7 1946; SSE-NEXT: pcmpeqd %xmm5, %xmm6 1947; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] 1948; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1949; SSE-NEXT: pand %xmm5, %xmm6 1950; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 1951; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3] 1952; SSE-NEXT: por %xmm6, %xmm9 1953; SSE-NEXT: pand %xmm9, %xmm8 1954; SSE-NEXT: pandn %xmm3, %xmm9 1955; SSE-NEXT: por %xmm8, %xmm9 1956; SSE-NEXT: movdqa %xmm5, %xmm3 1957; SSE-NEXT: pxor %xmm4, %xmm3 1958; SSE-NEXT: movdqa %xmm2, %xmm6 1959; SSE-NEXT: pxor %xmm4, %xmm6 1960; SSE-NEXT: movdqa %xmm3, %xmm7 1961; SSE-NEXT: pcmpgtd %xmm6, %xmm7 1962; SSE-NEXT: pcmpeqd %xmm3, %xmm6 1963; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] 1964; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1965; SSE-NEXT: pand %xmm3, %xmm6 1966; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm3 1967; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3] 1968; SSE-NEXT: por %xmm6, %xmm8 1969; SSE-NEXT: pand %xmm8, %xmm5 1970; SSE-NEXT: pandn %xmm2, %xmm8 1971; SSE-NEXT: por %xmm5, %xmm8 1972; SSE-NEXT: movdqa %xmm3, %xmm2 1973; SSE-NEXT: pxor %xmm4, %xmm2 1974; SSE-NEXT: movdqa %xmm1, %xmm5 1975; SSE-NEXT: pxor %xmm4, %xmm5 1976; SSE-NEXT: movdqa %xmm2, %xmm6 1977; SSE-NEXT: pcmpgtd %xmm5, %xmm6 1978; SSE-NEXT: pcmpeqd %xmm2, %xmm5 1979; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2] 1980; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1981; SSE-NEXT: pand %xmm2, %xmm5 1982; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 1983; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 1984; SSE-NEXT: por %xmm5, %xmm2 1985; SSE-NEXT: pand %xmm2, %xmm3 1986; SSE-NEXT: pandn %xmm1, %xmm2 1987; SSE-NEXT: por %xmm3, %xmm2 1988; SSE-NEXT: movdqa %xmm7, %xmm1 1989; SSE-NEXT: pxor %xmm4, %xmm1 1990; SSE-NEXT: movdqa %xmm0, %xmm3 1991; SSE-NEXT: pxor %xmm4, %xmm3 1992; SSE-NEXT: movdqa %xmm1, %xmm5 1993; SSE-NEXT: pcmpgtd %xmm3, %xmm5 1994; SSE-NEXT: pcmpeqd %xmm1, %xmm3 1995; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 1996; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1997; SSE-NEXT: pand %xmm1, %xmm3 1998; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 1999; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2000; SSE-NEXT: por %xmm3, %xmm5 2001; SSE-NEXT: pand %xmm5, %xmm7 2002; SSE-NEXT: pandn %xmm0, %xmm5 2003; SSE-NEXT: por %xmm7, %xmm5 2004; SSE-NEXT: movdqa %xmm5, %xmm0 2005; SSE-NEXT: pxor %xmm4, %xmm0 2006; SSE-NEXT: movdqa %xmm1, %xmm3 2007; SSE-NEXT: pxor %xmm4, %xmm3 2008; SSE-NEXT: movdqa %xmm3, %xmm6 2009; SSE-NEXT: pcmpgtd %xmm0, %xmm6 2010; SSE-NEXT: pcmpeqd %xmm0, %xmm3 2011; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 2012; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2013; SSE-NEXT: pand %xmm0, %xmm3 2014; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 2015; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 2016; SSE-NEXT: por %xmm3, %xmm0 2017; SSE-NEXT: pand %xmm0, %xmm1 2018; SSE-NEXT: pandn %xmm5, %xmm0 2019; SSE-NEXT: por %xmm1, %xmm0 2020; SSE-NEXT: movdqa %xmm2, %xmm1 2021; SSE-NEXT: pxor %xmm4, %xmm1 2022; SSE-NEXT: movdqa %xmm7, %xmm3 2023; SSE-NEXT: pxor %xmm4, %xmm3 2024; SSE-NEXT: movdqa %xmm3, %xmm5 2025; SSE-NEXT: pcmpgtd %xmm1, %xmm5 2026; SSE-NEXT: pcmpeqd %xmm1, %xmm3 2027; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 2028; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2029; SSE-NEXT: pand %xmm1, %xmm3 2030; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm6 2031; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 2032; SSE-NEXT: por %xmm3, %xmm1 2033; SSE-NEXT: pand %xmm1, %xmm7 2034; SSE-NEXT: pandn %xmm2, %xmm1 2035; SSE-NEXT: por %xmm7, %xmm1 2036; SSE-NEXT: movdqa %xmm8, %xmm2 2037; SSE-NEXT: pxor %xmm4, %xmm2 2038; SSE-NEXT: movdqa %xmm6, %xmm3 2039; SSE-NEXT: pxor %xmm4, %xmm3 2040; SSE-NEXT: movdqa %xmm3, %xmm5 2041; SSE-NEXT: pcmpgtd %xmm2, %xmm5 2042; SSE-NEXT: pcmpeqd %xmm2, %xmm3 2043; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2] 2044; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2045; SSE-NEXT: pand %xmm2, %xmm3 2046; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 2047; SSE-NEXT: por %xmm3, %xmm2 2048; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 2049; SSE-NEXT: pand %xmm2, %xmm6 2050; SSE-NEXT: pandn %xmm8, %xmm2 2051; SSE-NEXT: por %xmm6, %xmm2 2052; SSE-NEXT: movdqa %xmm9, %xmm3 2053; SSE-NEXT: pxor %xmm4, %xmm3 2054; SSE-NEXT: pxor %xmm5, %xmm4 2055; SSE-NEXT: movdqa %xmm4, %xmm6 2056; SSE-NEXT: pcmpgtd %xmm3, %xmm6 2057; SSE-NEXT: pcmpeqd %xmm3, %xmm4 2058; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2] 2059; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2060; SSE-NEXT: pand %xmm3, %xmm4 2061; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 2062; SSE-NEXT: por %xmm4, %xmm3 2063; SSE-NEXT: pand %xmm3, %xmm5 2064; SSE-NEXT: pandn %xmm9, %xmm3 2065; SSE-NEXT: por %xmm5, %xmm3 2066; SSE-NEXT: retq 2067; 2068; AVX2-LABEL: reassociate_umax_v8i64: 2069; AVX2: # %bb.0: 2070; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 2071; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 2072; AVX2-NEXT: vpxor %ymm3, %ymm5, %ymm8 2073; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm9 2074; AVX2-NEXT: vpcmpgtq %ymm9, %ymm8, %ymm8 2075; AVX2-NEXT: vblendvpd %ymm8, %ymm5, %ymm1, %ymm1 2076; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 2077; AVX2-NEXT: vpxor %ymm3, %ymm4, %ymm2 2078; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm5 2079; AVX2-NEXT: vpcmpgtq %ymm5, %ymm2, %ymm2 2080; AVX2-NEXT: vblendvpd %ymm2, %ymm4, %ymm0, %ymm0 2081; AVX2-NEXT: vxorpd %ymm3, %ymm0, %ymm2 2082; AVX2-NEXT: vpxor %ymm3, %ymm6, %ymm4 2083; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm2 2084; AVX2-NEXT: vblendvpd %ymm2, %ymm6, %ymm0, %ymm0 2085; AVX2-NEXT: vxorpd %ymm3, %ymm1, %ymm2 2086; AVX2-NEXT: vpxor %ymm3, %ymm7, %ymm3 2087; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2 2088; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm1 2089; AVX2-NEXT: retq 2090; 2091; AVX512-LABEL: reassociate_umax_v8i64: 2092; AVX512: # %bb.0: 2093; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 2094; AVX512-NEXT: vpmaxuq %zmm3, %zmm2, %zmm1 2095; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0 2096; AVX512-NEXT: retq 2097 2098 %t0 = add <8 x i64> %x0, %x1 2099 %t1 = icmp ugt <8 x i64> %x2, %t0 2100 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0 2101 %t3 = icmp ugt <8 x i64> %x3, %t2 2102 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2 2103 ret <8 x i64> %t4 2104} 2105 2106define <64 x i8> @reassociate_smax_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) { 2107; SSE-LABEL: reassociate_smax_v64i8: 2108; SSE: # %bb.0: 2109; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 2110; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 2111; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 2112; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 2113; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 2114; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 2115; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 2116; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 2117; SSE-NEXT: paddb %xmm4, %xmm0 2118; SSE-NEXT: paddb %xmm5, %xmm1 2119; SSE-NEXT: paddb %xmm6, %xmm2 2120; SSE-NEXT: paddb %xmm7, %xmm3 2121; SSE-NEXT: movdqa %xmm15, %xmm4 2122; SSE-NEXT: pcmpgtb %xmm3, %xmm4 2123; SSE-NEXT: pand %xmm4, %xmm15 2124; SSE-NEXT: pandn %xmm3, %xmm4 2125; SSE-NEXT: por %xmm15, %xmm4 2126; SSE-NEXT: movdqa %xmm14, %xmm3 2127; SSE-NEXT: pcmpgtb %xmm2, %xmm3 2128; SSE-NEXT: pand %xmm3, %xmm14 2129; SSE-NEXT: pandn %xmm2, %xmm3 2130; SSE-NEXT: por %xmm14, %xmm3 2131; SSE-NEXT: movdqa %xmm13, %xmm2 2132; SSE-NEXT: pcmpgtb %xmm1, %xmm2 2133; SSE-NEXT: pand %xmm2, %xmm13 2134; SSE-NEXT: pandn %xmm1, %xmm2 2135; SSE-NEXT: por %xmm13, %xmm2 2136; SSE-NEXT: movdqa %xmm12, %xmm1 2137; SSE-NEXT: pcmpgtb %xmm0, %xmm1 2138; SSE-NEXT: pand %xmm1, %xmm12 2139; SSE-NEXT: pandn %xmm0, %xmm1 2140; SSE-NEXT: por %xmm12, %xmm1 2141; SSE-NEXT: movdqa %xmm11, %xmm0 2142; SSE-NEXT: pcmpgtb %xmm1, %xmm0 2143; SSE-NEXT: pand %xmm0, %xmm11 2144; SSE-NEXT: pandn %xmm1, %xmm0 2145; SSE-NEXT: por %xmm11, %xmm0 2146; SSE-NEXT: movdqa %xmm10, %xmm1 2147; SSE-NEXT: pcmpgtb %xmm2, %xmm1 2148; SSE-NEXT: pand %xmm1, %xmm10 2149; SSE-NEXT: pandn %xmm2, %xmm1 2150; SSE-NEXT: por %xmm10, %xmm1 2151; SSE-NEXT: movdqa %xmm9, %xmm2 2152; SSE-NEXT: pcmpgtb %xmm3, %xmm2 2153; SSE-NEXT: pand %xmm2, %xmm9 2154; SSE-NEXT: pandn %xmm3, %xmm2 2155; SSE-NEXT: por %xmm9, %xmm2 2156; SSE-NEXT: movdqa %xmm8, %xmm3 2157; SSE-NEXT: pcmpgtb %xmm4, %xmm3 2158; SSE-NEXT: pand %xmm3, %xmm8 2159; SSE-NEXT: pandn %xmm4, %xmm3 2160; SSE-NEXT: por %xmm8, %xmm3 2161; SSE-NEXT: retq 2162; 2163; AVX2-LABEL: reassociate_smax_v64i8: 2164; AVX2: # %bb.0: 2165; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0 2166; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1 2167; AVX2-NEXT: vpmaxsb %ymm6, %ymm4, %ymm2 2168; AVX2-NEXT: vpmaxsb %ymm2, %ymm0, %ymm0 2169; AVX2-NEXT: vpmaxsb %ymm7, %ymm5, %ymm2 2170; AVX2-NEXT: vpmaxsb %ymm2, %ymm1, %ymm1 2171; AVX2-NEXT: retq 2172; 2173; AVX512-LABEL: reassociate_smax_v64i8: 2174; AVX512: # %bb.0: 2175; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm0 2176; AVX512-NEXT: vpmaxsb %zmm3, %zmm2, %zmm1 2177; AVX512-NEXT: vpmaxsb %zmm1, %zmm0, %zmm0 2178; AVX512-NEXT: retq 2179 2180 %t0 = add <64 x i8> %x0, %x1 2181 %t1 = icmp sgt <64 x i8> %x2, %t0 2182 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0 2183 %t3 = icmp sgt <64 x i8> %x3, %t2 2184 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2 2185 ret <64 x i8> %t4 2186} 2187 2188define <32 x i16> @reassociate_smax_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) { 2189; SSE-LABEL: reassociate_smax_v32i16: 2190; SSE: # %bb.0: 2191; SSE-NEXT: paddw %xmm4, %xmm0 2192; SSE-NEXT: paddw %xmm5, %xmm1 2193; SSE-NEXT: paddw %xmm6, %xmm2 2194; SSE-NEXT: paddw %xmm7, %xmm3 2195; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm3 2196; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm2 2197; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm1 2198; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm0 2199; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm0 2200; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm1 2201; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm2 2202; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm3 2203; SSE-NEXT: retq 2204; 2205; AVX2-LABEL: reassociate_smax_v32i16: 2206; AVX2: # %bb.0: 2207; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 2208; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm1 2209; AVX2-NEXT: vpmaxsw %ymm6, %ymm4, %ymm2 2210; AVX2-NEXT: vpmaxsw %ymm2, %ymm0, %ymm0 2211; AVX2-NEXT: vpmaxsw %ymm7, %ymm5, %ymm2 2212; AVX2-NEXT: vpmaxsw %ymm2, %ymm1, %ymm1 2213; AVX2-NEXT: retq 2214; 2215; AVX512-LABEL: reassociate_smax_v32i16: 2216; AVX512: # %bb.0: 2217; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm0 2218; AVX512-NEXT: vpmaxsw %zmm3, %zmm2, %zmm1 2219; AVX512-NEXT: vpmaxsw %zmm1, %zmm0, %zmm0 2220; AVX512-NEXT: retq 2221 2222 %t0 = add <32 x i16> %x0, %x1 2223 %t1 = icmp sgt <32 x i16> %x2, %t0 2224 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0 2225 %t3 = icmp sgt <32 x i16> %x3, %t2 2226 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2 2227 ret <32 x i16> %t4 2228} 2229 2230define <16 x i32> @reassociate_smax_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) { 2231; SSE-LABEL: reassociate_smax_v16i32: 2232; SSE: # %bb.0: 2233; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 2234; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 2235; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 2236; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 2237; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 2238; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 2239; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 2240; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 2241; SSE-NEXT: paddd %xmm4, %xmm0 2242; SSE-NEXT: paddd %xmm5, %xmm1 2243; SSE-NEXT: paddd %xmm6, %xmm2 2244; SSE-NEXT: paddd %xmm7, %xmm3 2245; SSE-NEXT: movdqa %xmm15, %xmm4 2246; SSE-NEXT: pcmpgtd %xmm3, %xmm4 2247; SSE-NEXT: pand %xmm4, %xmm15 2248; SSE-NEXT: pandn %xmm3, %xmm4 2249; SSE-NEXT: por %xmm15, %xmm4 2250; SSE-NEXT: movdqa %xmm14, %xmm3 2251; SSE-NEXT: pcmpgtd %xmm2, %xmm3 2252; SSE-NEXT: pand %xmm3, %xmm14 2253; SSE-NEXT: pandn %xmm2, %xmm3 2254; SSE-NEXT: por %xmm14, %xmm3 2255; SSE-NEXT: movdqa %xmm13, %xmm2 2256; SSE-NEXT: pcmpgtd %xmm1, %xmm2 2257; SSE-NEXT: pand %xmm2, %xmm13 2258; SSE-NEXT: pandn %xmm1, %xmm2 2259; SSE-NEXT: por %xmm13, %xmm2 2260; SSE-NEXT: movdqa %xmm12, %xmm1 2261; SSE-NEXT: pcmpgtd %xmm0, %xmm1 2262; SSE-NEXT: pand %xmm1, %xmm12 2263; SSE-NEXT: pandn %xmm0, %xmm1 2264; SSE-NEXT: por %xmm12, %xmm1 2265; SSE-NEXT: movdqa %xmm11, %xmm0 2266; SSE-NEXT: pcmpgtd %xmm1, %xmm0 2267; SSE-NEXT: pand %xmm0, %xmm11 2268; SSE-NEXT: pandn %xmm1, %xmm0 2269; SSE-NEXT: por %xmm11, %xmm0 2270; SSE-NEXT: movdqa %xmm10, %xmm1 2271; SSE-NEXT: pcmpgtd %xmm2, %xmm1 2272; SSE-NEXT: pand %xmm1, %xmm10 2273; SSE-NEXT: pandn %xmm2, %xmm1 2274; SSE-NEXT: por %xmm10, %xmm1 2275; SSE-NEXT: movdqa %xmm9, %xmm2 2276; SSE-NEXT: pcmpgtd %xmm3, %xmm2 2277; SSE-NEXT: pand %xmm2, %xmm9 2278; SSE-NEXT: pandn %xmm3, %xmm2 2279; SSE-NEXT: por %xmm9, %xmm2 2280; SSE-NEXT: movdqa %xmm8, %xmm3 2281; SSE-NEXT: pcmpgtd %xmm4, %xmm3 2282; SSE-NEXT: pand %xmm3, %xmm8 2283; SSE-NEXT: pandn %xmm4, %xmm3 2284; SSE-NEXT: por %xmm8, %xmm3 2285; SSE-NEXT: retq 2286; 2287; AVX2-LABEL: reassociate_smax_v16i32: 2288; AVX2: # %bb.0: 2289; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 2290; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 2291; AVX2-NEXT: vpmaxsd %ymm6, %ymm4, %ymm2 2292; AVX2-NEXT: vpmaxsd %ymm2, %ymm0, %ymm0 2293; AVX2-NEXT: vpmaxsd %ymm7, %ymm5, %ymm2 2294; AVX2-NEXT: vpmaxsd %ymm2, %ymm1, %ymm1 2295; AVX2-NEXT: retq 2296; 2297; AVX512-LABEL: reassociate_smax_v16i32: 2298; AVX512: # %bb.0: 2299; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 2300; AVX512-NEXT: vpmaxsd %zmm3, %zmm2, %zmm1 2301; AVX512-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0 2302; AVX512-NEXT: retq 2303 2304 %t0 = add <16 x i32> %x0, %x1 2305 %t1 = icmp sgt <16 x i32> %x2, %t0 2306 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0 2307 %t3 = icmp sgt <16 x i32> %x3, %t2 2308 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2 2309 ret <16 x i32> %t4 2310} 2311 2312define <8 x i64> @reassociate_smax_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) { 2313; SSE-LABEL: reassociate_smax_v8i64: 2314; SSE: # %bb.0: 2315; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 2316; SSE-NEXT: paddq %xmm4, %xmm0 2317; SSE-NEXT: paddq %xmm5, %xmm1 2318; SSE-NEXT: paddq %xmm6, %xmm2 2319; SSE-NEXT: paddq %xmm7, %xmm3 2320; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] 2321; SSE-NEXT: movdqa %xmm8, %xmm5 2322; SSE-NEXT: pxor %xmm4, %xmm5 2323; SSE-NEXT: movdqa %xmm3, %xmm6 2324; SSE-NEXT: pxor %xmm4, %xmm6 2325; SSE-NEXT: movdqa %xmm5, %xmm7 2326; SSE-NEXT: pcmpgtd %xmm6, %xmm7 2327; SSE-NEXT: pcmpeqd %xmm5, %xmm6 2328; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] 2329; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2330; SSE-NEXT: pand %xmm5, %xmm6 2331; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 2332; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3] 2333; SSE-NEXT: por %xmm6, %xmm9 2334; SSE-NEXT: pand %xmm9, %xmm8 2335; SSE-NEXT: pandn %xmm3, %xmm9 2336; SSE-NEXT: por %xmm8, %xmm9 2337; SSE-NEXT: movdqa %xmm5, %xmm3 2338; SSE-NEXT: pxor %xmm4, %xmm3 2339; SSE-NEXT: movdqa %xmm2, %xmm6 2340; SSE-NEXT: pxor %xmm4, %xmm6 2341; SSE-NEXT: movdqa %xmm3, %xmm7 2342; SSE-NEXT: pcmpgtd %xmm6, %xmm7 2343; SSE-NEXT: pcmpeqd %xmm3, %xmm6 2344; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] 2345; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2346; SSE-NEXT: pand %xmm3, %xmm6 2347; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm3 2348; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3] 2349; SSE-NEXT: por %xmm6, %xmm8 2350; SSE-NEXT: pand %xmm8, %xmm5 2351; SSE-NEXT: pandn %xmm2, %xmm8 2352; SSE-NEXT: por %xmm5, %xmm8 2353; SSE-NEXT: movdqa %xmm3, %xmm2 2354; SSE-NEXT: pxor %xmm4, %xmm2 2355; SSE-NEXT: movdqa %xmm1, %xmm5 2356; SSE-NEXT: pxor %xmm4, %xmm5 2357; SSE-NEXT: movdqa %xmm2, %xmm6 2358; SSE-NEXT: pcmpgtd %xmm5, %xmm6 2359; SSE-NEXT: pcmpeqd %xmm2, %xmm5 2360; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2] 2361; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2362; SSE-NEXT: pand %xmm2, %xmm5 2363; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 2364; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 2365; SSE-NEXT: por %xmm5, %xmm2 2366; SSE-NEXT: pand %xmm2, %xmm3 2367; SSE-NEXT: pandn %xmm1, %xmm2 2368; SSE-NEXT: por %xmm3, %xmm2 2369; SSE-NEXT: movdqa %xmm7, %xmm1 2370; SSE-NEXT: pxor %xmm4, %xmm1 2371; SSE-NEXT: movdqa %xmm0, %xmm3 2372; SSE-NEXT: pxor %xmm4, %xmm3 2373; SSE-NEXT: movdqa %xmm1, %xmm5 2374; SSE-NEXT: pcmpgtd %xmm3, %xmm5 2375; SSE-NEXT: pcmpeqd %xmm1, %xmm3 2376; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 2377; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2378; SSE-NEXT: pand %xmm1, %xmm3 2379; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 2380; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2381; SSE-NEXT: por %xmm3, %xmm5 2382; SSE-NEXT: pand %xmm5, %xmm7 2383; SSE-NEXT: pandn %xmm0, %xmm5 2384; SSE-NEXT: por %xmm7, %xmm5 2385; SSE-NEXT: movdqa %xmm5, %xmm0 2386; SSE-NEXT: pxor %xmm4, %xmm0 2387; SSE-NEXT: movdqa %xmm1, %xmm3 2388; SSE-NEXT: pxor %xmm4, %xmm3 2389; SSE-NEXT: movdqa %xmm3, %xmm6 2390; SSE-NEXT: pcmpgtd %xmm0, %xmm6 2391; SSE-NEXT: pcmpeqd %xmm0, %xmm3 2392; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 2393; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2394; SSE-NEXT: pand %xmm0, %xmm3 2395; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 2396; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 2397; SSE-NEXT: por %xmm3, %xmm0 2398; SSE-NEXT: pand %xmm0, %xmm1 2399; SSE-NEXT: pandn %xmm5, %xmm0 2400; SSE-NEXT: por %xmm1, %xmm0 2401; SSE-NEXT: movdqa %xmm2, %xmm1 2402; SSE-NEXT: pxor %xmm4, %xmm1 2403; SSE-NEXT: movdqa %xmm7, %xmm3 2404; SSE-NEXT: pxor %xmm4, %xmm3 2405; SSE-NEXT: movdqa %xmm3, %xmm5 2406; SSE-NEXT: pcmpgtd %xmm1, %xmm5 2407; SSE-NEXT: pcmpeqd %xmm1, %xmm3 2408; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 2409; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2410; SSE-NEXT: pand %xmm1, %xmm3 2411; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm6 2412; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 2413; SSE-NEXT: por %xmm3, %xmm1 2414; SSE-NEXT: pand %xmm1, %xmm7 2415; SSE-NEXT: pandn %xmm2, %xmm1 2416; SSE-NEXT: por %xmm7, %xmm1 2417; SSE-NEXT: movdqa %xmm8, %xmm2 2418; SSE-NEXT: pxor %xmm4, %xmm2 2419; SSE-NEXT: movdqa %xmm6, %xmm3 2420; SSE-NEXT: pxor %xmm4, %xmm3 2421; SSE-NEXT: movdqa %xmm3, %xmm5 2422; SSE-NEXT: pcmpgtd %xmm2, %xmm5 2423; SSE-NEXT: pcmpeqd %xmm2, %xmm3 2424; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2] 2425; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2426; SSE-NEXT: pand %xmm2, %xmm3 2427; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 2428; SSE-NEXT: por %xmm3, %xmm2 2429; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 2430; SSE-NEXT: pand %xmm2, %xmm6 2431; SSE-NEXT: pandn %xmm8, %xmm2 2432; SSE-NEXT: por %xmm6, %xmm2 2433; SSE-NEXT: movdqa %xmm9, %xmm3 2434; SSE-NEXT: pxor %xmm4, %xmm3 2435; SSE-NEXT: pxor %xmm5, %xmm4 2436; SSE-NEXT: movdqa %xmm4, %xmm6 2437; SSE-NEXT: pcmpgtd %xmm3, %xmm6 2438; SSE-NEXT: pcmpeqd %xmm3, %xmm4 2439; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2] 2440; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2441; SSE-NEXT: pand %xmm3, %xmm4 2442; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 2443; SSE-NEXT: por %xmm4, %xmm3 2444; SSE-NEXT: pand %xmm3, %xmm5 2445; SSE-NEXT: pandn %xmm9, %xmm3 2446; SSE-NEXT: por %xmm5, %xmm3 2447; SSE-NEXT: retq 2448; 2449; AVX2-LABEL: reassociate_smax_v8i64: 2450; AVX2: # %bb.0: 2451; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 2452; AVX2-NEXT: vpcmpgtq %ymm1, %ymm5, %ymm3 2453; AVX2-NEXT: vblendvpd %ymm3, %ymm5, %ymm1, %ymm1 2454; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 2455; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm2 2456; AVX2-NEXT: vblendvpd %ymm2, %ymm4, %ymm0, %ymm0 2457; AVX2-NEXT: vpcmpgtq %ymm0, %ymm6, %ymm2 2458; AVX2-NEXT: vblendvpd %ymm2, %ymm6, %ymm0, %ymm0 2459; AVX2-NEXT: vpcmpgtq %ymm1, %ymm7, %ymm2 2460; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm1 2461; AVX2-NEXT: retq 2462; 2463; AVX512-LABEL: reassociate_smax_v8i64: 2464; AVX512: # %bb.0: 2465; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 2466; AVX512-NEXT: vpmaxsq %zmm3, %zmm2, %zmm1 2467; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 2468; AVX512-NEXT: retq 2469 2470 %t0 = add <8 x i64> %x0, %x1 2471 %t1 = icmp sgt <8 x i64> %x2, %t0 2472 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0 2473 %t3 = icmp sgt <8 x i64> %x3, %t2 2474 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2 2475 ret <8 x i64> %t4 2476} 2477 2478define <64 x i8> @reassociate_umin_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) { 2479; SSE-LABEL: reassociate_umin_v64i8: 2480; SSE: # %bb.0: 2481; SSE-NEXT: paddb %xmm4, %xmm0 2482; SSE-NEXT: paddb %xmm5, %xmm1 2483; SSE-NEXT: paddb %xmm6, %xmm2 2484; SSE-NEXT: paddb %xmm7, %xmm3 2485; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm3 2486; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm2 2487; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm1 2488; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm0 2489; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm0 2490; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm1 2491; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm2 2492; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm3 2493; SSE-NEXT: retq 2494; 2495; AVX2-LABEL: reassociate_umin_v64i8: 2496; AVX2: # %bb.0: 2497; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0 2498; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1 2499; AVX2-NEXT: vpminub %ymm6, %ymm4, %ymm2 2500; AVX2-NEXT: vpminub %ymm2, %ymm0, %ymm0 2501; AVX2-NEXT: vpminub %ymm7, %ymm5, %ymm2 2502; AVX2-NEXT: vpminub %ymm2, %ymm1, %ymm1 2503; AVX2-NEXT: retq 2504; 2505; AVX512-LABEL: reassociate_umin_v64i8: 2506; AVX512: # %bb.0: 2507; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm0 2508; AVX512-NEXT: vpminub %zmm3, %zmm2, %zmm1 2509; AVX512-NEXT: vpminub %zmm1, %zmm0, %zmm0 2510; AVX512-NEXT: retq 2511 2512 %t0 = add <64 x i8> %x0, %x1 2513 %t1 = icmp ult <64 x i8> %x2, %t0 2514 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0 2515 %t3 = icmp ult <64 x i8> %x3, %t2 2516 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2 2517 ret <64 x i8> %t4 2518} 2519 2520define <32 x i16> @reassociate_umin_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) { 2521; SSE-LABEL: reassociate_umin_v32i16: 2522; SSE: # %bb.0: 2523; SSE-NEXT: movdqa %xmm3, %xmm8 2524; SSE-NEXT: movdqa %xmm2, %xmm9 2525; SSE-NEXT: movdqa %xmm1, %xmm10 2526; SSE-NEXT: movdqa %xmm0, %xmm11 2527; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm3 2528; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm2 2529; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 2530; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0 2531; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 2532; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 2533; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 2534; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 2535; SSE-NEXT: paddw %xmm4, %xmm11 2536; SSE-NEXT: paddw %xmm5, %xmm10 2537; SSE-NEXT: paddw %xmm6, %xmm9 2538; SSE-NEXT: paddw %xmm7, %xmm8 2539; SSE-NEXT: movdqa %xmm12, %xmm4 2540; SSE-NEXT: psubusw %xmm8, %xmm4 2541; SSE-NEXT: psubw %xmm4, %xmm12 2542; SSE-NEXT: movdqa %xmm13, %xmm4 2543; SSE-NEXT: psubusw %xmm9, %xmm4 2544; SSE-NEXT: psubw %xmm4, %xmm13 2545; SSE-NEXT: movdqa %xmm15, %xmm4 2546; SSE-NEXT: psubusw %xmm10, %xmm4 2547; SSE-NEXT: psubw %xmm4, %xmm15 2548; SSE-NEXT: movdqa %xmm14, %xmm4 2549; SSE-NEXT: psubusw %xmm11, %xmm4 2550; SSE-NEXT: psubw %xmm4, %xmm14 2551; SSE-NEXT: movdqa %xmm0, %xmm4 2552; SSE-NEXT: psubusw %xmm14, %xmm4 2553; SSE-NEXT: psubw %xmm4, %xmm0 2554; SSE-NEXT: movdqa %xmm1, %xmm4 2555; SSE-NEXT: psubusw %xmm15, %xmm4 2556; SSE-NEXT: psubw %xmm4, %xmm1 2557; SSE-NEXT: movdqa %xmm2, %xmm4 2558; SSE-NEXT: psubusw %xmm13, %xmm4 2559; SSE-NEXT: psubw %xmm4, %xmm2 2560; SSE-NEXT: movdqa %xmm3, %xmm4 2561; SSE-NEXT: psubusw %xmm12, %xmm4 2562; SSE-NEXT: psubw %xmm4, %xmm3 2563; SSE-NEXT: retq 2564; 2565; AVX2-LABEL: reassociate_umin_v32i16: 2566; AVX2: # %bb.0: 2567; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 2568; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm1 2569; AVX2-NEXT: vpminuw %ymm6, %ymm4, %ymm2 2570; AVX2-NEXT: vpminuw %ymm2, %ymm0, %ymm0 2571; AVX2-NEXT: vpminuw %ymm7, %ymm5, %ymm2 2572; AVX2-NEXT: vpminuw %ymm2, %ymm1, %ymm1 2573; AVX2-NEXT: retq 2574; 2575; AVX512-LABEL: reassociate_umin_v32i16: 2576; AVX512: # %bb.0: 2577; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm0 2578; AVX512-NEXT: vpminuw %zmm3, %zmm2, %zmm1 2579; AVX512-NEXT: vpminuw %zmm1, %zmm0, %zmm0 2580; AVX512-NEXT: retq 2581 2582 %t0 = add <32 x i16> %x0, %x1 2583 %t1 = icmp ult <32 x i16> %x2, %t0 2584 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0 2585 %t3 = icmp ult <32 x i16> %x3, %t2 2586 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2 2587 ret <32 x i16> %t4 2588} 2589 2590define <16 x i32> @reassociate_umin_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) { 2591; SSE-LABEL: reassociate_umin_v16i32: 2592; SSE: # %bb.0: 2593; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 2594; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 2595; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 2596; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 2597; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 2598; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 2599; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 2600; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 2601; SSE-NEXT: paddd %xmm4, %xmm0 2602; SSE-NEXT: paddd %xmm5, %xmm1 2603; SSE-NEXT: paddd %xmm6, %xmm2 2604; SSE-NEXT: paddd %xmm7, %xmm3 2605; SSE-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648] 2606; SSE-NEXT: movdqa %xmm15, %xmm6 2607; SSE-NEXT: pxor %xmm5, %xmm6 2608; SSE-NEXT: movdqa %xmm3, %xmm4 2609; SSE-NEXT: pxor %xmm5, %xmm4 2610; SSE-NEXT: pcmpgtd %xmm6, %xmm4 2611; SSE-NEXT: pand %xmm4, %xmm15 2612; SSE-NEXT: pandn %xmm3, %xmm4 2613; SSE-NEXT: por %xmm15, %xmm4 2614; SSE-NEXT: movdqa %xmm14, %xmm6 2615; SSE-NEXT: pxor %xmm5, %xmm6 2616; SSE-NEXT: movdqa %xmm2, %xmm3 2617; SSE-NEXT: pxor %xmm5, %xmm3 2618; SSE-NEXT: pcmpgtd %xmm6, %xmm3 2619; SSE-NEXT: pand %xmm3, %xmm14 2620; SSE-NEXT: pandn %xmm2, %xmm3 2621; SSE-NEXT: por %xmm14, %xmm3 2622; SSE-NEXT: movdqa %xmm13, %xmm6 2623; SSE-NEXT: pxor %xmm5, %xmm6 2624; SSE-NEXT: movdqa %xmm1, %xmm2 2625; SSE-NEXT: pxor %xmm5, %xmm2 2626; SSE-NEXT: pcmpgtd %xmm6, %xmm2 2627; SSE-NEXT: pand %xmm2, %xmm13 2628; SSE-NEXT: pandn %xmm1, %xmm2 2629; SSE-NEXT: por %xmm13, %xmm2 2630; SSE-NEXT: movdqa %xmm12, %xmm1 2631; SSE-NEXT: pxor %xmm5, %xmm1 2632; SSE-NEXT: movdqa %xmm0, %xmm6 2633; SSE-NEXT: pxor %xmm5, %xmm6 2634; SSE-NEXT: pcmpgtd %xmm1, %xmm6 2635; SSE-NEXT: pand %xmm6, %xmm12 2636; SSE-NEXT: pandn %xmm0, %xmm6 2637; SSE-NEXT: por %xmm12, %xmm6 2638; SSE-NEXT: movdqa %xmm6, %xmm0 2639; SSE-NEXT: pxor %xmm5, %xmm0 2640; SSE-NEXT: movdqa %xmm11, %xmm1 2641; SSE-NEXT: pxor %xmm5, %xmm1 2642; SSE-NEXT: pcmpgtd %xmm1, %xmm0 2643; SSE-NEXT: pand %xmm0, %xmm11 2644; SSE-NEXT: pandn %xmm6, %xmm0 2645; SSE-NEXT: por %xmm11, %xmm0 2646; SSE-NEXT: movdqa %xmm2, %xmm1 2647; SSE-NEXT: pxor %xmm5, %xmm1 2648; SSE-NEXT: movdqa %xmm10, %xmm6 2649; SSE-NEXT: pxor %xmm5, %xmm6 2650; SSE-NEXT: pcmpgtd %xmm6, %xmm1 2651; SSE-NEXT: pand %xmm1, %xmm10 2652; SSE-NEXT: pandn %xmm2, %xmm1 2653; SSE-NEXT: por %xmm10, %xmm1 2654; SSE-NEXT: movdqa %xmm3, %xmm2 2655; SSE-NEXT: pxor %xmm5, %xmm2 2656; SSE-NEXT: movdqa %xmm9, %xmm6 2657; SSE-NEXT: pxor %xmm5, %xmm6 2658; SSE-NEXT: pcmpgtd %xmm6, %xmm2 2659; SSE-NEXT: pand %xmm2, %xmm9 2660; SSE-NEXT: pandn %xmm3, %xmm2 2661; SSE-NEXT: por %xmm9, %xmm2 2662; SSE-NEXT: movdqa %xmm4, %xmm3 2663; SSE-NEXT: pxor %xmm5, %xmm3 2664; SSE-NEXT: pxor %xmm8, %xmm5 2665; SSE-NEXT: pcmpgtd %xmm5, %xmm3 2666; SSE-NEXT: pand %xmm3, %xmm8 2667; SSE-NEXT: pandn %xmm4, %xmm3 2668; SSE-NEXT: por %xmm8, %xmm3 2669; SSE-NEXT: retq 2670; 2671; AVX2-LABEL: reassociate_umin_v16i32: 2672; AVX2: # %bb.0: 2673; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 2674; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 2675; AVX2-NEXT: vpminud %ymm6, %ymm4, %ymm2 2676; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 2677; AVX2-NEXT: vpminud %ymm7, %ymm5, %ymm2 2678; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 2679; AVX2-NEXT: retq 2680; 2681; AVX512-LABEL: reassociate_umin_v16i32: 2682; AVX512: # %bb.0: 2683; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 2684; AVX512-NEXT: vpminud %zmm3, %zmm2, %zmm1 2685; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 2686; AVX512-NEXT: retq 2687 2688 %t0 = add <16 x i32> %x0, %x1 2689 %t1 = icmp ult <16 x i32> %x2, %t0 2690 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0 2691 %t3 = icmp ult <16 x i32> %x3, %t2 2692 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2 2693 ret <16 x i32> %t4 2694} 2695 2696define <8 x i64> @reassociate_umin_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) { 2697; SSE-LABEL: reassociate_umin_v8i64: 2698; SSE: # %bb.0: 2699; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 2700; SSE-NEXT: paddq %xmm4, %xmm0 2701; SSE-NEXT: paddq %xmm5, %xmm1 2702; SSE-NEXT: paddq %xmm6, %xmm2 2703; SSE-NEXT: paddq %xmm7, %xmm3 2704; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] 2705; SSE-NEXT: movdqa %xmm8, %xmm5 2706; SSE-NEXT: pxor %xmm4, %xmm5 2707; SSE-NEXT: movdqa %xmm3, %xmm6 2708; SSE-NEXT: pxor %xmm4, %xmm6 2709; SSE-NEXT: movdqa %xmm6, %xmm7 2710; SSE-NEXT: pcmpgtd %xmm5, %xmm7 2711; SSE-NEXT: pcmpeqd %xmm5, %xmm6 2712; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] 2713; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2714; SSE-NEXT: pand %xmm5, %xmm6 2715; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 2716; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3] 2717; SSE-NEXT: por %xmm6, %xmm9 2718; SSE-NEXT: pand %xmm9, %xmm8 2719; SSE-NEXT: pandn %xmm3, %xmm9 2720; SSE-NEXT: por %xmm8, %xmm9 2721; SSE-NEXT: movdqa %xmm5, %xmm3 2722; SSE-NEXT: pxor %xmm4, %xmm3 2723; SSE-NEXT: movdqa %xmm2, %xmm6 2724; SSE-NEXT: pxor %xmm4, %xmm6 2725; SSE-NEXT: movdqa %xmm6, %xmm7 2726; SSE-NEXT: pcmpgtd %xmm3, %xmm7 2727; SSE-NEXT: pcmpeqd %xmm3, %xmm6 2728; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] 2729; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2730; SSE-NEXT: pand %xmm3, %xmm6 2731; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm3 2732; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3] 2733; SSE-NEXT: por %xmm6, %xmm8 2734; SSE-NEXT: pand %xmm8, %xmm5 2735; SSE-NEXT: pandn %xmm2, %xmm8 2736; SSE-NEXT: por %xmm5, %xmm8 2737; SSE-NEXT: movdqa %xmm3, %xmm2 2738; SSE-NEXT: pxor %xmm4, %xmm2 2739; SSE-NEXT: movdqa %xmm1, %xmm5 2740; SSE-NEXT: pxor %xmm4, %xmm5 2741; SSE-NEXT: movdqa %xmm5, %xmm6 2742; SSE-NEXT: pcmpgtd %xmm2, %xmm6 2743; SSE-NEXT: pcmpeqd %xmm2, %xmm5 2744; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2] 2745; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2746; SSE-NEXT: pand %xmm2, %xmm5 2747; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 2748; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 2749; SSE-NEXT: por %xmm5, %xmm2 2750; SSE-NEXT: pand %xmm2, %xmm3 2751; SSE-NEXT: pandn %xmm1, %xmm2 2752; SSE-NEXT: por %xmm3, %xmm2 2753; SSE-NEXT: movdqa %xmm7, %xmm1 2754; SSE-NEXT: pxor %xmm4, %xmm1 2755; SSE-NEXT: movdqa %xmm0, %xmm3 2756; SSE-NEXT: pxor %xmm4, %xmm3 2757; SSE-NEXT: movdqa %xmm3, %xmm5 2758; SSE-NEXT: pcmpgtd %xmm1, %xmm5 2759; SSE-NEXT: pcmpeqd %xmm1, %xmm3 2760; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 2761; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2762; SSE-NEXT: pand %xmm1, %xmm3 2763; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 2764; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2765; SSE-NEXT: por %xmm3, %xmm5 2766; SSE-NEXT: pand %xmm5, %xmm7 2767; SSE-NEXT: pandn %xmm0, %xmm5 2768; SSE-NEXT: por %xmm7, %xmm5 2769; SSE-NEXT: movdqa %xmm5, %xmm0 2770; SSE-NEXT: pxor %xmm4, %xmm0 2771; SSE-NEXT: movdqa %xmm1, %xmm3 2772; SSE-NEXT: pxor %xmm4, %xmm3 2773; SSE-NEXT: movdqa %xmm0, %xmm6 2774; SSE-NEXT: pcmpgtd %xmm3, %xmm6 2775; SSE-NEXT: pcmpeqd %xmm0, %xmm3 2776; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 2777; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2778; SSE-NEXT: pand %xmm0, %xmm3 2779; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 2780; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 2781; SSE-NEXT: por %xmm3, %xmm0 2782; SSE-NEXT: pand %xmm0, %xmm1 2783; SSE-NEXT: pandn %xmm5, %xmm0 2784; SSE-NEXT: por %xmm1, %xmm0 2785; SSE-NEXT: movdqa %xmm2, %xmm1 2786; SSE-NEXT: pxor %xmm4, %xmm1 2787; SSE-NEXT: movdqa %xmm7, %xmm3 2788; SSE-NEXT: pxor %xmm4, %xmm3 2789; SSE-NEXT: movdqa %xmm1, %xmm5 2790; SSE-NEXT: pcmpgtd %xmm3, %xmm5 2791; SSE-NEXT: pcmpeqd %xmm1, %xmm3 2792; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 2793; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2794; SSE-NEXT: pand %xmm1, %xmm3 2795; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm6 2796; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 2797; SSE-NEXT: por %xmm3, %xmm1 2798; SSE-NEXT: pand %xmm1, %xmm7 2799; SSE-NEXT: pandn %xmm2, %xmm1 2800; SSE-NEXT: por %xmm7, %xmm1 2801; SSE-NEXT: movdqa %xmm8, %xmm2 2802; SSE-NEXT: pxor %xmm4, %xmm2 2803; SSE-NEXT: movdqa %xmm6, %xmm3 2804; SSE-NEXT: pxor %xmm4, %xmm3 2805; SSE-NEXT: movdqa %xmm2, %xmm5 2806; SSE-NEXT: pcmpgtd %xmm3, %xmm5 2807; SSE-NEXT: pcmpeqd %xmm2, %xmm3 2808; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2] 2809; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2810; SSE-NEXT: pand %xmm2, %xmm3 2811; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 2812; SSE-NEXT: por %xmm3, %xmm2 2813; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 2814; SSE-NEXT: pand %xmm2, %xmm6 2815; SSE-NEXT: pandn %xmm8, %xmm2 2816; SSE-NEXT: por %xmm6, %xmm2 2817; SSE-NEXT: movdqa %xmm9, %xmm3 2818; SSE-NEXT: pxor %xmm4, %xmm3 2819; SSE-NEXT: pxor %xmm5, %xmm4 2820; SSE-NEXT: movdqa %xmm3, %xmm6 2821; SSE-NEXT: pcmpgtd %xmm4, %xmm6 2822; SSE-NEXT: pcmpeqd %xmm3, %xmm4 2823; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2] 2824; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2825; SSE-NEXT: pand %xmm3, %xmm4 2826; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 2827; SSE-NEXT: por %xmm4, %xmm3 2828; SSE-NEXT: pand %xmm3, %xmm5 2829; SSE-NEXT: pandn %xmm9, %xmm3 2830; SSE-NEXT: por %xmm5, %xmm3 2831; SSE-NEXT: retq 2832; 2833; AVX2-LABEL: reassociate_umin_v8i64: 2834; AVX2: # %bb.0: 2835; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 2836; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 2837; AVX2-NEXT: vpxor %ymm3, %ymm5, %ymm8 2838; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm9 2839; AVX2-NEXT: vpcmpgtq %ymm8, %ymm9, %ymm8 2840; AVX2-NEXT: vblendvpd %ymm8, %ymm5, %ymm1, %ymm1 2841; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 2842; AVX2-NEXT: vpxor %ymm3, %ymm4, %ymm2 2843; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm5 2844; AVX2-NEXT: vpcmpgtq %ymm2, %ymm5, %ymm2 2845; AVX2-NEXT: vblendvpd %ymm2, %ymm4, %ymm0, %ymm0 2846; AVX2-NEXT: vxorpd %ymm3, %ymm0, %ymm2 2847; AVX2-NEXT: vpxor %ymm3, %ymm6, %ymm4 2848; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm2 2849; AVX2-NEXT: vblendvpd %ymm2, %ymm6, %ymm0, %ymm0 2850; AVX2-NEXT: vxorpd %ymm3, %ymm1, %ymm2 2851; AVX2-NEXT: vpxor %ymm3, %ymm7, %ymm3 2852; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2 2853; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm1 2854; AVX2-NEXT: retq 2855; 2856; AVX512-LABEL: reassociate_umin_v8i64: 2857; AVX512: # %bb.0: 2858; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 2859; AVX512-NEXT: vpminuq %zmm3, %zmm2, %zmm1 2860; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 2861; AVX512-NEXT: retq 2862 2863 %t0 = add <8 x i64> %x0, %x1 2864 %t1 = icmp ult <8 x i64> %x2, %t0 2865 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0 2866 %t3 = icmp ult <8 x i64> %x3, %t2 2867 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2 2868 ret <8 x i64> %t4 2869} 2870 2871define <64 x i8> @reassociate_smin_v64i8(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, <64 x i8> %x3) { 2872; SSE-LABEL: reassociate_smin_v64i8: 2873; SSE: # %bb.0: 2874; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 2875; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 2876; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 2877; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 2878; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 2879; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 2880; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 2881; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 2882; SSE-NEXT: paddb %xmm4, %xmm0 2883; SSE-NEXT: paddb %xmm5, %xmm1 2884; SSE-NEXT: paddb %xmm6, %xmm2 2885; SSE-NEXT: paddb %xmm7, %xmm3 2886; SSE-NEXT: movdqa %xmm3, %xmm4 2887; SSE-NEXT: pcmpgtb %xmm15, %xmm4 2888; SSE-NEXT: pand %xmm4, %xmm15 2889; SSE-NEXT: pandn %xmm3, %xmm4 2890; SSE-NEXT: por %xmm15, %xmm4 2891; SSE-NEXT: movdqa %xmm2, %xmm3 2892; SSE-NEXT: pcmpgtb %xmm14, %xmm3 2893; SSE-NEXT: pand %xmm3, %xmm14 2894; SSE-NEXT: pandn %xmm2, %xmm3 2895; SSE-NEXT: por %xmm14, %xmm3 2896; SSE-NEXT: movdqa %xmm1, %xmm2 2897; SSE-NEXT: pcmpgtb %xmm13, %xmm2 2898; SSE-NEXT: pand %xmm2, %xmm13 2899; SSE-NEXT: pandn %xmm1, %xmm2 2900; SSE-NEXT: por %xmm13, %xmm2 2901; SSE-NEXT: movdqa %xmm0, %xmm1 2902; SSE-NEXT: pcmpgtb %xmm12, %xmm1 2903; SSE-NEXT: pand %xmm1, %xmm12 2904; SSE-NEXT: pandn %xmm0, %xmm1 2905; SSE-NEXT: por %xmm12, %xmm1 2906; SSE-NEXT: movdqa %xmm1, %xmm0 2907; SSE-NEXT: pcmpgtb %xmm11, %xmm0 2908; SSE-NEXT: pand %xmm0, %xmm11 2909; SSE-NEXT: pandn %xmm1, %xmm0 2910; SSE-NEXT: por %xmm11, %xmm0 2911; SSE-NEXT: movdqa %xmm2, %xmm1 2912; SSE-NEXT: pcmpgtb %xmm10, %xmm1 2913; SSE-NEXT: pand %xmm1, %xmm10 2914; SSE-NEXT: pandn %xmm2, %xmm1 2915; SSE-NEXT: por %xmm10, %xmm1 2916; SSE-NEXT: movdqa %xmm3, %xmm2 2917; SSE-NEXT: pcmpgtb %xmm9, %xmm2 2918; SSE-NEXT: pand %xmm2, %xmm9 2919; SSE-NEXT: pandn %xmm3, %xmm2 2920; SSE-NEXT: por %xmm9, %xmm2 2921; SSE-NEXT: movdqa %xmm4, %xmm3 2922; SSE-NEXT: pcmpgtb %xmm8, %xmm3 2923; SSE-NEXT: pand %xmm3, %xmm8 2924; SSE-NEXT: pandn %xmm4, %xmm3 2925; SSE-NEXT: por %xmm8, %xmm3 2926; SSE-NEXT: retq 2927; 2928; AVX2-LABEL: reassociate_smin_v64i8: 2929; AVX2: # %bb.0: 2930; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0 2931; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1 2932; AVX2-NEXT: vpminsb %ymm6, %ymm4, %ymm2 2933; AVX2-NEXT: vpminsb %ymm2, %ymm0, %ymm0 2934; AVX2-NEXT: vpminsb %ymm7, %ymm5, %ymm2 2935; AVX2-NEXT: vpminsb %ymm2, %ymm1, %ymm1 2936; AVX2-NEXT: retq 2937; 2938; AVX512-LABEL: reassociate_smin_v64i8: 2939; AVX512: # %bb.0: 2940; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm0 2941; AVX512-NEXT: vpminsb %zmm3, %zmm2, %zmm1 2942; AVX512-NEXT: vpminsb %zmm1, %zmm0, %zmm0 2943; AVX512-NEXT: retq 2944 2945 %t0 = add <64 x i8> %x0, %x1 2946 %t1 = icmp slt <64 x i8> %x2, %t0 2947 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t0 2948 %t3 = icmp slt <64 x i8> %x3, %t2 2949 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t2 2950 ret <64 x i8> %t4 2951} 2952 2953define <32 x i16> @reassociate_smin_v32i16(<32 x i16> %x0, <32 x i16> %x1, <32 x i16> %x2, <32 x i16> %x3) { 2954; SSE-LABEL: reassociate_smin_v32i16: 2955; SSE: # %bb.0: 2956; SSE-NEXT: paddw %xmm4, %xmm0 2957; SSE-NEXT: paddw %xmm5, %xmm1 2958; SSE-NEXT: paddw %xmm6, %xmm2 2959; SSE-NEXT: paddw %xmm7, %xmm3 2960; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm3 2961; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm2 2962; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm1 2963; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm0 2964; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm0 2965; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm1 2966; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm2 2967; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm3 2968; SSE-NEXT: retq 2969; 2970; AVX2-LABEL: reassociate_smin_v32i16: 2971; AVX2: # %bb.0: 2972; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 2973; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm1 2974; AVX2-NEXT: vpminsw %ymm6, %ymm4, %ymm2 2975; AVX2-NEXT: vpminsw %ymm2, %ymm0, %ymm0 2976; AVX2-NEXT: vpminsw %ymm7, %ymm5, %ymm2 2977; AVX2-NEXT: vpminsw %ymm2, %ymm1, %ymm1 2978; AVX2-NEXT: retq 2979; 2980; AVX512-LABEL: reassociate_smin_v32i16: 2981; AVX512: # %bb.0: 2982; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm0 2983; AVX512-NEXT: vpminsw %zmm3, %zmm2, %zmm1 2984; AVX512-NEXT: vpminsw %zmm1, %zmm0, %zmm0 2985; AVX512-NEXT: retq 2986 2987 %t0 = add <32 x i16> %x0, %x1 2988 %t1 = icmp slt <32 x i16> %x2, %t0 2989 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t0 2990 %t3 = icmp slt <32 x i16> %x3, %t2 2991 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t2 2992 ret <32 x i16> %t4 2993} 2994 2995define <16 x i32> @reassociate_smin_v16i32(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, <16 x i32> %x3) { 2996; SSE-LABEL: reassociate_smin_v16i32: 2997; SSE: # %bb.0: 2998; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 2999; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 3000; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 3001; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 3002; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 3003; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 3004; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 3005; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 3006; SSE-NEXT: paddd %xmm4, %xmm0 3007; SSE-NEXT: paddd %xmm5, %xmm1 3008; SSE-NEXT: paddd %xmm6, %xmm2 3009; SSE-NEXT: paddd %xmm7, %xmm3 3010; SSE-NEXT: movdqa %xmm3, %xmm4 3011; SSE-NEXT: pcmpgtd %xmm15, %xmm4 3012; SSE-NEXT: pand %xmm4, %xmm15 3013; SSE-NEXT: pandn %xmm3, %xmm4 3014; SSE-NEXT: por %xmm15, %xmm4 3015; SSE-NEXT: movdqa %xmm2, %xmm3 3016; SSE-NEXT: pcmpgtd %xmm14, %xmm3 3017; SSE-NEXT: pand %xmm3, %xmm14 3018; SSE-NEXT: pandn %xmm2, %xmm3 3019; SSE-NEXT: por %xmm14, %xmm3 3020; SSE-NEXT: movdqa %xmm1, %xmm2 3021; SSE-NEXT: pcmpgtd %xmm13, %xmm2 3022; SSE-NEXT: pand %xmm2, %xmm13 3023; SSE-NEXT: pandn %xmm1, %xmm2 3024; SSE-NEXT: por %xmm13, %xmm2 3025; SSE-NEXT: movdqa %xmm0, %xmm1 3026; SSE-NEXT: pcmpgtd %xmm12, %xmm1 3027; SSE-NEXT: pand %xmm1, %xmm12 3028; SSE-NEXT: pandn %xmm0, %xmm1 3029; SSE-NEXT: por %xmm12, %xmm1 3030; SSE-NEXT: movdqa %xmm1, %xmm0 3031; SSE-NEXT: pcmpgtd %xmm11, %xmm0 3032; SSE-NEXT: pand %xmm0, %xmm11 3033; SSE-NEXT: pandn %xmm1, %xmm0 3034; SSE-NEXT: por %xmm11, %xmm0 3035; SSE-NEXT: movdqa %xmm2, %xmm1 3036; SSE-NEXT: pcmpgtd %xmm10, %xmm1 3037; SSE-NEXT: pand %xmm1, %xmm10 3038; SSE-NEXT: pandn %xmm2, %xmm1 3039; SSE-NEXT: por %xmm10, %xmm1 3040; SSE-NEXT: movdqa %xmm3, %xmm2 3041; SSE-NEXT: pcmpgtd %xmm9, %xmm2 3042; SSE-NEXT: pand %xmm2, %xmm9 3043; SSE-NEXT: pandn %xmm3, %xmm2 3044; SSE-NEXT: por %xmm9, %xmm2 3045; SSE-NEXT: movdqa %xmm4, %xmm3 3046; SSE-NEXT: pcmpgtd %xmm8, %xmm3 3047; SSE-NEXT: pand %xmm3, %xmm8 3048; SSE-NEXT: pandn %xmm4, %xmm3 3049; SSE-NEXT: por %xmm8, %xmm3 3050; SSE-NEXT: retq 3051; 3052; AVX2-LABEL: reassociate_smin_v16i32: 3053; AVX2: # %bb.0: 3054; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 3055; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 3056; AVX2-NEXT: vpminsd %ymm6, %ymm4, %ymm2 3057; AVX2-NEXT: vpminsd %ymm2, %ymm0, %ymm0 3058; AVX2-NEXT: vpminsd %ymm7, %ymm5, %ymm2 3059; AVX2-NEXT: vpminsd %ymm2, %ymm1, %ymm1 3060; AVX2-NEXT: retq 3061; 3062; AVX512-LABEL: reassociate_smin_v16i32: 3063; AVX512: # %bb.0: 3064; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 3065; AVX512-NEXT: vpminsd %zmm3, %zmm2, %zmm1 3066; AVX512-NEXT: vpminsd %zmm1, %zmm0, %zmm0 3067; AVX512-NEXT: retq 3068 3069 %t0 = add <16 x i32> %x0, %x1 3070 %t1 = icmp slt <16 x i32> %x2, %t0 3071 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t0 3072 %t3 = icmp slt <16 x i32> %x3, %t2 3073 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t2 3074 ret <16 x i32> %t4 3075} 3076 3077define <8 x i64> @reassociate_smin_v8i64(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, <8 x i64> %x3) { 3078; SSE-LABEL: reassociate_smin_v8i64: 3079; SSE: # %bb.0: 3080; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 3081; SSE-NEXT: paddq %xmm4, %xmm0 3082; SSE-NEXT: paddq %xmm5, %xmm1 3083; SSE-NEXT: paddq %xmm6, %xmm2 3084; SSE-NEXT: paddq %xmm7, %xmm3 3085; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] 3086; SSE-NEXT: movdqa %xmm8, %xmm5 3087; SSE-NEXT: pxor %xmm4, %xmm5 3088; SSE-NEXT: movdqa %xmm3, %xmm6 3089; SSE-NEXT: pxor %xmm4, %xmm6 3090; SSE-NEXT: movdqa %xmm6, %xmm7 3091; SSE-NEXT: pcmpgtd %xmm5, %xmm7 3092; SSE-NEXT: pcmpeqd %xmm5, %xmm6 3093; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] 3094; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 3095; SSE-NEXT: pand %xmm5, %xmm6 3096; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 3097; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3] 3098; SSE-NEXT: por %xmm6, %xmm9 3099; SSE-NEXT: pand %xmm9, %xmm8 3100; SSE-NEXT: pandn %xmm3, %xmm9 3101; SSE-NEXT: por %xmm8, %xmm9 3102; SSE-NEXT: movdqa %xmm5, %xmm3 3103; SSE-NEXT: pxor %xmm4, %xmm3 3104; SSE-NEXT: movdqa %xmm2, %xmm6 3105; SSE-NEXT: pxor %xmm4, %xmm6 3106; SSE-NEXT: movdqa %xmm6, %xmm7 3107; SSE-NEXT: pcmpgtd %xmm3, %xmm7 3108; SSE-NEXT: pcmpeqd %xmm3, %xmm6 3109; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] 3110; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 3111; SSE-NEXT: pand %xmm3, %xmm6 3112; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm3 3113; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3] 3114; SSE-NEXT: por %xmm6, %xmm8 3115; SSE-NEXT: pand %xmm8, %xmm5 3116; SSE-NEXT: pandn %xmm2, %xmm8 3117; SSE-NEXT: por %xmm5, %xmm8 3118; SSE-NEXT: movdqa %xmm3, %xmm2 3119; SSE-NEXT: pxor %xmm4, %xmm2 3120; SSE-NEXT: movdqa %xmm1, %xmm5 3121; SSE-NEXT: pxor %xmm4, %xmm5 3122; SSE-NEXT: movdqa %xmm5, %xmm6 3123; SSE-NEXT: pcmpgtd %xmm2, %xmm6 3124; SSE-NEXT: pcmpeqd %xmm2, %xmm5 3125; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2] 3126; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 3127; SSE-NEXT: pand %xmm2, %xmm5 3128; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 3129; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 3130; SSE-NEXT: por %xmm5, %xmm2 3131; SSE-NEXT: pand %xmm2, %xmm3 3132; SSE-NEXT: pandn %xmm1, %xmm2 3133; SSE-NEXT: por %xmm3, %xmm2 3134; SSE-NEXT: movdqa %xmm7, %xmm1 3135; SSE-NEXT: pxor %xmm4, %xmm1 3136; SSE-NEXT: movdqa %xmm0, %xmm3 3137; SSE-NEXT: pxor %xmm4, %xmm3 3138; SSE-NEXT: movdqa %xmm3, %xmm5 3139; SSE-NEXT: pcmpgtd %xmm1, %xmm5 3140; SSE-NEXT: pcmpeqd %xmm1, %xmm3 3141; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 3142; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3143; SSE-NEXT: pand %xmm1, %xmm3 3144; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 3145; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 3146; SSE-NEXT: por %xmm3, %xmm5 3147; SSE-NEXT: pand %xmm5, %xmm7 3148; SSE-NEXT: pandn %xmm0, %xmm5 3149; SSE-NEXT: por %xmm7, %xmm5 3150; SSE-NEXT: movdqa %xmm5, %xmm0 3151; SSE-NEXT: pxor %xmm4, %xmm0 3152; SSE-NEXT: movdqa %xmm1, %xmm3 3153; SSE-NEXT: pxor %xmm4, %xmm3 3154; SSE-NEXT: movdqa %xmm0, %xmm6 3155; SSE-NEXT: pcmpgtd %xmm3, %xmm6 3156; SSE-NEXT: pcmpeqd %xmm0, %xmm3 3157; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 3158; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3159; SSE-NEXT: pand %xmm0, %xmm3 3160; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7 3161; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 3162; SSE-NEXT: por %xmm3, %xmm0 3163; SSE-NEXT: pand %xmm0, %xmm1 3164; SSE-NEXT: pandn %xmm5, %xmm0 3165; SSE-NEXT: por %xmm1, %xmm0 3166; SSE-NEXT: movdqa %xmm2, %xmm1 3167; SSE-NEXT: pxor %xmm4, %xmm1 3168; SSE-NEXT: movdqa %xmm7, %xmm3 3169; SSE-NEXT: pxor %xmm4, %xmm3 3170; SSE-NEXT: movdqa %xmm1, %xmm5 3171; SSE-NEXT: pcmpgtd %xmm3, %xmm5 3172; SSE-NEXT: pcmpeqd %xmm1, %xmm3 3173; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 3174; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3175; SSE-NEXT: pand %xmm1, %xmm3 3176; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm6 3177; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 3178; SSE-NEXT: por %xmm3, %xmm1 3179; SSE-NEXT: pand %xmm1, %xmm7 3180; SSE-NEXT: pandn %xmm2, %xmm1 3181; SSE-NEXT: por %xmm7, %xmm1 3182; SSE-NEXT: movdqa %xmm8, %xmm2 3183; SSE-NEXT: pxor %xmm4, %xmm2 3184; SSE-NEXT: movdqa %xmm6, %xmm3 3185; SSE-NEXT: pxor %xmm4, %xmm3 3186; SSE-NEXT: movdqa %xmm2, %xmm5 3187; SSE-NEXT: pcmpgtd %xmm3, %xmm5 3188; SSE-NEXT: pcmpeqd %xmm2, %xmm3 3189; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2] 3190; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3191; SSE-NEXT: pand %xmm2, %xmm3 3192; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 3193; SSE-NEXT: por %xmm3, %xmm2 3194; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 3195; SSE-NEXT: pand %xmm2, %xmm6 3196; SSE-NEXT: pandn %xmm8, %xmm2 3197; SSE-NEXT: por %xmm6, %xmm2 3198; SSE-NEXT: movdqa %xmm9, %xmm3 3199; SSE-NEXT: pxor %xmm4, %xmm3 3200; SSE-NEXT: pxor %xmm5, %xmm4 3201; SSE-NEXT: movdqa %xmm3, %xmm6 3202; SSE-NEXT: pcmpgtd %xmm4, %xmm6 3203; SSE-NEXT: pcmpeqd %xmm3, %xmm4 3204; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2] 3205; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3206; SSE-NEXT: pand %xmm3, %xmm4 3207; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 3208; SSE-NEXT: por %xmm4, %xmm3 3209; SSE-NEXT: pand %xmm3, %xmm5 3210; SSE-NEXT: pandn %xmm9, %xmm3 3211; SSE-NEXT: por %xmm5, %xmm3 3212; SSE-NEXT: retq 3213; 3214; AVX2-LABEL: reassociate_smin_v8i64: 3215; AVX2: # %bb.0: 3216; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 3217; AVX2-NEXT: vpcmpgtq %ymm5, %ymm1, %ymm3 3218; AVX2-NEXT: vblendvpd %ymm3, %ymm5, %ymm1, %ymm1 3219; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 3220; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm2 3221; AVX2-NEXT: vblendvpd %ymm2, %ymm4, %ymm0, %ymm0 3222; AVX2-NEXT: vpcmpgtq %ymm6, %ymm0, %ymm2 3223; AVX2-NEXT: vblendvpd %ymm2, %ymm6, %ymm0, %ymm0 3224; AVX2-NEXT: vpcmpgtq %ymm7, %ymm1, %ymm2 3225; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm1 3226; AVX2-NEXT: retq 3227; 3228; AVX512-LABEL: reassociate_smin_v8i64: 3229; AVX512: # %bb.0: 3230; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 3231; AVX512-NEXT: vpminsq %zmm3, %zmm2, %zmm1 3232; AVX512-NEXT: vpminsq %zmm1, %zmm0, %zmm0 3233; AVX512-NEXT: retq 3234 3235 %t0 = add <8 x i64> %x0, %x1 3236 %t1 = icmp slt <8 x i64> %x2, %t0 3237 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t0 3238 %t3 = icmp slt <8 x i64> %x3, %t2 3239 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t2 3240 ret <8 x i64> %t4 3241} 3242