3242 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=sse2 -machine-combiner-verify-pattern-order=true < %s | FileCheck %s --check-prefix=SSE3; 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=AVX24; 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=AVX5125 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, %xmm012; SSE-NEXT: pand %xmm3, %xmm213; SSE-NEXT: pand %xmm2, %xmm014; SSE-NEXT: retq15;16; AVX2-LABEL: reassociate_and_v4i32:17; AVX2: # %bb.0:18; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm019; AVX2-NEXT: vpand %xmm2, %xmm3, %xmm120; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm021; AVX2-NEXT: retq22;23; AVX512-LABEL: reassociate_and_v4i32:24; AVX512: # %bb.0:25; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm026; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 & xmm3 & xmm227; AVX512-NEXT: retq28 29 %t0 = add <4 x i32> %x0, %x130 %t1 = and <4 x i32> %x2, %t031 %t2 = and <4 x i32> %x3, %t132 ret <4 x i32> %t233}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, %xmm039; SSE-NEXT: por %xmm3, %xmm240; SSE-NEXT: por %xmm2, %xmm041; SSE-NEXT: retq42;43; AVX2-LABEL: reassociate_or_v4i32:44; AVX2: # %bb.0:45; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm046; AVX2-NEXT: vpor %xmm2, %xmm3, %xmm147; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm048; AVX2-NEXT: retq49;50; AVX512-LABEL: reassociate_or_v4i32:51; AVX512: # %bb.0:52; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm053; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 | xmm3 | xmm254; AVX512-NEXT: retq55 56 %t0 = add <4 x i32> %x0, %x157 %t1 = or <4 x i32> %x2, %t058 %t2 = or <4 x i32> %x3, %t159 ret <4 x i32> %t260}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, %xmm066; SSE-NEXT: pxor %xmm3, %xmm267; SSE-NEXT: pxor %xmm2, %xmm068; SSE-NEXT: retq69;70; AVX2-LABEL: reassociate_xor_v4i32:71; AVX2: # %bb.0:72; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm073; AVX2-NEXT: vpxor %xmm2, %xmm3, %xmm174; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm075; AVX2-NEXT: retq76;77; AVX512-LABEL: reassociate_xor_v4i32:78; AVX512: # %bb.0:79; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm080; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 ^ xmm3 ^ xmm281; AVX512-NEXT: retq82 83 %t0 = add <4 x i32> %x0, %x184 %t1 = xor <4 x i32> %x2, %t085 %t2 = xor <4 x i32> %x3, %t186 ret <4 x i32> %t287}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, %xmm095; SSE-NEXT: pand %xmm6, %xmm496; SSE-NEXT: pand %xmm4, %xmm097; SSE-NEXT: paddd %xmm3, %xmm198; SSE-NEXT: pand %xmm7, %xmm599; SSE-NEXT: pand %xmm5, %xmm1100; SSE-NEXT: retq101;102; AVX2-LABEL: reassociate_and_v8i32:103; AVX2: # %bb.0:104; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0105; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm1106; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0107; AVX2-NEXT: retq108;109; AVX512-LABEL: reassociate_and_v8i32:110; AVX512: # %bb.0:111; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0112; AVX512-NEXT: vpternlogd {{.*#+}} ymm0 = ymm0 & ymm3 & ymm2113; AVX512-NEXT: retq114 115 %t0 = add <8 x i32> %x0, %x1116 %t1 = and <8 x i32> %x2, %t0117 %t2 = and <8 x i32> %x3, %t1118 ret <8 x i32> %t2119}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, %xmm0125; SSE-NEXT: por %xmm6, %xmm4126; SSE-NEXT: por %xmm4, %xmm0127; SSE-NEXT: paddd %xmm3, %xmm1128; SSE-NEXT: por %xmm7, %xmm5129; SSE-NEXT: por %xmm5, %xmm1130; SSE-NEXT: retq131;132; AVX2-LABEL: reassociate_or_v8i32:133; AVX2: # %bb.0:134; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0135; AVX2-NEXT: vpor %ymm2, %ymm3, %ymm1136; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0137; AVX2-NEXT: retq138;139; AVX512-LABEL: reassociate_or_v8i32:140; AVX512: # %bb.0:141; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0142; AVX512-NEXT: vpternlogd {{.*#+}} ymm0 = ymm0 | ymm3 | ymm2143; AVX512-NEXT: retq144 145 %t0 = add <8 x i32> %x0, %x1146 %t1 = or <8 x i32> %x2, %t0147 %t2 = or <8 x i32> %x3, %t1148 ret <8 x i32> %t2149}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, %xmm0155; SSE-NEXT: pxor %xmm6, %xmm4156; SSE-NEXT: pxor %xmm4, %xmm0157; SSE-NEXT: paddd %xmm3, %xmm1158; SSE-NEXT: pxor %xmm7, %xmm5159; SSE-NEXT: pxor %xmm5, %xmm1160; SSE-NEXT: retq161;162; AVX2-LABEL: reassociate_xor_v8i32:163; AVX2: # %bb.0:164; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0165; AVX2-NEXT: vpxor %ymm2, %ymm3, %ymm1166; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0167; AVX2-NEXT: retq168;169; AVX512-LABEL: reassociate_xor_v8i32:170; AVX512: # %bb.0:171; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0172; AVX512-NEXT: vpternlogd {{.*#+}} ymm0 = ymm0 ^ ymm3 ^ ymm2173; AVX512-NEXT: retq174 175 %t0 = add <8 x i32> %x0, %x1176 %t1 = xor <8 x i32> %x2, %t0177 %t2 = xor <8 x i32> %x3, %t1178 ret <8 x i32> %t2179}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, %xmm0188; SSE-NEXT: paddd %xmm5, %xmm1189; SSE-NEXT: paddd %xmm6, %xmm2190; SSE-NEXT: paddd %xmm7, %xmm3191; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm3192; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm2193; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm1194; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm0195; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm0196; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm1197; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm2198; SSE-NEXT: pand {{[0-9]+}}(%rsp), %xmm3199; SSE-NEXT: retq200;201; AVX2-LABEL: reassociate_and_v16i32:202; AVX2: # %bb.0:203; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0204; AVX2-NEXT: vpand %ymm4, %ymm6, %ymm2205; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0206; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1207; AVX2-NEXT: vpand %ymm5, %ymm7, %ymm2208; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1209; AVX2-NEXT: retq210;211; AVX512-LABEL: reassociate_and_v16i32:212; AVX512: # %bb.0:213; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0214; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 & zmm3 & zmm2215; AVX512-NEXT: retq216 217 %t0 = add <16 x i32> %x0, %x1218 %t1 = and <16 x i32> %x2, %t0219 %t2 = and <16 x i32> %x3, %t1220 ret <16 x i32> %t2221}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, %xmm0227; SSE-NEXT: paddd %xmm5, %xmm1228; SSE-NEXT: paddd %xmm6, %xmm2229; SSE-NEXT: paddd %xmm7, %xmm3230; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm3231; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm2232; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm1233; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm0234; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm0235; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm1236; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm2237; SSE-NEXT: por {{[0-9]+}}(%rsp), %xmm3238; SSE-NEXT: retq239;240; AVX2-LABEL: reassociate_or_v16i32:241; AVX2: # %bb.0:242; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0243; AVX2-NEXT: vpor %ymm4, %ymm6, %ymm2244; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0245; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1246; AVX2-NEXT: vpor %ymm5, %ymm7, %ymm2247; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1248; AVX2-NEXT: retq249;250; AVX512-LABEL: reassociate_or_v16i32:251; AVX512: # %bb.0:252; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0253; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 | zmm3 | zmm2254; AVX512-NEXT: retq255 256 %t0 = add <16 x i32> %x0, %x1257 %t1 = or <16 x i32> %x2, %t0258 %t2 = or <16 x i32> %x3, %t1259 ret <16 x i32> %t2260}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, %xmm0266; SSE-NEXT: paddd %xmm5, %xmm1267; SSE-NEXT: paddd %xmm6, %xmm2268; SSE-NEXT: paddd %xmm7, %xmm3269; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm3270; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm2271; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm1272; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm0273; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm0274; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm1275; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm2276; SSE-NEXT: pxor {{[0-9]+}}(%rsp), %xmm3277; SSE-NEXT: retq278;279; AVX2-LABEL: reassociate_xor_v16i32:280; AVX2: # %bb.0:281; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0282; AVX2-NEXT: vpxor %ymm4, %ymm6, %ymm2283; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0284; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1285; AVX2-NEXT: vpxor %ymm5, %ymm7, %ymm2286; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm1287; AVX2-NEXT: retq288;289; AVX512-LABEL: reassociate_xor_v16i32:290; AVX512: # %bb.0:291; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0292; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 = zmm0 ^ zmm3 ^ zmm2293; AVX512-NEXT: retq294 295 %t0 = add <16 x i32> %x0, %x1296 %t1 = xor <16 x i32> %x2, %t0297 %t2 = xor <16 x i32> %x3, %t1298 ret <16 x i32> %t2299}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, %xmm0307; SSE-NEXT: pmaxub %xmm3, %xmm2308; SSE-NEXT: pmaxub %xmm2, %xmm0309; SSE-NEXT: retq310;311; AVX-LABEL: reassociate_umax_v16i8:312; AVX: # %bb.0:313; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0314; AVX-NEXT: vpmaxub %xmm2, %xmm3, %xmm1315; AVX-NEXT: vpmaxub %xmm0, %xmm1, %xmm0316; AVX-NEXT: retq317 318 %t0 = add <16 x i8> %x0, %x1319 %t1 = icmp ugt <16 x i8> %x2, %t0320 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0321 %t3 = icmp ugt <16 x i8> %x3, %t2322 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2323 ret <16 x i8> %t4324}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, %xmm0330; SSE-NEXT: psubusw %xmm2, %xmm0331; SSE-NEXT: paddw %xmm2, %xmm0332; SSE-NEXT: psubusw %xmm3, %xmm0333; SSE-NEXT: paddw %xmm3, %xmm0334; SSE-NEXT: retq335;336; AVX-LABEL: reassociate_umax_v8i16:337; AVX: # %bb.0:338; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0339; AVX-NEXT: vpmaxuw %xmm2, %xmm3, %xmm1340; AVX-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0341; AVX-NEXT: retq342 343 %t0 = add <8 x i16> %x0, %x1344 %t1 = icmp ugt <8 x i16> %x2, %t0345 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0346 %t3 = icmp ugt <8 x i16> %x3, %t2347 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2348 ret <8 x i16> %t4349}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, %xmm0355; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]356; SSE-NEXT: movdqa %xmm2, %xmm4357; SSE-NEXT: pxor %xmm1, %xmm4358; SSE-NEXT: movdqa %xmm0, %xmm5359; SSE-NEXT: pxor %xmm1, %xmm5360; SSE-NEXT: pcmpgtd %xmm5, %xmm4361; SSE-NEXT: pand %xmm4, %xmm2362; SSE-NEXT: pandn %xmm0, %xmm4363; SSE-NEXT: por %xmm2, %xmm4364; SSE-NEXT: movdqa %xmm4, %xmm0365; SSE-NEXT: pxor %xmm1, %xmm0366; SSE-NEXT: pxor %xmm3, %xmm1367; SSE-NEXT: pcmpgtd %xmm0, %xmm1368; SSE-NEXT: pand %xmm1, %xmm3369; SSE-NEXT: pandn %xmm4, %xmm1370; SSE-NEXT: por %xmm3, %xmm1371; SSE-NEXT: movdqa %xmm1, %xmm0372; SSE-NEXT: retq373;374; AVX-LABEL: reassociate_umax_v4i32:375; AVX: # %bb.0:376; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0377; AVX-NEXT: vpmaxud %xmm2, %xmm3, %xmm1378; AVX-NEXT: vpmaxud %xmm0, %xmm1, %xmm0379; AVX-NEXT: retq380 381 %t0 = add <4 x i32> %x0, %x1382 %t1 = icmp ugt <4 x i32> %x2, %t0383 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0384 %t3 = icmp ugt <4 x i32> %x3, %t2385 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2386 ret <4 x i32> %t4387}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, %xmm0393; SSE-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]394; SSE-NEXT: movdqa %xmm2, %xmm4395; SSE-NEXT: pxor %xmm1, %xmm4396; SSE-NEXT: movdqa %xmm0, %xmm5397; SSE-NEXT: pxor %xmm1, %xmm5398; SSE-NEXT: movdqa %xmm4, %xmm6399; SSE-NEXT: pcmpgtd %xmm5, %xmm6400; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]401; SSE-NEXT: pcmpeqd %xmm4, %xmm5402; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]403; SSE-NEXT: pand %xmm7, %xmm4404; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]405; SSE-NEXT: por %xmm4, %xmm5406; SSE-NEXT: pand %xmm5, %xmm2407; SSE-NEXT: pandn %xmm0, %xmm5408; SSE-NEXT: por %xmm2, %xmm5409; SSE-NEXT: movdqa %xmm5, %xmm0410; SSE-NEXT: pxor %xmm1, %xmm0411; SSE-NEXT: pxor %xmm3, %xmm1412; SSE-NEXT: movdqa %xmm1, %xmm2413; SSE-NEXT: pcmpgtd %xmm0, %xmm2414; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]415; SSE-NEXT: pcmpeqd %xmm0, %xmm1416; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]417; SSE-NEXT: pand %xmm4, %xmm1418; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]419; SSE-NEXT: por %xmm1, %xmm0420; SSE-NEXT: pand %xmm0, %xmm3421; SSE-NEXT: pandn %xmm5, %xmm0422; SSE-NEXT: por %xmm3, %xmm0423; SSE-NEXT: retq424;425; AVX2-LABEL: reassociate_umax_v2i64:426; AVX2: # %bb.0:427; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0428; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]429; AVX2-NEXT: vpxor %xmm1, %xmm2, %xmm4430; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm5431; AVX2-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm4432; AVX2-NEXT: vblendvpd %xmm4, %xmm2, %xmm0, %xmm0433; AVX2-NEXT: vxorpd %xmm1, %xmm0, %xmm2434; AVX2-NEXT: vpxor %xmm1, %xmm3, %xmm1435; AVX2-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm1436; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0437; AVX2-NEXT: retq438;439; AVX512-LABEL: reassociate_umax_v2i64:440; AVX512: # %bb.0:441; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0442; AVX512-NEXT: vpmaxuq %xmm2, %xmm3, %xmm1443; AVX512-NEXT: vpmaxuq %xmm0, %xmm1, %xmm0444; AVX512-NEXT: retq445 446 %t0 = add <2 x i64> %x0, %x1447 %t1 = icmp ugt <2 x i64> %x2, %t0448 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0449 %t3 = icmp ugt <2 x i64> %x3, %t2450 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2451 ret <2 x i64> %t4452}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, %xmm0458; SSE-NEXT: movdqa %xmm2, %xmm1459; SSE-NEXT: pcmpgtb %xmm0, %xmm1460; SSE-NEXT: pand %xmm1, %xmm2461; SSE-NEXT: pandn %xmm0, %xmm1462; SSE-NEXT: por %xmm2, %xmm1463; SSE-NEXT: movdqa %xmm3, %xmm0464; SSE-NEXT: pcmpgtb %xmm1, %xmm0465; SSE-NEXT: pand %xmm0, %xmm3466; SSE-NEXT: pandn %xmm1, %xmm0467; SSE-NEXT: por %xmm3, %xmm0468; SSE-NEXT: retq469;470; AVX-LABEL: reassociate_smax_v16i8:471; AVX: # %bb.0:472; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0473; AVX-NEXT: vpmaxsb %xmm2, %xmm3, %xmm1474; AVX-NEXT: vpmaxsb %xmm0, %xmm1, %xmm0475; AVX-NEXT: retq476 477 %t0 = add <16 x i8> %x0, %x1478 %t1 = icmp sgt <16 x i8> %x2, %t0479 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0480 %t3 = icmp sgt <16 x i8> %x3, %t2481 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2482 ret <16 x i8> %t4483}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, %xmm0489; SSE-NEXT: pmaxsw %xmm3, %xmm2490; SSE-NEXT: pmaxsw %xmm2, %xmm0491; SSE-NEXT: retq492;493; AVX-LABEL: reassociate_smax_v8i16:494; AVX: # %bb.0:495; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0496; AVX-NEXT: vpmaxsw %xmm2, %xmm3, %xmm1497; AVX-NEXT: vpmaxsw %xmm0, %xmm1, %xmm0498; AVX-NEXT: retq499 500 %t0 = add <8 x i16> %x0, %x1501 %t1 = icmp sgt <8 x i16> %x2, %t0502 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0503 %t3 = icmp sgt <8 x i16> %x3, %t2504 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2505 ret <8 x i16> %t4506}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, %xmm0512; SSE-NEXT: movdqa %xmm2, %xmm1513; SSE-NEXT: pcmpgtd %xmm0, %xmm1514; SSE-NEXT: pand %xmm1, %xmm2515; SSE-NEXT: pandn %xmm0, %xmm1516; SSE-NEXT: por %xmm2, %xmm1517; SSE-NEXT: movdqa %xmm3, %xmm0518; SSE-NEXT: pcmpgtd %xmm1, %xmm0519; SSE-NEXT: pand %xmm0, %xmm3520; SSE-NEXT: pandn %xmm1, %xmm0521; SSE-NEXT: por %xmm3, %xmm0522; SSE-NEXT: retq523;524; AVX-LABEL: reassociate_smax_v4i32:525; AVX: # %bb.0:526; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0527; AVX-NEXT: vpmaxsd %xmm2, %xmm3, %xmm1528; AVX-NEXT: vpmaxsd %xmm0, %xmm1, %xmm0529; AVX-NEXT: retq530 531 %t0 = add <4 x i32> %x0, %x1532 %t1 = icmp sgt <4 x i32> %x2, %t0533 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0534 %t3 = icmp sgt <4 x i32> %x3, %t2535 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2536 ret <4 x i32> %t4537}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, %xmm0543; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]544; SSE-NEXT: movdqa %xmm2, %xmm4545; SSE-NEXT: pxor %xmm1, %xmm4546; SSE-NEXT: movdqa %xmm0, %xmm5547; SSE-NEXT: pxor %xmm1, %xmm5548; SSE-NEXT: movdqa %xmm4, %xmm6549; SSE-NEXT: pcmpgtd %xmm5, %xmm6550; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]551; SSE-NEXT: pcmpeqd %xmm4, %xmm5552; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]553; SSE-NEXT: pand %xmm7, %xmm4554; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]555; SSE-NEXT: por %xmm4, %xmm5556; SSE-NEXT: pand %xmm5, %xmm2557; SSE-NEXT: pandn %xmm0, %xmm5558; SSE-NEXT: por %xmm2, %xmm5559; SSE-NEXT: movdqa %xmm5, %xmm0560; SSE-NEXT: pxor %xmm1, %xmm0561; SSE-NEXT: pxor %xmm3, %xmm1562; SSE-NEXT: movdqa %xmm1, %xmm2563; SSE-NEXT: pcmpgtd %xmm0, %xmm2564; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]565; SSE-NEXT: pcmpeqd %xmm0, %xmm1566; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]567; SSE-NEXT: pand %xmm4, %xmm1568; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]569; SSE-NEXT: por %xmm1, %xmm0570; SSE-NEXT: pand %xmm0, %xmm3571; SSE-NEXT: pandn %xmm5, %xmm0572; SSE-NEXT: por %xmm3, %xmm0573; SSE-NEXT: retq574;575; AVX2-LABEL: reassociate_smax_v2i64:576; AVX2: # %bb.0:577; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0578; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1579; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0580; AVX2-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm1581; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0582; AVX2-NEXT: retq583;584; AVX512-LABEL: reassociate_smax_v2i64:585; AVX512: # %bb.0:586; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0587; AVX512-NEXT: vpmaxsq %xmm2, %xmm3, %xmm1588; AVX512-NEXT: vpmaxsq %xmm0, %xmm1, %xmm0589; AVX512-NEXT: retq590 591 %t0 = add <2 x i64> %x0, %x1592 %t1 = icmp sgt <2 x i64> %x2, %t0593 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0594 %t3 = icmp sgt <2 x i64> %x3, %t2595 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2596 ret <2 x i64> %t4597}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, %xmm0603; SSE-NEXT: pminub %xmm3, %xmm2604; SSE-NEXT: pminub %xmm2, %xmm0605; SSE-NEXT: retq606;607; AVX-LABEL: reassociate_umin_v16i8:608; AVX: # %bb.0:609; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0610; AVX-NEXT: vpminub %xmm2, %xmm3, %xmm1611; AVX-NEXT: vpminub %xmm0, %xmm1, %xmm0612; AVX-NEXT: retq613 614 %t0 = add <16 x i8> %x0, %x1615 %t1 = icmp ult <16 x i8> %x2, %t0616 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0617 %t3 = icmp ult <16 x i8> %x3, %t2618 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2619 ret <16 x i8> %t4620}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, %xmm0626; SSE-NEXT: movdqa %xmm2, %xmm1627; SSE-NEXT: psubusw %xmm0, %xmm1628; SSE-NEXT: psubw %xmm1, %xmm2629; SSE-NEXT: movdqa %xmm3, %xmm0630; SSE-NEXT: psubusw %xmm2, %xmm0631; SSE-NEXT: psubw %xmm0, %xmm3632; SSE-NEXT: movdqa %xmm3, %xmm0633; SSE-NEXT: retq634;635; AVX-LABEL: reassociate_umin_v8i16:636; AVX: # %bb.0:637; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0638; AVX-NEXT: vpminuw %xmm2, %xmm3, %xmm1639; AVX-NEXT: vpminuw %xmm0, %xmm1, %xmm0640; AVX-NEXT: retq641 642 %t0 = add <8 x i16> %x0, %x1643 %t1 = icmp ult <8 x i16> %x2, %t0644 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0645 %t3 = icmp ult <8 x i16> %x3, %t2646 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2647 ret <8 x i16> %t4648}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, %xmm0654; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]655; SSE-NEXT: movdqa %xmm2, %xmm4656; SSE-NEXT: pxor %xmm1, %xmm4657; SSE-NEXT: movdqa %xmm0, %xmm5658; SSE-NEXT: pxor %xmm1, %xmm5659; SSE-NEXT: pcmpgtd %xmm4, %xmm5660; SSE-NEXT: pand %xmm5, %xmm2661; SSE-NEXT: pandn %xmm0, %xmm5662; SSE-NEXT: por %xmm2, %xmm5663; SSE-NEXT: movdqa %xmm5, %xmm0664; SSE-NEXT: pxor %xmm1, %xmm0665; SSE-NEXT: pxor %xmm3, %xmm1666; SSE-NEXT: pcmpgtd %xmm1, %xmm0667; SSE-NEXT: pand %xmm0, %xmm3668; SSE-NEXT: pandn %xmm5, %xmm0669; SSE-NEXT: por %xmm3, %xmm0670; SSE-NEXT: retq671;672; AVX-LABEL: reassociate_umin_v4i32:673; AVX: # %bb.0:674; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0675; AVX-NEXT: vpminud %xmm2, %xmm3, %xmm1676; AVX-NEXT: vpminud %xmm0, %xmm1, %xmm0677; AVX-NEXT: retq678 679 %t0 = add <4 x i32> %x0, %x1680 %t1 = icmp ult <4 x i32> %x2, %t0681 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0682 %t3 = icmp ult <4 x i32> %x3, %t2683 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2684 ret <4 x i32> %t4685}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, %xmm0691; SSE-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]692; SSE-NEXT: movdqa %xmm2, %xmm4693; SSE-NEXT: pxor %xmm1, %xmm4694; SSE-NEXT: movdqa %xmm0, %xmm5695; SSE-NEXT: pxor %xmm1, %xmm5696; SSE-NEXT: movdqa %xmm5, %xmm6697; SSE-NEXT: pcmpgtd %xmm4, %xmm6698; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]699; SSE-NEXT: pcmpeqd %xmm4, %xmm5700; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]701; SSE-NEXT: pand %xmm7, %xmm4702; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]703; SSE-NEXT: por %xmm4, %xmm5704; SSE-NEXT: pand %xmm5, %xmm2705; SSE-NEXT: pandn %xmm0, %xmm5706; SSE-NEXT: por %xmm2, %xmm5707; SSE-NEXT: movdqa %xmm5, %xmm0708; SSE-NEXT: pxor %xmm1, %xmm0709; SSE-NEXT: pxor %xmm3, %xmm1710; SSE-NEXT: movdqa %xmm0, %xmm2711; SSE-NEXT: pcmpgtd %xmm1, %xmm2712; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]713; SSE-NEXT: pcmpeqd %xmm0, %xmm1714; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]715; SSE-NEXT: pand %xmm4, %xmm1716; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]717; SSE-NEXT: por %xmm1, %xmm0718; SSE-NEXT: pand %xmm0, %xmm3719; SSE-NEXT: pandn %xmm5, %xmm0720; SSE-NEXT: por %xmm3, %xmm0721; SSE-NEXT: retq722;723; AVX2-LABEL: reassociate_umin_v2i64:724; AVX2: # %bb.0:725; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0726; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]727; AVX2-NEXT: vpxor %xmm1, %xmm2, %xmm4728; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm5729; AVX2-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4730; AVX2-NEXT: vblendvpd %xmm4, %xmm2, %xmm0, %xmm0731; AVX2-NEXT: vxorpd %xmm1, %xmm0, %xmm2732; AVX2-NEXT: vpxor %xmm1, %xmm3, %xmm1733; AVX2-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1734; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0735; AVX2-NEXT: retq736;737; AVX512-LABEL: reassociate_umin_v2i64:738; AVX512: # %bb.0:739; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0740; AVX512-NEXT: vpminuq %xmm2, %xmm3, %xmm1741; AVX512-NEXT: vpminuq %xmm0, %xmm1, %xmm0742; AVX512-NEXT: retq743 744 %t0 = add <2 x i64> %x0, %x1745 %t1 = icmp ult <2 x i64> %x2, %t0746 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0747 %t3 = icmp ult <2 x i64> %x3, %t2748 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2749 ret <2 x i64> %t4750}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, %xmm0756; SSE-NEXT: movdqa %xmm0, %xmm1757; SSE-NEXT: pcmpgtb %xmm2, %xmm1758; SSE-NEXT: pand %xmm1, %xmm2759; SSE-NEXT: pandn %xmm0, %xmm1760; SSE-NEXT: por %xmm2, %xmm1761; SSE-NEXT: movdqa %xmm1, %xmm0762; SSE-NEXT: pcmpgtb %xmm3, %xmm0763; SSE-NEXT: pand %xmm0, %xmm3764; SSE-NEXT: pandn %xmm1, %xmm0765; SSE-NEXT: por %xmm3, %xmm0766; SSE-NEXT: retq767;768; AVX-LABEL: reassociate_smin_v16i8:769; AVX: # %bb.0:770; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0771; AVX-NEXT: vpminsb %xmm2, %xmm3, %xmm1772; AVX-NEXT: vpminsb %xmm0, %xmm1, %xmm0773; AVX-NEXT: retq774 775 %t0 = add <16 x i8> %x0, %x1776 %t1 = icmp slt <16 x i8> %x2, %t0777 %t2 = select <16 x i1> %t1, <16 x i8> %x2, <16 x i8> %t0778 %t3 = icmp slt <16 x i8> %x3, %t2779 %t4 = select <16 x i1> %t3, <16 x i8> %x3, <16 x i8> %t2780 ret <16 x i8> %t4781}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, %xmm0787; SSE-NEXT: pminsw %xmm3, %xmm2788; SSE-NEXT: pminsw %xmm2, %xmm0789; SSE-NEXT: retq790;791; AVX-LABEL: reassociate_smin_v8i16:792; AVX: # %bb.0:793; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0794; AVX-NEXT: vpminsw %xmm2, %xmm3, %xmm1795; AVX-NEXT: vpminsw %xmm0, %xmm1, %xmm0796; AVX-NEXT: retq797 798 %t0 = add <8 x i16> %x0, %x1799 %t1 = icmp slt <8 x i16> %x2, %t0800 %t2 = select <8 x i1> %t1, <8 x i16> %x2, <8 x i16> %t0801 %t3 = icmp slt <8 x i16> %x3, %t2802 %t4 = select <8 x i1> %t3, <8 x i16> %x3, <8 x i16> %t2803 ret <8 x i16> %t4804}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, %xmm0810; SSE-NEXT: movdqa %xmm0, %xmm1811; SSE-NEXT: pcmpgtd %xmm2, %xmm1812; SSE-NEXT: pand %xmm1, %xmm2813; SSE-NEXT: pandn %xmm0, %xmm1814; SSE-NEXT: por %xmm2, %xmm1815; SSE-NEXT: movdqa %xmm1, %xmm0816; SSE-NEXT: pcmpgtd %xmm3, %xmm0817; SSE-NEXT: pand %xmm0, %xmm3818; SSE-NEXT: pandn %xmm1, %xmm0819; SSE-NEXT: por %xmm3, %xmm0820; SSE-NEXT: retq821;822; AVX-LABEL: reassociate_smin_v4i32:823; AVX: # %bb.0:824; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0825; AVX-NEXT: vpminsd %xmm2, %xmm3, %xmm1826; AVX-NEXT: vpminsd %xmm0, %xmm1, %xmm0827; AVX-NEXT: retq828 829 %t0 = add <4 x i32> %x0, %x1830 %t1 = icmp slt <4 x i32> %x2, %t0831 %t2 = select <4 x i1> %t1, <4 x i32> %x2, <4 x i32> %t0832 %t3 = icmp slt <4 x i32> %x3, %t2833 %t4 = select <4 x i1> %t3, <4 x i32> %x3, <4 x i32> %t2834 ret <4 x i32> %t4835}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, %xmm0841; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]842; SSE-NEXT: movdqa %xmm2, %xmm4843; SSE-NEXT: pxor %xmm1, %xmm4844; SSE-NEXT: movdqa %xmm0, %xmm5845; SSE-NEXT: pxor %xmm1, %xmm5846; SSE-NEXT: movdqa %xmm5, %xmm6847; SSE-NEXT: pcmpgtd %xmm4, %xmm6848; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]849; SSE-NEXT: pcmpeqd %xmm4, %xmm5850; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]851; SSE-NEXT: pand %xmm7, %xmm4852; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]853; SSE-NEXT: por %xmm4, %xmm5854; SSE-NEXT: pand %xmm5, %xmm2855; SSE-NEXT: pandn %xmm0, %xmm5856; SSE-NEXT: por %xmm2, %xmm5857; SSE-NEXT: movdqa %xmm5, %xmm0858; SSE-NEXT: pxor %xmm1, %xmm0859; SSE-NEXT: pxor %xmm3, %xmm1860; SSE-NEXT: movdqa %xmm0, %xmm2861; SSE-NEXT: pcmpgtd %xmm1, %xmm2862; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]863; SSE-NEXT: pcmpeqd %xmm0, %xmm1864; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]865; SSE-NEXT: pand %xmm4, %xmm1866; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]867; SSE-NEXT: por %xmm1, %xmm0868; SSE-NEXT: pand %xmm0, %xmm3869; SSE-NEXT: pandn %xmm5, %xmm0870; SSE-NEXT: por %xmm3, %xmm0871; SSE-NEXT: retq872;873; AVX2-LABEL: reassociate_smin_v2i64:874; AVX2: # %bb.0:875; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0876; AVX2-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm1877; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0878; AVX2-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm1879; AVX2-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm0880; AVX2-NEXT: retq881;882; AVX512-LABEL: reassociate_smin_v2i64:883; AVX512: # %bb.0:884; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0885; AVX512-NEXT: vpminsq %xmm2, %xmm3, %xmm1886; AVX512-NEXT: vpminsq %xmm0, %xmm1, %xmm0887; AVX512-NEXT: retq888 889 %t0 = add <2 x i64> %x0, %x1890 %t1 = icmp slt <2 x i64> %x2, %t0891 %t2 = select <2 x i1> %t1, <2 x i64> %x2, <2 x i64> %t0892 %t3 = icmp slt <2 x i64> %x3, %t2893 %t4 = select <2 x i1> %t3, <2 x i64> %x3, <2 x i64> %t2894 ret <2 x i64> %t4895}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, %xmm0903; SSE-NEXT: paddb %xmm3, %xmm1904; SSE-NEXT: pmaxub %xmm6, %xmm4905; SSE-NEXT: pmaxub %xmm4, %xmm0906; SSE-NEXT: pmaxub %xmm7, %xmm5907; SSE-NEXT: pmaxub %xmm5, %xmm1908; SSE-NEXT: retq909;910; AVX-LABEL: reassociate_umax_v32i8:911; AVX: # %bb.0:912; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm0913; AVX-NEXT: vpmaxub %ymm2, %ymm3, %ymm1914; AVX-NEXT: vpmaxub %ymm0, %ymm1, %ymm0915; AVX-NEXT: retq916 917 %t0 = add <32 x i8> %x0, %x1918 %t1 = icmp ugt <32 x i8> %x2, %t0919 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t0920 %t3 = icmp ugt <32 x i8> %x3, %t2921 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t2922 ret <32 x i8> %t4923}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, %xmm0929; SSE-NEXT: paddw %xmm3, %xmm1930; SSE-NEXT: psubusw %xmm5, %xmm1931; SSE-NEXT: paddw %xmm5, %xmm1932; SSE-NEXT: psubusw %xmm4, %xmm0933; SSE-NEXT: paddw %xmm4, %xmm0934; SSE-NEXT: psubusw %xmm6, %xmm0935; SSE-NEXT: paddw %xmm6, %xmm0936; SSE-NEXT: psubusw %xmm7, %xmm1937; SSE-NEXT: paddw %xmm7, %xmm1938; SSE-NEXT: retq939;940; AVX-LABEL: reassociate_umax_v16i16:941; AVX: # %bb.0:942; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm0943; AVX-NEXT: vpmaxuw %ymm2, %ymm3, %ymm1944; AVX-NEXT: vpmaxuw %ymm0, %ymm1, %ymm0945; AVX-NEXT: retq946 947 %t0 = add <16 x i16> %x0, %x1948 %t1 = icmp ugt <16 x i16> %x2, %t0949 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t0950 %t3 = icmp ugt <16 x i16> %x3, %t2951 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t2952 ret <16 x i16> %t4953}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, %xmm8959; SSE-NEXT: paddd %xmm2, %xmm0960; SSE-NEXT: paddd %xmm3, %xmm8961; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]962; SSE-NEXT: movdqa %xmm5, %xmm2963; SSE-NEXT: pxor %xmm1, %xmm2964; SSE-NEXT: movdqa %xmm8, %xmm3965; SSE-NEXT: pxor %xmm1, %xmm3966; SSE-NEXT: pcmpgtd %xmm3, %xmm2967; SSE-NEXT: pand %xmm2, %xmm5968; SSE-NEXT: pandn %xmm8, %xmm2969; SSE-NEXT: por %xmm5, %xmm2970; SSE-NEXT: movdqa %xmm4, %xmm3971; SSE-NEXT: pxor %xmm1, %xmm3972; SSE-NEXT: movdqa %xmm0, %xmm5973; SSE-NEXT: pxor %xmm1, %xmm5974; SSE-NEXT: pcmpgtd %xmm5, %xmm3975; SSE-NEXT: pand %xmm3, %xmm4976; SSE-NEXT: pandn %xmm0, %xmm3977; SSE-NEXT: por %xmm4, %xmm3978; SSE-NEXT: movdqa %xmm3, %xmm4979; SSE-NEXT: pxor %xmm1, %xmm4980; SSE-NEXT: movdqa %xmm6, %xmm0981; SSE-NEXT: pxor %xmm1, %xmm0982; SSE-NEXT: pcmpgtd %xmm4, %xmm0983; SSE-NEXT: pand %xmm0, %xmm6984; SSE-NEXT: pandn %xmm3, %xmm0985; SSE-NEXT: por %xmm6, %xmm0986; SSE-NEXT: movdqa %xmm2, %xmm3987; SSE-NEXT: pxor %xmm1, %xmm3988; SSE-NEXT: pxor %xmm7, %xmm1989; SSE-NEXT: pcmpgtd %xmm3, %xmm1990; SSE-NEXT: pand %xmm1, %xmm7991; SSE-NEXT: pandn %xmm2, %xmm1992; SSE-NEXT: por %xmm7, %xmm1993; SSE-NEXT: retq994;995; AVX-LABEL: reassociate_umax_v8i32:996; AVX: # %bb.0:997; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0998; AVX-NEXT: vpmaxud %ymm2, %ymm3, %ymm1999; AVX-NEXT: vpmaxud %ymm0, %ymm1, %ymm01000; AVX-NEXT: retq1001 1002 %t0 = add <8 x i32> %x0, %x11003 %t1 = icmp ugt <8 x i32> %x2, %t01004 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t01005 %t3 = icmp ugt <8 x i32> %x3, %t21006 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t21007 ret <8 x i32> %t41008}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, %xmm01014; SSE-NEXT: paddq %xmm3, %xmm11015; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]1016; SSE-NEXT: movdqa %xmm5, %xmm31017; SSE-NEXT: pxor %xmm2, %xmm31018; SSE-NEXT: movdqa %xmm1, %xmm81019; SSE-NEXT: pxor %xmm2, %xmm81020; SSE-NEXT: movdqa %xmm3, %xmm91021; SSE-NEXT: pcmpgtd %xmm8, %xmm91022; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]1023; SSE-NEXT: pcmpeqd %xmm3, %xmm81024; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]1025; SSE-NEXT: pand %xmm10, %xmm81026; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]1027; SSE-NEXT: por %xmm8, %xmm31028; SSE-NEXT: pand %xmm3, %xmm51029; SSE-NEXT: pandn %xmm1, %xmm31030; SSE-NEXT: por %xmm5, %xmm31031; SSE-NEXT: movdqa %xmm4, %xmm11032; SSE-NEXT: pxor %xmm2, %xmm11033; SSE-NEXT: movdqa %xmm0, %xmm51034; SSE-NEXT: pxor %xmm2, %xmm51035; SSE-NEXT: movdqa %xmm1, %xmm81036; SSE-NEXT: pcmpgtd %xmm5, %xmm81037; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]1038; SSE-NEXT: pcmpeqd %xmm1, %xmm51039; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]1040; SSE-NEXT: pand %xmm9, %xmm11041; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]1042; SSE-NEXT: por %xmm1, %xmm51043; SSE-NEXT: pand %xmm5, %xmm41044; SSE-NEXT: pandn %xmm0, %xmm51045; SSE-NEXT: por %xmm4, %xmm51046; SSE-NEXT: movdqa %xmm5, %xmm01047; SSE-NEXT: pxor %xmm2, %xmm01048; SSE-NEXT: movdqa %xmm6, %xmm11049; SSE-NEXT: pxor %xmm2, %xmm11050; SSE-NEXT: movdqa %xmm1, %xmm41051; SSE-NEXT: pcmpgtd %xmm0, %xmm41052; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]1053; SSE-NEXT: pcmpeqd %xmm0, %xmm11054; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1055; SSE-NEXT: pand %xmm8, %xmm11056; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]1057; SSE-NEXT: por %xmm1, %xmm01058; SSE-NEXT: pand %xmm0, %xmm61059; SSE-NEXT: pandn %xmm5, %xmm01060; SSE-NEXT: por %xmm6, %xmm01061; SSE-NEXT: movdqa %xmm3, %xmm11062; SSE-NEXT: pxor %xmm2, %xmm11063; SSE-NEXT: pxor %xmm7, %xmm21064; SSE-NEXT: movdqa %xmm2, %xmm41065; SSE-NEXT: pcmpgtd %xmm1, %xmm41066; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]1067; SSE-NEXT: pcmpeqd %xmm1, %xmm21068; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1069; SSE-NEXT: pand %xmm5, %xmm21070; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]1071; SSE-NEXT: por %xmm2, %xmm11072; SSE-NEXT: pand %xmm1, %xmm71073; SSE-NEXT: pandn %xmm3, %xmm11074; SSE-NEXT: por %xmm7, %xmm11075; SSE-NEXT: retq1076;1077; AVX2-LABEL: reassociate_umax_v4i64:1078; AVX2: # %bb.0:1079; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1080; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm01081; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm11082; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm51083; AVX2-NEXT: vpcmpgtq %ymm5, %ymm1, %ymm11084; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm01085; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm11086; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm21087; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm11088; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm01089; AVX2-NEXT: retq1090;1091; AVX512-LABEL: reassociate_umax_v4i64:1092; AVX512: # %bb.0:1093; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm01094; AVX512-NEXT: vpmaxuq %ymm2, %ymm3, %ymm11095; AVX512-NEXT: vpmaxuq %ymm0, %ymm1, %ymm01096; AVX512-NEXT: retq1097 1098 %t0 = add <4 x i64> %x0, %x11099 %t1 = icmp ugt <4 x i64> %x2, %t01100 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t01101 %t3 = icmp ugt <4 x i64> %x3, %t21102 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t21103 ret <4 x i64> %t41104}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, %xmm01110; SSE-NEXT: paddb %xmm3, %xmm11111; SSE-NEXT: movdqa %xmm5, %xmm21112; SSE-NEXT: pcmpgtb %xmm1, %xmm21113; SSE-NEXT: pand %xmm2, %xmm51114; SSE-NEXT: pandn %xmm1, %xmm21115; SSE-NEXT: por %xmm5, %xmm21116; SSE-NEXT: movdqa %xmm4, %xmm11117; SSE-NEXT: pcmpgtb %xmm0, %xmm11118; SSE-NEXT: pand %xmm1, %xmm41119; SSE-NEXT: pandn %xmm0, %xmm11120; SSE-NEXT: por %xmm4, %xmm11121; SSE-NEXT: movdqa %xmm6, %xmm01122; SSE-NEXT: pcmpgtb %xmm1, %xmm01123; SSE-NEXT: pand %xmm0, %xmm61124; SSE-NEXT: pandn %xmm1, %xmm01125; SSE-NEXT: por %xmm6, %xmm01126; SSE-NEXT: movdqa %xmm7, %xmm11127; SSE-NEXT: pcmpgtb %xmm2, %xmm11128; SSE-NEXT: pand %xmm1, %xmm71129; SSE-NEXT: pandn %xmm2, %xmm11130; SSE-NEXT: por %xmm7, %xmm11131; SSE-NEXT: retq1132;1133; AVX-LABEL: reassociate_smax_v32i8:1134; AVX: # %bb.0:1135; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm01136; AVX-NEXT: vpmaxsb %ymm2, %ymm3, %ymm11137; AVX-NEXT: vpmaxsb %ymm0, %ymm1, %ymm01138; AVX-NEXT: retq1139 1140 %t0 = add <32 x i8> %x0, %x11141 %t1 = icmp sgt <32 x i8> %x2, %t01142 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t01143 %t3 = icmp sgt <32 x i8> %x3, %t21144 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t21145 ret <32 x i8> %t41146}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, %xmm01152; SSE-NEXT: paddw %xmm3, %xmm11153; SSE-NEXT: pmaxsw %xmm6, %xmm41154; SSE-NEXT: pmaxsw %xmm4, %xmm01155; SSE-NEXT: pmaxsw %xmm7, %xmm51156; SSE-NEXT: pmaxsw %xmm5, %xmm11157; SSE-NEXT: retq1158;1159; AVX-LABEL: reassociate_smax_v16i16:1160; AVX: # %bb.0:1161; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm01162; AVX-NEXT: vpmaxsw %ymm2, %ymm3, %ymm11163; AVX-NEXT: vpmaxsw %ymm0, %ymm1, %ymm01164; AVX-NEXT: retq1165 1166 %t0 = add <16 x i16> %x0, %x11167 %t1 = icmp sgt <16 x i16> %x2, %t01168 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t01169 %t3 = icmp sgt <16 x i16> %x3, %t21170 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t21171 ret <16 x i16> %t41172}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, %xmm01178; SSE-NEXT: paddd %xmm3, %xmm11179; SSE-NEXT: movdqa %xmm5, %xmm21180; SSE-NEXT: pcmpgtd %xmm1, %xmm21181; SSE-NEXT: pand %xmm2, %xmm51182; SSE-NEXT: pandn %xmm1, %xmm21183; SSE-NEXT: por %xmm5, %xmm21184; SSE-NEXT: movdqa %xmm4, %xmm11185; SSE-NEXT: pcmpgtd %xmm0, %xmm11186; SSE-NEXT: pand %xmm1, %xmm41187; SSE-NEXT: pandn %xmm0, %xmm11188; SSE-NEXT: por %xmm4, %xmm11189; SSE-NEXT: movdqa %xmm6, %xmm01190; SSE-NEXT: pcmpgtd %xmm1, %xmm01191; SSE-NEXT: pand %xmm0, %xmm61192; SSE-NEXT: pandn %xmm1, %xmm01193; SSE-NEXT: por %xmm6, %xmm01194; SSE-NEXT: movdqa %xmm7, %xmm11195; SSE-NEXT: pcmpgtd %xmm2, %xmm11196; SSE-NEXT: pand %xmm1, %xmm71197; SSE-NEXT: pandn %xmm2, %xmm11198; SSE-NEXT: por %xmm7, %xmm11199; SSE-NEXT: retq1200;1201; AVX-LABEL: reassociate_smax_v8i32:1202; AVX: # %bb.0:1203; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm01204; AVX-NEXT: vpmaxsd %ymm2, %ymm3, %ymm11205; AVX-NEXT: vpmaxsd %ymm0, %ymm1, %ymm01206; AVX-NEXT: retq1207 1208 %t0 = add <8 x i32> %x0, %x11209 %t1 = icmp sgt <8 x i32> %x2, %t01210 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t01211 %t3 = icmp sgt <8 x i32> %x3, %t21212 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t21213 ret <8 x i32> %t41214}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, %xmm01220; SSE-NEXT: paddq %xmm3, %xmm11221; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]1222; SSE-NEXT: movdqa %xmm5, %xmm31223; SSE-NEXT: pxor %xmm2, %xmm31224; SSE-NEXT: movdqa %xmm1, %xmm81225; SSE-NEXT: pxor %xmm2, %xmm81226; SSE-NEXT: movdqa %xmm3, %xmm91227; SSE-NEXT: pcmpgtd %xmm8, %xmm91228; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]1229; SSE-NEXT: pcmpeqd %xmm3, %xmm81230; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]1231; SSE-NEXT: pand %xmm10, %xmm81232; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]1233; SSE-NEXT: por %xmm8, %xmm31234; SSE-NEXT: pand %xmm3, %xmm51235; SSE-NEXT: pandn %xmm1, %xmm31236; SSE-NEXT: por %xmm5, %xmm31237; SSE-NEXT: movdqa %xmm4, %xmm11238; SSE-NEXT: pxor %xmm2, %xmm11239; SSE-NEXT: movdqa %xmm0, %xmm51240; SSE-NEXT: pxor %xmm2, %xmm51241; SSE-NEXT: movdqa %xmm1, %xmm81242; SSE-NEXT: pcmpgtd %xmm5, %xmm81243; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]1244; SSE-NEXT: pcmpeqd %xmm1, %xmm51245; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]1246; SSE-NEXT: pand %xmm9, %xmm11247; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]1248; SSE-NEXT: por %xmm1, %xmm51249; SSE-NEXT: pand %xmm5, %xmm41250; SSE-NEXT: pandn %xmm0, %xmm51251; SSE-NEXT: por %xmm4, %xmm51252; SSE-NEXT: movdqa %xmm5, %xmm01253; SSE-NEXT: pxor %xmm2, %xmm01254; SSE-NEXT: movdqa %xmm6, %xmm11255; SSE-NEXT: pxor %xmm2, %xmm11256; SSE-NEXT: movdqa %xmm1, %xmm41257; SSE-NEXT: pcmpgtd %xmm0, %xmm41258; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]1259; SSE-NEXT: pcmpeqd %xmm0, %xmm11260; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1261; SSE-NEXT: pand %xmm8, %xmm11262; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]1263; SSE-NEXT: por %xmm1, %xmm01264; SSE-NEXT: pand %xmm0, %xmm61265; SSE-NEXT: pandn %xmm5, %xmm01266; SSE-NEXT: por %xmm6, %xmm01267; SSE-NEXT: movdqa %xmm3, %xmm11268; SSE-NEXT: pxor %xmm2, %xmm11269; SSE-NEXT: pxor %xmm7, %xmm21270; SSE-NEXT: movdqa %xmm2, %xmm41271; SSE-NEXT: pcmpgtd %xmm1, %xmm41272; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]1273; SSE-NEXT: pcmpeqd %xmm1, %xmm21274; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1275; SSE-NEXT: pand %xmm5, %xmm21276; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]1277; SSE-NEXT: por %xmm2, %xmm11278; SSE-NEXT: pand %xmm1, %xmm71279; SSE-NEXT: pandn %xmm3, %xmm11280; SSE-NEXT: por %xmm7, %xmm11281; SSE-NEXT: retq1282;1283; AVX2-LABEL: reassociate_smax_v4i64:1284; AVX2: # %bb.0:1285; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm01286; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm11287; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm01288; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm11289; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm01290; AVX2-NEXT: retq1291;1292; AVX512-LABEL: reassociate_smax_v4i64:1293; AVX512: # %bb.0:1294; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm01295; AVX512-NEXT: vpmaxsq %ymm2, %ymm3, %ymm11296; AVX512-NEXT: vpmaxsq %ymm0, %ymm1, %ymm01297; AVX512-NEXT: retq1298 1299 %t0 = add <4 x i64> %x0, %x11300 %t1 = icmp sgt <4 x i64> %x2, %t01301 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t01302 %t3 = icmp sgt <4 x i64> %x3, %t21303 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t21304 ret <4 x i64> %t41305}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, %xmm01311; SSE-NEXT: paddb %xmm3, %xmm11312; SSE-NEXT: pminub %xmm6, %xmm41313; SSE-NEXT: pminub %xmm4, %xmm01314; SSE-NEXT: pminub %xmm7, %xmm51315; SSE-NEXT: pminub %xmm5, %xmm11316; SSE-NEXT: retq1317;1318; AVX-LABEL: reassociate_umin_v32i8:1319; AVX: # %bb.0:1320; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm01321; AVX-NEXT: vpminub %ymm2, %ymm3, %ymm11322; AVX-NEXT: vpminub %ymm0, %ymm1, %ymm01323; AVX-NEXT: retq1324 1325 %t0 = add <32 x i8> %x0, %x11326 %t1 = icmp ult <32 x i8> %x2, %t01327 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t01328 %t3 = icmp ult <32 x i8> %x3, %t21329 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t21330 ret <32 x i8> %t41331}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, %xmm01337; SSE-NEXT: paddw %xmm3, %xmm11338; SSE-NEXT: movdqa %xmm5, %xmm21339; SSE-NEXT: psubusw %xmm1, %xmm21340; SSE-NEXT: psubw %xmm2, %xmm51341; SSE-NEXT: movdqa %xmm4, %xmm11342; SSE-NEXT: psubusw %xmm0, %xmm11343; SSE-NEXT: psubw %xmm1, %xmm41344; SSE-NEXT: movdqa %xmm6, %xmm01345; SSE-NEXT: psubusw %xmm4, %xmm01346; SSE-NEXT: psubw %xmm0, %xmm61347; SSE-NEXT: movdqa %xmm7, %xmm01348; SSE-NEXT: psubusw %xmm5, %xmm01349; SSE-NEXT: psubw %xmm0, %xmm71350; SSE-NEXT: movdqa %xmm6, %xmm01351; SSE-NEXT: movdqa %xmm7, %xmm11352; SSE-NEXT: retq1353;1354; AVX-LABEL: reassociate_umin_v16i16:1355; AVX: # %bb.0:1356; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm01357; AVX-NEXT: vpminuw %ymm2, %ymm3, %ymm11358; AVX-NEXT: vpminuw %ymm0, %ymm1, %ymm01359; AVX-NEXT: retq1360 1361 %t0 = add <16 x i16> %x0, %x11362 %t1 = icmp ult <16 x i16> %x2, %t01363 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t01364 %t3 = icmp ult <16 x i16> %x3, %t21365 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t21366 ret <16 x i16> %t41367}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, %xmm01373; SSE-NEXT: paddd %xmm3, %xmm11374; SSE-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1375; SSE-NEXT: movdqa %xmm5, %xmm81376; SSE-NEXT: pxor %xmm3, %xmm81377; SSE-NEXT: movdqa %xmm1, %xmm21378; SSE-NEXT: pxor %xmm3, %xmm21379; SSE-NEXT: pcmpgtd %xmm8, %xmm21380; SSE-NEXT: pand %xmm2, %xmm51381; SSE-NEXT: pandn %xmm1, %xmm21382; SSE-NEXT: por %xmm5, %xmm21383; SSE-NEXT: movdqa %xmm4, %xmm11384; SSE-NEXT: pxor %xmm3, %xmm11385; SSE-NEXT: movdqa %xmm0, %xmm51386; SSE-NEXT: pxor %xmm3, %xmm51387; SSE-NEXT: pcmpgtd %xmm1, %xmm51388; SSE-NEXT: pand %xmm5, %xmm41389; SSE-NEXT: pandn %xmm0, %xmm51390; SSE-NEXT: por %xmm4, %xmm51391; SSE-NEXT: movdqa %xmm5, %xmm01392; SSE-NEXT: pxor %xmm3, %xmm01393; SSE-NEXT: movdqa %xmm6, %xmm11394; SSE-NEXT: pxor %xmm3, %xmm11395; SSE-NEXT: pcmpgtd %xmm1, %xmm01396; SSE-NEXT: pand %xmm0, %xmm61397; SSE-NEXT: pandn %xmm5, %xmm01398; SSE-NEXT: por %xmm6, %xmm01399; SSE-NEXT: movdqa %xmm2, %xmm11400; SSE-NEXT: pxor %xmm3, %xmm11401; SSE-NEXT: pxor %xmm7, %xmm31402; SSE-NEXT: pcmpgtd %xmm3, %xmm11403; SSE-NEXT: pand %xmm1, %xmm71404; SSE-NEXT: pandn %xmm2, %xmm11405; SSE-NEXT: por %xmm7, %xmm11406; SSE-NEXT: retq1407;1408; AVX-LABEL: reassociate_umin_v8i32:1409; AVX: # %bb.0:1410; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm01411; AVX-NEXT: vpminud %ymm2, %ymm3, %ymm11412; AVX-NEXT: vpminud %ymm0, %ymm1, %ymm01413; AVX-NEXT: retq1414 1415 %t0 = add <8 x i32> %x0, %x11416 %t1 = icmp ult <8 x i32> %x2, %t01417 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t01418 %t3 = icmp ult <8 x i32> %x3, %t21419 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t21420 ret <8 x i32> %t41421}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, %xmm01427; SSE-NEXT: paddq %xmm3, %xmm11428; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]1429; SSE-NEXT: movdqa %xmm5, %xmm31430; SSE-NEXT: pxor %xmm2, %xmm31431; SSE-NEXT: movdqa %xmm1, %xmm81432; SSE-NEXT: pxor %xmm2, %xmm81433; SSE-NEXT: movdqa %xmm8, %xmm91434; SSE-NEXT: pcmpgtd %xmm3, %xmm91435; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]1436; SSE-NEXT: pcmpeqd %xmm3, %xmm81437; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]1438; SSE-NEXT: pand %xmm10, %xmm81439; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]1440; SSE-NEXT: por %xmm8, %xmm31441; SSE-NEXT: pand %xmm3, %xmm51442; SSE-NEXT: pandn %xmm1, %xmm31443; SSE-NEXT: por %xmm5, %xmm31444; SSE-NEXT: movdqa %xmm4, %xmm11445; SSE-NEXT: pxor %xmm2, %xmm11446; SSE-NEXT: movdqa %xmm0, %xmm51447; SSE-NEXT: pxor %xmm2, %xmm51448; SSE-NEXT: movdqa %xmm5, %xmm81449; SSE-NEXT: pcmpgtd %xmm1, %xmm81450; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]1451; SSE-NEXT: pcmpeqd %xmm1, %xmm51452; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]1453; SSE-NEXT: pand %xmm9, %xmm11454; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]1455; SSE-NEXT: por %xmm1, %xmm51456; SSE-NEXT: pand %xmm5, %xmm41457; SSE-NEXT: pandn %xmm0, %xmm51458; SSE-NEXT: por %xmm4, %xmm51459; SSE-NEXT: movdqa %xmm5, %xmm01460; SSE-NEXT: pxor %xmm2, %xmm01461; SSE-NEXT: movdqa %xmm6, %xmm11462; SSE-NEXT: pxor %xmm2, %xmm11463; SSE-NEXT: movdqa %xmm0, %xmm41464; SSE-NEXT: pcmpgtd %xmm1, %xmm41465; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]1466; SSE-NEXT: pcmpeqd %xmm0, %xmm11467; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1468; SSE-NEXT: pand %xmm8, %xmm11469; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]1470; SSE-NEXT: por %xmm1, %xmm01471; SSE-NEXT: pand %xmm0, %xmm61472; SSE-NEXT: pandn %xmm5, %xmm01473; SSE-NEXT: por %xmm6, %xmm01474; SSE-NEXT: movdqa %xmm3, %xmm11475; SSE-NEXT: pxor %xmm2, %xmm11476; SSE-NEXT: pxor %xmm7, %xmm21477; SSE-NEXT: movdqa %xmm1, %xmm41478; SSE-NEXT: pcmpgtd %xmm2, %xmm41479; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]1480; SSE-NEXT: pcmpeqd %xmm1, %xmm21481; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1482; SSE-NEXT: pand %xmm5, %xmm21483; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]1484; SSE-NEXT: por %xmm2, %xmm11485; SSE-NEXT: pand %xmm1, %xmm71486; SSE-NEXT: pandn %xmm3, %xmm11487; SSE-NEXT: por %xmm7, %xmm11488; SSE-NEXT: retq1489;1490; AVX2-LABEL: reassociate_umin_v4i64:1491; AVX2: # %bb.0:1492; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1493; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm01494; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm11495; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm51496; AVX2-NEXT: vpcmpgtq %ymm1, %ymm5, %ymm11497; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm01498; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm11499; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm21500; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm11501; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm01502; AVX2-NEXT: retq1503;1504; AVX512-LABEL: reassociate_umin_v4i64:1505; AVX512: # %bb.0:1506; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm01507; AVX512-NEXT: vpminuq %ymm2, %ymm3, %ymm11508; AVX512-NEXT: vpminuq %ymm0, %ymm1, %ymm01509; AVX512-NEXT: retq1510 1511 %t0 = add <4 x i64> %x0, %x11512 %t1 = icmp ult <4 x i64> %x2, %t01513 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t01514 %t3 = icmp ult <4 x i64> %x3, %t21515 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t21516 ret <4 x i64> %t41517}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, %xmm01523; SSE-NEXT: paddb %xmm3, %xmm11524; SSE-NEXT: movdqa %xmm1, %xmm21525; SSE-NEXT: pcmpgtb %xmm5, %xmm21526; SSE-NEXT: pand %xmm2, %xmm51527; SSE-NEXT: pandn %xmm1, %xmm21528; SSE-NEXT: por %xmm5, %xmm21529; SSE-NEXT: movdqa %xmm0, %xmm11530; SSE-NEXT: pcmpgtb %xmm4, %xmm11531; SSE-NEXT: pand %xmm1, %xmm41532; SSE-NEXT: pandn %xmm0, %xmm11533; SSE-NEXT: por %xmm4, %xmm11534; SSE-NEXT: movdqa %xmm1, %xmm01535; SSE-NEXT: pcmpgtb %xmm6, %xmm01536; SSE-NEXT: pand %xmm0, %xmm61537; SSE-NEXT: pandn %xmm1, %xmm01538; SSE-NEXT: por %xmm6, %xmm01539; SSE-NEXT: movdqa %xmm2, %xmm11540; SSE-NEXT: pcmpgtb %xmm7, %xmm11541; SSE-NEXT: pand %xmm1, %xmm71542; SSE-NEXT: pandn %xmm2, %xmm11543; SSE-NEXT: por %xmm7, %xmm11544; SSE-NEXT: retq1545;1546; AVX-LABEL: reassociate_smin_v32i8:1547; AVX: # %bb.0:1548; AVX-NEXT: vpaddb %ymm1, %ymm0, %ymm01549; AVX-NEXT: vpminsb %ymm2, %ymm3, %ymm11550; AVX-NEXT: vpminsb %ymm0, %ymm1, %ymm01551; AVX-NEXT: retq1552 1553 %t0 = add <32 x i8> %x0, %x11554 %t1 = icmp slt <32 x i8> %x2, %t01555 %t2 = select <32 x i1> %t1, <32 x i8> %x2, <32 x i8> %t01556 %t3 = icmp slt <32 x i8> %x3, %t21557 %t4 = select <32 x i1> %t3, <32 x i8> %x3, <32 x i8> %t21558 ret <32 x i8> %t41559}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, %xmm01565; SSE-NEXT: paddw %xmm3, %xmm11566; SSE-NEXT: pminsw %xmm6, %xmm41567; SSE-NEXT: pminsw %xmm4, %xmm01568; SSE-NEXT: pminsw %xmm7, %xmm51569; SSE-NEXT: pminsw %xmm5, %xmm11570; SSE-NEXT: retq1571;1572; AVX-LABEL: reassociate_smin_v16i16:1573; AVX: # %bb.0:1574; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm01575; AVX-NEXT: vpminsw %ymm2, %ymm3, %ymm11576; AVX-NEXT: vpminsw %ymm0, %ymm1, %ymm01577; AVX-NEXT: retq1578 1579 %t0 = add <16 x i16> %x0, %x11580 %t1 = icmp slt <16 x i16> %x2, %t01581 %t2 = select <16 x i1> %t1, <16 x i16> %x2, <16 x i16> %t01582 %t3 = icmp slt <16 x i16> %x3, %t21583 %t4 = select <16 x i1> %t3, <16 x i16> %x3, <16 x i16> %t21584 ret <16 x i16> %t41585}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, %xmm01591; SSE-NEXT: paddd %xmm3, %xmm11592; SSE-NEXT: movdqa %xmm1, %xmm21593; SSE-NEXT: pcmpgtd %xmm5, %xmm21594; SSE-NEXT: pand %xmm2, %xmm51595; SSE-NEXT: pandn %xmm1, %xmm21596; SSE-NEXT: por %xmm5, %xmm21597; SSE-NEXT: movdqa %xmm0, %xmm11598; SSE-NEXT: pcmpgtd %xmm4, %xmm11599; SSE-NEXT: pand %xmm1, %xmm41600; SSE-NEXT: pandn %xmm0, %xmm11601; SSE-NEXT: por %xmm4, %xmm11602; SSE-NEXT: movdqa %xmm1, %xmm01603; SSE-NEXT: pcmpgtd %xmm6, %xmm01604; SSE-NEXT: pand %xmm0, %xmm61605; SSE-NEXT: pandn %xmm1, %xmm01606; SSE-NEXT: por %xmm6, %xmm01607; SSE-NEXT: movdqa %xmm2, %xmm11608; SSE-NEXT: pcmpgtd %xmm7, %xmm11609; SSE-NEXT: pand %xmm1, %xmm71610; SSE-NEXT: pandn %xmm2, %xmm11611; SSE-NEXT: por %xmm7, %xmm11612; SSE-NEXT: retq1613;1614; AVX-LABEL: reassociate_smin_v8i32:1615; AVX: # %bb.0:1616; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm01617; AVX-NEXT: vpminsd %ymm2, %ymm3, %ymm11618; AVX-NEXT: vpminsd %ymm0, %ymm1, %ymm01619; AVX-NEXT: retq1620 1621 %t0 = add <8 x i32> %x0, %x11622 %t1 = icmp slt <8 x i32> %x2, %t01623 %t2 = select <8 x i1> %t1, <8 x i32> %x2, <8 x i32> %t01624 %t3 = icmp slt <8 x i32> %x3, %t21625 %t4 = select <8 x i1> %t3, <8 x i32> %x3, <8 x i32> %t21626 ret <8 x i32> %t41627}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, %xmm01633; SSE-NEXT: paddq %xmm3, %xmm11634; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]1635; SSE-NEXT: movdqa %xmm5, %xmm31636; SSE-NEXT: pxor %xmm2, %xmm31637; SSE-NEXT: movdqa %xmm1, %xmm81638; SSE-NEXT: pxor %xmm2, %xmm81639; SSE-NEXT: movdqa %xmm8, %xmm91640; SSE-NEXT: pcmpgtd %xmm3, %xmm91641; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]1642; SSE-NEXT: pcmpeqd %xmm3, %xmm81643; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]1644; SSE-NEXT: pand %xmm10, %xmm81645; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]1646; SSE-NEXT: por %xmm8, %xmm31647; SSE-NEXT: pand %xmm3, %xmm51648; SSE-NEXT: pandn %xmm1, %xmm31649; SSE-NEXT: por %xmm5, %xmm31650; SSE-NEXT: movdqa %xmm4, %xmm11651; SSE-NEXT: pxor %xmm2, %xmm11652; SSE-NEXT: movdqa %xmm0, %xmm51653; SSE-NEXT: pxor %xmm2, %xmm51654; SSE-NEXT: movdqa %xmm5, %xmm81655; SSE-NEXT: pcmpgtd %xmm1, %xmm81656; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]1657; SSE-NEXT: pcmpeqd %xmm1, %xmm51658; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]1659; SSE-NEXT: pand %xmm9, %xmm11660; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]1661; SSE-NEXT: por %xmm1, %xmm51662; SSE-NEXT: pand %xmm5, %xmm41663; SSE-NEXT: pandn %xmm0, %xmm51664; SSE-NEXT: por %xmm4, %xmm51665; SSE-NEXT: movdqa %xmm5, %xmm01666; SSE-NEXT: pxor %xmm2, %xmm01667; SSE-NEXT: movdqa %xmm6, %xmm11668; SSE-NEXT: pxor %xmm2, %xmm11669; SSE-NEXT: movdqa %xmm0, %xmm41670; SSE-NEXT: pcmpgtd %xmm1, %xmm41671; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]1672; SSE-NEXT: pcmpeqd %xmm0, %xmm11673; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1674; SSE-NEXT: pand %xmm8, %xmm11675; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]1676; SSE-NEXT: por %xmm1, %xmm01677; SSE-NEXT: pand %xmm0, %xmm61678; SSE-NEXT: pandn %xmm5, %xmm01679; SSE-NEXT: por %xmm6, %xmm01680; SSE-NEXT: movdqa %xmm3, %xmm11681; SSE-NEXT: pxor %xmm2, %xmm11682; SSE-NEXT: pxor %xmm7, %xmm21683; SSE-NEXT: movdqa %xmm1, %xmm41684; SSE-NEXT: pcmpgtd %xmm2, %xmm41685; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]1686; SSE-NEXT: pcmpeqd %xmm1, %xmm21687; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1688; SSE-NEXT: pand %xmm5, %xmm21689; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]1690; SSE-NEXT: por %xmm2, %xmm11691; SSE-NEXT: pand %xmm1, %xmm71692; SSE-NEXT: pandn %xmm3, %xmm11693; SSE-NEXT: por %xmm7, %xmm11694; SSE-NEXT: retq1695;1696; AVX2-LABEL: reassociate_smin_v4i64:1697; AVX2: # %bb.0:1698; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm01699; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm11700; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm01701; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm11702; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm01703; AVX2-NEXT: retq1704;1705; AVX512-LABEL: reassociate_smin_v4i64:1706; AVX512: # %bb.0:1707; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm01708; AVX512-NEXT: vpminsq %ymm2, %ymm3, %ymm11709; AVX512-NEXT: vpminsq %ymm0, %ymm1, %ymm01710; AVX512-NEXT: retq1711 1712 %t0 = add <4 x i64> %x0, %x11713 %t1 = icmp slt <4 x i64> %x2, %t01714 %t2 = select <4 x i1> %t1, <4 x i64> %x2, <4 x i64> %t01715 %t3 = icmp slt <4 x i64> %x3, %t21716 %t4 = select <4 x i1> %t3, <4 x i64> %x3, <4 x i64> %t21717 ret <4 x i64> %t41718}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, %xmm01726; SSE-NEXT: paddb %xmm5, %xmm11727; SSE-NEXT: paddb %xmm6, %xmm21728; SSE-NEXT: paddb %xmm7, %xmm31729; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm31730; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm21731; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm11732; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm01733; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm01734; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm11735; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm21736; SSE-NEXT: pmaxub {{[0-9]+}}(%rsp), %xmm31737; SSE-NEXT: retq1738;1739; AVX2-LABEL: reassociate_umax_v64i8:1740; AVX2: # %bb.0:1741; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm01742; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm11743; AVX2-NEXT: vpmaxub %ymm4, %ymm6, %ymm21744; AVX2-NEXT: vpmaxub %ymm0, %ymm2, %ymm01745; AVX2-NEXT: vpmaxub %ymm5, %ymm7, %ymm21746; AVX2-NEXT: vpmaxub %ymm1, %ymm2, %ymm11747; AVX2-NEXT: retq1748;1749; AVX512-LABEL: reassociate_umax_v64i8:1750; AVX512: # %bb.0:1751; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm01752; AVX512-NEXT: vpmaxub %zmm2, %zmm3, %zmm11753; AVX512-NEXT: vpmaxub %zmm0, %zmm1, %zmm01754; AVX512-NEXT: retq1755 1756 %t0 = add <64 x i8> %x0, %x11757 %t1 = icmp ugt <64 x i8> %x2, %t01758 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t01759 %t3 = icmp ugt <64 x i8> %x3, %t21760 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t21761 ret <64 x i8> %t41762}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), %xmm81768; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm91769; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm101770; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm111771; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm121772; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm131773; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm141774; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm151775; SSE-NEXT: paddw %xmm4, %xmm01776; SSE-NEXT: paddw %xmm5, %xmm11777; SSE-NEXT: paddw %xmm6, %xmm21778; SSE-NEXT: paddw %xmm7, %xmm31779; SSE-NEXT: psubusw %xmm15, %xmm31780; SSE-NEXT: paddw %xmm15, %xmm31781; SSE-NEXT: psubusw %xmm14, %xmm21782; SSE-NEXT: paddw %xmm14, %xmm21783; SSE-NEXT: psubusw %xmm13, %xmm11784; SSE-NEXT: paddw %xmm13, %xmm11785; SSE-NEXT: psubusw %xmm12, %xmm01786; SSE-NEXT: paddw %xmm12, %xmm01787; SSE-NEXT: psubusw %xmm11, %xmm01788; SSE-NEXT: paddw %xmm11, %xmm01789; SSE-NEXT: psubusw %xmm10, %xmm11790; SSE-NEXT: paddw %xmm10, %xmm11791; SSE-NEXT: psubusw %xmm9, %xmm21792; SSE-NEXT: paddw %xmm9, %xmm21793; SSE-NEXT: psubusw %xmm8, %xmm31794; SSE-NEXT: paddw %xmm8, %xmm31795; SSE-NEXT: retq1796;1797; AVX2-LABEL: reassociate_umax_v32i16:1798; AVX2: # %bb.0:1799; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm01800; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm11801; AVX2-NEXT: vpmaxuw %ymm4, %ymm6, %ymm21802; AVX2-NEXT: vpmaxuw %ymm0, %ymm2, %ymm01803; AVX2-NEXT: vpmaxuw %ymm5, %ymm7, %ymm21804; AVX2-NEXT: vpmaxuw %ymm1, %ymm2, %ymm11805; AVX2-NEXT: retq1806;1807; AVX512-LABEL: reassociate_umax_v32i16:1808; AVX512: # %bb.0:1809; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm01810; AVX512-NEXT: vpmaxuw %zmm2, %zmm3, %zmm11811; AVX512-NEXT: vpmaxuw %zmm0, %zmm1, %zmm01812; AVX512-NEXT: retq1813 1814 %t0 = add <32 x i16> %x0, %x11815 %t1 = icmp ugt <32 x i16> %x2, %t01816 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t01817 %t3 = icmp ugt <32 x i16> %x3, %t21818 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t21819 ret <32 x i16> %t41820}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, %xmm91826; SSE-NEXT: movdqa %xmm4, %xmm71827; SSE-NEXT: movdqa %xmm3, %xmm81828; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm101829; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm111830; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm121831; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm131832; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm141833; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm151834; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm41835; SSE-NEXT: paddd %xmm7, %xmm01836; SSE-NEXT: paddd %xmm5, %xmm11837; SSE-NEXT: paddd %xmm6, %xmm21838; SSE-NEXT: paddd %xmm9, %xmm81839; SSE-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1840; SSE-NEXT: movdqa %xmm4, %xmm61841; SSE-NEXT: pxor %xmm3, %xmm61842; SSE-NEXT: movdqa %xmm8, %xmm51843; SSE-NEXT: pxor %xmm3, %xmm51844; SSE-NEXT: pcmpgtd %xmm5, %xmm61845; SSE-NEXT: pand %xmm6, %xmm41846; SSE-NEXT: pandn %xmm8, %xmm61847; SSE-NEXT: por %xmm4, %xmm61848; SSE-NEXT: movdqa %xmm15, %xmm51849; SSE-NEXT: pxor %xmm3, %xmm51850; SSE-NEXT: movdqa %xmm2, %xmm41851; SSE-NEXT: pxor %xmm3, %xmm41852; SSE-NEXT: pcmpgtd %xmm4, %xmm51853; SSE-NEXT: pand %xmm5, %xmm151854; SSE-NEXT: pandn %xmm2, %xmm51855; SSE-NEXT: por %xmm15, %xmm51856; SSE-NEXT: movdqa %xmm14, %xmm21857; SSE-NEXT: pxor %xmm3, %xmm21858; SSE-NEXT: movdqa %xmm1, %xmm41859; SSE-NEXT: pxor %xmm3, %xmm41860; SSE-NEXT: pcmpgtd %xmm4, %xmm21861; SSE-NEXT: pand %xmm2, %xmm141862; SSE-NEXT: pandn %xmm1, %xmm21863; SSE-NEXT: por %xmm14, %xmm21864; SSE-NEXT: movdqa %xmm13, %xmm11865; SSE-NEXT: pxor %xmm3, %xmm11866; SSE-NEXT: movdqa %xmm0, %xmm41867; SSE-NEXT: pxor %xmm3, %xmm41868; SSE-NEXT: pcmpgtd %xmm4, %xmm11869; SSE-NEXT: pand %xmm1, %xmm131870; SSE-NEXT: pandn %xmm0, %xmm11871; SSE-NEXT: por %xmm13, %xmm11872; SSE-NEXT: movdqa %xmm1, %xmm41873; SSE-NEXT: pxor %xmm3, %xmm41874; SSE-NEXT: movdqa %xmm12, %xmm01875; SSE-NEXT: pxor %xmm3, %xmm01876; SSE-NEXT: pcmpgtd %xmm4, %xmm01877; SSE-NEXT: pand %xmm0, %xmm121878; SSE-NEXT: pandn %xmm1, %xmm01879; SSE-NEXT: por %xmm12, %xmm01880; SSE-NEXT: movdqa %xmm2, %xmm41881; SSE-NEXT: pxor %xmm3, %xmm41882; SSE-NEXT: movdqa %xmm11, %xmm11883; SSE-NEXT: pxor %xmm3, %xmm11884; SSE-NEXT: pcmpgtd %xmm4, %xmm11885; SSE-NEXT: pand %xmm1, %xmm111886; SSE-NEXT: pandn %xmm2, %xmm11887; SSE-NEXT: por %xmm11, %xmm11888; SSE-NEXT: movdqa %xmm5, %xmm41889; SSE-NEXT: pxor %xmm3, %xmm41890; SSE-NEXT: movdqa %xmm10, %xmm21891; SSE-NEXT: pxor %xmm3, %xmm21892; SSE-NEXT: pcmpgtd %xmm4, %xmm21893; SSE-NEXT: pand %xmm2, %xmm101894; SSE-NEXT: pandn %xmm5, %xmm21895; SSE-NEXT: por %xmm10, %xmm21896; SSE-NEXT: movdqa %xmm6, %xmm41897; SSE-NEXT: pxor %xmm3, %xmm41898; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm51899; SSE-NEXT: pxor %xmm5, %xmm31900; SSE-NEXT: pcmpgtd %xmm4, %xmm31901; SSE-NEXT: pand %xmm3, %xmm51902; SSE-NEXT: pandn %xmm6, %xmm31903; SSE-NEXT: por %xmm5, %xmm31904; SSE-NEXT: retq1905;1906; AVX2-LABEL: reassociate_umax_v16i32:1907; AVX2: # %bb.0:1908; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm01909; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm11910; AVX2-NEXT: vpmaxud %ymm4, %ymm6, %ymm21911; AVX2-NEXT: vpmaxud %ymm0, %ymm2, %ymm01912; AVX2-NEXT: vpmaxud %ymm5, %ymm7, %ymm21913; AVX2-NEXT: vpmaxud %ymm1, %ymm2, %ymm11914; AVX2-NEXT: retq1915;1916; AVX512-LABEL: reassociate_umax_v16i32:1917; AVX512: # %bb.0:1918; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm01919; AVX512-NEXT: vpmaxud %zmm2, %zmm3, %zmm11920; AVX512-NEXT: vpmaxud %zmm0, %zmm1, %zmm01921; AVX512-NEXT: retq1922 1923 %t0 = add <16 x i32> %x0, %x11924 %t1 = icmp ugt <16 x i32> %x2, %t01925 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t01926 %t3 = icmp ugt <16 x i32> %x3, %t21927 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t21928 ret <16 x i32> %t41929}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), %xmm81935; SSE-NEXT: paddq %xmm4, %xmm01936; SSE-NEXT: paddq %xmm5, %xmm11937; SSE-NEXT: paddq %xmm6, %xmm21938; SSE-NEXT: paddq %xmm7, %xmm31939; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]1940; SSE-NEXT: movdqa %xmm8, %xmm51941; SSE-NEXT: pxor %xmm4, %xmm51942; SSE-NEXT: movdqa %xmm3, %xmm61943; SSE-NEXT: pxor %xmm4, %xmm61944; SSE-NEXT: movdqa %xmm5, %xmm71945; SSE-NEXT: pcmpgtd %xmm6, %xmm71946; SSE-NEXT: pcmpeqd %xmm5, %xmm61947; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]1948; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]1949; SSE-NEXT: pand %xmm5, %xmm61950; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm91951; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]1952; SSE-NEXT: por %xmm6, %xmm51953; SSE-NEXT: pand %xmm5, %xmm81954; SSE-NEXT: pandn %xmm3, %xmm51955; SSE-NEXT: por %xmm8, %xmm51956; SSE-NEXT: movdqa %xmm9, %xmm31957; SSE-NEXT: pxor %xmm4, %xmm31958; SSE-NEXT: movdqa %xmm2, %xmm61959; SSE-NEXT: pxor %xmm4, %xmm61960; SSE-NEXT: movdqa %xmm3, %xmm71961; SSE-NEXT: pcmpgtd %xmm6, %xmm71962; SSE-NEXT: pcmpeqd %xmm3, %xmm61963; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]1964; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]1965; SSE-NEXT: pand %xmm3, %xmm61966; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm81967; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]1968; SSE-NEXT: por %xmm6, %xmm31969; SSE-NEXT: pand %xmm3, %xmm91970; SSE-NEXT: pandn %xmm2, %xmm31971; SSE-NEXT: por %xmm9, %xmm31972; SSE-NEXT: movdqa %xmm8, %xmm21973; SSE-NEXT: pxor %xmm4, %xmm21974; SSE-NEXT: movdqa %xmm1, %xmm61975; SSE-NEXT: pxor %xmm4, %xmm61976; SSE-NEXT: movdqa %xmm2, %xmm71977; SSE-NEXT: pcmpgtd %xmm6, %xmm71978; SSE-NEXT: pcmpeqd %xmm2, %xmm61979; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]1980; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]1981; SSE-NEXT: pand %xmm2, %xmm61982; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm91983; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]1984; SSE-NEXT: por %xmm6, %xmm21985; SSE-NEXT: pand %xmm2, %xmm81986; SSE-NEXT: pandn %xmm1, %xmm21987; SSE-NEXT: por %xmm8, %xmm21988; SSE-NEXT: movdqa %xmm9, %xmm11989; SSE-NEXT: pxor %xmm4, %xmm11990; SSE-NEXT: movdqa %xmm0, %xmm61991; SSE-NEXT: pxor %xmm4, %xmm61992; SSE-NEXT: movdqa %xmm1, %xmm71993; SSE-NEXT: pcmpgtd %xmm6, %xmm71994; SSE-NEXT: pcmpeqd %xmm1, %xmm61995; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]1996; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]1997; SSE-NEXT: pand %xmm1, %xmm61998; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11999; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]2000; SSE-NEXT: por %xmm6, %xmm72001; SSE-NEXT: pand %xmm7, %xmm92002; SSE-NEXT: pandn %xmm0, %xmm72003; SSE-NEXT: por %xmm9, %xmm72004; SSE-NEXT: movdqa %xmm7, %xmm02005; SSE-NEXT: pxor %xmm4, %xmm02006; SSE-NEXT: movdqa %xmm1, %xmm62007; SSE-NEXT: pxor %xmm4, %xmm62008; SSE-NEXT: movdqa %xmm6, %xmm82009; SSE-NEXT: pcmpgtd %xmm0, %xmm82010; SSE-NEXT: pcmpeqd %xmm0, %xmm62011; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]2012; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2013; SSE-NEXT: pand %xmm0, %xmm62014; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92015; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[1,1,3,3]2016; SSE-NEXT: por %xmm6, %xmm02017; SSE-NEXT: pand %xmm0, %xmm12018; SSE-NEXT: pandn %xmm7, %xmm02019; SSE-NEXT: por %xmm1, %xmm02020; SSE-NEXT: movdqa %xmm2, %xmm12021; SSE-NEXT: pxor %xmm4, %xmm12022; SSE-NEXT: movdqa %xmm9, %xmm62023; SSE-NEXT: pxor %xmm4, %xmm62024; SSE-NEXT: movdqa %xmm6, %xmm72025; SSE-NEXT: pcmpgtd %xmm1, %xmm72026; SSE-NEXT: pcmpeqd %xmm1, %xmm62027; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]2028; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2029; SSE-NEXT: pand %xmm1, %xmm62030; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm82031; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]2032; SSE-NEXT: por %xmm6, %xmm12033; SSE-NEXT: pand %xmm1, %xmm92034; SSE-NEXT: pandn %xmm2, %xmm12035; SSE-NEXT: por %xmm9, %xmm12036; SSE-NEXT: movdqa %xmm3, %xmm22037; SSE-NEXT: pxor %xmm4, %xmm22038; SSE-NEXT: movdqa %xmm8, %xmm62039; SSE-NEXT: pxor %xmm4, %xmm62040; SSE-NEXT: movdqa %xmm6, %xmm72041; SSE-NEXT: pcmpgtd %xmm2, %xmm72042; SSE-NEXT: pcmpeqd %xmm2, %xmm62043; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]2044; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2045; SSE-NEXT: pand %xmm2, %xmm62046; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]2047; SSE-NEXT: por %xmm6, %xmm22048; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm62049; SSE-NEXT: pand %xmm2, %xmm82050; SSE-NEXT: pandn %xmm3, %xmm22051; SSE-NEXT: por %xmm8, %xmm22052; SSE-NEXT: movdqa %xmm5, %xmm32053; SSE-NEXT: pxor %xmm4, %xmm32054; SSE-NEXT: pxor %xmm6, %xmm42055; SSE-NEXT: movdqa %xmm4, %xmm72056; SSE-NEXT: pcmpgtd %xmm3, %xmm72057; SSE-NEXT: pcmpeqd %xmm3, %xmm42058; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]2059; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]2060; SSE-NEXT: pand %xmm3, %xmm42061; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]2062; SSE-NEXT: por %xmm4, %xmm32063; SSE-NEXT: pand %xmm3, %xmm62064; SSE-NEXT: pandn %xmm5, %xmm32065; SSE-NEXT: por %xmm6, %xmm32066; SSE-NEXT: retq2067;2068; AVX2-LABEL: reassociate_umax_v8i64:2069; AVX2: # %bb.0:2070; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm02071; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]2072; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm12073; AVX2-NEXT: vpxor %ymm2, %ymm5, %ymm32074; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm82075; AVX2-NEXT: vpcmpgtq %ymm8, %ymm3, %ymm32076; AVX2-NEXT: vblendvpd %ymm3, %ymm5, %ymm1, %ymm12077; AVX2-NEXT: vpxor %ymm2, %ymm4, %ymm32078; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm52079; AVX2-NEXT: vpcmpgtq %ymm5, %ymm3, %ymm32080; AVX2-NEXT: vblendvpd %ymm3, %ymm4, %ymm0, %ymm02081; AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm32082; AVX2-NEXT: vpxor %ymm2, %ymm6, %ymm42083; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm32084; AVX2-NEXT: vblendvpd %ymm3, %ymm6, %ymm0, %ymm02085; AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm32086; AVX2-NEXT: vpxor %ymm2, %ymm7, %ymm22087; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm22088; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm12089; AVX2-NEXT: retq2090;2091; AVX512-LABEL: reassociate_umax_v8i64:2092; AVX512: # %bb.0:2093; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm02094; AVX512-NEXT: vpmaxuq %zmm2, %zmm3, %zmm12095; AVX512-NEXT: vpmaxuq %zmm0, %zmm1, %zmm02096; AVX512-NEXT: retq2097 2098 %t0 = add <8 x i64> %x0, %x12099 %t1 = icmp ugt <8 x i64> %x2, %t02100 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t02101 %t3 = icmp ugt <8 x i64> %x3, %t22102 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t22103 ret <8 x i64> %t42104}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), %xmm82110; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92111; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm102112; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm112113; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm122114; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm132115; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm142116; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm152117; SSE-NEXT: paddb %xmm4, %xmm02118; SSE-NEXT: paddb %xmm5, %xmm12119; SSE-NEXT: paddb %xmm6, %xmm22120; SSE-NEXT: paddb %xmm7, %xmm32121; SSE-NEXT: movdqa %xmm15, %xmm42122; SSE-NEXT: pcmpgtb %xmm3, %xmm42123; SSE-NEXT: pand %xmm4, %xmm152124; SSE-NEXT: pandn %xmm3, %xmm42125; SSE-NEXT: por %xmm15, %xmm42126; SSE-NEXT: movdqa %xmm14, %xmm32127; SSE-NEXT: pcmpgtb %xmm2, %xmm32128; SSE-NEXT: pand %xmm3, %xmm142129; SSE-NEXT: pandn %xmm2, %xmm32130; SSE-NEXT: por %xmm14, %xmm32131; SSE-NEXT: movdqa %xmm13, %xmm22132; SSE-NEXT: pcmpgtb %xmm1, %xmm22133; SSE-NEXT: pand %xmm2, %xmm132134; SSE-NEXT: pandn %xmm1, %xmm22135; SSE-NEXT: por %xmm13, %xmm22136; SSE-NEXT: movdqa %xmm12, %xmm12137; SSE-NEXT: pcmpgtb %xmm0, %xmm12138; SSE-NEXT: pand %xmm1, %xmm122139; SSE-NEXT: pandn %xmm0, %xmm12140; SSE-NEXT: por %xmm12, %xmm12141; SSE-NEXT: movdqa %xmm11, %xmm02142; SSE-NEXT: pcmpgtb %xmm1, %xmm02143; SSE-NEXT: pand %xmm0, %xmm112144; SSE-NEXT: pandn %xmm1, %xmm02145; SSE-NEXT: por %xmm11, %xmm02146; SSE-NEXT: movdqa %xmm10, %xmm12147; SSE-NEXT: pcmpgtb %xmm2, %xmm12148; SSE-NEXT: pand %xmm1, %xmm102149; SSE-NEXT: pandn %xmm2, %xmm12150; SSE-NEXT: por %xmm10, %xmm12151; SSE-NEXT: movdqa %xmm9, %xmm22152; SSE-NEXT: pcmpgtb %xmm3, %xmm22153; SSE-NEXT: pand %xmm2, %xmm92154; SSE-NEXT: pandn %xmm3, %xmm22155; SSE-NEXT: por %xmm9, %xmm22156; SSE-NEXT: movdqa %xmm8, %xmm32157; SSE-NEXT: pcmpgtb %xmm4, %xmm32158; SSE-NEXT: pand %xmm3, %xmm82159; SSE-NEXT: pandn %xmm4, %xmm32160; SSE-NEXT: por %xmm8, %xmm32161; SSE-NEXT: retq2162;2163; AVX2-LABEL: reassociate_smax_v64i8:2164; AVX2: # %bb.0:2165; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm02166; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm12167; AVX2-NEXT: vpmaxsb %ymm4, %ymm6, %ymm22168; AVX2-NEXT: vpmaxsb %ymm0, %ymm2, %ymm02169; AVX2-NEXT: vpmaxsb %ymm5, %ymm7, %ymm22170; AVX2-NEXT: vpmaxsb %ymm1, %ymm2, %ymm12171; AVX2-NEXT: retq2172;2173; AVX512-LABEL: reassociate_smax_v64i8:2174; AVX512: # %bb.0:2175; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm02176; AVX512-NEXT: vpmaxsb %zmm2, %zmm3, %zmm12177; AVX512-NEXT: vpmaxsb %zmm0, %zmm1, %zmm02178; AVX512-NEXT: retq2179 2180 %t0 = add <64 x i8> %x0, %x12181 %t1 = icmp sgt <64 x i8> %x2, %t02182 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t02183 %t3 = icmp sgt <64 x i8> %x3, %t22184 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t22185 ret <64 x i8> %t42186}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, %xmm02192; SSE-NEXT: paddw %xmm5, %xmm12193; SSE-NEXT: paddw %xmm6, %xmm22194; SSE-NEXT: paddw %xmm7, %xmm32195; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm32196; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm22197; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm12198; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm02199; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm02200; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm12201; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm22202; SSE-NEXT: pmaxsw {{[0-9]+}}(%rsp), %xmm32203; SSE-NEXT: retq2204;2205; AVX2-LABEL: reassociate_smax_v32i16:2206; AVX2: # %bb.0:2207; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm02208; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm12209; AVX2-NEXT: vpmaxsw %ymm4, %ymm6, %ymm22210; AVX2-NEXT: vpmaxsw %ymm0, %ymm2, %ymm02211; AVX2-NEXT: vpmaxsw %ymm5, %ymm7, %ymm22212; AVX2-NEXT: vpmaxsw %ymm1, %ymm2, %ymm12213; AVX2-NEXT: retq2214;2215; AVX512-LABEL: reassociate_smax_v32i16:2216; AVX512: # %bb.0:2217; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm02218; AVX512-NEXT: vpmaxsw %zmm2, %zmm3, %zmm12219; AVX512-NEXT: vpmaxsw %zmm0, %zmm1, %zmm02220; AVX512-NEXT: retq2221 2222 %t0 = add <32 x i16> %x0, %x12223 %t1 = icmp sgt <32 x i16> %x2, %t02224 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t02225 %t3 = icmp sgt <32 x i16> %x3, %t22226 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t22227 ret <32 x i16> %t42228}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), %xmm82234; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92235; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm102236; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm112237; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm122238; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm132239; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm142240; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm152241; SSE-NEXT: paddd %xmm4, %xmm02242; SSE-NEXT: paddd %xmm5, %xmm12243; SSE-NEXT: paddd %xmm6, %xmm22244; SSE-NEXT: paddd %xmm7, %xmm32245; SSE-NEXT: movdqa %xmm15, %xmm42246; SSE-NEXT: pcmpgtd %xmm3, %xmm42247; SSE-NEXT: pand %xmm4, %xmm152248; SSE-NEXT: pandn %xmm3, %xmm42249; SSE-NEXT: por %xmm15, %xmm42250; SSE-NEXT: movdqa %xmm14, %xmm32251; SSE-NEXT: pcmpgtd %xmm2, %xmm32252; SSE-NEXT: pand %xmm3, %xmm142253; SSE-NEXT: pandn %xmm2, %xmm32254; SSE-NEXT: por %xmm14, %xmm32255; SSE-NEXT: movdqa %xmm13, %xmm22256; SSE-NEXT: pcmpgtd %xmm1, %xmm22257; SSE-NEXT: pand %xmm2, %xmm132258; SSE-NEXT: pandn %xmm1, %xmm22259; SSE-NEXT: por %xmm13, %xmm22260; SSE-NEXT: movdqa %xmm12, %xmm12261; SSE-NEXT: pcmpgtd %xmm0, %xmm12262; SSE-NEXT: pand %xmm1, %xmm122263; SSE-NEXT: pandn %xmm0, %xmm12264; SSE-NEXT: por %xmm12, %xmm12265; SSE-NEXT: movdqa %xmm11, %xmm02266; SSE-NEXT: pcmpgtd %xmm1, %xmm02267; SSE-NEXT: pand %xmm0, %xmm112268; SSE-NEXT: pandn %xmm1, %xmm02269; SSE-NEXT: por %xmm11, %xmm02270; SSE-NEXT: movdqa %xmm10, %xmm12271; SSE-NEXT: pcmpgtd %xmm2, %xmm12272; SSE-NEXT: pand %xmm1, %xmm102273; SSE-NEXT: pandn %xmm2, %xmm12274; SSE-NEXT: por %xmm10, %xmm12275; SSE-NEXT: movdqa %xmm9, %xmm22276; SSE-NEXT: pcmpgtd %xmm3, %xmm22277; SSE-NEXT: pand %xmm2, %xmm92278; SSE-NEXT: pandn %xmm3, %xmm22279; SSE-NEXT: por %xmm9, %xmm22280; SSE-NEXT: movdqa %xmm8, %xmm32281; SSE-NEXT: pcmpgtd %xmm4, %xmm32282; SSE-NEXT: pand %xmm3, %xmm82283; SSE-NEXT: pandn %xmm4, %xmm32284; SSE-NEXT: por %xmm8, %xmm32285; SSE-NEXT: retq2286;2287; AVX2-LABEL: reassociate_smax_v16i32:2288; AVX2: # %bb.0:2289; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm02290; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm12291; AVX2-NEXT: vpmaxsd %ymm4, %ymm6, %ymm22292; AVX2-NEXT: vpmaxsd %ymm0, %ymm2, %ymm02293; AVX2-NEXT: vpmaxsd %ymm5, %ymm7, %ymm22294; AVX2-NEXT: vpmaxsd %ymm1, %ymm2, %ymm12295; AVX2-NEXT: retq2296;2297; AVX512-LABEL: reassociate_smax_v16i32:2298; AVX512: # %bb.0:2299; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm02300; AVX512-NEXT: vpmaxsd %zmm2, %zmm3, %zmm12301; AVX512-NEXT: vpmaxsd %zmm0, %zmm1, %zmm02302; AVX512-NEXT: retq2303 2304 %t0 = add <16 x i32> %x0, %x12305 %t1 = icmp sgt <16 x i32> %x2, %t02306 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t02307 %t3 = icmp sgt <16 x i32> %x3, %t22308 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t22309 ret <16 x i32> %t42310}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), %xmm82316; SSE-NEXT: paddq %xmm4, %xmm02317; SSE-NEXT: paddq %xmm5, %xmm12318; SSE-NEXT: paddq %xmm6, %xmm22319; SSE-NEXT: paddq %xmm7, %xmm32320; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648]2321; SSE-NEXT: movdqa %xmm8, %xmm52322; SSE-NEXT: pxor %xmm4, %xmm52323; SSE-NEXT: movdqa %xmm3, %xmm62324; SSE-NEXT: pxor %xmm4, %xmm62325; SSE-NEXT: movdqa %xmm5, %xmm72326; SSE-NEXT: pcmpgtd %xmm6, %xmm72327; SSE-NEXT: pcmpeqd %xmm5, %xmm62328; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]2329; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2330; SSE-NEXT: pand %xmm5, %xmm62331; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92332; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]2333; SSE-NEXT: por %xmm6, %xmm52334; SSE-NEXT: pand %xmm5, %xmm82335; SSE-NEXT: pandn %xmm3, %xmm52336; SSE-NEXT: por %xmm8, %xmm52337; SSE-NEXT: movdqa %xmm9, %xmm32338; SSE-NEXT: pxor %xmm4, %xmm32339; SSE-NEXT: movdqa %xmm2, %xmm62340; SSE-NEXT: pxor %xmm4, %xmm62341; SSE-NEXT: movdqa %xmm3, %xmm72342; SSE-NEXT: pcmpgtd %xmm6, %xmm72343; SSE-NEXT: pcmpeqd %xmm3, %xmm62344; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]2345; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2346; SSE-NEXT: pand %xmm3, %xmm62347; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm82348; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]2349; SSE-NEXT: por %xmm6, %xmm32350; SSE-NEXT: pand %xmm3, %xmm92351; SSE-NEXT: pandn %xmm2, %xmm32352; SSE-NEXT: por %xmm9, %xmm32353; SSE-NEXT: movdqa %xmm8, %xmm22354; SSE-NEXT: pxor %xmm4, %xmm22355; SSE-NEXT: movdqa %xmm1, %xmm62356; SSE-NEXT: pxor %xmm4, %xmm62357; SSE-NEXT: movdqa %xmm2, %xmm72358; SSE-NEXT: pcmpgtd %xmm6, %xmm72359; SSE-NEXT: pcmpeqd %xmm2, %xmm62360; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]2361; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2362; SSE-NEXT: pand %xmm2, %xmm62363; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92364; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]2365; SSE-NEXT: por %xmm6, %xmm22366; SSE-NEXT: pand %xmm2, %xmm82367; SSE-NEXT: pandn %xmm1, %xmm22368; SSE-NEXT: por %xmm8, %xmm22369; SSE-NEXT: movdqa %xmm9, %xmm12370; SSE-NEXT: pxor %xmm4, %xmm12371; SSE-NEXT: movdqa %xmm0, %xmm62372; SSE-NEXT: pxor %xmm4, %xmm62373; SSE-NEXT: movdqa %xmm1, %xmm72374; SSE-NEXT: pcmpgtd %xmm6, %xmm72375; SSE-NEXT: pcmpeqd %xmm1, %xmm62376; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]2377; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2378; SSE-NEXT: pand %xmm1, %xmm62379; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12380; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]2381; SSE-NEXT: por %xmm6, %xmm72382; SSE-NEXT: pand %xmm7, %xmm92383; SSE-NEXT: pandn %xmm0, %xmm72384; SSE-NEXT: por %xmm9, %xmm72385; SSE-NEXT: movdqa %xmm7, %xmm02386; SSE-NEXT: pxor %xmm4, %xmm02387; SSE-NEXT: movdqa %xmm1, %xmm62388; SSE-NEXT: pxor %xmm4, %xmm62389; SSE-NEXT: movdqa %xmm6, %xmm82390; SSE-NEXT: pcmpgtd %xmm0, %xmm82391; SSE-NEXT: pcmpeqd %xmm0, %xmm62392; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]2393; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2394; SSE-NEXT: pand %xmm0, %xmm62395; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92396; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[1,1,3,3]2397; SSE-NEXT: por %xmm6, %xmm02398; SSE-NEXT: pand %xmm0, %xmm12399; SSE-NEXT: pandn %xmm7, %xmm02400; SSE-NEXT: por %xmm1, %xmm02401; SSE-NEXT: movdqa %xmm2, %xmm12402; SSE-NEXT: pxor %xmm4, %xmm12403; SSE-NEXT: movdqa %xmm9, %xmm62404; SSE-NEXT: pxor %xmm4, %xmm62405; SSE-NEXT: movdqa %xmm6, %xmm72406; SSE-NEXT: pcmpgtd %xmm1, %xmm72407; SSE-NEXT: pcmpeqd %xmm1, %xmm62408; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]2409; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2410; SSE-NEXT: pand %xmm1, %xmm62411; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm82412; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]2413; SSE-NEXT: por %xmm6, %xmm12414; SSE-NEXT: pand %xmm1, %xmm92415; SSE-NEXT: pandn %xmm2, %xmm12416; SSE-NEXT: por %xmm9, %xmm12417; SSE-NEXT: movdqa %xmm3, %xmm22418; SSE-NEXT: pxor %xmm4, %xmm22419; SSE-NEXT: movdqa %xmm8, %xmm62420; SSE-NEXT: pxor %xmm4, %xmm62421; SSE-NEXT: movdqa %xmm6, %xmm72422; SSE-NEXT: pcmpgtd %xmm2, %xmm72423; SSE-NEXT: pcmpeqd %xmm2, %xmm62424; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]2425; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2426; SSE-NEXT: pand %xmm2, %xmm62427; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]2428; SSE-NEXT: por %xmm6, %xmm22429; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm62430; SSE-NEXT: pand %xmm2, %xmm82431; SSE-NEXT: pandn %xmm3, %xmm22432; SSE-NEXT: por %xmm8, %xmm22433; SSE-NEXT: movdqa %xmm5, %xmm32434; SSE-NEXT: pxor %xmm4, %xmm32435; SSE-NEXT: pxor %xmm6, %xmm42436; SSE-NEXT: movdqa %xmm4, %xmm72437; SSE-NEXT: pcmpgtd %xmm3, %xmm72438; SSE-NEXT: pcmpeqd %xmm3, %xmm42439; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]2440; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]2441; SSE-NEXT: pand %xmm3, %xmm42442; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]2443; SSE-NEXT: por %xmm4, %xmm32444; SSE-NEXT: pand %xmm3, %xmm62445; SSE-NEXT: pandn %xmm5, %xmm32446; SSE-NEXT: por %xmm6, %xmm32447; SSE-NEXT: retq2448;2449; AVX2-LABEL: reassociate_smax_v8i64:2450; AVX2: # %bb.0:2451; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm12452; AVX2-NEXT: vpcmpgtq %ymm1, %ymm5, %ymm32453; AVX2-NEXT: vblendvpd %ymm3, %ymm5, %ymm1, %ymm12454; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm02455; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm22456; AVX2-NEXT: vblendvpd %ymm2, %ymm4, %ymm0, %ymm02457; AVX2-NEXT: vpcmpgtq %ymm0, %ymm6, %ymm22458; AVX2-NEXT: vblendvpd %ymm2, %ymm6, %ymm0, %ymm02459; AVX2-NEXT: vpcmpgtq %ymm1, %ymm7, %ymm22460; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm12461; AVX2-NEXT: retq2462;2463; AVX512-LABEL: reassociate_smax_v8i64:2464; AVX512: # %bb.0:2465; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm02466; AVX512-NEXT: vpmaxsq %zmm2, %zmm3, %zmm12467; AVX512-NEXT: vpmaxsq %zmm0, %zmm1, %zmm02468; AVX512-NEXT: retq2469 2470 %t0 = add <8 x i64> %x0, %x12471 %t1 = icmp sgt <8 x i64> %x2, %t02472 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t02473 %t3 = icmp sgt <8 x i64> %x3, %t22474 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t22475 ret <8 x i64> %t42476}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, %xmm02482; SSE-NEXT: paddb %xmm5, %xmm12483; SSE-NEXT: paddb %xmm6, %xmm22484; SSE-NEXT: paddb %xmm7, %xmm32485; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm32486; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm22487; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm12488; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm02489; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm02490; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm12491; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm22492; SSE-NEXT: pminub {{[0-9]+}}(%rsp), %xmm32493; SSE-NEXT: retq2494;2495; AVX2-LABEL: reassociate_umin_v64i8:2496; AVX2: # %bb.0:2497; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm02498; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm12499; AVX2-NEXT: vpminub %ymm4, %ymm6, %ymm22500; AVX2-NEXT: vpminub %ymm0, %ymm2, %ymm02501; AVX2-NEXT: vpminub %ymm5, %ymm7, %ymm22502; AVX2-NEXT: vpminub %ymm1, %ymm2, %ymm12503; AVX2-NEXT: retq2504;2505; AVX512-LABEL: reassociate_umin_v64i8:2506; AVX512: # %bb.0:2507; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm02508; AVX512-NEXT: vpminub %zmm2, %zmm3, %zmm12509; AVX512-NEXT: vpminub %zmm0, %zmm1, %zmm02510; AVX512-NEXT: retq2511 2512 %t0 = add <64 x i8> %x0, %x12513 %t1 = icmp ult <64 x i8> %x2, %t02514 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t02515 %t3 = icmp ult <64 x i8> %x3, %t22516 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t22517 ret <64 x i8> %t42518}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, %xmm82524; SSE-NEXT: movdqa %xmm2, %xmm92525; SSE-NEXT: movdqa %xmm1, %xmm102526; SSE-NEXT: movdqa %xmm0, %xmm112527; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm32528; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm22529; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12530; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm02531; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm142532; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm152533; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm132534; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm122535; SSE-NEXT: paddw %xmm4, %xmm112536; SSE-NEXT: paddw %xmm5, %xmm102537; SSE-NEXT: paddw %xmm6, %xmm92538; SSE-NEXT: paddw %xmm7, %xmm82539; SSE-NEXT: movdqa %xmm12, %xmm42540; SSE-NEXT: psubusw %xmm8, %xmm42541; SSE-NEXT: psubw %xmm4, %xmm122542; SSE-NEXT: movdqa %xmm13, %xmm42543; SSE-NEXT: psubusw %xmm9, %xmm42544; SSE-NEXT: psubw %xmm4, %xmm132545; SSE-NEXT: movdqa %xmm15, %xmm42546; SSE-NEXT: psubusw %xmm10, %xmm42547; SSE-NEXT: psubw %xmm4, %xmm152548; SSE-NEXT: movdqa %xmm14, %xmm42549; SSE-NEXT: psubusw %xmm11, %xmm42550; SSE-NEXT: psubw %xmm4, %xmm142551; SSE-NEXT: movdqa %xmm0, %xmm42552; SSE-NEXT: psubusw %xmm14, %xmm42553; SSE-NEXT: psubw %xmm4, %xmm02554; SSE-NEXT: movdqa %xmm1, %xmm42555; SSE-NEXT: psubusw %xmm15, %xmm42556; SSE-NEXT: psubw %xmm4, %xmm12557; SSE-NEXT: movdqa %xmm2, %xmm42558; SSE-NEXT: psubusw %xmm13, %xmm42559; SSE-NEXT: psubw %xmm4, %xmm22560; SSE-NEXT: movdqa %xmm3, %xmm42561; SSE-NEXT: psubusw %xmm12, %xmm42562; SSE-NEXT: psubw %xmm4, %xmm32563; SSE-NEXT: retq2564;2565; AVX2-LABEL: reassociate_umin_v32i16:2566; AVX2: # %bb.0:2567; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm02568; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm12569; AVX2-NEXT: vpminuw %ymm4, %ymm6, %ymm22570; AVX2-NEXT: vpminuw %ymm0, %ymm2, %ymm02571; AVX2-NEXT: vpminuw %ymm5, %ymm7, %ymm22572; AVX2-NEXT: vpminuw %ymm1, %ymm2, %ymm12573; AVX2-NEXT: retq2574;2575; AVX512-LABEL: reassociate_umin_v32i16:2576; AVX512: # %bb.0:2577; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm02578; AVX512-NEXT: vpminuw %zmm2, %zmm3, %zmm12579; AVX512-NEXT: vpminuw %zmm0, %zmm1, %zmm02580; AVX512-NEXT: retq2581 2582 %t0 = add <32 x i16> %x0, %x12583 %t1 = icmp ult <32 x i16> %x2, %t02584 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t02585 %t3 = icmp ult <32 x i16> %x3, %t22586 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t22587 ret <32 x i16> %t42588}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), %xmm82594; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92595; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm102596; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm112597; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm122598; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm132599; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm142600; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm152601; SSE-NEXT: paddd %xmm4, %xmm02602; SSE-NEXT: paddd %xmm5, %xmm12603; SSE-NEXT: paddd %xmm6, %xmm22604; SSE-NEXT: paddd %xmm7, %xmm32605; SSE-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]2606; SSE-NEXT: movdqa %xmm15, %xmm62607; SSE-NEXT: pxor %xmm5, %xmm62608; SSE-NEXT: movdqa %xmm3, %xmm42609; SSE-NEXT: pxor %xmm5, %xmm42610; SSE-NEXT: pcmpgtd %xmm6, %xmm42611; SSE-NEXT: pand %xmm4, %xmm152612; SSE-NEXT: pandn %xmm3, %xmm42613; SSE-NEXT: por %xmm15, %xmm42614; SSE-NEXT: movdqa %xmm14, %xmm62615; SSE-NEXT: pxor %xmm5, %xmm62616; SSE-NEXT: movdqa %xmm2, %xmm32617; SSE-NEXT: pxor %xmm5, %xmm32618; SSE-NEXT: pcmpgtd %xmm6, %xmm32619; SSE-NEXT: pand %xmm3, %xmm142620; SSE-NEXT: pandn %xmm2, %xmm32621; SSE-NEXT: por %xmm14, %xmm32622; SSE-NEXT: movdqa %xmm13, %xmm62623; SSE-NEXT: pxor %xmm5, %xmm62624; SSE-NEXT: movdqa %xmm1, %xmm22625; SSE-NEXT: pxor %xmm5, %xmm22626; SSE-NEXT: pcmpgtd %xmm6, %xmm22627; SSE-NEXT: pand %xmm2, %xmm132628; SSE-NEXT: pandn %xmm1, %xmm22629; SSE-NEXT: por %xmm13, %xmm22630; SSE-NEXT: movdqa %xmm12, %xmm12631; SSE-NEXT: pxor %xmm5, %xmm12632; SSE-NEXT: movdqa %xmm0, %xmm62633; SSE-NEXT: pxor %xmm5, %xmm62634; SSE-NEXT: pcmpgtd %xmm1, %xmm62635; SSE-NEXT: pand %xmm6, %xmm122636; SSE-NEXT: pandn %xmm0, %xmm62637; SSE-NEXT: por %xmm12, %xmm62638; SSE-NEXT: movdqa %xmm6, %xmm02639; SSE-NEXT: pxor %xmm5, %xmm02640; SSE-NEXT: movdqa %xmm11, %xmm12641; SSE-NEXT: pxor %xmm5, %xmm12642; SSE-NEXT: pcmpgtd %xmm1, %xmm02643; SSE-NEXT: pand %xmm0, %xmm112644; SSE-NEXT: pandn %xmm6, %xmm02645; SSE-NEXT: por %xmm11, %xmm02646; SSE-NEXT: movdqa %xmm2, %xmm12647; SSE-NEXT: pxor %xmm5, %xmm12648; SSE-NEXT: movdqa %xmm10, %xmm62649; SSE-NEXT: pxor %xmm5, %xmm62650; SSE-NEXT: pcmpgtd %xmm6, %xmm12651; SSE-NEXT: pand %xmm1, %xmm102652; SSE-NEXT: pandn %xmm2, %xmm12653; SSE-NEXT: por %xmm10, %xmm12654; SSE-NEXT: movdqa %xmm3, %xmm22655; SSE-NEXT: pxor %xmm5, %xmm22656; SSE-NEXT: movdqa %xmm9, %xmm62657; SSE-NEXT: pxor %xmm5, %xmm62658; SSE-NEXT: pcmpgtd %xmm6, %xmm22659; SSE-NEXT: pand %xmm2, %xmm92660; SSE-NEXT: pandn %xmm3, %xmm22661; SSE-NEXT: por %xmm9, %xmm22662; SSE-NEXT: movdqa %xmm4, %xmm32663; SSE-NEXT: pxor %xmm5, %xmm32664; SSE-NEXT: pxor %xmm8, %xmm52665; SSE-NEXT: pcmpgtd %xmm5, %xmm32666; SSE-NEXT: pand %xmm3, %xmm82667; SSE-NEXT: pandn %xmm4, %xmm32668; SSE-NEXT: por %xmm8, %xmm32669; SSE-NEXT: retq2670;2671; AVX2-LABEL: reassociate_umin_v16i32:2672; AVX2: # %bb.0:2673; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm02674; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm12675; AVX2-NEXT: vpminud %ymm4, %ymm6, %ymm22676; AVX2-NEXT: vpminud %ymm0, %ymm2, %ymm02677; AVX2-NEXT: vpminud %ymm5, %ymm7, %ymm22678; AVX2-NEXT: vpminud %ymm1, %ymm2, %ymm12679; AVX2-NEXT: retq2680;2681; AVX512-LABEL: reassociate_umin_v16i32:2682; AVX512: # %bb.0:2683; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm02684; AVX512-NEXT: vpminud %zmm2, %zmm3, %zmm12685; AVX512-NEXT: vpminud %zmm0, %zmm1, %zmm02686; AVX512-NEXT: retq2687 2688 %t0 = add <16 x i32> %x0, %x12689 %t1 = icmp ult <16 x i32> %x2, %t02690 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t02691 %t3 = icmp ult <16 x i32> %x3, %t22692 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t22693 ret <16 x i32> %t42694}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), %xmm82700; SSE-NEXT: paddq %xmm4, %xmm02701; SSE-NEXT: paddq %xmm5, %xmm12702; SSE-NEXT: paddq %xmm6, %xmm22703; SSE-NEXT: paddq %xmm7, %xmm32704; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]2705; SSE-NEXT: movdqa %xmm8, %xmm52706; SSE-NEXT: pxor %xmm4, %xmm52707; SSE-NEXT: movdqa %xmm3, %xmm62708; SSE-NEXT: pxor %xmm4, %xmm62709; SSE-NEXT: movdqa %xmm6, %xmm72710; SSE-NEXT: pcmpgtd %xmm5, %xmm72711; SSE-NEXT: pcmpeqd %xmm5, %xmm62712; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]2713; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2714; SSE-NEXT: pand %xmm5, %xmm62715; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92716; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]2717; SSE-NEXT: por %xmm6, %xmm52718; SSE-NEXT: pand %xmm5, %xmm82719; SSE-NEXT: pandn %xmm3, %xmm52720; SSE-NEXT: por %xmm8, %xmm52721; SSE-NEXT: movdqa %xmm9, %xmm32722; SSE-NEXT: pxor %xmm4, %xmm32723; SSE-NEXT: movdqa %xmm2, %xmm62724; SSE-NEXT: pxor %xmm4, %xmm62725; SSE-NEXT: movdqa %xmm6, %xmm72726; SSE-NEXT: pcmpgtd %xmm3, %xmm72727; SSE-NEXT: pcmpeqd %xmm3, %xmm62728; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]2729; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2730; SSE-NEXT: pand %xmm3, %xmm62731; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm82732; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]2733; SSE-NEXT: por %xmm6, %xmm32734; SSE-NEXT: pand %xmm3, %xmm92735; SSE-NEXT: pandn %xmm2, %xmm32736; SSE-NEXT: por %xmm9, %xmm32737; SSE-NEXT: movdqa %xmm8, %xmm22738; SSE-NEXT: pxor %xmm4, %xmm22739; SSE-NEXT: movdqa %xmm1, %xmm62740; SSE-NEXT: pxor %xmm4, %xmm62741; SSE-NEXT: movdqa %xmm6, %xmm72742; SSE-NEXT: pcmpgtd %xmm2, %xmm72743; SSE-NEXT: pcmpeqd %xmm2, %xmm62744; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]2745; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2746; SSE-NEXT: pand %xmm2, %xmm62747; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92748; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]2749; SSE-NEXT: por %xmm6, %xmm22750; SSE-NEXT: pand %xmm2, %xmm82751; SSE-NEXT: pandn %xmm1, %xmm22752; SSE-NEXT: por %xmm8, %xmm22753; SSE-NEXT: movdqa %xmm9, %xmm12754; SSE-NEXT: pxor %xmm4, %xmm12755; SSE-NEXT: movdqa %xmm0, %xmm62756; SSE-NEXT: pxor %xmm4, %xmm62757; SSE-NEXT: movdqa %xmm6, %xmm72758; SSE-NEXT: pcmpgtd %xmm1, %xmm72759; SSE-NEXT: pcmpeqd %xmm1, %xmm62760; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]2761; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2762; SSE-NEXT: pand %xmm1, %xmm62763; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12764; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]2765; SSE-NEXT: por %xmm6, %xmm72766; SSE-NEXT: pand %xmm7, %xmm92767; SSE-NEXT: pandn %xmm0, %xmm72768; SSE-NEXT: por %xmm9, %xmm72769; SSE-NEXT: movdqa %xmm7, %xmm02770; SSE-NEXT: pxor %xmm4, %xmm02771; SSE-NEXT: movdqa %xmm1, %xmm62772; SSE-NEXT: pxor %xmm4, %xmm62773; SSE-NEXT: movdqa %xmm0, %xmm82774; SSE-NEXT: pcmpgtd %xmm6, %xmm82775; SSE-NEXT: pcmpeqd %xmm0, %xmm62776; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]2777; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2778; SSE-NEXT: pand %xmm0, %xmm62779; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92780; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[1,1,3,3]2781; SSE-NEXT: por %xmm6, %xmm02782; SSE-NEXT: pand %xmm0, %xmm12783; SSE-NEXT: pandn %xmm7, %xmm02784; SSE-NEXT: por %xmm1, %xmm02785; SSE-NEXT: movdqa %xmm2, %xmm12786; SSE-NEXT: pxor %xmm4, %xmm12787; SSE-NEXT: movdqa %xmm9, %xmm62788; SSE-NEXT: pxor %xmm4, %xmm62789; SSE-NEXT: movdqa %xmm1, %xmm72790; SSE-NEXT: pcmpgtd %xmm6, %xmm72791; SSE-NEXT: pcmpeqd %xmm1, %xmm62792; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]2793; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2794; SSE-NEXT: pand %xmm1, %xmm62795; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm82796; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]2797; SSE-NEXT: por %xmm6, %xmm12798; SSE-NEXT: pand %xmm1, %xmm92799; SSE-NEXT: pandn %xmm2, %xmm12800; SSE-NEXT: por %xmm9, %xmm12801; SSE-NEXT: movdqa %xmm3, %xmm22802; SSE-NEXT: pxor %xmm4, %xmm22803; SSE-NEXT: movdqa %xmm8, %xmm62804; SSE-NEXT: pxor %xmm4, %xmm62805; SSE-NEXT: movdqa %xmm2, %xmm72806; SSE-NEXT: pcmpgtd %xmm6, %xmm72807; SSE-NEXT: pcmpeqd %xmm2, %xmm62808; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]2809; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2810; SSE-NEXT: pand %xmm2, %xmm62811; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]2812; SSE-NEXT: por %xmm6, %xmm22813; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm62814; SSE-NEXT: pand %xmm2, %xmm82815; SSE-NEXT: pandn %xmm3, %xmm22816; SSE-NEXT: por %xmm8, %xmm22817; SSE-NEXT: movdqa %xmm5, %xmm32818; SSE-NEXT: pxor %xmm4, %xmm32819; SSE-NEXT: pxor %xmm6, %xmm42820; SSE-NEXT: movdqa %xmm3, %xmm72821; SSE-NEXT: pcmpgtd %xmm4, %xmm72822; SSE-NEXT: pcmpeqd %xmm3, %xmm42823; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]2824; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]2825; SSE-NEXT: pand %xmm3, %xmm42826; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]2827; SSE-NEXT: por %xmm4, %xmm32828; SSE-NEXT: pand %xmm3, %xmm62829; SSE-NEXT: pandn %xmm5, %xmm32830; SSE-NEXT: por %xmm6, %xmm32831; SSE-NEXT: retq2832;2833; AVX2-LABEL: reassociate_umin_v8i64:2834; AVX2: # %bb.0:2835; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm02836; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]2837; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm12838; AVX2-NEXT: vpxor %ymm2, %ymm5, %ymm32839; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm82840; AVX2-NEXT: vpcmpgtq %ymm3, %ymm8, %ymm32841; AVX2-NEXT: vblendvpd %ymm3, %ymm5, %ymm1, %ymm12842; AVX2-NEXT: vpxor %ymm2, %ymm4, %ymm32843; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm52844; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm32845; AVX2-NEXT: vblendvpd %ymm3, %ymm4, %ymm0, %ymm02846; AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm32847; AVX2-NEXT: vpxor %ymm2, %ymm6, %ymm42848; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm32849; AVX2-NEXT: vblendvpd %ymm3, %ymm6, %ymm0, %ymm02850; AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm32851; AVX2-NEXT: vpxor %ymm2, %ymm7, %ymm22852; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm22853; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm12854; AVX2-NEXT: retq2855;2856; AVX512-LABEL: reassociate_umin_v8i64:2857; AVX512: # %bb.0:2858; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm02859; AVX512-NEXT: vpminuq %zmm2, %zmm3, %zmm12860; AVX512-NEXT: vpminuq %zmm0, %zmm1, %zmm02861; AVX512-NEXT: retq2862 2863 %t0 = add <8 x i64> %x0, %x12864 %t1 = icmp ult <8 x i64> %x2, %t02865 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t02866 %t3 = icmp ult <8 x i64> %x3, %t22867 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t22868 ret <8 x i64> %t42869}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), %xmm82875; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm92876; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm102877; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm112878; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm122879; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm132880; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm142881; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm152882; SSE-NEXT: paddb %xmm4, %xmm02883; SSE-NEXT: paddb %xmm5, %xmm12884; SSE-NEXT: paddb %xmm6, %xmm22885; SSE-NEXT: paddb %xmm7, %xmm32886; SSE-NEXT: movdqa %xmm3, %xmm42887; SSE-NEXT: pcmpgtb %xmm15, %xmm42888; SSE-NEXT: pand %xmm4, %xmm152889; SSE-NEXT: pandn %xmm3, %xmm42890; SSE-NEXT: por %xmm15, %xmm42891; SSE-NEXT: movdqa %xmm2, %xmm32892; SSE-NEXT: pcmpgtb %xmm14, %xmm32893; SSE-NEXT: pand %xmm3, %xmm142894; SSE-NEXT: pandn %xmm2, %xmm32895; SSE-NEXT: por %xmm14, %xmm32896; SSE-NEXT: movdqa %xmm1, %xmm22897; SSE-NEXT: pcmpgtb %xmm13, %xmm22898; SSE-NEXT: pand %xmm2, %xmm132899; SSE-NEXT: pandn %xmm1, %xmm22900; SSE-NEXT: por %xmm13, %xmm22901; SSE-NEXT: movdqa %xmm0, %xmm12902; SSE-NEXT: pcmpgtb %xmm12, %xmm12903; SSE-NEXT: pand %xmm1, %xmm122904; SSE-NEXT: pandn %xmm0, %xmm12905; SSE-NEXT: por %xmm12, %xmm12906; SSE-NEXT: movdqa %xmm1, %xmm02907; SSE-NEXT: pcmpgtb %xmm11, %xmm02908; SSE-NEXT: pand %xmm0, %xmm112909; SSE-NEXT: pandn %xmm1, %xmm02910; SSE-NEXT: por %xmm11, %xmm02911; SSE-NEXT: movdqa %xmm2, %xmm12912; SSE-NEXT: pcmpgtb %xmm10, %xmm12913; SSE-NEXT: pand %xmm1, %xmm102914; SSE-NEXT: pandn %xmm2, %xmm12915; SSE-NEXT: por %xmm10, %xmm12916; SSE-NEXT: movdqa %xmm3, %xmm22917; SSE-NEXT: pcmpgtb %xmm9, %xmm22918; SSE-NEXT: pand %xmm2, %xmm92919; SSE-NEXT: pandn %xmm3, %xmm22920; SSE-NEXT: por %xmm9, %xmm22921; SSE-NEXT: movdqa %xmm4, %xmm32922; SSE-NEXT: pcmpgtb %xmm8, %xmm32923; SSE-NEXT: pand %xmm3, %xmm82924; SSE-NEXT: pandn %xmm4, %xmm32925; SSE-NEXT: por %xmm8, %xmm32926; SSE-NEXT: retq2927;2928; AVX2-LABEL: reassociate_smin_v64i8:2929; AVX2: # %bb.0:2930; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm02931; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm12932; AVX2-NEXT: vpminsb %ymm4, %ymm6, %ymm22933; AVX2-NEXT: vpminsb %ymm0, %ymm2, %ymm02934; AVX2-NEXT: vpminsb %ymm5, %ymm7, %ymm22935; AVX2-NEXT: vpminsb %ymm1, %ymm2, %ymm12936; AVX2-NEXT: retq2937;2938; AVX512-LABEL: reassociate_smin_v64i8:2939; AVX512: # %bb.0:2940; AVX512-NEXT: vpaddb %zmm1, %zmm0, %zmm02941; AVX512-NEXT: vpminsb %zmm2, %zmm3, %zmm12942; AVX512-NEXT: vpminsb %zmm0, %zmm1, %zmm02943; AVX512-NEXT: retq2944 2945 %t0 = add <64 x i8> %x0, %x12946 %t1 = icmp slt <64 x i8> %x2, %t02947 %t2 = select <64 x i1> %t1, <64 x i8> %x2, <64 x i8> %t02948 %t3 = icmp slt <64 x i8> %x3, %t22949 %t4 = select <64 x i1> %t3, <64 x i8> %x3, <64 x i8> %t22950 ret <64 x i8> %t42951}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, %xmm02957; SSE-NEXT: paddw %xmm5, %xmm12958; SSE-NEXT: paddw %xmm6, %xmm22959; SSE-NEXT: paddw %xmm7, %xmm32960; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm32961; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm22962; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm12963; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm02964; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm02965; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm12966; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm22967; SSE-NEXT: pminsw {{[0-9]+}}(%rsp), %xmm32968; SSE-NEXT: retq2969;2970; AVX2-LABEL: reassociate_smin_v32i16:2971; AVX2: # %bb.0:2972; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm02973; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm12974; AVX2-NEXT: vpminsw %ymm4, %ymm6, %ymm22975; AVX2-NEXT: vpminsw %ymm0, %ymm2, %ymm02976; AVX2-NEXT: vpminsw %ymm5, %ymm7, %ymm22977; AVX2-NEXT: vpminsw %ymm1, %ymm2, %ymm12978; AVX2-NEXT: retq2979;2980; AVX512-LABEL: reassociate_smin_v32i16:2981; AVX512: # %bb.0:2982; AVX512-NEXT: vpaddw %zmm1, %zmm0, %zmm02983; AVX512-NEXT: vpminsw %zmm2, %zmm3, %zmm12984; AVX512-NEXT: vpminsw %zmm0, %zmm1, %zmm02985; AVX512-NEXT: retq2986 2987 %t0 = add <32 x i16> %x0, %x12988 %t1 = icmp slt <32 x i16> %x2, %t02989 %t2 = select <32 x i1> %t1, <32 x i16> %x2, <32 x i16> %t02990 %t3 = icmp slt <32 x i16> %x3, %t22991 %t4 = select <32 x i1> %t3, <32 x i16> %x3, <32 x i16> %t22992 ret <32 x i16> %t42993}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), %xmm82999; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm93000; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm103001; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm113002; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm123003; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm133004; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm143005; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm153006; SSE-NEXT: paddd %xmm4, %xmm03007; SSE-NEXT: paddd %xmm5, %xmm13008; SSE-NEXT: paddd %xmm6, %xmm23009; SSE-NEXT: paddd %xmm7, %xmm33010; SSE-NEXT: movdqa %xmm3, %xmm43011; SSE-NEXT: pcmpgtd %xmm15, %xmm43012; SSE-NEXT: pand %xmm4, %xmm153013; SSE-NEXT: pandn %xmm3, %xmm43014; SSE-NEXT: por %xmm15, %xmm43015; SSE-NEXT: movdqa %xmm2, %xmm33016; SSE-NEXT: pcmpgtd %xmm14, %xmm33017; SSE-NEXT: pand %xmm3, %xmm143018; SSE-NEXT: pandn %xmm2, %xmm33019; SSE-NEXT: por %xmm14, %xmm33020; SSE-NEXT: movdqa %xmm1, %xmm23021; SSE-NEXT: pcmpgtd %xmm13, %xmm23022; SSE-NEXT: pand %xmm2, %xmm133023; SSE-NEXT: pandn %xmm1, %xmm23024; SSE-NEXT: por %xmm13, %xmm23025; SSE-NEXT: movdqa %xmm0, %xmm13026; SSE-NEXT: pcmpgtd %xmm12, %xmm13027; SSE-NEXT: pand %xmm1, %xmm123028; SSE-NEXT: pandn %xmm0, %xmm13029; SSE-NEXT: por %xmm12, %xmm13030; SSE-NEXT: movdqa %xmm1, %xmm03031; SSE-NEXT: pcmpgtd %xmm11, %xmm03032; SSE-NEXT: pand %xmm0, %xmm113033; SSE-NEXT: pandn %xmm1, %xmm03034; SSE-NEXT: por %xmm11, %xmm03035; SSE-NEXT: movdqa %xmm2, %xmm13036; SSE-NEXT: pcmpgtd %xmm10, %xmm13037; SSE-NEXT: pand %xmm1, %xmm103038; SSE-NEXT: pandn %xmm2, %xmm13039; SSE-NEXT: por %xmm10, %xmm13040; SSE-NEXT: movdqa %xmm3, %xmm23041; SSE-NEXT: pcmpgtd %xmm9, %xmm23042; SSE-NEXT: pand %xmm2, %xmm93043; SSE-NEXT: pandn %xmm3, %xmm23044; SSE-NEXT: por %xmm9, %xmm23045; SSE-NEXT: movdqa %xmm4, %xmm33046; SSE-NEXT: pcmpgtd %xmm8, %xmm33047; SSE-NEXT: pand %xmm3, %xmm83048; SSE-NEXT: pandn %xmm4, %xmm33049; SSE-NEXT: por %xmm8, %xmm33050; SSE-NEXT: retq3051;3052; AVX2-LABEL: reassociate_smin_v16i32:3053; AVX2: # %bb.0:3054; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm03055; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm13056; AVX2-NEXT: vpminsd %ymm4, %ymm6, %ymm23057; AVX2-NEXT: vpminsd %ymm0, %ymm2, %ymm03058; AVX2-NEXT: vpminsd %ymm5, %ymm7, %ymm23059; AVX2-NEXT: vpminsd %ymm1, %ymm2, %ymm13060; AVX2-NEXT: retq3061;3062; AVX512-LABEL: reassociate_smin_v16i32:3063; AVX512: # %bb.0:3064; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm03065; AVX512-NEXT: vpminsd %zmm2, %zmm3, %zmm13066; AVX512-NEXT: vpminsd %zmm0, %zmm1, %zmm03067; AVX512-NEXT: retq3068 3069 %t0 = add <16 x i32> %x0, %x13070 %t1 = icmp slt <16 x i32> %x2, %t03071 %t2 = select <16 x i1> %t1, <16 x i32> %x2, <16 x i32> %t03072 %t3 = icmp slt <16 x i32> %x3, %t23073 %t4 = select <16 x i1> %t3, <16 x i32> %x3, <16 x i32> %t23074 ret <16 x i32> %t43075}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), %xmm83081; SSE-NEXT: paddq %xmm4, %xmm03082; SSE-NEXT: paddq %xmm5, %xmm13083; SSE-NEXT: paddq %xmm6, %xmm23084; SSE-NEXT: paddq %xmm7, %xmm33085; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648]3086; SSE-NEXT: movdqa %xmm8, %xmm53087; SSE-NEXT: pxor %xmm4, %xmm53088; SSE-NEXT: movdqa %xmm3, %xmm63089; SSE-NEXT: pxor %xmm4, %xmm63090; SSE-NEXT: movdqa %xmm6, %xmm73091; SSE-NEXT: pcmpgtd %xmm5, %xmm73092; SSE-NEXT: pcmpeqd %xmm5, %xmm63093; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]3094; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3095; SSE-NEXT: pand %xmm5, %xmm63096; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm93097; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]3098; SSE-NEXT: por %xmm6, %xmm53099; SSE-NEXT: pand %xmm5, %xmm83100; SSE-NEXT: pandn %xmm3, %xmm53101; SSE-NEXT: por %xmm8, %xmm53102; SSE-NEXT: movdqa %xmm9, %xmm33103; SSE-NEXT: pxor %xmm4, %xmm33104; SSE-NEXT: movdqa %xmm2, %xmm63105; SSE-NEXT: pxor %xmm4, %xmm63106; SSE-NEXT: movdqa %xmm6, %xmm73107; SSE-NEXT: pcmpgtd %xmm3, %xmm73108; SSE-NEXT: pcmpeqd %xmm3, %xmm63109; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]3110; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3111; SSE-NEXT: pand %xmm3, %xmm63112; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm83113; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]3114; SSE-NEXT: por %xmm6, %xmm33115; SSE-NEXT: pand %xmm3, %xmm93116; SSE-NEXT: pandn %xmm2, %xmm33117; SSE-NEXT: por %xmm9, %xmm33118; SSE-NEXT: movdqa %xmm8, %xmm23119; SSE-NEXT: pxor %xmm4, %xmm23120; SSE-NEXT: movdqa %xmm1, %xmm63121; SSE-NEXT: pxor %xmm4, %xmm63122; SSE-NEXT: movdqa %xmm6, %xmm73123; SSE-NEXT: pcmpgtd %xmm2, %xmm73124; SSE-NEXT: pcmpeqd %xmm2, %xmm63125; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]3126; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3127; SSE-NEXT: pand %xmm2, %xmm63128; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm93129; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]3130; SSE-NEXT: por %xmm6, %xmm23131; SSE-NEXT: pand %xmm2, %xmm83132; SSE-NEXT: pandn %xmm1, %xmm23133; SSE-NEXT: por %xmm8, %xmm23134; SSE-NEXT: movdqa %xmm9, %xmm13135; SSE-NEXT: pxor %xmm4, %xmm13136; SSE-NEXT: movdqa %xmm0, %xmm63137; SSE-NEXT: pxor %xmm4, %xmm63138; SSE-NEXT: movdqa %xmm6, %xmm73139; SSE-NEXT: pcmpgtd %xmm1, %xmm73140; SSE-NEXT: pcmpeqd %xmm1, %xmm63141; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]3142; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3143; SSE-NEXT: pand %xmm1, %xmm63144; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13145; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]3146; SSE-NEXT: por %xmm6, %xmm73147; SSE-NEXT: pand %xmm7, %xmm93148; SSE-NEXT: pandn %xmm0, %xmm73149; SSE-NEXT: por %xmm9, %xmm73150; SSE-NEXT: movdqa %xmm7, %xmm03151; SSE-NEXT: pxor %xmm4, %xmm03152; SSE-NEXT: movdqa %xmm1, %xmm63153; SSE-NEXT: pxor %xmm4, %xmm63154; SSE-NEXT: movdqa %xmm0, %xmm83155; SSE-NEXT: pcmpgtd %xmm6, %xmm83156; SSE-NEXT: pcmpeqd %xmm0, %xmm63157; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]3158; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3159; SSE-NEXT: pand %xmm0, %xmm63160; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm93161; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm8[1,1,3,3]3162; SSE-NEXT: por %xmm6, %xmm03163; SSE-NEXT: pand %xmm0, %xmm13164; SSE-NEXT: pandn %xmm7, %xmm03165; SSE-NEXT: por %xmm1, %xmm03166; SSE-NEXT: movdqa %xmm2, %xmm13167; SSE-NEXT: pxor %xmm4, %xmm13168; SSE-NEXT: movdqa %xmm9, %xmm63169; SSE-NEXT: pxor %xmm4, %xmm63170; SSE-NEXT: movdqa %xmm1, %xmm73171; SSE-NEXT: pcmpgtd %xmm6, %xmm73172; SSE-NEXT: pcmpeqd %xmm1, %xmm63173; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]3174; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3175; SSE-NEXT: pand %xmm1, %xmm63176; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm83177; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]3178; SSE-NEXT: por %xmm6, %xmm13179; SSE-NEXT: pand %xmm1, %xmm93180; SSE-NEXT: pandn %xmm2, %xmm13181; SSE-NEXT: por %xmm9, %xmm13182; SSE-NEXT: movdqa %xmm3, %xmm23183; SSE-NEXT: pxor %xmm4, %xmm23184; SSE-NEXT: movdqa %xmm8, %xmm63185; SSE-NEXT: pxor %xmm4, %xmm63186; SSE-NEXT: movdqa %xmm2, %xmm73187; SSE-NEXT: pcmpgtd %xmm6, %xmm73188; SSE-NEXT: pcmpeqd %xmm2, %xmm63189; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]3190; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3191; SSE-NEXT: pand %xmm2, %xmm63192; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]3193; SSE-NEXT: por %xmm6, %xmm23194; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm63195; SSE-NEXT: pand %xmm2, %xmm83196; SSE-NEXT: pandn %xmm3, %xmm23197; SSE-NEXT: por %xmm8, %xmm23198; SSE-NEXT: movdqa %xmm5, %xmm33199; SSE-NEXT: pxor %xmm4, %xmm33200; SSE-NEXT: pxor %xmm6, %xmm43201; SSE-NEXT: movdqa %xmm3, %xmm73202; SSE-NEXT: pcmpgtd %xmm4, %xmm73203; SSE-NEXT: pcmpeqd %xmm3, %xmm43204; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]3205; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]3206; SSE-NEXT: pand %xmm3, %xmm43207; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]3208; SSE-NEXT: por %xmm4, %xmm33209; SSE-NEXT: pand %xmm3, %xmm63210; SSE-NEXT: pandn %xmm5, %xmm33211; SSE-NEXT: por %xmm6, %xmm33212; SSE-NEXT: retq3213;3214; AVX2-LABEL: reassociate_smin_v8i64:3215; AVX2: # %bb.0:3216; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm13217; AVX2-NEXT: vpcmpgtq %ymm5, %ymm1, %ymm33218; AVX2-NEXT: vblendvpd %ymm3, %ymm5, %ymm1, %ymm13219; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm03220; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm23221; AVX2-NEXT: vblendvpd %ymm2, %ymm4, %ymm0, %ymm03222; AVX2-NEXT: vpcmpgtq %ymm6, %ymm0, %ymm23223; AVX2-NEXT: vblendvpd %ymm2, %ymm6, %ymm0, %ymm03224; AVX2-NEXT: vpcmpgtq %ymm7, %ymm1, %ymm23225; AVX2-NEXT: vblendvpd %ymm2, %ymm7, %ymm1, %ymm13226; AVX2-NEXT: retq3227;3228; AVX512-LABEL: reassociate_smin_v8i64:3229; AVX512: # %bb.0:3230; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm03231; AVX512-NEXT: vpminsq %zmm2, %zmm3, %zmm13232; AVX512-NEXT: vpminsq %zmm0, %zmm1, %zmm03233; AVX512-NEXT: retq3234 3235 %t0 = add <8 x i64> %x0, %x13236 %t1 = icmp slt <8 x i64> %x2, %t03237 %t2 = select <8 x i1> %t1, <8 x i64> %x2, <8 x i64> %t03238 %t3 = icmp slt <8 x i64> %x3, %t23239 %t4 = select <8 x i1> %t3, <8 x i64> %x3, <8 x i64> %t23240 ret <8 x i64> %t43241}3242