3069 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2OR3,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSE2OR3,SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX29; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX51210; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX51211 12declare <4 x i32> @llvm.usub.sat.v4i32(<4 x i32>, <4 x i32>)13 14define <8 x i16> @test1(<8 x i16> %x) nounwind {15; SSE-LABEL: test1:16; SSE: # %bb.0: # %vector.ph17; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm018; SSE-NEXT: retq19;20; AVX-LABEL: test1:21; AVX: # %bb.0: # %vector.ph22; AVX-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm023; AVX-NEXT: retq24vector.ph:25 %0 = icmp slt <8 x i16> %x, zeroinitializer26 %1 = xor <8 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>27 %res = select <8 x i1> %0, <8 x i16> %1, <8 x i16> zeroinitializer28 ret <8 x i16> %res29}30 31; This is logically equivalent to the above.32; usubsat X, (1 << (BW-1)) <--> (X ^ (1 << (BW-1))) & (ashr X, (BW-1))33 34define <8 x i16> @ashr_xor_and(<8 x i16> %x) nounwind {35; SSE-LABEL: ashr_xor_and:36; SSE: # %bb.0:37; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm038; SSE-NEXT: retq39;40; AVX-LABEL: ashr_xor_and:41; AVX: # %bb.0:42; AVX-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm043; AVX-NEXT: retq44 %signsplat = ashr <8 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>45 %flipsign = xor <8 x i16> %x, <i16 undef, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768>46 %res = and <8 x i16> %signsplat, %flipsign47 ret <8 x i16> %res48}49 50define <8 x i16> @ashr_add_and(<8 x i16> %x) nounwind {51; SSE-LABEL: ashr_add_and:52; SSE: # %bb.0:53; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm054; SSE-NEXT: retq55;56; AVX-LABEL: ashr_add_and:57; AVX: # %bb.0:58; AVX-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm059; AVX-NEXT: retq60 %signsplat = ashr <8 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>61 %flipsign = add <8 x i16> %x, <i16 undef, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768>62 %res = and <8 x i16> %signsplat, %flipsign63 ret <8 x i16> %res64}65 66; negative test - extra uses may lead to extra instructions when custom-lowered67 68define <16 x i8> @ashr_xor_and_commute_uses(<16 x i8> %x, ptr %p1, ptr %p2) nounwind {69; SSE-LABEL: ashr_xor_and_commute_uses:70; SSE: # %bb.0:71; SSE-NEXT: pxor %xmm1, %xmm172; SSE-NEXT: pcmpgtb %xmm0, %xmm173; SSE-NEXT: movdqa %xmm1, (%rdi)74; SSE-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm075; SSE-NEXT: movdqa %xmm0, (%rsi)76; SSE-NEXT: pand %xmm1, %xmm077; SSE-NEXT: retq78;79; AVX1-LABEL: ashr_xor_and_commute_uses:80; AVX1: # %bb.0:81; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm182; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm183; AVX1-NEXT: vmovdqa %xmm1, (%rdi)84; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm085; AVX1-NEXT: vmovdqa %xmm0, (%rsi)86; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm087; AVX1-NEXT: retq88;89; AVX2-LABEL: ashr_xor_and_commute_uses:90; AVX2: # %bb.0:91; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm192; AVX2-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm193; AVX2-NEXT: vmovdqa %xmm1, (%rdi)94; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm095; AVX2-NEXT: vmovdqa %xmm0, (%rsi)96; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm097; AVX2-NEXT: retq98;99; AVX512-LABEL: ashr_xor_and_commute_uses:100; AVX512: # %bb.0:101; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1102; AVX512-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1103; AVX512-NEXT: vmovdqa %xmm1, (%rdi)104; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0105; AVX512-NEXT: vmovdqa %xmm0, (%rsi)106; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0107; AVX512-NEXT: retq108 %signsplat = ashr <16 x i8> %x, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>109 store <16 x i8> %signsplat, ptr %p1110 %flipsign = xor <16 x i8> %x, <i8 undef, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>111 store <16 x i8> %flipsign, ptr %p2112 %res = and <16 x i8> %flipsign, %signsplat113 ret <16 x i8> %res114}115 116define <4 x i32> @ashr_xor_and_custom(<4 x i32> %x) nounwind {117; SSE2OR3-LABEL: ashr_xor_and_custom:118; SSE2OR3: # %bb.0:119; SSE2OR3-NEXT: movdqa %xmm0, %xmm1120; SSE2OR3-NEXT: psrad $31, %xmm1121; SSE2OR3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0122; SSE2OR3-NEXT: pand %xmm1, %xmm0123; SSE2OR3-NEXT: retq124;125; SSE41-LABEL: ashr_xor_and_custom:126; SSE41: # %bb.0:127; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]128; SSE41-NEXT: pmaxud %xmm1, %xmm0129; SSE41-NEXT: psubd %xmm1, %xmm0130; SSE41-NEXT: retq131;132; AVX1-LABEL: ashr_xor_and_custom:133; AVX1: # %bb.0:134; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]135; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0136; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0137; AVX1-NEXT: retq138;139; AVX2-LABEL: ashr_xor_and_custom:140; AVX2: # %bb.0:141; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]142; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm0143; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0144; AVX2-NEXT: retq145;146; AVX512-LABEL: ashr_xor_and_custom:147; AVX512: # %bb.0:148; AVX512-NEXT: vpsrad $31, %xmm0, %xmm1149; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 & (xmm0 ^ m32bcst)150; AVX512-NEXT: retq151 %signsplat = ashr <4 x i32> %x, <i32 undef, i32 31, i32 31, i32 31>152 %flipsign = xor <4 x i32> %x, <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>153 %res = and <4 x i32> %flipsign, %signsplat154 ret <4 x i32> %res155}156 157define <4 x i32> @ashr_add_and_custom(<4 x i32> %x) nounwind {158; SSE2OR3-LABEL: ashr_add_and_custom:159; SSE2OR3: # %bb.0:160; SSE2OR3-NEXT: movdqa %xmm0, %xmm1161; SSE2OR3-NEXT: psrad $31, %xmm1162; SSE2OR3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0163; SSE2OR3-NEXT: pand %xmm1, %xmm0164; SSE2OR3-NEXT: retq165;166; SSE41-LABEL: ashr_add_and_custom:167; SSE41: # %bb.0:168; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]169; SSE41-NEXT: pmaxud %xmm1, %xmm0170; SSE41-NEXT: psubd %xmm1, %xmm0171; SSE41-NEXT: retq172;173; AVX1-LABEL: ashr_add_and_custom:174; AVX1: # %bb.0:175; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]176; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0177; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0178; AVX1-NEXT: retq179;180; AVX2-LABEL: ashr_add_and_custom:181; AVX2: # %bb.0:182; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]183; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm0184; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0185; AVX2-NEXT: retq186;187; AVX512-LABEL: ashr_add_and_custom:188; AVX512: # %bb.0:189; AVX512-NEXT: vpsrad $31, %xmm0, %xmm1190; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 & (xmm0 ^ m32bcst)191; AVX512-NEXT: retq192 %signsplat = ashr <4 x i32> %x, <i32 undef, i32 31, i32 31, i32 31>193 %flipsign = add <4 x i32> %x, <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>194 %res = and <4 x i32> %flipsign, %signsplat195 ret <4 x i32> %res196}197 198; usubsat X, (1 << (BW-1)) <--> (X ^ (1 << (BW-1))) & (ashr X, (BW-1))199 200define <4 x i32> @usubsat_custom(<4 x i32> %x) nounwind {201; SSE2OR3-LABEL: usubsat_custom:202; SSE2OR3: # %bb.0:203; SSE2OR3-NEXT: movdqa %xmm0, %xmm1204; SSE2OR3-NEXT: psrad $31, %xmm1205; SSE2OR3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0206; SSE2OR3-NEXT: pand %xmm1, %xmm0207; SSE2OR3-NEXT: retq208;209; SSE41-LABEL: usubsat_custom:210; SSE41: # %bb.0:211; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,u]212; SSE41-NEXT: pmaxud %xmm1, %xmm0213; SSE41-NEXT: psubd %xmm1, %xmm0214; SSE41-NEXT: retq215;216; AVX1-LABEL: usubsat_custom:217; AVX1: # %bb.0:218; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]219; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0220; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0221; AVX1-NEXT: retq222;223; AVX2-LABEL: usubsat_custom:224; AVX2: # %bb.0:225; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]226; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm0227; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0228; AVX2-NEXT: retq229;230; AVX512-LABEL: usubsat_custom:231; AVX512: # %bb.0:232; AVX512-NEXT: vpsrad $31, %xmm0, %xmm1233; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 & (xmm0 ^ m32bcst)234; AVX512-NEXT: retq235 %res = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %x, <4 x i32> <i32 2147483648, i32 2147483648, i32 2147483648, i32 undef>)236 ret <4 x i32> %res237}238 239define <8 x i16> @test2(<8 x i16> %x) nounwind {240; SSE-LABEL: test2:241; SSE: # %bb.0: # %vector.ph242; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0243; SSE-NEXT: retq244;245; AVX-LABEL: test2:246; AVX: # %bb.0: # %vector.ph247; AVX-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0248; AVX-NEXT: retq249vector.ph:250 %0 = icmp ugt <8 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>251 %1 = add <8 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767>252 %res = select <8 x i1> %0, <8 x i16> %1, <8 x i16> zeroinitializer253 ret <8 x i16> %res254}255 256define <8 x i16> @test3(<8 x i16> %x, i16 zeroext %w) nounwind {257; SSE-LABEL: test3:258; SSE: # %bb.0: # %vector.ph259; SSE-NEXT: movd %edi, %xmm1260; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]261; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]262; SSE-NEXT: psubusw %xmm1, %xmm0263; SSE-NEXT: retq264;265; AVX1-LABEL: test3:266; AVX1: # %bb.0: # %vector.ph267; AVX1-NEXT: vmovd %edi, %xmm1268; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]269; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]270; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0271; AVX1-NEXT: retq272;273; AVX2-LABEL: test3:274; AVX2: # %bb.0: # %vector.ph275; AVX2-NEXT: vmovd %edi, %xmm1276; AVX2-NEXT: vpbroadcastw %xmm1, %xmm1277; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0278; AVX2-NEXT: retq279;280; AVX512-LABEL: test3:281; AVX512: # %bb.0: # %vector.ph282; AVX512-NEXT: vpbroadcastw %edi, %xmm1283; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0284; AVX512-NEXT: retq285vector.ph:286 %0 = insertelement <8 x i16> undef, i16 %w, i32 0287 %broadcast15 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer288 %1 = icmp ult <8 x i16> %x, %broadcast15289 %2 = sub <8 x i16> %x, %broadcast15290 %res = select <8 x i1> %1, <8 x i16> zeroinitializer, <8 x i16> %2291 ret <8 x i16> %res292}293 294define <16 x i8> @test4(<16 x i8> %x) nounwind {295; SSE-LABEL: test4:296; SSE: # %bb.0: # %vector.ph297; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0298; SSE-NEXT: retq299;300; AVX-LABEL: test4:301; AVX: # %bb.0: # %vector.ph302; AVX-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0303; AVX-NEXT: retq304vector.ph:305 %0 = icmp slt <16 x i8> %x, zeroinitializer306 %1 = xor <16 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>307 %res = select <16 x i1> %0, <16 x i8> %1, <16 x i8> zeroinitializer308 ret <16 x i8> %res309}310 311define <16 x i8> @test5(<16 x i8> %x) nounwind {312; SSE-LABEL: test5:313; SSE: # %bb.0: # %vector.ph314; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0315; SSE-NEXT: retq316;317; AVX-LABEL: test5:318; AVX: # %bb.0: # %vector.ph319; AVX-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0320; AVX-NEXT: retq321vector.ph:322 %0 = icmp ugt <16 x i8> %x, <i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126>323 %1 = add <16 x i8> %x, <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127>324 %res = select <16 x i1> %0, <16 x i8> %1, <16 x i8> zeroinitializer325 ret <16 x i8> %res326}327 328define <16 x i8> @test6(<16 x i8> %x, i8 zeroext %w) nounwind {329; SSE2-LABEL: test6:330; SSE2: # %bb.0: # %vector.ph331; SSE2-NEXT: movd %edi, %xmm1332; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]333; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]334; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]335; SSE2-NEXT: psubusb %xmm1, %xmm0336; SSE2-NEXT: retq337;338; SSSE3-LABEL: test6:339; SSSE3: # %bb.0: # %vector.ph340; SSSE3-NEXT: movd %edi, %xmm1341; SSSE3-NEXT: pxor %xmm2, %xmm2342; SSSE3-NEXT: pshufb %xmm2, %xmm1343; SSSE3-NEXT: psubusb %xmm1, %xmm0344; SSSE3-NEXT: retq345;346; SSE41-LABEL: test6:347; SSE41: # %bb.0: # %vector.ph348; SSE41-NEXT: movd %edi, %xmm1349; SSE41-NEXT: pxor %xmm2, %xmm2350; SSE41-NEXT: pshufb %xmm2, %xmm1351; SSE41-NEXT: psubusb %xmm1, %xmm0352; SSE41-NEXT: retq353;354; AVX1-LABEL: test6:355; AVX1: # %bb.0: # %vector.ph356; AVX1-NEXT: vmovd %edi, %xmm1357; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2358; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1359; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0360; AVX1-NEXT: retq361;362; AVX2-LABEL: test6:363; AVX2: # %bb.0: # %vector.ph364; AVX2-NEXT: vmovd %edi, %xmm1365; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1366; AVX2-NEXT: vpsubusb %xmm1, %xmm0, %xmm0367; AVX2-NEXT: retq368;369; AVX512-LABEL: test6:370; AVX512: # %bb.0: # %vector.ph371; AVX512-NEXT: vpbroadcastb %edi, %xmm1372; AVX512-NEXT: vpsubusb %xmm1, %xmm0, %xmm0373; AVX512-NEXT: retq374vector.ph:375 %0 = insertelement <16 x i8> undef, i8 %w, i32 0376 %broadcast15 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer377 %1 = icmp ult <16 x i8> %x, %broadcast15378 %2 = sub <16 x i8> %x, %broadcast15379 %res = select <16 x i1> %1, <16 x i8> zeroinitializer, <16 x i8> %2380 ret <16 x i8> %res381}382 383define <16 x i16> @test7(<16 x i16> %x) nounwind {384; SSE-LABEL: test7:385; SSE: # %bb.0: # %vector.ph386; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]387; SSE-NEXT: psubusw %xmm2, %xmm0388; SSE-NEXT: psubusw %xmm2, %xmm1389; SSE-NEXT: retq390;391; AVX1-LABEL: test7:392; AVX1: # %bb.0: # %vector.ph393; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1394; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]395; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1396; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0397; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0398; AVX1-NEXT: retq399;400; AVX2-LABEL: test7:401; AVX2: # %bb.0: # %vector.ph402; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0403; AVX2-NEXT: retq404;405; AVX512-LABEL: test7:406; AVX512: # %bb.0: # %vector.ph407; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0408; AVX512-NEXT: retq409vector.ph:410 %0 = icmp slt <16 x i16> %x, zeroinitializer411 %1 = xor <16 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>412 %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer413 ret <16 x i16> %res414}415 416define <16 x i16> @ashr_xor_and_v16i16(<16 x i16> %x) nounwind {417; SSE-LABEL: ashr_xor_and_v16i16:418; SSE: # %bb.0:419; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]420; SSE-NEXT: psubusw %xmm2, %xmm0421; SSE-NEXT: psubusw %xmm2, %xmm1422; SSE-NEXT: retq423;424; AVX1-LABEL: ashr_xor_and_v16i16:425; AVX1: # %bb.0:426; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1427; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]428; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1429; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0430; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0431; AVX1-NEXT: retq432;433; AVX2-LABEL: ashr_xor_and_v16i16:434; AVX2: # %bb.0:435; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0436; AVX2-NEXT: retq437;438; AVX512-LABEL: ashr_xor_and_v16i16:439; AVX512: # %bb.0:440; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0441; AVX512-NEXT: retq442 %signsplat = ashr <16 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>443 %flipsign = xor <16 x i16> %x, <i16 undef, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768>444 %res = and <16 x i16> %signsplat, %flipsign445 ret <16 x i16> %res446}447 448define <16 x i16> @ashr_add_and_v16i16(<16 x i16> %x) nounwind {449; SSE-LABEL: ashr_add_and_v16i16:450; SSE: # %bb.0:451; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]452; SSE-NEXT: psubusw %xmm2, %xmm0453; SSE-NEXT: psubusw %xmm2, %xmm1454; SSE-NEXT: retq455;456; AVX1-LABEL: ashr_add_and_v16i16:457; AVX1: # %bb.0:458; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1459; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]460; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1461; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0462; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0463; AVX1-NEXT: retq464;465; AVX2-LABEL: ashr_add_and_v16i16:466; AVX2: # %bb.0:467; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0468; AVX2-NEXT: retq469;470; AVX512-LABEL: ashr_add_and_v16i16:471; AVX512: # %bb.0:472; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0473; AVX512-NEXT: retq474 %signsplat = ashr <16 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>475 %flipsign = add <16 x i16> %x, <i16 undef, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768, i16 32768>476 %res = and <16 x i16> %signsplat, %flipsign477 ret <16 x i16> %res478}479 480define <16 x i16> @test8(<16 x i16> %x) nounwind {481; SSE-LABEL: test8:482; SSE: # %bb.0: # %vector.ph483; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767]484; SSE-NEXT: psubusw %xmm2, %xmm0485; SSE-NEXT: psubusw %xmm2, %xmm1486; SSE-NEXT: retq487;488; AVX1-LABEL: test8:489; AVX1: # %bb.0: # %vector.ph490; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1491; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767]492; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1493; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0494; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0495; AVX1-NEXT: retq496;497; AVX2-LABEL: test8:498; AVX2: # %bb.0: # %vector.ph499; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0500; AVX2-NEXT: retq501;502; AVX512-LABEL: test8:503; AVX512: # %bb.0: # %vector.ph504; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0505; AVX512-NEXT: retq506vector.ph:507 %0 = icmp ugt <16 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>508 %1 = add <16 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767>509 %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer510 ret <16 x i16> %res511}512 513define <16 x i16> @test8a(<16 x i16> %x) nounwind {514; SSE-LABEL: test8a:515; SSE: # %bb.0: # %vector.ph516; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0517; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1518; SSE-NEXT: retq519;520; AVX1-LABEL: test8a:521; AVX1: # %bb.0: # %vector.ph522; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1523; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0524; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0525; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0526; AVX1-NEXT: retq527;528; AVX2-LABEL: test8a:529; AVX2: # %bb.0: # %vector.ph530; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0531; AVX2-NEXT: retq532;533; AVX512-LABEL: test8a:534; AVX512: # %bb.0: # %vector.ph535; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0536; AVX512-NEXT: retq537vector.ph:538 %0 = icmp ugt <16 x i16> %x, <i16 32766, i16 32765, i16 32764, i16 32763, i16 32762, i16 32761, i16 32760, i16 32759, i16 32758, i16 32757, i16 32756, i16 32755, i16 32754, i16 32753, i16 32752, i16 32751>539 %1 = add <16 x i16> %x, <i16 -32767, i16 -32766, i16 -32765, i16 -32764, i16 -32763, i16 -32762, i16 -32761, i16 -32760, i16 -32759, i16 -32758, i16 -32757, i16 -32756, i16 -32755, i16 -32754, i16 -32753, i16 -32752>540 %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer541 ret <16 x i16> %res542}543 544define <16 x i16> @test9(<16 x i16> %x, i16 zeroext %w) nounwind {545; SSE-LABEL: test9:546; SSE: # %bb.0: # %vector.ph547; SSE-NEXT: movd %edi, %xmm2548; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]549; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]550; SSE-NEXT: psubusw %xmm2, %xmm0551; SSE-NEXT: psubusw %xmm2, %xmm1552; SSE-NEXT: retq553;554; AVX1-LABEL: test9:555; AVX1: # %bb.0: # %vector.ph556; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1557; AVX1-NEXT: vmovd %edi, %xmm2558; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]559; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]560; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1561; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0562; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0563; AVX1-NEXT: retq564;565; AVX2-LABEL: test9:566; AVX2: # %bb.0: # %vector.ph567; AVX2-NEXT: vmovd %edi, %xmm1568; AVX2-NEXT: vpbroadcastw %xmm1, %ymm1569; AVX2-NEXT: vpsubusw %ymm1, %ymm0, %ymm0570; AVX2-NEXT: retq571;572; AVX512-LABEL: test9:573; AVX512: # %bb.0: # %vector.ph574; AVX512-NEXT: vpbroadcastw %edi, %ymm1575; AVX512-NEXT: vpsubusw %ymm1, %ymm0, %ymm0576; AVX512-NEXT: retq577vector.ph:578 %0 = insertelement <16 x i16> undef, i16 %w, i32 0579 %broadcast15 = shufflevector <16 x i16> %0, <16 x i16> undef, <16 x i32> zeroinitializer580 %1 = icmp ult <16 x i16> %x, %broadcast15581 %2 = sub <16 x i16> %x, %broadcast15582 %res = select <16 x i1> %1, <16 x i16> zeroinitializer, <16 x i16> %2583 ret <16 x i16> %res584}585 586define <32 x i8> @test10(<32 x i8> %x) nounwind {587; SSE-LABEL: test10:588; SSE: # %bb.0: # %vector.ph589; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]590; SSE-NEXT: psubusb %xmm2, %xmm0591; SSE-NEXT: psubusb %xmm2, %xmm1592; SSE-NEXT: retq593;594; AVX1-LABEL: test10:595; AVX1: # %bb.0: # %vector.ph596; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1597; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]598; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm1599; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0600; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0601; AVX1-NEXT: retq602;603; AVX2-LABEL: test10:604; AVX2: # %bb.0: # %vector.ph605; AVX2-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0606; AVX2-NEXT: retq607;608; AVX512-LABEL: test10:609; AVX512: # %bb.0: # %vector.ph610; AVX512-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0611; AVX512-NEXT: retq612vector.ph:613 %0 = icmp slt <32 x i8> %x, zeroinitializer614 %1 = xor <32 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>615 %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer616 ret <32 x i8> %res617}618 619define <32 x i8> @test11(<32 x i8> %x) nounwind {620; SSE-LABEL: test11:621; SSE: # %bb.0: # %vector.ph622; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]623; SSE-NEXT: psubusb %xmm2, %xmm0624; SSE-NEXT: psubusb %xmm2, %xmm1625; SSE-NEXT: retq626;627; AVX1-LABEL: test11:628; AVX1: # %bb.0: # %vector.ph629; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1630; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]631; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm1632; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0633; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0634; AVX1-NEXT: retq635;636; AVX2-LABEL: test11:637; AVX2: # %bb.0: # %vector.ph638; AVX2-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0639; AVX2-NEXT: retq640;641; AVX512-LABEL: test11:642; AVX512: # %bb.0: # %vector.ph643; AVX512-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0644; AVX512-NEXT: retq645vector.ph:646 %0 = icmp ugt <32 x i8> %x, <i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126>647 %1 = add <32 x i8> %x, <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127>648 %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer649 ret <32 x i8> %res650}651 652define <32 x i8> @test11a(<32 x i8> %x) nounwind {653; SSE-LABEL: test11a:654; SSE: # %bb.0: # %vector.ph655; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0656; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1657; SSE-NEXT: retq658;659; AVX1-LABEL: test11a:660; AVX1: # %bb.0: # %vector.ph661; AVX1-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1662; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0663; AVX1-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0664; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0665; AVX1-NEXT: retq666;667; AVX2-LABEL: test11a:668; AVX2: # %bb.0: # %vector.ph669; AVX2-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0670; AVX2-NEXT: retq671;672; AVX512-LABEL: test11a:673; AVX512: # %bb.0: # %vector.ph674; AVX512-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0675; AVX512-NEXT: retq676vector.ph:677 %0 = icmp ugt <32 x i8> %x, <i8 126, i8 125, i8 124, i8 123, i8 122, i8 121, i8 120, i8 119, i8 118, i8 117, i8 116, i8 115, i8 114, i8 113, i8 112, i8 111, i8 110, i8 109, i8 108, i8 107, i8 106, i8 105, i8 104, i8 103, i8 102, i8 101, i8 100, i8 99, i8 98, i8 97, i8 96, i8 95>678 %1 = add <32 x i8> %x, <i8 -127, i8 -126, i8 -125, i8 -124, i8 -123, i8 -122, i8 -121, i8 -120, i8 -119, i8 -118, i8 -117, i8 -116, i8 -115, i8 -114, i8 -113, i8 -112, i8 -111, i8 -110, i8 -109, i8 -108, i8 -107, i8 -106, i8 -105, i8 -104, i8 -103, i8 -102, i8 -101, i8 -100, i8 -99, i8 -98, i8 -97, i8 -96>679 %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer680 ret <32 x i8> %res681}682 683define <32 x i8> @test12(<32 x i8> %x, i8 zeroext %w) nounwind {684; SSE2-LABEL: test12:685; SSE2: # %bb.0: # %vector.ph686; SSE2-NEXT: movd %edi, %xmm2687; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]688; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]689; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]690; SSE2-NEXT: psubusb %xmm2, %xmm0691; SSE2-NEXT: psubusb %xmm2, %xmm1692; SSE2-NEXT: retq693;694; SSSE3-LABEL: test12:695; SSSE3: # %bb.0: # %vector.ph696; SSSE3-NEXT: movd %edi, %xmm2697; SSSE3-NEXT: pxor %xmm3, %xmm3698; SSSE3-NEXT: pshufb %xmm3, %xmm2699; SSSE3-NEXT: psubusb %xmm2, %xmm0700; SSSE3-NEXT: psubusb %xmm2, %xmm1701; SSSE3-NEXT: retq702;703; SSE41-LABEL: test12:704; SSE41: # %bb.0: # %vector.ph705; SSE41-NEXT: movd %edi, %xmm2706; SSE41-NEXT: pxor %xmm3, %xmm3707; SSE41-NEXT: pshufb %xmm3, %xmm2708; SSE41-NEXT: psubusb %xmm2, %xmm0709; SSE41-NEXT: psubusb %xmm2, %xmm1710; SSE41-NEXT: retq711;712; AVX1-LABEL: test12:713; AVX1: # %bb.0: # %vector.ph714; AVX1-NEXT: vmovd %edi, %xmm1715; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2716; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1717; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2718; AVX1-NEXT: vpsubusb %xmm1, %xmm2, %xmm2719; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0720; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0721; AVX1-NEXT: retq722;723; AVX2-LABEL: test12:724; AVX2: # %bb.0: # %vector.ph725; AVX2-NEXT: vmovd %edi, %xmm1726; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1727; AVX2-NEXT: vpsubusb %ymm1, %ymm0, %ymm0728; AVX2-NEXT: retq729;730; AVX512-LABEL: test12:731; AVX512: # %bb.0: # %vector.ph732; AVX512-NEXT: vpbroadcastb %edi, %ymm1733; AVX512-NEXT: vpsubusb %ymm1, %ymm0, %ymm0734; AVX512-NEXT: retq735vector.ph:736 %0 = insertelement <32 x i8> undef, i8 %w, i32 0737 %broadcast15 = shufflevector <32 x i8> %0, <32 x i8> undef, <32 x i32> zeroinitializer738 %1 = icmp ult <32 x i8> %x, %broadcast15739 %2 = sub <32 x i8> %x, %broadcast15740 %res = select <32 x i1> %1, <32 x i8> zeroinitializer, <32 x i8> %2741 ret <32 x i8> %res742}743 744define <8 x i16> @test13(<8 x i16> %x, <8 x i32> %y) nounwind {745; SSE2-LABEL: test13:746; SSE2: # %bb.0: # %vector.ph747; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]748; SSE2-NEXT: movdqa %xmm2, %xmm4749; SSE2-NEXT: pxor %xmm3, %xmm4750; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]751; SSE2-NEXT: movdqa %xmm5, %xmm6752; SSE2-NEXT: pcmpgtd %xmm4, %xmm6753; SSE2-NEXT: pcmpeqd %xmm4, %xmm4754; SSE2-NEXT: pand %xmm6, %xmm2755; SSE2-NEXT: pxor %xmm4, %xmm6756; SSE2-NEXT: por %xmm2, %xmm6757; SSE2-NEXT: pslld $16, %xmm6758; SSE2-NEXT: psrad $16, %xmm6759; SSE2-NEXT: pxor %xmm1, %xmm3760; SSE2-NEXT: pcmpgtd %xmm3, %xmm5761; SSE2-NEXT: pxor %xmm5, %xmm4762; SSE2-NEXT: pand %xmm1, %xmm5763; SSE2-NEXT: por %xmm4, %xmm5764; SSE2-NEXT: pslld $16, %xmm5765; SSE2-NEXT: psrad $16, %xmm5766; SSE2-NEXT: packssdw %xmm6, %xmm5767; SSE2-NEXT: psubusw %xmm5, %xmm0768; SSE2-NEXT: retq769;770; SSSE3-LABEL: test13:771; SSSE3: # %bb.0: # %vector.ph772; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]773; SSSE3-NEXT: movdqa %xmm2, %xmm4774; SSSE3-NEXT: pxor %xmm3, %xmm4775; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]776; SSSE3-NEXT: movdqa %xmm5, %xmm6777; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6778; SSSE3-NEXT: pcmpeqd %xmm4, %xmm4779; SSSE3-NEXT: pand %xmm6, %xmm2780; SSSE3-NEXT: pxor %xmm4, %xmm6781; SSSE3-NEXT: por %xmm2, %xmm6782; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]783; SSSE3-NEXT: pshufb %xmm2, %xmm6784; SSSE3-NEXT: pxor %xmm1, %xmm3785; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5786; SSSE3-NEXT: pxor %xmm5, %xmm4787; SSSE3-NEXT: pand %xmm1, %xmm5788; SSSE3-NEXT: por %xmm4, %xmm5789; SSSE3-NEXT: pshufb %xmm2, %xmm5790; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]791; SSSE3-NEXT: psubusw %xmm5, %xmm0792; SSSE3-NEXT: retq793;794; SSE41-LABEL: test13:795; SSE41: # %bb.0: # %vector.ph796; SSE41-NEXT: pmovsxbw {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]797; SSE41-NEXT: pminud %xmm3, %xmm2798; SSE41-NEXT: pminud %xmm3, %xmm1799; SSE41-NEXT: packusdw %xmm2, %xmm1800; SSE41-NEXT: psubusw %xmm1, %xmm0801; SSE41-NEXT: retq802;803; AVX1-LABEL: test13:804; AVX1: # %bb.0: # %vector.ph805; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2806; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [65535,65535,65535,65535]807; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2808; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1809; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1810; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0811; AVX1-NEXT: vzeroupper812; AVX1-NEXT: retq813;814; AVX2-LABEL: test13:815; AVX2: # %bb.0: # %vector.ph816; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]817; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1818; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2819; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1820; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0821; AVX2-NEXT: vzeroupper822; AVX2-NEXT: retq823;824; AVX512-LABEL: test13:825; AVX512: # %bb.0: # %vector.ph826; AVX512-NEXT: vpmovusdw %ymm1, %xmm1827; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0828; AVX512-NEXT: vzeroupper829; AVX512-NEXT: retq830vector.ph:831 %lhs = zext <8 x i16> %x to <8 x i32>832 %cond = icmp ult <8 x i32> %lhs, %y833 %sub = sub <8 x i32> %lhs, %y834 %trunc = trunc <8 x i32> %sub to <8 x i16>835 %res = select <8 x i1> %cond, <8 x i16> zeroinitializer, <8 x i16> %trunc836 ret <8 x i16> %res837}838 839; FIXME: match this to UMIN+TRUNC+PSUBUS840define <16 x i8> @test14(<16 x i8> %x, <16 x i32> %y) nounwind {841; SSE2OR3-LABEL: test14:842; SSE2OR3: # %bb.0: # %vector.ph843; SSE2OR3-NEXT: pxor %xmm6, %xmm6844; SSE2OR3-NEXT: movdqa %xmm0, %xmm5845; SSE2OR3-NEXT: movdqa %xmm4, %xmm7846; SSE2OR3-NEXT: movdqa %xmm3, %xmm8847; SSE2OR3-NEXT: movdqa %xmm2, %xmm9848; SSE2OR3-NEXT: movdqa {{.*#+}} xmm10 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]849; SSE2OR3-NEXT: pand %xmm10, %xmm4850; SSE2OR3-NEXT: pand %xmm10, %xmm3851; SSE2OR3-NEXT: packuswb %xmm4, %xmm3852; SSE2OR3-NEXT: movdqa %xmm1, %xmm4853; SSE2OR3-NEXT: pand %xmm10, %xmm2854; SSE2OR3-NEXT: pand %xmm10, %xmm1855; SSE2OR3-NEXT: packuswb %xmm2, %xmm1856; SSE2OR3-NEXT: packuswb %xmm3, %xmm1857; SSE2OR3-NEXT: psubb %xmm0, %xmm1858; SSE2OR3-NEXT: movdqa %xmm0, %xmm2859; SSE2OR3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1],xmm2[2],xmm6[2],xmm2[3],xmm6[3],xmm2[4],xmm6[4],xmm2[5],xmm6[5],xmm2[6],xmm6[6],xmm2[7],xmm6[7]860; SSE2OR3-NEXT: movdqa %xmm2, %xmm0861; SSE2OR3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1],xmm0[2],xmm6[2],xmm0[3],xmm6[3]862; SSE2OR3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm6[4],xmm2[5],xmm6[5],xmm2[6],xmm6[6],xmm2[7],xmm6[7]863; SSE2OR3-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm6[8],xmm5[9],xmm6[9],xmm5[10],xmm6[10],xmm5[11],xmm6[11],xmm5[12],xmm6[12],xmm5[13],xmm6[13],xmm5[14],xmm6[14],xmm5[15],xmm6[15]864; SSE2OR3-NEXT: movdqa %xmm5, %xmm3865; SSE2OR3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1],xmm3[2],xmm6[2],xmm3[3],xmm6[3]866; SSE2OR3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm6[4],xmm5[5],xmm6[5],xmm5[6],xmm6[6],xmm5[7],xmm6[7]867; SSE2OR3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]868; SSE2OR3-NEXT: pxor %xmm6, %xmm7869; SSE2OR3-NEXT: por %xmm6, %xmm5870; SSE2OR3-NEXT: pcmpgtd %xmm7, %xmm5871; SSE2OR3-NEXT: pxor %xmm6, %xmm8872; SSE2OR3-NEXT: por %xmm6, %xmm3873; SSE2OR3-NEXT: pcmpgtd %xmm8, %xmm3874; SSE2OR3-NEXT: packssdw %xmm5, %xmm3875; SSE2OR3-NEXT: pxor %xmm6, %xmm9876; SSE2OR3-NEXT: por %xmm6, %xmm2877; SSE2OR3-NEXT: pcmpgtd %xmm9, %xmm2878; SSE2OR3-NEXT: pxor %xmm6, %xmm4879; SSE2OR3-NEXT: por %xmm6, %xmm0880; SSE2OR3-NEXT: pcmpgtd %xmm4, %xmm0881; SSE2OR3-NEXT: packssdw %xmm2, %xmm0882; SSE2OR3-NEXT: packsswb %xmm3, %xmm0883; SSE2OR3-NEXT: pandn %xmm1, %xmm0884; SSE2OR3-NEXT: retq885;886; SSE41-LABEL: test14:887; SSE41: # %bb.0: # %vector.ph888; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,1,1]889; SSE41-NEXT: pmovzxbd {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero890; SSE41-NEXT: pmovzxbd {{.*#+}} xmm6 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero891; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[2,3,2,3]892; SSE41-NEXT: pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero893; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[3,3,3,3]894; SSE41-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm8[0],zero,zero,zero,xmm8[1],zero,zero,zero,xmm8[2],zero,zero,zero,xmm8[3],zero,zero,zero895; SSE41-NEXT: pmaxud %xmm4, %xmm8896; SSE41-NEXT: pcmpeqd %xmm4, %xmm8897; SSE41-NEXT: pmaxud %xmm3, %xmm7898; SSE41-NEXT: pcmpeqd %xmm3, %xmm7899; SSE41-NEXT: packssdw %xmm8, %xmm7900; SSE41-NEXT: pmaxud %xmm1, %xmm6901; SSE41-NEXT: pcmpeqd %xmm1, %xmm6902; SSE41-NEXT: pmaxud %xmm2, %xmm5903; SSE41-NEXT: pcmpeqd %xmm2, %xmm5904; SSE41-NEXT: packssdw %xmm5, %xmm6905; SSE41-NEXT: packsswb %xmm7, %xmm6906; SSE41-NEXT: pmovzxbd {{.*#+}} xmm5 = [255,255,255,255]907; SSE41-NEXT: pand %xmm5, %xmm4908; SSE41-NEXT: pand %xmm5, %xmm3909; SSE41-NEXT: packusdw %xmm4, %xmm3910; SSE41-NEXT: pand %xmm5, %xmm2911; SSE41-NEXT: pand %xmm1, %xmm5912; SSE41-NEXT: packusdw %xmm2, %xmm5913; SSE41-NEXT: packuswb %xmm3, %xmm5914; SSE41-NEXT: psubb %xmm0, %xmm5915; SSE41-NEXT: pand %xmm6, %xmm5916; SSE41-NEXT: movdqa %xmm5, %xmm0917; SSE41-NEXT: retq918;919; AVX1-LABEL: test14:920; AVX1: # %bb.0: # %vector.ph921; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]922; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero923; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm4 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero924; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm0[2,3,2,3]925; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero926; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[3,3,3,3]927; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero928; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7929; AVX1-NEXT: vpmaxud %xmm6, %xmm7, %xmm6930; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6931; AVX1-NEXT: vpmaxud %xmm5, %xmm2, %xmm5932; AVX1-NEXT: vpcmpeqd %xmm5, %xmm2, %xmm5933; AVX1-NEXT: vpackssdw %xmm6, %xmm5, %xmm5934; AVX1-NEXT: vpmaxud %xmm4, %xmm1, %xmm4935; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm4936; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6937; AVX1-NEXT: vpmaxud %xmm3, %xmm6, %xmm3938; AVX1-NEXT: vpcmpeqd %xmm3, %xmm6, %xmm3939; AVX1-NEXT: vpackssdw %xmm3, %xmm4, %xmm3940; AVX1-NEXT: vpacksswb %xmm5, %xmm3, %xmm3941; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255]942; AVX1-NEXT: vandps %ymm4, %ymm2, %ymm2943; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5944; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2945; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1946; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4947; AVX1-NEXT: vpackusdw %xmm4, %xmm1, %xmm1948; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1949; AVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm0950; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0951; AVX1-NEXT: vzeroupper952; AVX1-NEXT: retq953;954; AVX2-LABEL: test14:955; AVX2: # %bb.0: # %vector.ph956; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]957; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero958; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm4 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero959; AVX2-NEXT: vpmaxud %ymm4, %ymm1, %ymm4960; AVX2-NEXT: vpcmpeqd %ymm4, %ymm1, %ymm4961; AVX2-NEXT: vpmaxud %ymm3, %ymm2, %ymm3962; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm3963; AVX2-NEXT: vpackssdw %ymm3, %ymm4, %ymm3964; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4965; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3966; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4967; AVX2-NEXT: vpacksswb %xmm4, %xmm3, %xmm3968; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,2,1,3]969; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]970; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2971; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1972; AVX2-NEXT: vpackusdw %ymm2, %ymm1, %ymm1973; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2974; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1975; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]976; AVX2-NEXT: vpsubb %xmm0, %xmm1, %xmm0977; AVX2-NEXT: vpandn %xmm0, %xmm3, %xmm0978; AVX2-NEXT: vzeroupper979; AVX2-NEXT: retq980;981; AVX512-LABEL: test14:982; AVX512: # %bb.0: # %vector.ph983; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero984; AVX512-NEXT: vpcmpnltud %zmm2, %zmm1, %k1985; AVX512-NEXT: vpmovdb %zmm1, %xmm1986; AVX512-NEXT: vpsubb %xmm0, %xmm1, %xmm0 {%k1} {z}987; AVX512-NEXT: vzeroupper988; AVX512-NEXT: retq989vector.ph:990 %rhs = zext <16 x i8> %x to <16 x i32>991 %cond = icmp ult <16 x i32> %y, %rhs992 %sub = sub <16 x i32> %y, %rhs993 %truncsub = trunc <16 x i32> %sub to <16 x i8>994 %res = select <16 x i1> %cond, <16 x i8> zeroinitializer, <16 x i8> %truncsub995 ret <16 x i8> %res996}997 998define <8 x i16> @test15(<8 x i16> %x, <8 x i32> %y) nounwind {999; SSE2-LABEL: test15:1000; SSE2: # %bb.0: # %vector.ph1001; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1002; SSE2-NEXT: movdqa %xmm2, %xmm41003; SSE2-NEXT: pxor %xmm3, %xmm41004; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]1005; SSE2-NEXT: movdqa %xmm5, %xmm61006; SSE2-NEXT: pcmpgtd %xmm4, %xmm61007; SSE2-NEXT: pcmpeqd %xmm4, %xmm41008; SSE2-NEXT: pand %xmm6, %xmm21009; SSE2-NEXT: pxor %xmm4, %xmm61010; SSE2-NEXT: por %xmm2, %xmm61011; SSE2-NEXT: pslld $16, %xmm61012; SSE2-NEXT: psrad $16, %xmm61013; SSE2-NEXT: pxor %xmm1, %xmm31014; SSE2-NEXT: pcmpgtd %xmm3, %xmm51015; SSE2-NEXT: pxor %xmm5, %xmm41016; SSE2-NEXT: pand %xmm1, %xmm51017; SSE2-NEXT: por %xmm4, %xmm51018; SSE2-NEXT: pslld $16, %xmm51019; SSE2-NEXT: psrad $16, %xmm51020; SSE2-NEXT: packssdw %xmm6, %xmm51021; SSE2-NEXT: psubusw %xmm5, %xmm01022; SSE2-NEXT: retq1023;1024; SSSE3-LABEL: test15:1025; SSSE3: # %bb.0: # %vector.ph1026; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1027; SSSE3-NEXT: movdqa %xmm2, %xmm41028; SSSE3-NEXT: pxor %xmm3, %xmm41029; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]1030; SSSE3-NEXT: movdqa %xmm5, %xmm61031; SSSE3-NEXT: pcmpgtd %xmm4, %xmm61032; SSSE3-NEXT: pcmpeqd %xmm4, %xmm41033; SSSE3-NEXT: pand %xmm6, %xmm21034; SSSE3-NEXT: pxor %xmm4, %xmm61035; SSSE3-NEXT: por %xmm2, %xmm61036; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1037; SSSE3-NEXT: pshufb %xmm2, %xmm61038; SSSE3-NEXT: pxor %xmm1, %xmm31039; SSSE3-NEXT: pcmpgtd %xmm3, %xmm51040; SSSE3-NEXT: pxor %xmm5, %xmm41041; SSSE3-NEXT: pand %xmm1, %xmm51042; SSSE3-NEXT: por %xmm4, %xmm51043; SSSE3-NEXT: pshufb %xmm2, %xmm51044; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]1045; SSSE3-NEXT: psubusw %xmm5, %xmm01046; SSSE3-NEXT: retq1047;1048; SSE41-LABEL: test15:1049; SSE41: # %bb.0: # %vector.ph1050; SSE41-NEXT: pmovsxbw {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]1051; SSE41-NEXT: pminud %xmm3, %xmm21052; SSE41-NEXT: pminud %xmm3, %xmm11053; SSE41-NEXT: packusdw %xmm2, %xmm11054; SSE41-NEXT: psubusw %xmm1, %xmm01055; SSE41-NEXT: retq1056;1057; AVX1-LABEL: test15:1058; AVX1: # %bb.0: # %vector.ph1059; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21060; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [65535,65535,65535,65535]1061; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm21062; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm11063; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm11064; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm01065; AVX1-NEXT: vzeroupper1066; AVX1-NEXT: retq1067;1068; AVX2-LABEL: test15:1069; AVX2: # %bb.0: # %vector.ph1070; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]1071; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm11072; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm21073; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm11074; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm01075; AVX2-NEXT: vzeroupper1076; AVX2-NEXT: retq1077;1078; AVX512-LABEL: test15:1079; AVX512: # %bb.0: # %vector.ph1080; AVX512-NEXT: vpmovusdw %ymm1, %xmm11081; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm01082; AVX512-NEXT: vzeroupper1083; AVX512-NEXT: retq1084vector.ph:1085 %lhs = zext <8 x i16> %x to <8 x i32>1086 %cond = icmp ugt <8 x i32> %lhs, %y1087 %sub = sub <8 x i32> %lhs, %y1088 %truncsub = trunc <8 x i32> %sub to <8 x i16>1089 %res = select <8 x i1> %cond, <8 x i16> %truncsub, <8 x i16> zeroinitializer1090 ret <8 x i16> %res1091}1092 1093; FIXME: match this to UMIN+TRUNC+PSUBUS1094define <8 x i16> @test16(<8 x i16> %x, <8 x i32> %y) nounwind {1095; SSE2-LABEL: test16:1096; SSE2: # %bb.0: # %vector.ph1097; SSE2-NEXT: pxor %xmm3, %xmm31098; SSE2-NEXT: movdqa %xmm0, %xmm41099; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]1100; SSE2-NEXT: movdqa %xmm0, %xmm51101; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]1102; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1103; SSE2-NEXT: movdqa %xmm2, %xmm61104; SSE2-NEXT: pxor %xmm3, %xmm61105; SSE2-NEXT: por %xmm3, %xmm51106; SSE2-NEXT: pcmpgtd %xmm6, %xmm51107; SSE2-NEXT: movdqa %xmm1, %xmm61108; SSE2-NEXT: pxor %xmm3, %xmm61109; SSE2-NEXT: por %xmm3, %xmm41110; SSE2-NEXT: pcmpgtd %xmm6, %xmm41111; SSE2-NEXT: packssdw %xmm5, %xmm41112; SSE2-NEXT: pslld $16, %xmm21113; SSE2-NEXT: psrad $16, %xmm21114; SSE2-NEXT: pslld $16, %xmm11115; SSE2-NEXT: psrad $16, %xmm11116; SSE2-NEXT: packssdw %xmm2, %xmm11117; SSE2-NEXT: psubw %xmm1, %xmm01118; SSE2-NEXT: pand %xmm4, %xmm01119; SSE2-NEXT: retq1120;1121; SSSE3-LABEL: test16:1122; SSSE3: # %bb.0: # %vector.ph1123; SSSE3-NEXT: pxor %xmm3, %xmm31124; SSSE3-NEXT: movdqa %xmm0, %xmm41125; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]1126; SSSE3-NEXT: movdqa %xmm0, %xmm51127; SSSE3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]1128; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1129; SSSE3-NEXT: movdqa %xmm2, %xmm61130; SSSE3-NEXT: pxor %xmm3, %xmm61131; SSSE3-NEXT: por %xmm3, %xmm51132; SSSE3-NEXT: pcmpgtd %xmm6, %xmm51133; SSSE3-NEXT: movdqa %xmm1, %xmm61134; SSSE3-NEXT: pxor %xmm3, %xmm61135; SSSE3-NEXT: por %xmm3, %xmm41136; SSSE3-NEXT: pcmpgtd %xmm6, %xmm41137; SSSE3-NEXT: packssdw %xmm5, %xmm41138; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1139; SSSE3-NEXT: pshufb %xmm3, %xmm21140; SSSE3-NEXT: pshufb %xmm3, %xmm11141; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1142; SSSE3-NEXT: psubw %xmm1, %xmm01143; SSSE3-NEXT: pand %xmm4, %xmm01144; SSSE3-NEXT: retq1145;1146; SSE41-LABEL: test16:1147; SSE41: # %bb.0: # %vector.ph1148; SSE41-NEXT: pxor %xmm4, %xmm41149; SSE41-NEXT: movdqa %xmm0, %xmm51150; SSE41-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]1151; SSE41-NEXT: pmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1152; SSE41-NEXT: pmaxud %xmm2, %xmm51153; SSE41-NEXT: pcmpeqd %xmm2, %xmm51154; SSE41-NEXT: pmaxud %xmm1, %xmm31155; SSE41-NEXT: pcmpeqd %xmm1, %xmm31156; SSE41-NEXT: packssdw %xmm5, %xmm31157; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3],xmm2[4],xmm4[5],xmm2[6],xmm4[7]1158; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]1159; SSE41-NEXT: packusdw %xmm2, %xmm11160; SSE41-NEXT: psubw %xmm1, %xmm01161; SSE41-NEXT: pandn %xmm0, %xmm31162; SSE41-NEXT: movdqa %xmm3, %xmm01163; SSE41-NEXT: retq1164;1165; AVX1-LABEL: test16:1166; AVX1: # %bb.0: # %vector.ph1167; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21168; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]1169; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1170; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm41171; AVX1-NEXT: vpmaxud %xmm2, %xmm4, %xmm21172; AVX1-NEXT: vpcmpeqd %xmm2, %xmm4, %xmm21173; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm31174; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm31175; AVX1-NEXT: vpackssdw %xmm2, %xmm3, %xmm21176; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11177; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31178; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm11179; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm01180; AVX1-NEXT: vpandn %xmm0, %xmm2, %xmm01181; AVX1-NEXT: vzeroupper1182; AVX1-NEXT: retq1183;1184; AVX2-LABEL: test16:1185; AVX2: # %bb.0: # %vector.ph1186; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1187; AVX2-NEXT: vpmaxud %ymm2, %ymm1, %ymm21188; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm21189; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm31190; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm21191; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm31192; AVX2-NEXT: vpackssdw %xmm3, %xmm2, %xmm21193; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]1194; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]1195; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm01196; AVX2-NEXT: vpand %xmm0, %xmm2, %xmm01197; AVX2-NEXT: vzeroupper1198; AVX2-NEXT: retq1199;1200; AVX512-LABEL: test16:1201; AVX512: # %bb.0: # %vector.ph1202; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1203; AVX512-NEXT: vpcmpltud %ymm2, %ymm1, %k11204; AVX512-NEXT: vpmovdw %ymm1, %xmm11205; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm0 {%k1} {z}1206; AVX512-NEXT: vzeroupper1207; AVX512-NEXT: retq1208vector.ph:1209 %lhs = zext <8 x i16> %x to <8 x i32>1210 %cond = icmp ult <8 x i32> %y, %lhs1211 %sub = sub <8 x i32> %lhs, %y1212 %truncsub = trunc <8 x i32> %sub to <8 x i16>1213 %res = select <8 x i1> %cond, <8 x i16> %truncsub, <8 x i16> zeroinitializer1214 ret <8 x i16> %res1215}1216 1217define <64 x i8> @test17(<64 x i8> %x, i8 zeroext %w) nounwind {1218; SSE2-LABEL: test17:1219; SSE2: # %bb.0: # %vector.ph1220; SSE2-NEXT: movd %edi, %xmm41221; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1222; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,0,4,5,6,7]1223; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]1224; SSE2-NEXT: psubusb %xmm4, %xmm01225; SSE2-NEXT: psubusb %xmm4, %xmm11226; SSE2-NEXT: psubusb %xmm4, %xmm21227; SSE2-NEXT: psubusb %xmm4, %xmm31228; SSE2-NEXT: retq1229;1230; SSSE3-LABEL: test17:1231; SSSE3: # %bb.0: # %vector.ph1232; SSSE3-NEXT: movd %edi, %xmm41233; SSSE3-NEXT: pxor %xmm5, %xmm51234; SSSE3-NEXT: pshufb %xmm5, %xmm41235; SSSE3-NEXT: psubusb %xmm4, %xmm01236; SSSE3-NEXT: psubusb %xmm4, %xmm11237; SSSE3-NEXT: psubusb %xmm4, %xmm21238; SSSE3-NEXT: psubusb %xmm4, %xmm31239; SSSE3-NEXT: retq1240;1241; SSE41-LABEL: test17:1242; SSE41: # %bb.0: # %vector.ph1243; SSE41-NEXT: movd %edi, %xmm41244; SSE41-NEXT: pxor %xmm5, %xmm51245; SSE41-NEXT: pshufb %xmm5, %xmm41246; SSE41-NEXT: psubusb %xmm4, %xmm01247; SSE41-NEXT: psubusb %xmm4, %xmm11248; SSE41-NEXT: psubusb %xmm4, %xmm21249; SSE41-NEXT: psubusb %xmm4, %xmm31250; SSE41-NEXT: retq1251;1252; AVX1-LABEL: test17:1253; AVX1: # %bb.0: # %vector.ph1254; AVX1-NEXT: vmovd %edi, %xmm21255; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm31256; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm21257; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31258; AVX1-NEXT: vpsubusb %xmm2, %xmm3, %xmm31259; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm01260; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm01261; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31262; AVX1-NEXT: vpsubusb %xmm2, %xmm3, %xmm31263; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm11264; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm11265; AVX1-NEXT: retq1266;1267; AVX2-LABEL: test17:1268; AVX2: # %bb.0: # %vector.ph1269; AVX2-NEXT: vmovd %edi, %xmm21270; AVX2-NEXT: vpbroadcastb %xmm2, %ymm21271; AVX2-NEXT: vpsubusb %ymm2, %ymm0, %ymm01272; AVX2-NEXT: vpsubusb %ymm2, %ymm1, %ymm11273; AVX2-NEXT: retq1274;1275; AVX512-LABEL: test17:1276; AVX512: # %bb.0: # %vector.ph1277; AVX512-NEXT: vpbroadcastb %edi, %zmm11278; AVX512-NEXT: vpsubusb %zmm1, %zmm0, %zmm01279; AVX512-NEXT: retq1280vector.ph:1281 %0 = insertelement <64 x i8> undef, i8 %w, i32 01282 %broadcast15 = shufflevector <64 x i8> %0, <64 x i8> undef, <64 x i32> zeroinitializer1283 %1 = icmp ult <64 x i8> %x, %broadcast151284 %2 = sub <64 x i8> %x, %broadcast151285 %res = select <64 x i1> %1, <64 x i8> zeroinitializer, <64 x i8> %21286 ret <64 x i8> %res1287}1288 1289define <32 x i16> @test18(<32 x i16> %x, i16 zeroext %w) nounwind {1290; SSE-LABEL: test18:1291; SSE: # %bb.0: # %vector.ph1292; SSE-NEXT: movd %edi, %xmm41293; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,0,4,5,6,7]1294; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]1295; SSE-NEXT: psubusw %xmm4, %xmm01296; SSE-NEXT: psubusw %xmm4, %xmm11297; SSE-NEXT: psubusw %xmm4, %xmm21298; SSE-NEXT: psubusw %xmm4, %xmm31299; SSE-NEXT: retq1300;1301; AVX1-LABEL: test18:1302; AVX1: # %bb.0: # %vector.ph1303; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21304; AVX1-NEXT: vmovd %edi, %xmm31305; AVX1-NEXT: vpshuflw {{.*#+}} xmm3 = xmm3[0,0,0,0,4,5,6,7]1306; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]1307; AVX1-NEXT: vpsubusw %xmm3, %xmm2, %xmm21308; AVX1-NEXT: vpsubusw %xmm3, %xmm0, %xmm01309; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01310; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21311; AVX1-NEXT: vpsubusw %xmm3, %xmm2, %xmm21312; AVX1-NEXT: vpsubusw %xmm3, %xmm1, %xmm11313; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11314; AVX1-NEXT: retq1315;1316; AVX2-LABEL: test18:1317; AVX2: # %bb.0: # %vector.ph1318; AVX2-NEXT: vmovd %edi, %xmm21319; AVX2-NEXT: vpbroadcastw %xmm2, %ymm21320; AVX2-NEXT: vpsubusw %ymm2, %ymm0, %ymm01321; AVX2-NEXT: vpsubusw %ymm2, %ymm1, %ymm11322; AVX2-NEXT: retq1323;1324; AVX512-LABEL: test18:1325; AVX512: # %bb.0: # %vector.ph1326; AVX512-NEXT: vpbroadcastw %edi, %zmm11327; AVX512-NEXT: vpsubusw %zmm1, %zmm0, %zmm01328; AVX512-NEXT: retq1329vector.ph:1330 %0 = insertelement <32 x i16> undef, i16 %w, i32 01331 %broadcast15 = shufflevector <32 x i16> %0, <32 x i16> undef, <32 x i32> zeroinitializer1332 %1 = icmp ult <32 x i16> %x, %broadcast151333 %2 = sub <32 x i16> %x, %broadcast151334 %res = select <32 x i1> %1, <32 x i16> zeroinitializer, <32 x i16> %21335 ret <32 x i16> %res1336}1337 1338define <8 x i16> @psubus_8i16_max(<8 x i16> %x, <8 x i16> %y) nounwind {1339; SSE-LABEL: psubus_8i16_max:1340; SSE: # %bb.0: # %vector.ph1341; SSE-NEXT: psubusw %xmm1, %xmm01342; SSE-NEXT: retq1343;1344; AVX-LABEL: psubus_8i16_max:1345; AVX: # %bb.0: # %vector.ph1346; AVX-NEXT: vpsubusw %xmm1, %xmm0, %xmm01347; AVX-NEXT: retq1348vector.ph:1349 %cmp = icmp ult <8 x i16> %x, %y1350 %max = select <8 x i1> %cmp, <8 x i16> %y, <8 x i16> %x1351 %res = sub <8 x i16> %max, %y1352 ret <8 x i16> %res1353}1354 1355define <16 x i8> @psubus_16i8_max(<16 x i8> %x, <16 x i8> %y) nounwind {1356; SSE-LABEL: psubus_16i8_max:1357; SSE: # %bb.0: # %vector.ph1358; SSE-NEXT: psubusb %xmm1, %xmm01359; SSE-NEXT: retq1360;1361; AVX-LABEL: psubus_16i8_max:1362; AVX: # %bb.0: # %vector.ph1363; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm01364; AVX-NEXT: retq1365vector.ph:1366 %cmp = icmp ult <16 x i8> %x, %y1367 %max = select <16 x i1> %cmp, <16 x i8> %y, <16 x i8> %x1368 %res = sub <16 x i8> %max, %y1369 ret <16 x i8> %res1370}1371 1372define <16 x i16> @psubus_16i16_max(<16 x i16> %x, <16 x i16> %y) nounwind {1373; SSE-LABEL: psubus_16i16_max:1374; SSE: # %bb.0: # %vector.ph1375; SSE-NEXT: psubusw %xmm2, %xmm01376; SSE-NEXT: psubusw %xmm3, %xmm11377; SSE-NEXT: retq1378;1379; AVX1-LABEL: psubus_16i16_max:1380; AVX1: # %bb.0: # %vector.ph1381; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21382; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31383; AVX1-NEXT: vpsubusw %xmm2, %xmm3, %xmm21384; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm01385; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01386; AVX1-NEXT: retq1387;1388; AVX2-LABEL: psubus_16i16_max:1389; AVX2: # %bb.0: # %vector.ph1390; AVX2-NEXT: vpsubusw %ymm1, %ymm0, %ymm01391; AVX2-NEXT: retq1392;1393; AVX512-LABEL: psubus_16i16_max:1394; AVX512: # %bb.0: # %vector.ph1395; AVX512-NEXT: vpsubusw %ymm1, %ymm0, %ymm01396; AVX512-NEXT: retq1397vector.ph:1398 %cmp = icmp ult <16 x i16> %x, %y1399 %max = select <16 x i1> %cmp, <16 x i16> %y, <16 x i16> %x1400 %res = sub <16 x i16> %max, %y1401 ret <16 x i16> %res1402}1403 1404define <32 x i16> @psubus_32i16_max(<32 x i16> %x, <32 x i16> %y) nounwind {1405; SSE-LABEL: psubus_32i16_max:1406; SSE: # %bb.0: # %vector.ph1407; SSE-NEXT: psubusw %xmm4, %xmm01408; SSE-NEXT: psubusw %xmm5, %xmm11409; SSE-NEXT: psubusw %xmm6, %xmm21410; SSE-NEXT: psubusw %xmm7, %xmm31411; SSE-NEXT: retq1412;1413; AVX1-LABEL: psubus_32i16_max:1414; AVX1: # %bb.0: # %vector.ph1415; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm41416; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm51417; AVX1-NEXT: vpsubusw %xmm4, %xmm5, %xmm41418; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm01419; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm01420; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm21421; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm41422; AVX1-NEXT: vpsubusw %xmm2, %xmm4, %xmm21423; AVX1-NEXT: vpsubusw %xmm3, %xmm1, %xmm11424; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11425; AVX1-NEXT: retq1426;1427; AVX2-LABEL: psubus_32i16_max:1428; AVX2: # %bb.0: # %vector.ph1429; AVX2-NEXT: vpsubusw %ymm2, %ymm0, %ymm01430; AVX2-NEXT: vpsubusw %ymm3, %ymm1, %ymm11431; AVX2-NEXT: retq1432;1433; AVX512-LABEL: psubus_32i16_max:1434; AVX512: # %bb.0: # %vector.ph1435; AVX512-NEXT: vpsubusw %zmm1, %zmm0, %zmm01436; AVX512-NEXT: retq1437vector.ph:1438 %cmp = icmp ult <32 x i16> %x, %y1439 %max = select <32 x i1> %cmp, <32 x i16> %y, <32 x i16> %x1440 %res = sub <32 x i16> %max, %y1441 ret <32 x i16> %res1442}1443 1444define <64 x i8> @psubus_64i8_max(<64 x i8> %x, <64 x i8> %y) nounwind {1445; SSE-LABEL: psubus_64i8_max:1446; SSE: # %bb.0: # %vector.ph1447; SSE-NEXT: psubusb %xmm4, %xmm01448; SSE-NEXT: psubusb %xmm5, %xmm11449; SSE-NEXT: psubusb %xmm6, %xmm21450; SSE-NEXT: psubusb %xmm7, %xmm31451; SSE-NEXT: retq1452;1453; AVX1-LABEL: psubus_64i8_max:1454; AVX1: # %bb.0: # %vector.ph1455; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm41456; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm51457; AVX1-NEXT: vpsubusb %xmm4, %xmm5, %xmm41458; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm01459; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm01460; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm21461; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm41462; AVX1-NEXT: vpsubusb %xmm2, %xmm4, %xmm21463; AVX1-NEXT: vpsubusb %xmm3, %xmm1, %xmm11464; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11465; AVX1-NEXT: retq1466;1467; AVX2-LABEL: psubus_64i8_max:1468; AVX2: # %bb.0: # %vector.ph1469; AVX2-NEXT: vpsubusb %ymm2, %ymm0, %ymm01470; AVX2-NEXT: vpsubusb %ymm3, %ymm1, %ymm11471; AVX2-NEXT: retq1472;1473; AVX512-LABEL: psubus_64i8_max:1474; AVX512: # %bb.0: # %vector.ph1475; AVX512-NEXT: vpsubusb %zmm1, %zmm0, %zmm01476; AVX512-NEXT: retq1477vector.ph:1478 %cmp = icmp ult <64 x i8> %x, %y1479 %max = select <64 x i1> %cmp, <64 x i8> %y, <64 x i8> %x1480 %res = sub <64 x i8> %max, %y1481 ret <64 x i8> %res1482}1483 1484define <32 x i8> @psubus_32i8_max(<32 x i8> %x, <32 x i8> %y) nounwind {1485; SSE-LABEL: psubus_32i8_max:1486; SSE: # %bb.0: # %vector.ph1487; SSE-NEXT: psubusb %xmm2, %xmm01488; SSE-NEXT: psubusb %xmm3, %xmm11489; SSE-NEXT: retq1490;1491; AVX1-LABEL: psubus_32i8_max:1492; AVX1: # %bb.0: # %vector.ph1493; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21494; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31495; AVX1-NEXT: vpsubusb %xmm2, %xmm3, %xmm21496; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm01497; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01498; AVX1-NEXT: retq1499;1500; AVX2-LABEL: psubus_32i8_max:1501; AVX2: # %bb.0: # %vector.ph1502; AVX2-NEXT: vpsubusb %ymm1, %ymm0, %ymm01503; AVX2-NEXT: retq1504;1505; AVX512-LABEL: psubus_32i8_max:1506; AVX512: # %bb.0: # %vector.ph1507; AVX512-NEXT: vpsubusb %ymm1, %ymm0, %ymm01508; AVX512-NEXT: retq1509vector.ph:1510 %cmp = icmp ult <32 x i8> %x, %y1511 %max = select <32 x i1> %cmp, <32 x i8> %y, <32 x i8> %x1512 %res = sub <32 x i8> %max, %y1513 ret <32 x i8> %res1514}1515 1516define <8 x i16> @psubus_8i32_max(<8 x i16> %x, <8 x i32> %y) nounwind {1517; SSE2-LABEL: psubus_8i32_max:1518; SSE2: # %bb.0: # %vector.ph1519; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1520; SSE2-NEXT: movdqa %xmm2, %xmm41521; SSE2-NEXT: pxor %xmm3, %xmm41522; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]1523; SSE2-NEXT: movdqa %xmm5, %xmm61524; SSE2-NEXT: pcmpgtd %xmm4, %xmm61525; SSE2-NEXT: pcmpeqd %xmm4, %xmm41526; SSE2-NEXT: pand %xmm6, %xmm21527; SSE2-NEXT: pxor %xmm4, %xmm61528; SSE2-NEXT: por %xmm2, %xmm61529; SSE2-NEXT: pslld $16, %xmm61530; SSE2-NEXT: psrad $16, %xmm61531; SSE2-NEXT: pxor %xmm1, %xmm31532; SSE2-NEXT: pcmpgtd %xmm3, %xmm51533; SSE2-NEXT: pxor %xmm5, %xmm41534; SSE2-NEXT: pand %xmm1, %xmm51535; SSE2-NEXT: por %xmm4, %xmm51536; SSE2-NEXT: pslld $16, %xmm51537; SSE2-NEXT: psrad $16, %xmm51538; SSE2-NEXT: packssdw %xmm6, %xmm51539; SSE2-NEXT: psubusw %xmm5, %xmm01540; SSE2-NEXT: retq1541;1542; SSSE3-LABEL: psubus_8i32_max:1543; SSSE3: # %bb.0: # %vector.ph1544; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1545; SSSE3-NEXT: movdqa %xmm2, %xmm41546; SSSE3-NEXT: pxor %xmm3, %xmm41547; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]1548; SSSE3-NEXT: movdqa %xmm5, %xmm61549; SSSE3-NEXT: pcmpgtd %xmm4, %xmm61550; SSSE3-NEXT: pcmpeqd %xmm4, %xmm41551; SSSE3-NEXT: pand %xmm6, %xmm21552; SSSE3-NEXT: pxor %xmm4, %xmm61553; SSSE3-NEXT: por %xmm2, %xmm61554; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1555; SSSE3-NEXT: pshufb %xmm2, %xmm61556; SSSE3-NEXT: pxor %xmm1, %xmm31557; SSSE3-NEXT: pcmpgtd %xmm3, %xmm51558; SSSE3-NEXT: pxor %xmm5, %xmm41559; SSSE3-NEXT: pand %xmm1, %xmm51560; SSSE3-NEXT: por %xmm4, %xmm51561; SSSE3-NEXT: pshufb %xmm2, %xmm51562; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]1563; SSSE3-NEXT: psubusw %xmm5, %xmm01564; SSSE3-NEXT: retq1565;1566; SSE41-LABEL: psubus_8i32_max:1567; SSE41: # %bb.0: # %vector.ph1568; SSE41-NEXT: pmovsxbw {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]1569; SSE41-NEXT: pminud %xmm3, %xmm21570; SSE41-NEXT: pminud %xmm3, %xmm11571; SSE41-NEXT: packusdw %xmm2, %xmm11572; SSE41-NEXT: psubusw %xmm1, %xmm01573; SSE41-NEXT: retq1574;1575; AVX1-LABEL: psubus_8i32_max:1576; AVX1: # %bb.0: # %vector.ph1577; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21578; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [65535,65535,65535,65535]1579; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm21580; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm11581; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm11582; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm01583; AVX1-NEXT: vzeroupper1584; AVX1-NEXT: retq1585;1586; AVX2-LABEL: psubus_8i32_max:1587; AVX2: # %bb.0: # %vector.ph1588; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]1589; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm11590; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm21591; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm11592; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm01593; AVX2-NEXT: vzeroupper1594; AVX2-NEXT: retq1595;1596; AVX512-LABEL: psubus_8i32_max:1597; AVX512: # %bb.0: # %vector.ph1598; AVX512-NEXT: vpmovusdw %ymm1, %xmm11599; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm01600; AVX512-NEXT: vzeroupper1601; AVX512-NEXT: retq1602vector.ph:1603 %lhs = zext <8 x i16> %x to <8 x i32>1604 %cond = icmp ult <8 x i32> %lhs, %y1605 %max = select <8 x i1> %cond, <8 x i32> %y, <8 x i32> %lhs1606 %sub = sub <8 x i32> %max, %y1607 %res = trunc <8 x i32> %sub to <8 x i16>1608 ret <8 x i16> %res1609}1610 1611define <8 x i16> @psubus_8i64_max(<8 x i16> %x, <8 x i64> %y) nounwind {1612; SSE2OR3-LABEL: psubus_8i64_max:1613; SSE2OR3: # %bb.0: # %vector.ph1614; SSE2OR3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]1615; SSE2OR3-NEXT: movdqa %xmm4, %xmm71616; SSE2OR3-NEXT: pxor %xmm5, %xmm71617; SSE2OR3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]1618; SSE2OR3-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183]1619; SSE2OR3-NEXT: movdqa %xmm6, %xmm91620; SSE2OR3-NEXT: pcmpgtd %xmm8, %xmm91621; SSE2OR3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]1622; SSE2OR3-NEXT: pcmpeqd %xmm5, %xmm81623; SSE2OR3-NEXT: pand %xmm9, %xmm81624; SSE2OR3-NEXT: pcmpeqd %xmm7, %xmm71625; SSE2OR3-NEXT: pand %xmm8, %xmm41626; SSE2OR3-NEXT: pxor %xmm7, %xmm81627; SSE2OR3-NEXT: por %xmm4, %xmm81628; SSE2OR3-NEXT: movdqa %xmm3, %xmm41629; SSE2OR3-NEXT: pxor %xmm5, %xmm41630; SSE2OR3-NEXT: pshufd {{.*#+}} xmm9 = xmm4[0,0,2,2]1631; SSE2OR3-NEXT: movdqa %xmm6, %xmm101632; SSE2OR3-NEXT: pcmpgtd %xmm9, %xmm101633; SSE2OR3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]1634; SSE2OR3-NEXT: pcmpeqd %xmm5, %xmm41635; SSE2OR3-NEXT: pand %xmm10, %xmm41636; SSE2OR3-NEXT: pand %xmm4, %xmm31637; SSE2OR3-NEXT: pxor %xmm7, %xmm41638; SSE2OR3-NEXT: por %xmm3, %xmm41639; SSE2OR3-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm8[0,2]1640; SSE2OR3-NEXT: pslld $16, %xmm41641; SSE2OR3-NEXT: psrad $16, %xmm41642; SSE2OR3-NEXT: movdqa %xmm2, %xmm31643; SSE2OR3-NEXT: pxor %xmm5, %xmm31644; SSE2OR3-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]1645; SSE2OR3-NEXT: movdqa %xmm6, %xmm91646; SSE2OR3-NEXT: pcmpgtd %xmm8, %xmm91647; SSE2OR3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]1648; SSE2OR3-NEXT: pcmpeqd %xmm5, %xmm31649; SSE2OR3-NEXT: pand %xmm9, %xmm31650; SSE2OR3-NEXT: pand %xmm3, %xmm21651; SSE2OR3-NEXT: pxor %xmm7, %xmm31652; SSE2OR3-NEXT: por %xmm2, %xmm31653; SSE2OR3-NEXT: movdqa %xmm1, %xmm21654; SSE2OR3-NEXT: pxor %xmm5, %xmm21655; SSE2OR3-NEXT: pshufd {{.*#+}} xmm8 = xmm2[0,0,2,2]1656; SSE2OR3-NEXT: pcmpgtd %xmm8, %xmm61657; SSE2OR3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1658; SSE2OR3-NEXT: pcmpeqd %xmm5, %xmm21659; SSE2OR3-NEXT: pand %xmm6, %xmm21660; SSE2OR3-NEXT: pxor %xmm2, %xmm71661; SSE2OR3-NEXT: pand %xmm1, %xmm21662; SSE2OR3-NEXT: por %xmm7, %xmm21663; SSE2OR3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]1664; SSE2OR3-NEXT: pslld $16, %xmm21665; SSE2OR3-NEXT: psrad $16, %xmm21666; SSE2OR3-NEXT: packssdw %xmm4, %xmm21667; SSE2OR3-NEXT: psubusw %xmm2, %xmm01668; SSE2OR3-NEXT: retq1669;1670; SSE41-LABEL: psubus_8i64_max:1671; SSE41: # %bb.0: # %vector.ph1672; SSE41-NEXT: movdqa %xmm0, %xmm51673; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]1674; SSE41-NEXT: movdqa %xmm4, %xmm81675; SSE41-NEXT: pxor %xmm9, %xmm81676; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002324991,9223372039002324991]1677; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm8[0,0,2,2]1678; SSE41-NEXT: pcmpeqd %xmm7, %xmm81679; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183]1680; SSE41-NEXT: movdqa %xmm6, %xmm01681; SSE41-NEXT: pcmpgtd %xmm10, %xmm01682; SSE41-NEXT: pand %xmm8, %xmm01683; SSE41-NEXT: movapd {{.*#+}} xmm8 = [65535,65535]1684; SSE41-NEXT: movapd %xmm8, %xmm101685; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm101686; SSE41-NEXT: movdqa %xmm3, %xmm41687; SSE41-NEXT: pxor %xmm9, %xmm41688; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm4[0,0,2,2]1689; SSE41-NEXT: pcmpeqd %xmm7, %xmm41690; SSE41-NEXT: movdqa %xmm6, %xmm01691; SSE41-NEXT: pcmpgtd %xmm11, %xmm01692; SSE41-NEXT: pand %xmm4, %xmm01693; SSE41-NEXT: movapd %xmm8, %xmm41694; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm41695; SSE41-NEXT: packusdw %xmm10, %xmm41696; SSE41-NEXT: movdqa %xmm2, %xmm31697; SSE41-NEXT: pxor %xmm9, %xmm31698; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm3[0,0,2,2]1699; SSE41-NEXT: pcmpeqd %xmm7, %xmm31700; SSE41-NEXT: movdqa %xmm6, %xmm01701; SSE41-NEXT: pcmpgtd %xmm10, %xmm01702; SSE41-NEXT: pand %xmm3, %xmm01703; SSE41-NEXT: movapd %xmm8, %xmm31704; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm31705; SSE41-NEXT: pxor %xmm1, %xmm91706; SSE41-NEXT: pcmpeqd %xmm9, %xmm71707; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]1708; SSE41-NEXT: pcmpgtd %xmm0, %xmm61709; SSE41-NEXT: pand %xmm7, %xmm61710; SSE41-NEXT: movdqa %xmm6, %xmm01711; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm81712; SSE41-NEXT: packusdw %xmm3, %xmm81713; SSE41-NEXT: packusdw %xmm4, %xmm81714; SSE41-NEXT: psubusw %xmm8, %xmm51715; SSE41-NEXT: movdqa %xmm5, %xmm01716; SSE41-NEXT: retq1717;1718; AVX1-LABEL: psubus_8i64_max:1719; AVX1: # %bb.0: # %vector.ph1720; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm31721; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]1722; AVX1-NEXT: # xmm4 = mem[0,0]1723; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm51724; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372036854841343,9223372036854841343]1725; AVX1-NEXT: # xmm6 = mem[0,0]1726; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm51727; AVX1-NEXT: vmovddup {{.*#+}} xmm7 = [65535,65535]1728; AVX1-NEXT: # xmm7 = mem[0,0]1729; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm7, %xmm31730; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm51731; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm51732; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm7, %xmm21733; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm21734; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31735; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm51736; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm51737; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm7, %xmm31738; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm41739; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm41740; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm7, %xmm11741; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm11742; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm11743; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm01744; AVX1-NEXT: vzeroupper1745; AVX1-NEXT: retq1746;1747; AVX2-LABEL: psubus_8i64_max:1748; AVX2: # %bb.0: # %vector.ph1749; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1750; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm41751; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]1752; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm41753; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [65535,65535,65535,65535]1754; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm21755; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm31756; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm31757; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm6, %ymm11758; AVX2-NEXT: vpackusdw %ymm2, %ymm1, %ymm11759; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm21760; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm11761; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]1762; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm01763; AVX2-NEXT: vzeroupper1764; AVX2-NEXT: retq1765;1766; AVX512-LABEL: psubus_8i64_max:1767; AVX512: # %bb.0: # %vector.ph1768; AVX512-NEXT: vpmovusqw %zmm1, %xmm11769; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm01770; AVX512-NEXT: vzeroupper1771; AVX512-NEXT: retq1772vector.ph:1773 %lhs = zext <8 x i16> %x to <8 x i64>1774 %cond = icmp ult <8 x i64> %lhs, %y1775 %max = select <8 x i1> %cond, <8 x i64> %y, <8 x i64> %lhs1776 %sub = sub <8 x i64> %max, %y1777 %res = trunc <8 x i64> %sub to <8 x i16>1778 ret <8 x i16> %res1779}1780 1781define <16 x i16> @psubus_16i32_max(<16 x i16> %x, <16 x i32> %y) nounwind {1782; SSE2-LABEL: psubus_16i32_max:1783; SSE2: # %bb.0: # %vector.ph1784; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]1785; SSE2-NEXT: movdqa %xmm3, %xmm81786; SSE2-NEXT: pxor %xmm7, %xmm81787; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183]1788; SSE2-NEXT: movdqa %xmm6, %xmm91789; SSE2-NEXT: pcmpgtd %xmm8, %xmm91790; SSE2-NEXT: pcmpeqd %xmm8, %xmm81791; SSE2-NEXT: pand %xmm9, %xmm31792; SSE2-NEXT: pxor %xmm8, %xmm91793; SSE2-NEXT: por %xmm3, %xmm91794; SSE2-NEXT: pslld $16, %xmm91795; SSE2-NEXT: psrad $16, %xmm91796; SSE2-NEXT: movdqa %xmm2, %xmm31797; SSE2-NEXT: pxor %xmm7, %xmm31798; SSE2-NEXT: movdqa %xmm6, %xmm101799; SSE2-NEXT: pcmpgtd %xmm3, %xmm101800; SSE2-NEXT: pand %xmm10, %xmm21801; SSE2-NEXT: pxor %xmm8, %xmm101802; SSE2-NEXT: por %xmm2, %xmm101803; SSE2-NEXT: pslld $16, %xmm101804; SSE2-NEXT: psrad $16, %xmm101805; SSE2-NEXT: packssdw %xmm9, %xmm101806; SSE2-NEXT: psubusw %xmm10, %xmm01807; SSE2-NEXT: movdqa %xmm5, %xmm21808; SSE2-NEXT: pxor %xmm7, %xmm21809; SSE2-NEXT: movdqa %xmm6, %xmm31810; SSE2-NEXT: pcmpgtd %xmm2, %xmm31811; SSE2-NEXT: pand %xmm3, %xmm51812; SSE2-NEXT: pxor %xmm8, %xmm31813; SSE2-NEXT: por %xmm5, %xmm31814; SSE2-NEXT: pslld $16, %xmm31815; SSE2-NEXT: psrad $16, %xmm31816; SSE2-NEXT: pxor %xmm4, %xmm71817; SSE2-NEXT: pcmpgtd %xmm7, %xmm61818; SSE2-NEXT: pxor %xmm6, %xmm81819; SSE2-NEXT: pand %xmm4, %xmm61820; SSE2-NEXT: por %xmm8, %xmm61821; SSE2-NEXT: pslld $16, %xmm61822; SSE2-NEXT: psrad $16, %xmm61823; SSE2-NEXT: packssdw %xmm3, %xmm61824; SSE2-NEXT: psubusw %xmm6, %xmm11825; SSE2-NEXT: retq1826;1827; SSSE3-LABEL: psubus_16i32_max:1828; SSSE3: # %bb.0: # %vector.ph1829; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]1830; SSSE3-NEXT: movdqa %xmm3, %xmm81831; SSSE3-NEXT: pxor %xmm7, %xmm81832; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183]1833; SSSE3-NEXT: movdqa %xmm6, %xmm91834; SSSE3-NEXT: pcmpgtd %xmm8, %xmm91835; SSSE3-NEXT: pcmpeqd %xmm8, %xmm81836; SSSE3-NEXT: pand %xmm9, %xmm31837; SSSE3-NEXT: pxor %xmm8, %xmm91838; SSSE3-NEXT: por %xmm3, %xmm91839; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1840; SSSE3-NEXT: pshufb %xmm3, %xmm91841; SSSE3-NEXT: movdqa %xmm2, %xmm101842; SSSE3-NEXT: pxor %xmm7, %xmm101843; SSSE3-NEXT: movdqa %xmm6, %xmm111844; SSSE3-NEXT: pcmpgtd %xmm10, %xmm111845; SSSE3-NEXT: pand %xmm11, %xmm21846; SSSE3-NEXT: pxor %xmm8, %xmm111847; SSSE3-NEXT: por %xmm2, %xmm111848; SSSE3-NEXT: pshufb %xmm3, %xmm111849; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm11 = xmm11[0],xmm9[0]1850; SSSE3-NEXT: psubusw %xmm11, %xmm01851; SSSE3-NEXT: movdqa %xmm5, %xmm21852; SSSE3-NEXT: pxor %xmm7, %xmm21853; SSSE3-NEXT: movdqa %xmm6, %xmm91854; SSSE3-NEXT: pcmpgtd %xmm2, %xmm91855; SSSE3-NEXT: pand %xmm9, %xmm51856; SSSE3-NEXT: pxor %xmm8, %xmm91857; SSSE3-NEXT: por %xmm5, %xmm91858; SSSE3-NEXT: pshufb %xmm3, %xmm91859; SSSE3-NEXT: pxor %xmm4, %xmm71860; SSSE3-NEXT: pcmpgtd %xmm7, %xmm61861; SSSE3-NEXT: pxor %xmm6, %xmm81862; SSSE3-NEXT: pand %xmm4, %xmm61863; SSSE3-NEXT: por %xmm8, %xmm61864; SSSE3-NEXT: pshufb %xmm3, %xmm61865; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm9[0]1866; SSSE3-NEXT: psubusw %xmm6, %xmm11867; SSSE3-NEXT: retq1868;1869; SSE41-LABEL: psubus_16i32_max:1870; SSE41: # %bb.0: # %vector.ph1871; SSE41-NEXT: pmovsxbw {{.*#+}} xmm6 = [65535,0,65535,0,65535,0,65535,0]1872; SSE41-NEXT: pminud %xmm6, %xmm31873; SSE41-NEXT: pminud %xmm6, %xmm21874; SSE41-NEXT: packusdw %xmm3, %xmm21875; SSE41-NEXT: psubusw %xmm2, %xmm01876; SSE41-NEXT: pminud %xmm6, %xmm51877; SSE41-NEXT: pminud %xmm6, %xmm41878; SSE41-NEXT: packusdw %xmm5, %xmm41879; SSE41-NEXT: psubusw %xmm4, %xmm11880; SSE41-NEXT: retq1881;1882; AVX1-LABEL: psubus_16i32_max:1883; AVX1: # %bb.0: # %vector.ph1884; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm31885; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [65535,65535,65535,65535]1886; AVX1-NEXT: vpminud %xmm4, %xmm3, %xmm31887; AVX1-NEXT: vpminud %xmm4, %xmm2, %xmm21888; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm21889; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31890; AVX1-NEXT: vpsubusw %xmm2, %xmm3, %xmm21891; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31892; AVX1-NEXT: vpminud %xmm4, %xmm3, %xmm31893; AVX1-NEXT: vpminud %xmm4, %xmm1, %xmm11894; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm11895; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm01896; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01897; AVX1-NEXT: retq1898;1899; AVX2-LABEL: psubus_16i32_max:1900; AVX2: # %bb.0: # %vector.ph1901; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [65535,65535,65535,65535,65535,65535,65535,65535]1902; AVX2-NEXT: vpminud %ymm3, %ymm2, %ymm21903; AVX2-NEXT: vpminud %ymm3, %ymm1, %ymm11904; AVX2-NEXT: vpackusdw %ymm2, %ymm1, %ymm11905; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]1906; AVX2-NEXT: vpsubusw %ymm1, %ymm0, %ymm01907; AVX2-NEXT: retq1908;1909; AVX512-LABEL: psubus_16i32_max:1910; AVX512: # %bb.0: # %vector.ph1911; AVX512-NEXT: vpmovusdw %zmm1, %ymm11912; AVX512-NEXT: vpsubusw %ymm1, %ymm0, %ymm01913; AVX512-NEXT: retq1914vector.ph:1915 %lhs = zext <16 x i16> %x to <16 x i32>1916 %cond = icmp ult <16 x i32> %lhs, %y1917 %max = select <16 x i1> %cond, <16 x i32> %y, <16 x i32> %lhs1918 %sub = sub <16 x i32> %max, %y1919 %res = trunc <16 x i32> %sub to <16 x i16>1920 ret <16 x i16> %res1921}1922 1923define <8 x i16> @psubus_i16_i32_max_swapped(<8 x i16> %x, <8 x i32> %y) nounwind {1924; SSE2-LABEL: psubus_i16_i32_max_swapped:1925; SSE2: # %bb.0: # %vector.ph1926; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1927; SSE2-NEXT: movdqa %xmm2, %xmm41928; SSE2-NEXT: pxor %xmm3, %xmm41929; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]1930; SSE2-NEXT: movdqa %xmm5, %xmm61931; SSE2-NEXT: pcmpgtd %xmm4, %xmm61932; SSE2-NEXT: pcmpeqd %xmm4, %xmm41933; SSE2-NEXT: pand %xmm6, %xmm21934; SSE2-NEXT: pxor %xmm4, %xmm61935; SSE2-NEXT: por %xmm2, %xmm61936; SSE2-NEXT: pslld $16, %xmm61937; SSE2-NEXT: psrad $16, %xmm61938; SSE2-NEXT: pxor %xmm1, %xmm31939; SSE2-NEXT: pcmpgtd %xmm3, %xmm51940; SSE2-NEXT: pxor %xmm5, %xmm41941; SSE2-NEXT: pand %xmm1, %xmm51942; SSE2-NEXT: por %xmm4, %xmm51943; SSE2-NEXT: pslld $16, %xmm51944; SSE2-NEXT: psrad $16, %xmm51945; SSE2-NEXT: packssdw %xmm6, %xmm51946; SSE2-NEXT: psubusw %xmm5, %xmm01947; SSE2-NEXT: retq1948;1949; SSSE3-LABEL: psubus_i16_i32_max_swapped:1950; SSSE3: # %bb.0: # %vector.ph1951; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1952; SSSE3-NEXT: movdqa %xmm2, %xmm41953; SSSE3-NEXT: pxor %xmm3, %xmm41954; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]1955; SSSE3-NEXT: movdqa %xmm5, %xmm61956; SSSE3-NEXT: pcmpgtd %xmm4, %xmm61957; SSSE3-NEXT: pcmpeqd %xmm4, %xmm41958; SSSE3-NEXT: pand %xmm6, %xmm21959; SSSE3-NEXT: pxor %xmm4, %xmm61960; SSSE3-NEXT: por %xmm2, %xmm61961; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1962; SSSE3-NEXT: pshufb %xmm2, %xmm61963; SSSE3-NEXT: pxor %xmm1, %xmm31964; SSSE3-NEXT: pcmpgtd %xmm3, %xmm51965; SSSE3-NEXT: pxor %xmm5, %xmm41966; SSSE3-NEXT: pand %xmm1, %xmm51967; SSSE3-NEXT: por %xmm4, %xmm51968; SSSE3-NEXT: pshufb %xmm2, %xmm51969; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]1970; SSSE3-NEXT: psubusw %xmm5, %xmm01971; SSSE3-NEXT: retq1972;1973; SSE41-LABEL: psubus_i16_i32_max_swapped:1974; SSE41: # %bb.0: # %vector.ph1975; SSE41-NEXT: pmovsxbw {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]1976; SSE41-NEXT: pminud %xmm3, %xmm21977; SSE41-NEXT: pminud %xmm3, %xmm11978; SSE41-NEXT: packusdw %xmm2, %xmm11979; SSE41-NEXT: psubusw %xmm1, %xmm01980; SSE41-NEXT: retq1981;1982; AVX1-LABEL: psubus_i16_i32_max_swapped:1983; AVX1: # %bb.0: # %vector.ph1984; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21985; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [65535,65535,65535,65535]1986; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm21987; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm11988; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm11989; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm01990; AVX1-NEXT: vzeroupper1991; AVX1-NEXT: retq1992;1993; AVX2-LABEL: psubus_i16_i32_max_swapped:1994; AVX2: # %bb.0: # %vector.ph1995; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]1996; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm11997; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm21998; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm11999; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm02000; AVX2-NEXT: vzeroupper2001; AVX2-NEXT: retq2002;2003; AVX512-LABEL: psubus_i16_i32_max_swapped:2004; AVX512: # %bb.0: # %vector.ph2005; AVX512-NEXT: vpmovusdw %ymm1, %xmm12006; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm02007; AVX512-NEXT: vzeroupper2008; AVX512-NEXT: retq2009vector.ph:2010 %lhs = zext <8 x i16> %x to <8 x i32>2011 %cond = icmp ult <8 x i32> %y, %lhs2012 %max = select <8 x i1> %cond, <8 x i32> %lhs, <8 x i32> %y2013 %sub = sub <8 x i32> %max, %y2014 %res = trunc <8 x i32> %sub to <8 x i16>2015 ret <8 x i16> %res2016}2017 2018define <8 x i16> @psubus_i16_i32_min(<8 x i16> %x, <8 x i32> %y) nounwind {2019; SSE2-LABEL: psubus_i16_i32_min:2020; SSE2: # %bb.0: # %vector.ph2021; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]2022; SSE2-NEXT: movdqa %xmm2, %xmm42023; SSE2-NEXT: pxor %xmm3, %xmm42024; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]2025; SSE2-NEXT: movdqa %xmm5, %xmm62026; SSE2-NEXT: pcmpgtd %xmm4, %xmm62027; SSE2-NEXT: pcmpeqd %xmm4, %xmm42028; SSE2-NEXT: pand %xmm6, %xmm22029; SSE2-NEXT: pxor %xmm4, %xmm62030; SSE2-NEXT: por %xmm2, %xmm62031; SSE2-NEXT: pslld $16, %xmm62032; SSE2-NEXT: psrad $16, %xmm62033; SSE2-NEXT: pxor %xmm1, %xmm32034; SSE2-NEXT: pcmpgtd %xmm3, %xmm52035; SSE2-NEXT: pxor %xmm5, %xmm42036; SSE2-NEXT: pand %xmm1, %xmm52037; SSE2-NEXT: por %xmm4, %xmm52038; SSE2-NEXT: pslld $16, %xmm52039; SSE2-NEXT: psrad $16, %xmm52040; SSE2-NEXT: packssdw %xmm6, %xmm52041; SSE2-NEXT: psubusw %xmm5, %xmm02042; SSE2-NEXT: retq2043;2044; SSSE3-LABEL: psubus_i16_i32_min:2045; SSSE3: # %bb.0: # %vector.ph2046; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]2047; SSSE3-NEXT: movdqa %xmm2, %xmm42048; SSSE3-NEXT: pxor %xmm3, %xmm42049; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]2050; SSSE3-NEXT: movdqa %xmm5, %xmm62051; SSSE3-NEXT: pcmpgtd %xmm4, %xmm62052; SSSE3-NEXT: pcmpeqd %xmm4, %xmm42053; SSSE3-NEXT: pand %xmm6, %xmm22054; SSSE3-NEXT: pxor %xmm4, %xmm62055; SSSE3-NEXT: por %xmm2, %xmm62056; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]2057; SSSE3-NEXT: pshufb %xmm2, %xmm62058; SSSE3-NEXT: pxor %xmm1, %xmm32059; SSSE3-NEXT: pcmpgtd %xmm3, %xmm52060; SSSE3-NEXT: pxor %xmm5, %xmm42061; SSSE3-NEXT: pand %xmm1, %xmm52062; SSSE3-NEXT: por %xmm4, %xmm52063; SSSE3-NEXT: pshufb %xmm2, %xmm52064; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]2065; SSSE3-NEXT: psubusw %xmm5, %xmm02066; SSSE3-NEXT: retq2067;2068; SSE41-LABEL: psubus_i16_i32_min:2069; SSE41: # %bb.0: # %vector.ph2070; SSE41-NEXT: pmovsxbw {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]2071; SSE41-NEXT: pminud %xmm3, %xmm22072; SSE41-NEXT: pminud %xmm3, %xmm12073; SSE41-NEXT: packusdw %xmm2, %xmm12074; SSE41-NEXT: psubusw %xmm1, %xmm02075; SSE41-NEXT: retq2076;2077; AVX1-LABEL: psubus_i16_i32_min:2078; AVX1: # %bb.0: # %vector.ph2079; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22080; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [65535,65535,65535,65535]2081; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm22082; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm12083; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm12084; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm02085; AVX1-NEXT: vzeroupper2086; AVX1-NEXT: retq2087;2088; AVX2-LABEL: psubus_i16_i32_min:2089; AVX2: # %bb.0: # %vector.ph2090; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]2091; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm12092; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22093; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm12094; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm02095; AVX2-NEXT: vzeroupper2096; AVX2-NEXT: retq2097;2098; AVX512-LABEL: psubus_i16_i32_min:2099; AVX512: # %bb.0: # %vector.ph2100; AVX512-NEXT: vpmovusdw %ymm1, %xmm12101; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm02102; AVX512-NEXT: vzeroupper2103; AVX512-NEXT: retq2104vector.ph:2105 %lhs = zext <8 x i16> %x to <8 x i32>2106 %cond = icmp ult <8 x i32> %lhs, %y2107 %min = select <8 x i1> %cond, <8 x i32> %lhs, <8 x i32> %y2108 %sub = sub <8 x i32> %lhs, %min2109 %res = trunc <8 x i32> %sub to <8 x i16>2110 ret <8 x i16> %res2111}2112 2113define void @subus_v8i8(ptr %p1, ptr %p2) {2114; SSE-LABEL: subus_v8i8:2115; SSE: # %bb.0:2116; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2117; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero2118; SSE-NEXT: psubusb %xmm1, %xmm02119; SSE-NEXT: movq %xmm0, (%rdi)2120; SSE-NEXT: retq2121;2122; AVX-LABEL: subus_v8i8:2123; AVX: # %bb.0:2124; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2125; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero2126; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm02127; AVX-NEXT: vmovq %xmm0, (%rdi)2128; AVX-NEXT: retq2129 %ld1 = load <8 x i8>, ptr %p1, align 82130 %ld2 = load <8 x i8>, ptr %p2, align 82131 %1 = sub <8 x i8> %ld1, %ld22132 %2 = icmp ugt <8 x i8> %ld1, %ld22133 %sh3 = select <8 x i1> %2, <8 x i8> %1, <8 x i8> zeroinitializer2134 store <8 x i8> %sh3, ptr %p1, align 82135 ret void2136}2137 2138define void @subus_v4i8(ptr %p1, ptr %p2) {2139; SSE-LABEL: subus_v4i8:2140; SSE: # %bb.0:2141; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2142; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero2143; SSE-NEXT: psubusb %xmm1, %xmm02144; SSE-NEXT: movd %xmm0, (%rdi)2145; SSE-NEXT: retq2146;2147; AVX-LABEL: subus_v4i8:2148; AVX: # %bb.0:2149; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2150; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero2151; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm02152; AVX-NEXT: vmovd %xmm0, (%rdi)2153; AVX-NEXT: retq2154 %ld1 = load <4 x i8>, ptr %p1, align 82155 %ld2 = load <4 x i8>, ptr %p2, align 82156 %1 = sub <4 x i8> %ld1, %ld22157 %2 = icmp ugt <4 x i8> %ld1, %ld22158 %sh3 = select <4 x i1> %2, <4 x i8> %1, <4 x i8> zeroinitializer2159 store <4 x i8> %sh3, ptr %p1, align 82160 ret void2161}2162 2163define void @subus_v2i8(ptr %p1, ptr %p2) {2164; SSE2OR3-LABEL: subus_v2i8:2165; SSE2OR3: # %bb.0:2166; SSE2OR3-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2167; SSE2OR3-NEXT: movq {{.*#+}} xmm1 = mem[0],zero2168; SSE2OR3-NEXT: psubusb %xmm1, %xmm02169; SSE2OR3-NEXT: movd %xmm0, %eax2170; SSE2OR3-NEXT: movw %ax, (%rdi)2171; SSE2OR3-NEXT: retq2172;2173; SSE41-LABEL: subus_v2i8:2174; SSE41: # %bb.0:2175; SSE41-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2176; SSE41-NEXT: movq {{.*#+}} xmm1 = mem[0],zero2177; SSE41-NEXT: psubusb %xmm1, %xmm02178; SSE41-NEXT: pextrw $0, %xmm0, (%rdi)2179; SSE41-NEXT: retq2180;2181; AVX-LABEL: subus_v2i8:2182; AVX: # %bb.0:2183; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2184; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero2185; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm02186; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)2187; AVX-NEXT: retq2188 %ld1 = load <2 x i8>, ptr %p1, align 82189 %ld2 = load <2 x i8>, ptr %p2, align 82190 %1 = sub <2 x i8> %ld1, %ld22191 %2 = icmp ugt <2 x i8> %ld1, %ld22192 %sh3 = select <2 x i1> %2, <2 x i8> %1, <2 x i8> zeroinitializer2193 store <2 x i8> %sh3, ptr %p1, align 82194 ret void2195}2196 2197define void @subus_v4i16(ptr %p1, ptr %p2) {2198; SSE-LABEL: subus_v4i16:2199; SSE: # %bb.0:2200; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2201; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero2202; SSE-NEXT: psubusw %xmm1, %xmm02203; SSE-NEXT: movq %xmm0, (%rdi)2204; SSE-NEXT: retq2205;2206; AVX-LABEL: subus_v4i16:2207; AVX: # %bb.0:2208; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2209; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero2210; AVX-NEXT: vpsubusw %xmm1, %xmm0, %xmm02211; AVX-NEXT: vmovq %xmm0, (%rdi)2212; AVX-NEXT: retq2213 %ld1 = load <4 x i16>, ptr %p1, align 82214 %ld2 = load <4 x i16>, ptr %p2, align 82215 %1 = sub <4 x i16> %ld1, %ld22216 %2 = icmp ugt <4 x i16> %ld1, %ld22217 %sh3 = select <4 x i1> %2, <4 x i16> %1, <4 x i16> zeroinitializer2218 store <4 x i16> %sh3, ptr %p1, align 82219 ret void2220}2221 2222define void @subus_v2i16(ptr %p1, ptr %p2) {2223; SSE-LABEL: subus_v2i16:2224; SSE: # %bb.0:2225; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero2226; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero2227; SSE-NEXT: psubusw %xmm1, %xmm02228; SSE-NEXT: movd %xmm0, (%rdi)2229; SSE-NEXT: retq2230;2231; AVX-LABEL: subus_v2i16:2232; AVX: # %bb.0:2233; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2234; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero2235; AVX-NEXT: vpsubusw %xmm1, %xmm0, %xmm02236; AVX-NEXT: vmovd %xmm0, (%rdi)2237; AVX-NEXT: retq2238 %ld1 = load <2 x i16>, ptr %p1, align 82239 %ld2 = load <2 x i16>, ptr %p2, align 82240 %1 = sub <2 x i16> %ld1, %ld22241 %2 = icmp ugt <2 x i16> %ld1, %ld22242 %sh3 = select <2 x i1> %2, <2 x i16> %1, <2 x i16> zeroinitializer2243 store <2 x i16> %sh3, ptr %p1, align 82244 ret void2245}2246 2247define <16 x i8> @test19(<16 x i8> %x) {2248; SSE-LABEL: test19:2249; SSE: # %bb.0: # %entry2250; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02251; SSE-NEXT: retq2252;2253; AVX-LABEL: test19:2254; AVX: # %bb.0: # %entry2255; AVX-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02256; AVX-NEXT: retq2257entry:2258 %0 = icmp ugt <16 x i8> %x, <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>2259 %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>2260 %2 = add <16 x i8> %1, <i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70>2261 ret <16 x i8> %22262}2263 2264define <16 x i8> @test20(<16 x i8> %x) {2265; SSE-LABEL: test20:2266; SSE: # %bb.0: # %entry2267; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02268; SSE-NEXT: retq2269;2270; AVX-LABEL: test20:2271; AVX: # %bb.0: # %entry2272; AVX-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02273; AVX-NEXT: retq2274entry:2275 %0 = icmp ugt <16 x i8> %x, <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70>2276 %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70>2277 %2 = add <16 x i8> %1, <i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70>2278 ret <16 x i8> %22279}2280 2281define <8 x i16> @test21(<8 x i16> %x) {2282; SSE-LABEL: test21:2283; SSE: # %bb.0: # %entry2284; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02285; SSE-NEXT: retq2286;2287; AVX-LABEL: test21:2288; AVX: # %bb.0: # %entry2289; AVX-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02290; AVX-NEXT: retq2291entry:2292 %0 = icmp ugt <8 x i16> %x, <i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700>2293 %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> <i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700>2294 %2 = add <8 x i16> %1, <i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700>2295 ret <8 x i16> %22296}2297 2298define <8 x i16> @test22(<8 x i16> %x) {2299; SSE-LABEL: test22:2300; SSE: # %bb.0: # %entry2301; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02302; SSE-NEXT: retq2303;2304; AVX-LABEL: test22:2305; AVX: # %bb.0: # %entry2306; AVX-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02307; AVX-NEXT: retq2308entry:2309 %0 = icmp ugt <8 x i16> %x, <i16 1, i16 -22000, i16 -770, i16 98, i16 19, i16 1000, i16 3456, i16 70>2310 %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> <i16 1, i16 -22000, i16 -770, i16 98, i16 19, i16 1000, i16 3456, i16 70>2311 %2 = add <8 x i16> %1, <i16 -1, i16 22000, i16 770, i16 -98, i16 -19, i16 -1000, i16 -3456, i16 -70>2312 ret <8 x i16> %22313}2314 2315define <32 x i8> @test23(<32 x i8> %x) {2316; SSE-LABEL: test23:2317; SSE: # %bb.0: # %entry2318; SSE-NEXT: movdqa {{.*#+}} xmm2 = [70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70]2319; SSE-NEXT: psubusb %xmm2, %xmm02320; SSE-NEXT: psubusb %xmm2, %xmm12321; SSE-NEXT: retq2322;2323; AVX1-LABEL: test23:2324; AVX1: # %bb.0: # %entry2325; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12326; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70]2327; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm12328; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm02329; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02330; AVX1-NEXT: retq2331;2332; AVX2-LABEL: test23:2333; AVX2: # %bb.0: # %entry2334; AVX2-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02335; AVX2-NEXT: retq2336;2337; AVX512-LABEL: test23:2338; AVX512: # %bb.0: # %entry2339; AVX512-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02340; AVX512-NEXT: retq2341entry:2342 %0 = icmp ugt <32 x i8> %x, <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>2343 %1 = select <32 x i1> %0, <32 x i8> %x, <32 x i8> <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>2344 %2 = add <32 x i8> %1, <i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70>2345 ret <32 x i8> %22346}2347 2348define <32 x i8> @test24(<32 x i8> %x) {2349; SSE-LABEL: test24:2350; SSE: # %bb.0: # %entry2351; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02352; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12353; SSE-NEXT: retq2354;2355; AVX1-LABEL: test24:2356; AVX1: # %bb.0: # %entry2357; AVX1-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12358; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02359; AVX1-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02360; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02361; AVX1-NEXT: retq2362;2363; AVX2-LABEL: test24:2364; AVX2: # %bb.0: # %entry2365; AVX2-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02366; AVX2-NEXT: retq2367;2368; AVX512-LABEL: test24:2369; AVX512: # %bb.0: # %entry2370; AVX512-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02371; AVX512-NEXT: retq2372entry:2373 %0 = icmp ugt <32 x i8> %x, <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>2374 %1 = select <32 x i1> %0, <32 x i8> %x, <32 x i8> <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>2375 %2 = add <32 x i8> %1, <i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70, i8 -2, i8 23, i8 49, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -110, i8 -25, i8 -34, i8 -55, i8 -70>2376 ret <32 x i8> %22377}2378 2379define <16 x i16> @test25(<16 x i16> %x) {2380; SSE-LABEL: test25:2381; SSE: # %bb.0: # %entry2382; SSE-NEXT: movdqa {{.*#+}} xmm2 = [5000,5000,5000,5000,5000,5000,5000,5000]2383; SSE-NEXT: psubusw %xmm2, %xmm02384; SSE-NEXT: psubusw %xmm2, %xmm12385; SSE-NEXT: retq2386;2387; AVX1-LABEL: test25:2388; AVX1: # %bb.0: # %entry2389; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12390; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [5000,5000,5000,5000,5000,5000,5000,5000]2391; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm12392; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm02393; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02394; AVX1-NEXT: retq2395;2396; AVX2-LABEL: test25:2397; AVX2: # %bb.0: # %entry2398; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02399; AVX2-NEXT: retq2400;2401; AVX512-LABEL: test25:2402; AVX512: # %bb.0: # %entry2403; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02404; AVX512-NEXT: retq2405entry:2406 %0 = icmp ugt <16 x i16> %x, <i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000>2407 %1 = select <16 x i1> %0, <16 x i16> %x, <16 x i16> <i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000>2408 %2 = add <16 x i16> %1, <i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000>2409 ret <16 x i16> %22410}2411 2412define <16 x i16> @test26(<16 x i16> %x) {2413; SSE-LABEL: test26:2414; SSE: # %bb.0: # %entry2415; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02416; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12417; SSE-NEXT: retq2418;2419; AVX1-LABEL: test26:2420; AVX1: # %bb.0: # %entry2421; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12422; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02423; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02424; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02425; AVX1-NEXT: retq2426;2427; AVX2-LABEL: test26:2428; AVX2: # %bb.0: # %entry2429; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02430; AVX2-NEXT: retq2431;2432; AVX512-LABEL: test26:2433; AVX512: # %bb.0: # %entry2434; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02435; AVX512-NEXT: retq2436entry:2437 %0 = icmp ugt <16 x i16> %x, <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70>2438 %1 = select <16 x i1> %0, <16 x i16> %x, <16 x i16> <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70>2439 %2 = add <16 x i16> %1, <i16 -1, i16 2200, i16 50, i16 114, i16 77, i16 70, i16 -123, i16 -9800, i16 -635, i16 -19567, i16 22, i16 -100, i16 -2534, i16 -34, i16 -55, i16 -70>2440 ret <16 x i16> %22441}2442 2443define <64 x i8> @test27(<64 x i8> %x) {2444; SSE-LABEL: test27:2445; SSE: # %bb.0: # %entry2446; SSE-NEXT: movdqa {{.*#+}} xmm4 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154]2447; SSE-NEXT: psubusb %xmm4, %xmm02448; SSE-NEXT: psubusb %xmm4, %xmm12449; SSE-NEXT: psubusb %xmm4, %xmm22450; SSE-NEXT: psubusb %xmm4, %xmm32451; SSE-NEXT: retq2452;2453; AVX1-LABEL: test27:2454; AVX1: # %bb.0: # %entry2455; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22456; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154]2457; AVX1-NEXT: vpsubusb %xmm3, %xmm2, %xmm22458; AVX1-NEXT: vpsubusb %xmm3, %xmm0, %xmm02459; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02460; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22461; AVX1-NEXT: vpsubusb %xmm3, %xmm2, %xmm22462; AVX1-NEXT: vpsubusb %xmm3, %xmm1, %xmm12463; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12464; AVX1-NEXT: retq2465;2466; AVX2-LABEL: test27:2467; AVX2: # %bb.0: # %entry2468; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154]2469; AVX2-NEXT: vpsubusb %ymm2, %ymm0, %ymm02470; AVX2-NEXT: vpsubusb %ymm2, %ymm1, %ymm12471; AVX2-NEXT: retq2472;2473; AVX512-LABEL: test27:2474; AVX512: # %bb.0: # %entry2475; AVX512-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm02476; AVX512-NEXT: retq2477entry:2478 %0 = icmp ugt <64 x i8> %x, <i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154>2479 %1 = select <64 x i1> %0, <64 x i8> %x, <64 x i8> <i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154>2480 %2 = add <64 x i8> %1, <i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154>2481 ret <64 x i8> %22482}2483 2484define <64 x i8> @test28(<64 x i8> %x) {2485; SSE-LABEL: test28:2486; SSE: # %bb.0: # %entry2487; SSE-NEXT: movdqa {{.*#+}} xmm4 = [1,234,206,142,179,186,123,98,63,19,234,100,25,34,55,70]2488; SSE-NEXT: psubusb %xmm4, %xmm02489; SSE-NEXT: psubusb %xmm4, %xmm22490; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12491; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32492; SSE-NEXT: retq2493;2494; AVX1-LABEL: test28:2495; AVX1: # %bb.0: # %entry2496; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,234,206,142,179,186,123,98,63,19,234,100,25,34,55,70]2497; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm32498; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02499; AVX1-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02500; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm02501; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm22502; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12503; AVX1-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12504; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm12505; AVX1-NEXT: retq2506;2507; AVX2-LABEL: test28:2508; AVX2: # %bb.0: # %entry2509; AVX2-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02510; AVX2-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12511; AVX2-NEXT: retq2512;2513; AVX512-LABEL: test28:2514; AVX512: # %bb.0: # %entry2515; AVX512-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm02516; AVX512-NEXT: retq2517entry:2518 %0 = icmp ugt <64 x i8> %x, <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70, i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -116, i8 -77, i8 -70, i8 123, i8 98, i8 67, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>2519 %1 = select <64 x i1> %0, <64 x i8> %x, <64 x i8> <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70, i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -116, i8 -77, i8 -70, i8 123, i8 98, i8 67, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>2520 %2 = add <64 x i8> %1, <i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70, i8 -2, i8 23, i8 49, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -110, i8 -25, i8 -34, i8 -55, i8 -70, i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70, i8 -2, i8 23, i8 49, i8 116, i8 77, i8 70, i8 -123, i8 -98, i8 -67, i8 -19, i8 22, i8 -110, i8 -25, i8 -34, i8 -55, i8 -70>2521 ret <64 x i8> %22522}2523 2524define <32 x i16> @test29(<32 x i16> %x) {2525; SSE-LABEL: test29:2526; SSE: # %bb.0: # %entry2527; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02528; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12529; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm22530; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32531; SSE-NEXT: retq2532;2533; AVX1-LABEL: test29:2534; AVX1: # %bb.0: # %entry2535; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm22536; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02537; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02538; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm02539; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm22540; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12541; AVX1-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12542; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm12543; AVX1-NEXT: retq2544;2545; AVX2-LABEL: test29:2546; AVX2: # %bb.0: # %entry2547; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02548; AVX2-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12549; AVX2-NEXT: retq2550;2551; AVX512-LABEL: test29:2552; AVX512: # %bb.0: # %entry2553; AVX512-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm02554; AVX512-NEXT: retq2555entry:2556 %0 = icmp ugt <32 x i16> %x, <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70, i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9805, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 346, i16 55, i16 70>2557 %1 = select <32 x i1> %0, <32 x i16> %x, <32 x i16> <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70, i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9805, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 346, i16 55, i16 70>2558 %2 = add <32 x i16> %1, <i16 -1, i16 2200, i16 50, i16 114, i16 77, i16 70, i16 -123, i16 -9800, i16 -635, i16 -19567, i16 22, i16 -100, i16 -2534, i16 -34, i16 -55, i16 -70, i16 -1, i16 2200, i16 50, i16 114, i16 77, i16 70, i16 -123, i16 -9805, i16 -635, i16 -19567, i16 22, i16 -100, i16 -2534, i16 -346, i16 -55, i16 -70>2559 ret <32 x i16> %22560}2561 2562; PR400832563define i64 @test30(<8 x i16> %x) {2564; SSE-LABEL: test30:2565; SSE: # %bb.0: # %entry2566; SSE-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02567; SSE-NEXT: movq %xmm0, %rax2568; SSE-NEXT: retq2569;2570; AVX-LABEL: test30:2571; AVX: # %bb.0: # %entry2572; AVX-NEXT: vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02573; AVX-NEXT: vmovq %xmm0, %rax2574; AVX-NEXT: retq2575entry:2576 %0 = icmp ugt <8 x i16> %x, <i16 1, i16 -2200, i16 -50, i16 -114, i16 undef, i16 undef, i16 undef, i16 undef>2577 %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> <i16 1, i16 -2200, i16 -50, i16 -114, i16 undef, i16 undef, i16 undef, i16 undef>2578 %2 = add <8 x i16> %1, <i16 -1, i16 2200, i16 50, i16 114, i16 undef, i16 undef, i16 undef, i16 undef>2579 %3 = bitcast <8 x i16> %2 to <2 x i64>2580 %4 = extractelement <2 x i64> %3, i32 02581 ret i64 %42582}2583 2584; PR400832585define i64 @test31(<2 x i64> %x) {2586; SSE-LABEL: test31:2587; SSE: # %bb.0:2588; SSE-NEXT: psubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02589; SSE-NEXT: movq %xmm0, %rax2590; SSE-NEXT: retq2591;2592; AVX-LABEL: test31:2593; AVX: # %bb.0:2594; AVX-NEXT: vpsubusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02595; AVX-NEXT: vmovq %xmm0, %rax2596; AVX-NEXT: retq2597 %t0 = bitcast <2 x i64> %x to <16 x i8>2598 %cmp = icmp ugt <16 x i8> %t0, <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>2599 %bop = add <16 x i8> %t0, <i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>2600 %sel = select <16 x i1> %cmp, <16 x i8> %bop, <16 x i8> zeroinitializer2601 %bc = bitcast <16 x i8> %sel to <2 x i64>2602 %ext = extractelement <2 x i64> %bc, i32 02603 ret i64 %ext2604}2605 2606; v8i16/v8i32 - sub(x,trunc(umin(zext(x),y)))2607define <8 x i16> @test32(<8 x i16> %a0, <8 x i32> %a1) {2608; SSE2-LABEL: test32:2609; SSE2: # %bb.0:2610; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]2611; SSE2-NEXT: movdqa %xmm2, %xmm42612; SSE2-NEXT: pxor %xmm3, %xmm42613; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]2614; SSE2-NEXT: movdqa %xmm5, %xmm62615; SSE2-NEXT: pcmpgtd %xmm4, %xmm62616; SSE2-NEXT: pcmpeqd %xmm4, %xmm42617; SSE2-NEXT: pand %xmm6, %xmm22618; SSE2-NEXT: pxor %xmm4, %xmm62619; SSE2-NEXT: por %xmm2, %xmm62620; SSE2-NEXT: pslld $16, %xmm62621; SSE2-NEXT: psrad $16, %xmm62622; SSE2-NEXT: pxor %xmm1, %xmm32623; SSE2-NEXT: pcmpgtd %xmm3, %xmm52624; SSE2-NEXT: pxor %xmm5, %xmm42625; SSE2-NEXT: pand %xmm1, %xmm52626; SSE2-NEXT: por %xmm4, %xmm52627; SSE2-NEXT: pslld $16, %xmm52628; SSE2-NEXT: psrad $16, %xmm52629; SSE2-NEXT: packssdw %xmm6, %xmm52630; SSE2-NEXT: psubusw %xmm5, %xmm02631; SSE2-NEXT: retq2632;2633; SSSE3-LABEL: test32:2634; SSSE3: # %bb.0:2635; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]2636; SSSE3-NEXT: movdqa %xmm2, %xmm42637; SSSE3-NEXT: pxor %xmm3, %xmm42638; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]2639; SSSE3-NEXT: movdqa %xmm5, %xmm62640; SSSE3-NEXT: pcmpgtd %xmm4, %xmm62641; SSSE3-NEXT: pcmpeqd %xmm4, %xmm42642; SSSE3-NEXT: pand %xmm6, %xmm22643; SSSE3-NEXT: pxor %xmm4, %xmm62644; SSSE3-NEXT: por %xmm2, %xmm62645; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]2646; SSSE3-NEXT: pshufb %xmm2, %xmm62647; SSSE3-NEXT: pxor %xmm1, %xmm32648; SSSE3-NEXT: pcmpgtd %xmm3, %xmm52649; SSSE3-NEXT: pxor %xmm5, %xmm42650; SSSE3-NEXT: pand %xmm1, %xmm52651; SSSE3-NEXT: por %xmm4, %xmm52652; SSSE3-NEXT: pshufb %xmm2, %xmm52653; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]2654; SSSE3-NEXT: psubusw %xmm5, %xmm02655; SSSE3-NEXT: retq2656;2657; SSE41-LABEL: test32:2658; SSE41: # %bb.0:2659; SSE41-NEXT: pmovsxbw {{.*#+}} xmm3 = [65535,0,65535,0,65535,0,65535,0]2660; SSE41-NEXT: pminud %xmm3, %xmm22661; SSE41-NEXT: pminud %xmm3, %xmm12662; SSE41-NEXT: packusdw %xmm2, %xmm12663; SSE41-NEXT: psubusw %xmm1, %xmm02664; SSE41-NEXT: retq2665;2666; AVX1-LABEL: test32:2667; AVX1: # %bb.0:2668; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22669; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [65535,65535,65535,65535]2670; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm22671; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm12672; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm12673; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm02674; AVX1-NEXT: vzeroupper2675; AVX1-NEXT: retq2676;2677; AVX2-LABEL: test32:2678; AVX2: # %bb.0:2679; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]2680; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm12681; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22682; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm12683; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm02684; AVX2-NEXT: vzeroupper2685; AVX2-NEXT: retq2686;2687; AVX512-LABEL: test32:2688; AVX512: # %bb.0:2689; AVX512-NEXT: vpmovusdw %ymm1, %xmm12690; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm02691; AVX512-NEXT: vzeroupper2692; AVX512-NEXT: retq2693 %zext = zext <8 x i16> %a0 to <8 x i32>2694 %icmp = icmp ult <8 x i32> %zext, %a12695 %umin = select <8 x i1> %icmp, <8 x i32> %zext, <8 x i32> %a12696 %trunc = trunc <8 x i32> %umin to <8 x i16>2697 %sub = sub <8 x i16> %a0, %trunc2698 ret <8 x i16> %sub2699}2700 2701; v8i32/v8i64 - sub(x,trunc(umin(y,zext(x))))2702define <8 x i32> @test33(<8 x i32> %a0, <8 x i64> %a1) {2703; SSE2OR3-LABEL: test33:2704; SSE2OR3: # %bb.0:2705; SSE2OR3-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]2706; SSE2OR3-NEXT: movdqa %xmm3, %xmm82707; SSE2OR3-NEXT: pxor %xmm6, %xmm82708; SSE2OR3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]2709; SSE2OR3-NEXT: movdqa {{.*#+}} xmm7 = [2147483647,2147483647,2147483647,2147483647]2710; SSE2OR3-NEXT: movdqa %xmm7, %xmm102711; SSE2OR3-NEXT: pcmpgtd %xmm9, %xmm102712; SSE2OR3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]2713; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm92714; SSE2OR3-NEXT: pand %xmm10, %xmm92715; SSE2OR3-NEXT: pcmpeqd %xmm8, %xmm82716; SSE2OR3-NEXT: pand %xmm9, %xmm32717; SSE2OR3-NEXT: pxor %xmm8, %xmm92718; SSE2OR3-NEXT: por %xmm3, %xmm92719; SSE2OR3-NEXT: movdqa %xmm2, %xmm32720; SSE2OR3-NEXT: pxor %xmm6, %xmm32721; SSE2OR3-NEXT: pshufd {{.*#+}} xmm10 = xmm3[0,0,2,2]2722; SSE2OR3-NEXT: movdqa %xmm7, %xmm112723; SSE2OR3-NEXT: pcmpgtd %xmm10, %xmm112724; SSE2OR3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2725; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm32726; SSE2OR3-NEXT: pand %xmm11, %xmm32727; SSE2OR3-NEXT: pand %xmm3, %xmm22728; SSE2OR3-NEXT: pxor %xmm8, %xmm32729; SSE2OR3-NEXT: por %xmm2, %xmm32730; SSE2OR3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm9[0,2]2731; SSE2OR3-NEXT: movdqa %xmm0, %xmm22732; SSE2OR3-NEXT: psubd %xmm3, %xmm22733; SSE2OR3-NEXT: pxor %xmm6, %xmm32734; SSE2OR3-NEXT: pxor %xmm6, %xmm02735; SSE2OR3-NEXT: pcmpgtd %xmm3, %xmm02736; SSE2OR3-NEXT: pand %xmm2, %xmm02737; SSE2OR3-NEXT: movdqa %xmm5, %xmm22738; SSE2OR3-NEXT: pxor %xmm6, %xmm22739; SSE2OR3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]2740; SSE2OR3-NEXT: movdqa %xmm7, %xmm92741; SSE2OR3-NEXT: pcmpgtd %xmm3, %xmm92742; SSE2OR3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]2743; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm22744; SSE2OR3-NEXT: pand %xmm9, %xmm22745; SSE2OR3-NEXT: pand %xmm2, %xmm52746; SSE2OR3-NEXT: pxor %xmm8, %xmm22747; SSE2OR3-NEXT: por %xmm5, %xmm22748; SSE2OR3-NEXT: movdqa %xmm4, %xmm32749; SSE2OR3-NEXT: pxor %xmm6, %xmm32750; SSE2OR3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]2751; SSE2OR3-NEXT: pcmpgtd %xmm5, %xmm72752; SSE2OR3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2753; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm32754; SSE2OR3-NEXT: pand %xmm7, %xmm32755; SSE2OR3-NEXT: pxor %xmm3, %xmm82756; SSE2OR3-NEXT: pand %xmm4, %xmm32757; SSE2OR3-NEXT: por %xmm8, %xmm32758; SSE2OR3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm2[0,2]2759; SSE2OR3-NEXT: movdqa %xmm1, %xmm22760; SSE2OR3-NEXT: psubd %xmm3, %xmm22761; SSE2OR3-NEXT: pxor %xmm6, %xmm32762; SSE2OR3-NEXT: pxor %xmm6, %xmm12763; SSE2OR3-NEXT: pcmpgtd %xmm3, %xmm12764; SSE2OR3-NEXT: pand %xmm2, %xmm12765; SSE2OR3-NEXT: retq2766;2767; SSE41-LABEL: test33:2768; SSE41: # %bb.0:2769; SSE41-NEXT: movdqa %xmm0, %xmm72770; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456]2771; SSE41-NEXT: movdqa %xmm3, %xmm92772; SSE41-NEXT: pxor %xmm10, %xmm92773; SSE41-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259455,9223372039002259455]2774; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm9[0,0,2,2]2775; SSE41-NEXT: pcmpeqd %xmm8, %xmm92776; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647,2147483647,2147483647]2777; SSE41-NEXT: movdqa %xmm6, %xmm02778; SSE41-NEXT: pcmpgtd %xmm11, %xmm02779; SSE41-NEXT: pand %xmm9, %xmm02780; SSE41-NEXT: movapd {{.*#+}} xmm9 = [4294967295,4294967295]2781; SSE41-NEXT: movapd %xmm9, %xmm112782; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm112783; SSE41-NEXT: movdqa %xmm2, %xmm32784; SSE41-NEXT: pxor %xmm10, %xmm32785; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm3[0,0,2,2]2786; SSE41-NEXT: pcmpeqd %xmm8, %xmm32787; SSE41-NEXT: movdqa %xmm6, %xmm02788; SSE41-NEXT: pcmpgtd %xmm12, %xmm02789; SSE41-NEXT: pand %xmm3, %xmm02790; SSE41-NEXT: movapd %xmm9, %xmm32791; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm32792; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm11[0,2]2793; SSE41-NEXT: pmaxud %xmm3, %xmm72794; SSE41-NEXT: psubd %xmm3, %xmm72795; SSE41-NEXT: movdqa %xmm5, %xmm22796; SSE41-NEXT: pxor %xmm10, %xmm22797; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]2798; SSE41-NEXT: pcmpeqd %xmm8, %xmm22799; SSE41-NEXT: movdqa %xmm6, %xmm02800; SSE41-NEXT: pcmpgtd %xmm3, %xmm02801; SSE41-NEXT: pand %xmm2, %xmm02802; SSE41-NEXT: movapd %xmm9, %xmm22803; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm22804; SSE41-NEXT: pxor %xmm4, %xmm102805; SSE41-NEXT: pcmpeqd %xmm10, %xmm82806; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]2807; SSE41-NEXT: pcmpgtd %xmm0, %xmm62808; SSE41-NEXT: pand %xmm8, %xmm62809; SSE41-NEXT: movdqa %xmm6, %xmm02810; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm92811; SSE41-NEXT: shufps {{.*#+}} xmm9 = xmm9[0,2],xmm2[0,2]2812; SSE41-NEXT: pmaxud %xmm9, %xmm12813; SSE41-NEXT: psubd %xmm9, %xmm12814; SSE41-NEXT: movdqa %xmm7, %xmm02815; SSE41-NEXT: retq2816;2817; AVX1-LABEL: test33:2818; AVX1: # %bb.0:2819; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm32820; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]2821; AVX1-NEXT: # xmm4 = mem[0,0]2822; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm52823; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372041149743103,9223372041149743103]2824; AVX1-NEXT: # xmm6 = mem[0,0]2825; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm52826; AVX1-NEXT: vmovddup {{.*#+}} xmm7 = [4294967295,4294967295]2827; AVX1-NEXT: # xmm7 = mem[0,0]2828; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm7, %xmm32829; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm52830; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm52831; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm7, %xmm22832; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]2833; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32834; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm32835; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm22836; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32837; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm52838; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm52839; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm7, %xmm32840; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm42841; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm42842; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm7, %xmm12843; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]2844; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm02845; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm02846; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02847; AVX1-NEXT: retq2848;2849; AVX2-LABEL: test33:2850; AVX2: # %bb.0:2851; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]2852; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm42853; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]2854; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm42855; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [4294967295,4294967295,4294967295,4294967295]2856; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm22857; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm32858; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm32859; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm6, %ymm12860; AVX2-NEXT: vshufps {{.*#+}} ymm1 = ymm1[0,2],ymm2[0,2],ymm1[4,6],ymm2[4,6]2861; AVX2-NEXT: vpermpd {{.*#+}} ymm1 = ymm1[0,2,1,3]2862; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm02863; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm02864; AVX2-NEXT: retq2865;2866; AVX512-LABEL: test33:2867; AVX512: # %bb.0:2868; AVX512-NEXT: vpmovusqd %zmm1, %ymm12869; AVX512-NEXT: vpmaxud %ymm1, %ymm0, %ymm02870; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm02871; AVX512-NEXT: retq2872 %zext = zext <8 x i32> %a0 to <8 x i64>2873 %icmp = icmp ult <8 x i64> %a1, %zext2874 %umin = select <8 x i1> %icmp, <8 x i64> %a1, <8 x i64> %zext2875 %trunc = trunc <8 x i64> %umin to <8 x i32>2876 %sub = sub <8 x i32> %a0, %trunc2877 ret <8 x i32> %sub2878}2879 2880; v8i32/v8i64 - sub(x,trunc(umin(zext(and(x,1)),y)))2881define <8 x i32> @test34(<8 x i32> %a0, <8 x i64> %a1) {2882; SSE2OR3-LABEL: test34:2883; SSE2OR3: # %bb.0:2884; SSE2OR3-NEXT: movdqa {{.*#+}} xmm6 = [1,1,1,1]2885; SSE2OR3-NEXT: pand %xmm6, %xmm12886; SSE2OR3-NEXT: pand %xmm6, %xmm02887; SSE2OR3-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]2888; SSE2OR3-NEXT: movdqa %xmm3, %xmm82889; SSE2OR3-NEXT: pxor %xmm6, %xmm82890; SSE2OR3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]2891; SSE2OR3-NEXT: movdqa {{.*#+}} xmm7 = [2147483647,2147483647,2147483647,2147483647]2892; SSE2OR3-NEXT: movdqa %xmm7, %xmm102893; SSE2OR3-NEXT: pcmpgtd %xmm9, %xmm102894; SSE2OR3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]2895; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm92896; SSE2OR3-NEXT: pand %xmm10, %xmm92897; SSE2OR3-NEXT: pcmpeqd %xmm8, %xmm82898; SSE2OR3-NEXT: pand %xmm9, %xmm32899; SSE2OR3-NEXT: pxor %xmm8, %xmm92900; SSE2OR3-NEXT: por %xmm3, %xmm92901; SSE2OR3-NEXT: movdqa %xmm2, %xmm32902; SSE2OR3-NEXT: pxor %xmm6, %xmm32903; SSE2OR3-NEXT: pshufd {{.*#+}} xmm10 = xmm3[0,0,2,2]2904; SSE2OR3-NEXT: movdqa %xmm7, %xmm112905; SSE2OR3-NEXT: pcmpgtd %xmm10, %xmm112906; SSE2OR3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2907; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm32908; SSE2OR3-NEXT: pand %xmm11, %xmm32909; SSE2OR3-NEXT: pand %xmm3, %xmm22910; SSE2OR3-NEXT: pxor %xmm8, %xmm32911; SSE2OR3-NEXT: por %xmm2, %xmm32912; SSE2OR3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm9[0,2]2913; SSE2OR3-NEXT: movdqa %xmm0, %xmm22914; SSE2OR3-NEXT: psubd %xmm3, %xmm22915; SSE2OR3-NEXT: pxor %xmm6, %xmm32916; SSE2OR3-NEXT: por %xmm6, %xmm02917; SSE2OR3-NEXT: pcmpgtd %xmm3, %xmm02918; SSE2OR3-NEXT: pand %xmm2, %xmm02919; SSE2OR3-NEXT: movdqa %xmm5, %xmm22920; SSE2OR3-NEXT: pxor %xmm6, %xmm22921; SSE2OR3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]2922; SSE2OR3-NEXT: movdqa %xmm7, %xmm92923; SSE2OR3-NEXT: pcmpgtd %xmm3, %xmm92924; SSE2OR3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]2925; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm22926; SSE2OR3-NEXT: pand %xmm9, %xmm22927; SSE2OR3-NEXT: pand %xmm2, %xmm52928; SSE2OR3-NEXT: pxor %xmm8, %xmm22929; SSE2OR3-NEXT: por %xmm5, %xmm22930; SSE2OR3-NEXT: movdqa %xmm4, %xmm32931; SSE2OR3-NEXT: pxor %xmm6, %xmm32932; SSE2OR3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]2933; SSE2OR3-NEXT: pcmpgtd %xmm5, %xmm72934; SSE2OR3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2935; SSE2OR3-NEXT: pcmpeqd %xmm6, %xmm32936; SSE2OR3-NEXT: pand %xmm7, %xmm32937; SSE2OR3-NEXT: pxor %xmm3, %xmm82938; SSE2OR3-NEXT: pand %xmm4, %xmm32939; SSE2OR3-NEXT: por %xmm8, %xmm32940; SSE2OR3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm2[0,2]2941; SSE2OR3-NEXT: movdqa %xmm1, %xmm22942; SSE2OR3-NEXT: psubd %xmm3, %xmm22943; SSE2OR3-NEXT: pxor %xmm6, %xmm32944; SSE2OR3-NEXT: por %xmm6, %xmm12945; SSE2OR3-NEXT: pcmpgtd %xmm3, %xmm12946; SSE2OR3-NEXT: pand %xmm2, %xmm12947; SSE2OR3-NEXT: retq2948;2949; SSE41-LABEL: test34:2950; SSE41: # %bb.0:2951; SSE41-NEXT: movdqa %xmm0, %xmm62952; SSE41-NEXT: pmovsxbd {{.*#+}} xmm0 = [1,1,1,1]2953; SSE41-NEXT: pand %xmm0, %xmm12954; SSE41-NEXT: pand %xmm0, %xmm62955; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456]2956; SSE41-NEXT: movdqa %xmm3, %xmm92957; SSE41-NEXT: pxor %xmm10, %xmm92958; SSE41-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259455,9223372039002259455]2959; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm9[0,0,2,2]2960; SSE41-NEXT: pcmpeqd %xmm8, %xmm92961; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [2147483647,2147483647,2147483647,2147483647]2962; SSE41-NEXT: movdqa %xmm7, %xmm02963; SSE41-NEXT: pcmpgtd %xmm11, %xmm02964; SSE41-NEXT: pand %xmm9, %xmm02965; SSE41-NEXT: movapd {{.*#+}} xmm9 = [4294967295,4294967295]2966; SSE41-NEXT: movapd %xmm9, %xmm112967; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm112968; SSE41-NEXT: movdqa %xmm2, %xmm32969; SSE41-NEXT: pxor %xmm10, %xmm32970; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm3[0,0,2,2]2971; SSE41-NEXT: pcmpeqd %xmm8, %xmm32972; SSE41-NEXT: movdqa %xmm7, %xmm02973; SSE41-NEXT: pcmpgtd %xmm12, %xmm02974; SSE41-NEXT: pand %xmm3, %xmm02975; SSE41-NEXT: movapd %xmm9, %xmm32976; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm32977; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm11[0,2]2978; SSE41-NEXT: pmaxud %xmm3, %xmm62979; SSE41-NEXT: psubd %xmm3, %xmm62980; SSE41-NEXT: movdqa %xmm5, %xmm22981; SSE41-NEXT: pxor %xmm10, %xmm22982; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]2983; SSE41-NEXT: pcmpeqd %xmm8, %xmm22984; SSE41-NEXT: movdqa %xmm7, %xmm02985; SSE41-NEXT: pcmpgtd %xmm3, %xmm02986; SSE41-NEXT: pand %xmm2, %xmm02987; SSE41-NEXT: movapd %xmm9, %xmm22988; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm22989; SSE41-NEXT: pxor %xmm4, %xmm102990; SSE41-NEXT: pcmpeqd %xmm10, %xmm82991; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]2992; SSE41-NEXT: pcmpgtd %xmm0, %xmm72993; SSE41-NEXT: pand %xmm8, %xmm72994; SSE41-NEXT: movdqa %xmm7, %xmm02995; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm92996; SSE41-NEXT: shufps {{.*#+}} xmm9 = xmm9[0,2],xmm2[0,2]2997; SSE41-NEXT: pmaxud %xmm9, %xmm12998; SSE41-NEXT: psubd %xmm9, %xmm12999; SSE41-NEXT: movdqa %xmm6, %xmm03000; SSE41-NEXT: retq3001;3002; AVX1-LABEL: test34:3003; AVX1: # %bb.0:3004; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03005; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm33006; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]3007; AVX1-NEXT: # xmm4 = mem[0,0]3008; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm53009; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372041149743103,9223372041149743103]3010; AVX1-NEXT: # xmm6 = mem[0,0]3011; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm53012; AVX1-NEXT: vmovddup {{.*#+}} xmm7 = [4294967295,4294967295]3013; AVX1-NEXT: # xmm7 = mem[0,0]3014; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm7, %xmm33015; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm53016; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm53017; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm7, %xmm23018; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]3019; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm33020; AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm33021; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm23022; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm33023; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm53024; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm53025; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm7, %xmm33026; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm43027; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm43028; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm7, %xmm13029; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]3030; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm03031; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm03032; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm03033; AVX1-NEXT: retq3034;3035; AVX2-LABEL: test34:3036; AVX2: # %bb.0:3037; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [1,1,1,1,1,1,1,1]3038; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm03039; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]3040; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm43041; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]3042; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm43043; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [4294967295,4294967295,4294967295,4294967295]3044; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm23045; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm33046; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm33047; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm6, %ymm13048; AVX2-NEXT: vshufps {{.*#+}} ymm1 = ymm1[0,2],ymm2[0,2],ymm1[4,6],ymm2[4,6]3049; AVX2-NEXT: vpermpd {{.*#+}} ymm1 = ymm1[0,2,1,3]3050; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm03051; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm03052; AVX2-NEXT: retq3053;3054; AVX512-LABEL: test34:3055; AVX512: # %bb.0:3056; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm03057; AVX512-NEXT: vpmovusqd %zmm1, %ymm13058; AVX512-NEXT: vpmaxud %ymm1, %ymm0, %ymm03059; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm03060; AVX512-NEXT: retq3061 %mask = and <8 x i32> %a0, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>3062 %zext = zext <8 x i32> %mask to <8 x i64>3063 %icmp = icmp ult <8 x i64> %zext, %a13064 %umin = select <8 x i1> %icmp, <8 x i64> %zext, <8 x i64> %a13065 %trunc = trunc <8 x i64> %umin to <8 x i32>3066 %sub = sub <8 x i32> %mask, %trunc3067 ret <8 x i32> %sub3068}3069