1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512 9 10define <8 x i16> @test1(<8 x i16> %x) nounwind { 11; SSE-LABEL: test1: 12; SSE: # %bb.0: # %vector.ph 13; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 14; SSE-NEXT: retq 15; 16; AVX-LABEL: test1: 17; AVX: # %bb.0: # %vector.ph 18; AVX-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 19; AVX-NEXT: retq 20vector.ph: 21 %0 = icmp slt <8 x i16> %x, zeroinitializer 22 %1 = xor <8 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768> 23 %res = select <8 x i1> %0, <8 x i16> %1, <8 x i16> zeroinitializer 24 ret <8 x i16> %res 25} 26 27define <8 x i16> @test2(<8 x i16> %x) nounwind { 28; SSE-LABEL: test2: 29; SSE: # %bb.0: # %vector.ph 30; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 31; SSE-NEXT: retq 32; 33; AVX-LABEL: test2: 34; AVX: # %bb.0: # %vector.ph 35; AVX-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 36; AVX-NEXT: retq 37vector.ph: 38 %0 = icmp ugt <8 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766> 39 %1 = add <8 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767> 40 %res = select <8 x i1> %0, <8 x i16> %1, <8 x i16> zeroinitializer 41 ret <8 x i16> %res 42} 43 44define <8 x i16> @test3(<8 x i16> %x, i16 zeroext %w) nounwind { 45; SSE-LABEL: test3: 46; SSE: # %bb.0: # %vector.ph 47; SSE-NEXT: movd %edi, %xmm1 48; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7] 49; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0] 50; SSE-NEXT: psubusw %xmm1, %xmm0 51; SSE-NEXT: retq 52; 53; AVX1-LABEL: test3: 54; AVX1: # %bb.0: # %vector.ph 55; AVX1-NEXT: vmovd %edi, %xmm1 56; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7] 57; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0] 58; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 59; AVX1-NEXT: retq 60; 61; AVX2-LABEL: test3: 62; AVX2: # %bb.0: # %vector.ph 63; AVX2-NEXT: vmovd %edi, %xmm1 64; AVX2-NEXT: vpbroadcastw %xmm1, %xmm1 65; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 66; AVX2-NEXT: retq 67; 68; AVX512-LABEL: test3: 69; AVX512: # %bb.0: # %vector.ph 70; AVX512-NEXT: vpbroadcastw %edi, %xmm1 71; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 72; AVX512-NEXT: retq 73vector.ph: 74 %0 = insertelement <8 x i16> undef, i16 %w, i32 0 75 %broadcast15 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer 76 %1 = icmp ult <8 x i16> %x, %broadcast15 77 %2 = sub <8 x i16> %x, %broadcast15 78 %res = select <8 x i1> %1, <8 x i16> zeroinitializer, <8 x i16> %2 79 ret <8 x i16> %res 80} 81 82define <16 x i8> @test4(<16 x i8> %x) nounwind { 83; SSE-LABEL: test4: 84; SSE: # %bb.0: # %vector.ph 85; SSE-NEXT: psubusb {{.*}}(%rip), %xmm0 86; SSE-NEXT: retq 87; 88; AVX-LABEL: test4: 89; AVX: # %bb.0: # %vector.ph 90; AVX-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 91; AVX-NEXT: retq 92vector.ph: 93 %0 = icmp slt <16 x i8> %x, zeroinitializer 94 %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> 95 %res = select <16 x i1> %0, <16 x i8> %1, <16 x i8> zeroinitializer 96 ret <16 x i8> %res 97} 98 99define <16 x i8> @test5(<16 x i8> %x) nounwind { 100; SSE-LABEL: test5: 101; SSE: # %bb.0: # %vector.ph 102; SSE-NEXT: psubusb {{.*}}(%rip), %xmm0 103; SSE-NEXT: retq 104; 105; AVX-LABEL: test5: 106; AVX: # %bb.0: # %vector.ph 107; AVX-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 108; AVX-NEXT: retq 109vector.ph: 110 %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> 111 %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> 112 %res = select <16 x i1> %0, <16 x i8> %1, <16 x i8> zeroinitializer 113 ret <16 x i8> %res 114} 115 116define <16 x i8> @test6(<16 x i8> %x, i8 zeroext %w) nounwind { 117; SSE2-LABEL: test6: 118; SSE2: # %bb.0: # %vector.ph 119; SSE2-NEXT: movd %edi, %xmm1 120; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 121; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7] 122; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0] 123; SSE2-NEXT: psubusb %xmm1, %xmm0 124; SSE2-NEXT: retq 125; 126; SSSE3-LABEL: test6: 127; SSSE3: # %bb.0: # %vector.ph 128; SSSE3-NEXT: movd %edi, %xmm1 129; SSSE3-NEXT: pxor %xmm2, %xmm2 130; SSSE3-NEXT: pshufb %xmm2, %xmm1 131; SSSE3-NEXT: psubusb %xmm1, %xmm0 132; SSSE3-NEXT: retq 133; 134; SSE41-LABEL: test6: 135; SSE41: # %bb.0: # %vector.ph 136; SSE41-NEXT: movd %edi, %xmm1 137; SSE41-NEXT: pxor %xmm2, %xmm2 138; SSE41-NEXT: pshufb %xmm2, %xmm1 139; SSE41-NEXT: psubusb %xmm1, %xmm0 140; SSE41-NEXT: retq 141; 142; AVX1-LABEL: test6: 143; AVX1: # %bb.0: # %vector.ph 144; AVX1-NEXT: vmovd %edi, %xmm1 145; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 146; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 147; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 148; AVX1-NEXT: retq 149; 150; AVX2-LABEL: test6: 151; AVX2: # %bb.0: # %vector.ph 152; AVX2-NEXT: vmovd %edi, %xmm1 153; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1 154; AVX2-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 155; AVX2-NEXT: retq 156; 157; AVX512-LABEL: test6: 158; AVX512: # %bb.0: # %vector.ph 159; AVX512-NEXT: vpbroadcastb %edi, %xmm1 160; AVX512-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 161; AVX512-NEXT: retq 162vector.ph: 163 %0 = insertelement <16 x i8> undef, i8 %w, i32 0 164 %broadcast15 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer 165 %1 = icmp ult <16 x i8> %x, %broadcast15 166 %2 = sub <16 x i8> %x, %broadcast15 167 %res = select <16 x i1> %1, <16 x i8> zeroinitializer, <16 x i8> %2 168 ret <16 x i8> %res 169} 170 171define <16 x i16> @test7(<16 x i16> %x) nounwind { 172; SSE-LABEL: test7: 173; SSE: # %bb.0: # %vector.ph 174; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 175; SSE-NEXT: psubusw %xmm2, %xmm0 176; SSE-NEXT: psubusw %xmm2, %xmm1 177; SSE-NEXT: retq 178; 179; AVX1-LABEL: test7: 180; AVX1: # %bb.0: # %vector.ph 181; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 182; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 183; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1 184; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0 185; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 186; AVX1-NEXT: retq 187; 188; AVX2-LABEL: test7: 189; AVX2: # %bb.0: # %vector.ph 190; AVX2-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 191; AVX2-NEXT: retq 192; 193; AVX512-LABEL: test7: 194; AVX512: # %bb.0: # %vector.ph 195; AVX512-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 196; AVX512-NEXT: retq 197vector.ph: 198 %0 = icmp slt <16 x i16> %x, zeroinitializer 199 %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> 200 %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer 201 ret <16 x i16> %res 202} 203 204define <16 x i16> @test8(<16 x i16> %x) nounwind { 205; SSE-LABEL: test8: 206; SSE: # %bb.0: # %vector.ph 207; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767] 208; SSE-NEXT: psubusw %xmm2, %xmm0 209; SSE-NEXT: psubusw %xmm2, %xmm1 210; SSE-NEXT: retq 211; 212; AVX1-LABEL: test8: 213; AVX1: # %bb.0: # %vector.ph 214; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 215; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767] 216; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1 217; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0 218; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 219; AVX1-NEXT: retq 220; 221; AVX2-LABEL: test8: 222; AVX2: # %bb.0: # %vector.ph 223; AVX2-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 224; AVX2-NEXT: retq 225; 226; AVX512-LABEL: test8: 227; AVX512: # %bb.0: # %vector.ph 228; AVX512-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 229; AVX512-NEXT: retq 230vector.ph: 231 %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> 232 %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> 233 %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer 234 ret <16 x i16> %res 235} 236 237define <16 x i16> @test8a(<16 x i16> %x) nounwind { 238; SSE-LABEL: test8a: 239; SSE: # %bb.0: # %vector.ph 240; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 241; SSE-NEXT: psubusw {{.*}}(%rip), %xmm1 242; SSE-NEXT: retq 243; 244; AVX1-LABEL: test8a: 245; AVX1: # %bb.0: # %vector.ph 246; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm1 247; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 248; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 249; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 250; AVX1-NEXT: retq 251; 252; AVX2-LABEL: test8a: 253; AVX2: # %bb.0: # %vector.ph 254; AVX2-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 255; AVX2-NEXT: retq 256; 257; AVX512-LABEL: test8a: 258; AVX512: # %bb.0: # %vector.ph 259; AVX512-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 260; AVX512-NEXT: retq 261vector.ph: 262 %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> 263 %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> 264 %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer 265 ret <16 x i16> %res 266} 267 268define <16 x i16> @test9(<16 x i16> %x, i16 zeroext %w) nounwind { 269; SSE-LABEL: test9: 270; SSE: # %bb.0: # %vector.ph 271; SSE-NEXT: movd %edi, %xmm2 272; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7] 273; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0] 274; SSE-NEXT: psubusw %xmm2, %xmm0 275; SSE-NEXT: psubusw %xmm2, %xmm1 276; SSE-NEXT: retq 277; 278; AVX1-LABEL: test9: 279; AVX1: # %bb.0: # %vector.ph 280; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 281; AVX1-NEXT: vmovd %edi, %xmm2 282; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7] 283; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0] 284; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1 285; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0 286; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 287; AVX1-NEXT: retq 288; 289; AVX2-LABEL: test9: 290; AVX2: # %bb.0: # %vector.ph 291; AVX2-NEXT: vmovd %edi, %xmm1 292; AVX2-NEXT: vpbroadcastw %xmm1, %ymm1 293; AVX2-NEXT: vpsubusw %ymm1, %ymm0, %ymm0 294; AVX2-NEXT: retq 295; 296; AVX512-LABEL: test9: 297; AVX512: # %bb.0: # %vector.ph 298; AVX512-NEXT: vpbroadcastw %edi, %ymm1 299; AVX512-NEXT: vpsubusw %ymm1, %ymm0, %ymm0 300; AVX512-NEXT: retq 301vector.ph: 302 %0 = insertelement <16 x i16> undef, i16 %w, i32 0 303 %broadcast15 = shufflevector <16 x i16> %0, <16 x i16> undef, <16 x i32> zeroinitializer 304 %1 = icmp ult <16 x i16> %x, %broadcast15 305 %2 = sub <16 x i16> %x, %broadcast15 306 %res = select <16 x i1> %1, <16 x i16> zeroinitializer, <16 x i16> %2 307 ret <16 x i16> %res 308} 309 310define <32 x i8> @test10(<32 x i8> %x) nounwind { 311; SSE-LABEL: test10: 312; SSE: # %bb.0: # %vector.ph 313; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 314; SSE-NEXT: psubusb %xmm2, %xmm0 315; SSE-NEXT: psubusb %xmm2, %xmm1 316; SSE-NEXT: retq 317; 318; AVX1-LABEL: test10: 319; AVX1: # %bb.0: # %vector.ph 320; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 321; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 322; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm1 323; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0 324; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 325; AVX1-NEXT: retq 326; 327; AVX2-LABEL: test10: 328; AVX2: # %bb.0: # %vector.ph 329; AVX2-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 330; AVX2-NEXT: retq 331; 332; AVX512-LABEL: test10: 333; AVX512: # %bb.0: # %vector.ph 334; AVX512-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 335; AVX512-NEXT: retq 336vector.ph: 337 %0 = icmp slt <32 x i8> %x, zeroinitializer 338 %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> 339 %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer 340 ret <32 x i8> %res 341} 342 343define <32 x i8> @test11(<32 x i8> %x) nounwind { 344; SSE-LABEL: test11: 345; SSE: # %bb.0: # %vector.ph 346; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 347; SSE-NEXT: psubusb %xmm2, %xmm0 348; SSE-NEXT: psubusb %xmm2, %xmm1 349; SSE-NEXT: retq 350; 351; AVX1-LABEL: test11: 352; AVX1: # %bb.0: # %vector.ph 353; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 354; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 355; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm1 356; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0 357; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 358; AVX1-NEXT: retq 359; 360; AVX2-LABEL: test11: 361; AVX2: # %bb.0: # %vector.ph 362; AVX2-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 363; AVX2-NEXT: retq 364; 365; AVX512-LABEL: test11: 366; AVX512: # %bb.0: # %vector.ph 367; AVX512-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 368; AVX512-NEXT: retq 369vector.ph: 370 %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> 371 %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> 372 %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer 373 ret <32 x i8> %res 374} 375 376define <32 x i8> @test11a(<32 x i8> %x) nounwind { 377; SSE-LABEL: test11a: 378; SSE: # %bb.0: # %vector.ph 379; SSE-NEXT: psubusb {{.*}}(%rip), %xmm0 380; SSE-NEXT: psubusb {{.*}}(%rip), %xmm1 381; SSE-NEXT: retq 382; 383; AVX1-LABEL: test11a: 384; AVX1: # %bb.0: # %vector.ph 385; AVX1-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm1 386; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 387; AVX1-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 388; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 389; AVX1-NEXT: retq 390; 391; AVX2-LABEL: test11a: 392; AVX2: # %bb.0: # %vector.ph 393; AVX2-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 394; AVX2-NEXT: retq 395; 396; AVX512-LABEL: test11a: 397; AVX512: # %bb.0: # %vector.ph 398; AVX512-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 399; AVX512-NEXT: retq 400vector.ph: 401 %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> 402 %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> 403 %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer 404 ret <32 x i8> %res 405} 406 407define <32 x i8> @test12(<32 x i8> %x, i8 zeroext %w) nounwind { 408; SSE2-LABEL: test12: 409; SSE2: # %bb.0: # %vector.ph 410; SSE2-NEXT: movd %edi, %xmm2 411; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 412; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7] 413; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0] 414; SSE2-NEXT: psubusb %xmm2, %xmm0 415; SSE2-NEXT: psubusb %xmm2, %xmm1 416; SSE2-NEXT: retq 417; 418; SSSE3-LABEL: test12: 419; SSSE3: # %bb.0: # %vector.ph 420; SSSE3-NEXT: movd %edi, %xmm2 421; SSSE3-NEXT: pxor %xmm3, %xmm3 422; SSSE3-NEXT: pshufb %xmm3, %xmm2 423; SSSE3-NEXT: psubusb %xmm2, %xmm0 424; SSSE3-NEXT: psubusb %xmm2, %xmm1 425; SSSE3-NEXT: retq 426; 427; SSE41-LABEL: test12: 428; SSE41: # %bb.0: # %vector.ph 429; SSE41-NEXT: movd %edi, %xmm2 430; SSE41-NEXT: pxor %xmm3, %xmm3 431; SSE41-NEXT: pshufb %xmm3, %xmm2 432; SSE41-NEXT: psubusb %xmm2, %xmm0 433; SSE41-NEXT: psubusb %xmm2, %xmm1 434; SSE41-NEXT: retq 435; 436; AVX1-LABEL: test12: 437; AVX1: # %bb.0: # %vector.ph 438; AVX1-NEXT: vmovd %edi, %xmm1 439; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 440; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 441; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 442; AVX1-NEXT: vpsubusb %xmm1, %xmm2, %xmm2 443; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 444; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 445; AVX1-NEXT: retq 446; 447; AVX2-LABEL: test12: 448; AVX2: # %bb.0: # %vector.ph 449; AVX2-NEXT: vmovd %edi, %xmm1 450; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1 451; AVX2-NEXT: vpsubusb %ymm1, %ymm0, %ymm0 452; AVX2-NEXT: retq 453; 454; AVX512-LABEL: test12: 455; AVX512: # %bb.0: # %vector.ph 456; AVX512-NEXT: vpbroadcastb %edi, %ymm1 457; AVX512-NEXT: vpsubusb %ymm1, %ymm0, %ymm0 458; AVX512-NEXT: retq 459vector.ph: 460 %0 = insertelement <32 x i8> undef, i8 %w, i32 0 461 %broadcast15 = shufflevector <32 x i8> %0, <32 x i8> undef, <32 x i32> zeroinitializer 462 %1 = icmp ult <32 x i8> %x, %broadcast15 463 %2 = sub <32 x i8> %x, %broadcast15 464 %res = select <32 x i1> %1, <32 x i8> zeroinitializer, <32 x i8> %2 465 ret <32 x i8> %res 466} 467 468define <8 x i16> @test13(<8 x i16> %x, <8 x i32> %y) nounwind { 469; SSE2-LABEL: test13: 470; SSE2: # %bb.0: # %vector.ph 471; SSE2-NEXT: pxor %xmm4, %xmm4 472; SSE2-NEXT: movdqa %xmm0, %xmm3 473; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3] 474; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 475; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 476; SSE2-NEXT: movdqa %xmm0, %xmm5 477; SSE2-NEXT: psubd %xmm2, %xmm0 478; SSE2-NEXT: movdqa %xmm2, %xmm6 479; SSE2-NEXT: pxor %xmm4, %xmm6 480; SSE2-NEXT: por %xmm4, %xmm5 481; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 482; SSE2-NEXT: movdqa %xmm1, %xmm2 483; SSE2-NEXT: pxor %xmm4, %xmm2 484; SSE2-NEXT: por %xmm3, %xmm4 485; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 486; SSE2-NEXT: packssdw %xmm6, %xmm2 487; SSE2-NEXT: psubd %xmm1, %xmm3 488; SSE2-NEXT: pslld $16, %xmm0 489; SSE2-NEXT: psrad $16, %xmm0 490; SSE2-NEXT: pslld $16, %xmm3 491; SSE2-NEXT: psrad $16, %xmm3 492; SSE2-NEXT: packssdw %xmm0, %xmm3 493; SSE2-NEXT: pandn %xmm3, %xmm2 494; SSE2-NEXT: movdqa %xmm2, %xmm0 495; SSE2-NEXT: retq 496; 497; SSSE3-LABEL: test13: 498; SSSE3: # %bb.0: # %vector.ph 499; SSSE3-NEXT: pxor %xmm3, %xmm3 500; SSSE3-NEXT: movdqa %xmm0, %xmm4 501; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3] 502; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 503; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 504; SSSE3-NEXT: movdqa %xmm0, %xmm5 505; SSSE3-NEXT: psubd %xmm2, %xmm0 506; SSSE3-NEXT: movdqa %xmm2, %xmm6 507; SSSE3-NEXT: pxor %xmm3, %xmm6 508; SSSE3-NEXT: por %xmm3, %xmm5 509; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6 510; SSSE3-NEXT: movdqa %xmm1, %xmm2 511; SSSE3-NEXT: pxor %xmm3, %xmm2 512; SSSE3-NEXT: por %xmm4, %xmm3 513; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 514; SSSE3-NEXT: packssdw %xmm6, %xmm2 515; SSSE3-NEXT: psubd %xmm1, %xmm4 516; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 517; SSSE3-NEXT: pshufb %xmm1, %xmm0 518; SSSE3-NEXT: pshufb %xmm1, %xmm4 519; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm0[0] 520; SSSE3-NEXT: pandn %xmm4, %xmm2 521; SSSE3-NEXT: movdqa %xmm2, %xmm0 522; SSSE3-NEXT: retq 523; 524; SSE41-LABEL: test13: 525; SSE41: # %bb.0: # %vector.ph 526; SSE41-NEXT: pxor %xmm3, %xmm3 527; SSE41-NEXT: pmovzxwd {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 528; SSE41-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 529; SSE41-NEXT: movdqa %xmm0, %xmm5 530; SSE41-NEXT: pmaxud %xmm2, %xmm5 531; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 532; SSE41-NEXT: pcmpeqd %xmm6, %xmm6 533; SSE41-NEXT: pxor %xmm6, %xmm5 534; SSE41-NEXT: movdqa %xmm4, %xmm3 535; SSE41-NEXT: pmaxud %xmm1, %xmm3 536; SSE41-NEXT: pcmpeqd %xmm4, %xmm3 537; SSE41-NEXT: pxor %xmm6, %xmm3 538; SSE41-NEXT: packssdw %xmm5, %xmm3 539; SSE41-NEXT: psubd %xmm1, %xmm4 540; SSE41-NEXT: psubd %xmm2, %xmm0 541; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 542; SSE41-NEXT: pshufb %xmm1, %xmm0 543; SSE41-NEXT: pshufb %xmm1, %xmm4 544; SSE41-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm0[0] 545; SSE41-NEXT: pandn %xmm4, %xmm3 546; SSE41-NEXT: movdqa %xmm3, %xmm0 547; SSE41-NEXT: retq 548; 549; AVX1-LABEL: test13: 550; AVX1: # %bb.0: # %vector.ph 551; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 552; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 553; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 554; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 555; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm4 556; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm4 557; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 558; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4 559; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm6 560; AVX1-NEXT: vpcmpeqd %xmm6, %xmm0, %xmm6 561; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm5 562; AVX1-NEXT: vpackssdw %xmm4, %xmm5, %xmm4 563; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0 564; AVX1-NEXT: vpsubd %xmm3, %xmm2, %xmm1 565; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 566; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 567; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 568; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 569; AVX1-NEXT: vpandn %xmm0, %xmm4, %xmm0 570; AVX1-NEXT: vzeroupper 571; AVX1-NEXT: retq 572; 573; AVX2-LABEL: test13: 574; AVX2: # %bb.0: # %vector.ph 575; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 576; AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm2 577; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm2 578; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 579; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 580; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3 581; AVX2-NEXT: vpackssdw %xmm3, %xmm2, %xmm2 582; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0 583; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 584; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 585; AVX2-NEXT: vpandn %xmm0, %xmm2, %xmm0 586; AVX2-NEXT: vzeroupper 587; AVX2-NEXT: retq 588; 589; AVX512-LABEL: test13: 590; AVX512: # %bb.0: # %vector.ph 591; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 592; AVX512-NEXT: vpcmpnltud %ymm1, %ymm0, %k1 593; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm0 594; AVX512-NEXT: vpmovdw %ymm0, %xmm0 {%k1} {z} 595; AVX512-NEXT: vzeroupper 596; AVX512-NEXT: retq 597vector.ph: 598 %lhs = zext <8 x i16> %x to <8 x i32> 599 %cond = icmp ult <8 x i32> %lhs, %y 600 %sub = sub <8 x i32> %lhs, %y 601 %trunc = trunc <8 x i32> %sub to <8 x i16> 602 %res = select <8 x i1> %cond, <8 x i16> zeroinitializer, <8 x i16> %trunc 603 ret <8 x i16> %res 604} 605 606define <16 x i8> @test14(<16 x i8> %x, <16 x i32> %y) nounwind { 607; SSE2-LABEL: test14: 608; SSE2: # %bb.0: # %vector.ph 609; SSE2-NEXT: movdqa %xmm0, %xmm5 610; SSE2-NEXT: pxor %xmm0, %xmm0 611; SSE2-NEXT: movdqa %xmm5, %xmm6 612; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1],xmm6[2],xmm0[2],xmm6[3],xmm0[3],xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7] 613; SSE2-NEXT: movdqa %xmm6, %xmm8 614; SSE2-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm0[0],xmm8[1],xmm0[1],xmm8[2],xmm0[2],xmm8[3],xmm0[3] 615; SSE2-NEXT: punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7] 616; SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15] 617; SSE2-NEXT: movdqa %xmm5, %xmm10 618; SSE2-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm0[0],xmm10[1],xmm0[1],xmm10[2],xmm0[2],xmm10[3],xmm0[3] 619; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7] 620; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648] 621; SSE2-NEXT: movdqa %xmm4, %xmm9 622; SSE2-NEXT: pxor %xmm0, %xmm9 623; SSE2-NEXT: psubd %xmm5, %xmm4 624; SSE2-NEXT: por %xmm0, %xmm5 625; SSE2-NEXT: pcmpgtd %xmm9, %xmm5 626; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255] 627; SSE2-NEXT: pand %xmm9, %xmm5 628; SSE2-NEXT: movdqa %xmm3, %xmm7 629; SSE2-NEXT: pxor %xmm0, %xmm7 630; SSE2-NEXT: psubd %xmm10, %xmm3 631; SSE2-NEXT: por %xmm0, %xmm10 632; SSE2-NEXT: pcmpgtd %xmm7, %xmm10 633; SSE2-NEXT: pand %xmm9, %xmm10 634; SSE2-NEXT: packuswb %xmm5, %xmm10 635; SSE2-NEXT: movdqa %xmm2, %xmm5 636; SSE2-NEXT: pxor %xmm0, %xmm5 637; SSE2-NEXT: psubd %xmm6, %xmm2 638; SSE2-NEXT: por %xmm0, %xmm6 639; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 640; SSE2-NEXT: pand %xmm9, %xmm6 641; SSE2-NEXT: movdqa %xmm1, %xmm5 642; SSE2-NEXT: pxor %xmm0, %xmm5 643; SSE2-NEXT: por %xmm8, %xmm0 644; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 645; SSE2-NEXT: pand %xmm9, %xmm0 646; SSE2-NEXT: packuswb %xmm6, %xmm0 647; SSE2-NEXT: packuswb %xmm10, %xmm0 648; SSE2-NEXT: psubd %xmm8, %xmm1 649; SSE2-NEXT: pand %xmm9, %xmm4 650; SSE2-NEXT: pand %xmm9, %xmm3 651; SSE2-NEXT: packuswb %xmm4, %xmm3 652; SSE2-NEXT: pand %xmm9, %xmm2 653; SSE2-NEXT: pand %xmm9, %xmm1 654; SSE2-NEXT: packuswb %xmm2, %xmm1 655; SSE2-NEXT: packuswb %xmm3, %xmm1 656; SSE2-NEXT: pandn %xmm1, %xmm0 657; SSE2-NEXT: retq 658; 659; SSSE3-LABEL: test14: 660; SSSE3: # %bb.0: # %vector.ph 661; SSSE3-NEXT: movdqa %xmm0, %xmm5 662; SSSE3-NEXT: pxor %xmm0, %xmm0 663; SSSE3-NEXT: movdqa %xmm5, %xmm7 664; SSSE3-NEXT: punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15] 665; SSSE3-NEXT: movdqa %xmm7, %xmm8 666; SSSE3-NEXT: punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm0[0],xmm8[1],xmm0[1],xmm8[2],xmm0[2],xmm8[3],xmm0[3] 667; SSSE3-NEXT: punpckhwd {{.*#+}} xmm7 = xmm7[4],xmm0[4],xmm7[5],xmm0[5],xmm7[6],xmm0[6],xmm7[7],xmm0[7] 668; SSSE3-NEXT: punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7] 669; SSSE3-NEXT: movdqa %xmm5, %xmm10 670; SSSE3-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm0[0],xmm10[1],xmm0[1],xmm10[2],xmm0[2],xmm10[3],xmm0[3] 671; SSSE3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7] 672; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648] 673; SSSE3-NEXT: movdqa %xmm2, %xmm9 674; SSSE3-NEXT: pxor %xmm0, %xmm9 675; SSSE3-NEXT: psubd %xmm5, %xmm2 676; SSSE3-NEXT: por %xmm0, %xmm5 677; SSSE3-NEXT: pcmpgtd %xmm9, %xmm5 678; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u> 679; SSSE3-NEXT: pshufb %xmm9, %xmm5 680; SSSE3-NEXT: movdqa %xmm1, %xmm6 681; SSSE3-NEXT: pxor %xmm0, %xmm6 682; SSSE3-NEXT: psubd %xmm10, %xmm1 683; SSSE3-NEXT: por %xmm0, %xmm10 684; SSSE3-NEXT: pcmpgtd %xmm6, %xmm10 685; SSSE3-NEXT: pshufb %xmm9, %xmm10 686; SSSE3-NEXT: punpckldq {{.*#+}} xmm10 = xmm10[0],xmm5[0],xmm10[1],xmm5[1] 687; SSSE3-NEXT: movdqa %xmm4, %xmm5 688; SSSE3-NEXT: pxor %xmm0, %xmm5 689; SSSE3-NEXT: psubd %xmm7, %xmm4 690; SSSE3-NEXT: por %xmm0, %xmm7 691; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 692; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u> 693; SSSE3-NEXT: pshufb %xmm5, %xmm7 694; SSSE3-NEXT: movdqa %xmm3, %xmm6 695; SSSE3-NEXT: pxor %xmm0, %xmm6 696; SSSE3-NEXT: por %xmm8, %xmm0 697; SSSE3-NEXT: pcmpgtd %xmm6, %xmm0 698; SSSE3-NEXT: pshufb %xmm5, %xmm0 699; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1] 700; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm10[0],xmm0[1] 701; SSSE3-NEXT: psubd %xmm8, %xmm3 702; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 703; SSSE3-NEXT: pand %xmm5, %xmm4 704; SSSE3-NEXT: pand %xmm5, %xmm3 705; SSSE3-NEXT: packuswb %xmm4, %xmm3 706; SSSE3-NEXT: pand %xmm5, %xmm2 707; SSSE3-NEXT: pand %xmm5, %xmm1 708; SSSE3-NEXT: packuswb %xmm2, %xmm1 709; SSSE3-NEXT: packuswb %xmm3, %xmm1 710; SSSE3-NEXT: andnpd %xmm1, %xmm0 711; SSSE3-NEXT: retq 712; 713; SSE41-LABEL: test14: 714; SSE41: # %bb.0: # %vector.ph 715; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,2,3] 716; SSE41-NEXT: pmovzxbd {{.*#+}} xmm11 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero 717; SSE41-NEXT: pmovzxbd {{.*#+}} xmm8 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 718; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[2,3,0,1] 719; SSE41-NEXT: pmovzxbd {{.*#+}} xmm9 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero 720; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] 721; SSE41-NEXT: pmovzxbd {{.*#+}} xmm10 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 722; SSE41-NEXT: movdqa %xmm4, %xmm0 723; SSE41-NEXT: pmaxud %xmm10, %xmm0 724; SSE41-NEXT: pcmpeqd %xmm4, %xmm0 725; SSE41-NEXT: pcmpeqd %xmm6, %xmm6 726; SSE41-NEXT: pxor %xmm6, %xmm0 727; SSE41-NEXT: movdqa {{.*#+}} xmm7 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u> 728; SSE41-NEXT: pshufb %xmm7, %xmm0 729; SSE41-NEXT: movdqa %xmm3, %xmm5 730; SSE41-NEXT: pmaxud %xmm9, %xmm5 731; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 732; SSE41-NEXT: pxor %xmm6, %xmm5 733; SSE41-NEXT: pshufb %xmm7, %xmm5 734; SSE41-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1] 735; SSE41-NEXT: movdqa %xmm1, %xmm0 736; SSE41-NEXT: pmaxud %xmm8, %xmm0 737; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 738; SSE41-NEXT: pxor %xmm6, %xmm0 739; SSE41-NEXT: movdqa {{.*#+}} xmm12 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u> 740; SSE41-NEXT: pshufb %xmm12, %xmm0 741; SSE41-NEXT: movdqa %xmm2, %xmm7 742; SSE41-NEXT: pmaxud %xmm11, %xmm7 743; SSE41-NEXT: pcmpeqd %xmm2, %xmm7 744; SSE41-NEXT: pxor %xmm6, %xmm7 745; SSE41-NEXT: pshufb %xmm12, %xmm7 746; SSE41-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1] 747; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm5[4,5,6,7] 748; SSE41-NEXT: psubd %xmm11, %xmm2 749; SSE41-NEXT: psubd %xmm8, %xmm1 750; SSE41-NEXT: psubd %xmm9, %xmm3 751; SSE41-NEXT: psubd %xmm10, %xmm4 752; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 753; SSE41-NEXT: pand %xmm5, %xmm4 754; SSE41-NEXT: pand %xmm5, %xmm3 755; SSE41-NEXT: packusdw %xmm4, %xmm3 756; SSE41-NEXT: pand %xmm5, %xmm1 757; SSE41-NEXT: pand %xmm5, %xmm2 758; SSE41-NEXT: packusdw %xmm2, %xmm1 759; SSE41-NEXT: packuswb %xmm3, %xmm1 760; SSE41-NEXT: pandn %xmm1, %xmm0 761; SSE41-NEXT: retq 762; 763; AVX1-LABEL: test14: 764; AVX1: # %bb.0: # %vector.ph 765; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,3] 766; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm8 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero 767; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm9 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 768; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm0[2,3,0,1] 769; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm11 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero 770; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1] 771; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 772; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6 773; AVX1-NEXT: vpmaxud %xmm0, %xmm6, %xmm7 774; AVX1-NEXT: vpcmpeqd %xmm7, %xmm6, %xmm7 775; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 776; AVX1-NEXT: vpxor %xmm3, %xmm7, %xmm7 777; AVX1-NEXT: vpmaxud %xmm11, %xmm2, %xmm4 778; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm4 779; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 780; AVX1-NEXT: vpackssdw %xmm7, %xmm4, %xmm10 781; AVX1-NEXT: vpmaxud %xmm9, %xmm1, %xmm7 782; AVX1-NEXT: vpcmpeqd %xmm7, %xmm1, %xmm7 783; AVX1-NEXT: vpxor %xmm3, %xmm7, %xmm7 784; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 785; AVX1-NEXT: vpmaxud %xmm8, %xmm4, %xmm5 786; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5 787; AVX1-NEXT: vpxor %xmm3, %xmm5, %xmm3 788; AVX1-NEXT: vpackssdw %xmm3, %xmm7, %xmm3 789; AVX1-NEXT: vpacksswb %xmm10, %xmm3, %xmm3 790; AVX1-NEXT: vpsubd %xmm8, %xmm4, %xmm4 791; AVX1-NEXT: vpsubd %xmm9, %xmm1, %xmm1 792; AVX1-NEXT: vpsubd %xmm11, %xmm2, %xmm2 793; AVX1-NEXT: vpsubd %xmm0, %xmm6, %xmm0 794; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [3.57331108E-43,3.57331108E-43,3.57331108E-43,3.57331108E-43] 795; AVX1-NEXT: vpand %xmm5, %xmm0, %xmm0 796; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2 797; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 798; AVX1-NEXT: vpand %xmm5, %xmm1, %xmm1 799; AVX1-NEXT: vpand %xmm5, %xmm4, %xmm2 800; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 801; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0 802; AVX1-NEXT: vpandn %xmm0, %xmm3, %xmm0 803; AVX1-NEXT: vzeroupper 804; AVX1-NEXT: retq 805; 806; AVX2-LABEL: test14: 807; AVX2: # %bb.0: # %vector.ph 808; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 809; 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,zero 810; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = 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 811; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm4 812; AVX2-NEXT: vpcmpeqd %ymm4, %ymm1, %ymm4 813; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 814; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4 815; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm6 816; AVX2-NEXT: vpackssdw %xmm6, %xmm4, %xmm4 817; AVX2-NEXT: vpmaxud %ymm3, %ymm2, %ymm6 818; AVX2-NEXT: vpcmpeqd %ymm6, %ymm2, %ymm6 819; AVX2-NEXT: vpxor %ymm5, %ymm6, %ymm5 820; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm6 821; AVX2-NEXT: vpackssdw %xmm6, %xmm5, %xmm5 822; AVX2-NEXT: vpacksswb %xmm5, %xmm4, %xmm4 823; AVX2-NEXT: vpsubd %ymm3, %ymm2, %ymm2 824; AVX2-NEXT: vpsubd %ymm0, %ymm1, %ymm0 825; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 826; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm0 827; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 828; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 829; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm0 830; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1 831; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 832; AVX2-NEXT: vpand %xmm3, %xmm1, %xmm1 833; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 834; AVX2-NEXT: vpandn %xmm0, %xmm4, %xmm0 835; AVX2-NEXT: vzeroupper 836; AVX2-NEXT: retq 837; 838; AVX512-LABEL: test14: 839; AVX512: # %bb.0: # %vector.ph 840; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = 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,zero 841; AVX512-NEXT: vpcmpnltud %zmm0, %zmm1, %k1 842; AVX512-NEXT: vpsubd %zmm0, %zmm1, %zmm0 843; AVX512-NEXT: vpmovdb %zmm0, %xmm0 {%k1} {z} 844; AVX512-NEXT: vzeroupper 845; AVX512-NEXT: retq 846vector.ph: 847 %rhs = zext <16 x i8> %x to <16 x i32> 848 %cond = icmp ult <16 x i32> %y, %rhs 849 %sub = sub <16 x i32> %y, %rhs 850 %truncsub = trunc <16 x i32> %sub to <16 x i8> 851 %res = select <16 x i1> %cond, <16 x i8> zeroinitializer, <16 x i8> %truncsub 852 ret <16 x i8> %res 853} 854 855define <8 x i16> @test15(<8 x i16> %x, <8 x i32> %y) nounwind { 856; SSE2-LABEL: test15: 857; SSE2: # %bb.0: # %vector.ph 858; SSE2-NEXT: movdqa %xmm0, %xmm3 859; SSE2-NEXT: pxor %xmm4, %xmm4 860; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3] 861; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 862; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 863; SSE2-NEXT: movdqa %xmm3, %xmm5 864; SSE2-NEXT: psubd %xmm2, %xmm3 865; SSE2-NEXT: pxor %xmm4, %xmm2 866; SSE2-NEXT: por %xmm4, %xmm5 867; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 868; SSE2-NEXT: movdqa %xmm1, %xmm2 869; SSE2-NEXT: pxor %xmm4, %xmm2 870; SSE2-NEXT: por %xmm0, %xmm4 871; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 872; SSE2-NEXT: packssdw %xmm5, %xmm4 873; SSE2-NEXT: psubd %xmm1, %xmm0 874; SSE2-NEXT: pslld $16, %xmm3 875; SSE2-NEXT: psrad $16, %xmm3 876; SSE2-NEXT: pslld $16, %xmm0 877; SSE2-NEXT: psrad $16, %xmm0 878; SSE2-NEXT: packssdw %xmm3, %xmm0 879; SSE2-NEXT: pand %xmm4, %xmm0 880; SSE2-NEXT: retq 881; 882; SSSE3-LABEL: test15: 883; SSSE3: # %bb.0: # %vector.ph 884; SSSE3-NEXT: pxor %xmm4, %xmm4 885; SSSE3-NEXT: movdqa %xmm0, %xmm3 886; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3] 887; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 888; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 889; SSSE3-NEXT: movdqa %xmm0, %xmm5 890; SSSE3-NEXT: psubd %xmm2, %xmm0 891; SSSE3-NEXT: pxor %xmm4, %xmm2 892; SSSE3-NEXT: por %xmm4, %xmm5 893; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 894; SSSE3-NEXT: movdqa %xmm1, %xmm2 895; SSSE3-NEXT: pxor %xmm4, %xmm2 896; SSSE3-NEXT: por %xmm3, %xmm4 897; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 898; SSSE3-NEXT: packssdw %xmm5, %xmm4 899; SSSE3-NEXT: psubd %xmm1, %xmm3 900; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 901; SSSE3-NEXT: pshufb %xmm1, %xmm0 902; SSSE3-NEXT: pshufb %xmm1, %xmm3 903; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 904; SSSE3-NEXT: pand %xmm4, %xmm3 905; SSSE3-NEXT: movdqa %xmm3, %xmm0 906; SSSE3-NEXT: retq 907; 908; SSE41-LABEL: test15: 909; SSE41: # %bb.0: # %vector.ph 910; SSE41-NEXT: pxor %xmm4, %xmm4 911; SSE41-NEXT: pmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 912; SSE41-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 913; SSE41-NEXT: movdqa %xmm0, %xmm4 914; SSE41-NEXT: pminud %xmm2, %xmm4 915; SSE41-NEXT: pcmpeqd %xmm0, %xmm4 916; SSE41-NEXT: pcmpeqd %xmm5, %xmm5 917; SSE41-NEXT: pxor %xmm5, %xmm4 918; SSE41-NEXT: movdqa %xmm3, %xmm6 919; SSE41-NEXT: pminud %xmm1, %xmm6 920; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 921; SSE41-NEXT: pxor %xmm5, %xmm6 922; SSE41-NEXT: packssdw %xmm4, %xmm6 923; SSE41-NEXT: psubd %xmm1, %xmm3 924; SSE41-NEXT: psubd %xmm2, %xmm0 925; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 926; SSE41-NEXT: pshufb %xmm1, %xmm0 927; SSE41-NEXT: pshufb %xmm1, %xmm3 928; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 929; SSE41-NEXT: pand %xmm6, %xmm3 930; SSE41-NEXT: movdqa %xmm3, %xmm0 931; SSE41-NEXT: retq 932; 933; AVX1-LABEL: test15: 934; AVX1: # %bb.0: # %vector.ph 935; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 936; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 937; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 938; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 939; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm4 940; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm4 941; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm5 942; AVX1-NEXT: vpcmpeqd %xmm5, %xmm0, %xmm5 943; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0 944; AVX1-NEXT: vpandn %xmm0, %xmm5, %xmm0 945; AVX1-NEXT: vpsubd %xmm3, %xmm2, %xmm1 946; AVX1-NEXT: vpandn %xmm1, %xmm4, %xmm1 947; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 948; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 949; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 950; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 951; AVX1-NEXT: vzeroupper 952; AVX1-NEXT: retq 953; 954; AVX2-LABEL: test15: 955; AVX2: # %bb.0: # %vector.ph 956; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 957; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm2 958; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm2 959; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0 960; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0 961; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 962; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 963; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 964; AVX2-NEXT: vzeroupper 965; AVX2-NEXT: retq 966; 967; AVX512-LABEL: test15: 968; AVX512: # %bb.0: # %vector.ph 969; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 970; AVX512-NEXT: vpcmpnleud %ymm1, %ymm0, %k1 971; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm0 972; AVX512-NEXT: vpmovdw %ymm0, %xmm0 {%k1} {z} 973; AVX512-NEXT: vzeroupper 974; AVX512-NEXT: retq 975vector.ph: 976 %lhs = zext <8 x i16> %x to <8 x i32> 977 %cond = icmp ugt <8 x i32> %lhs, %y 978 %sub = sub <8 x i32> %lhs, %y 979 %truncsub = trunc <8 x i32> %sub to <8 x i16> 980 %res = select <8 x i1> %cond, <8 x i16> %truncsub, <8 x i16> zeroinitializer 981 ret <8 x i16> %res 982} 983 984define <8 x i16> @test16(<8 x i16> %x, <8 x i32> %y) nounwind { 985; SSE2-LABEL: test16: 986; SSE2: # %bb.0: # %vector.ph 987; SSE2-NEXT: movdqa %xmm0, %xmm3 988; SSE2-NEXT: pxor %xmm4, %xmm4 989; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3] 990; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 991; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 992; SSE2-NEXT: movdqa %xmm3, %xmm5 993; SSE2-NEXT: psubd %xmm2, %xmm3 994; SSE2-NEXT: pxor %xmm4, %xmm2 995; SSE2-NEXT: por %xmm4, %xmm5 996; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 997; SSE2-NEXT: movdqa %xmm1, %xmm2 998; SSE2-NEXT: pxor %xmm4, %xmm2 999; SSE2-NEXT: por %xmm0, %xmm4 1000; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 1001; SSE2-NEXT: packssdw %xmm5, %xmm4 1002; SSE2-NEXT: psubd %xmm1, %xmm0 1003; SSE2-NEXT: pslld $16, %xmm3 1004; SSE2-NEXT: psrad $16, %xmm3 1005; SSE2-NEXT: pslld $16, %xmm0 1006; SSE2-NEXT: psrad $16, %xmm0 1007; SSE2-NEXT: packssdw %xmm3, %xmm0 1008; SSE2-NEXT: pand %xmm4, %xmm0 1009; SSE2-NEXT: retq 1010; 1011; SSSE3-LABEL: test16: 1012; SSSE3: # %bb.0: # %vector.ph 1013; SSSE3-NEXT: pxor %xmm4, %xmm4 1014; SSSE3-NEXT: movdqa %xmm0, %xmm3 1015; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3] 1016; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1017; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 1018; SSSE3-NEXT: movdqa %xmm0, %xmm5 1019; SSSE3-NEXT: psubd %xmm2, %xmm0 1020; SSSE3-NEXT: pxor %xmm4, %xmm2 1021; SSSE3-NEXT: por %xmm4, %xmm5 1022; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 1023; SSSE3-NEXT: movdqa %xmm1, %xmm2 1024; SSSE3-NEXT: pxor %xmm4, %xmm2 1025; SSSE3-NEXT: por %xmm3, %xmm4 1026; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1027; SSSE3-NEXT: packssdw %xmm5, %xmm4 1028; SSSE3-NEXT: psubd %xmm1, %xmm3 1029; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1030; SSSE3-NEXT: pshufb %xmm1, %xmm0 1031; SSSE3-NEXT: pshufb %xmm1, %xmm3 1032; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 1033; SSSE3-NEXT: pand %xmm4, %xmm3 1034; SSSE3-NEXT: movdqa %xmm3, %xmm0 1035; SSSE3-NEXT: retq 1036; 1037; SSE41-LABEL: test16: 1038; SSE41: # %bb.0: # %vector.ph 1039; SSE41-NEXT: pxor %xmm4, %xmm4 1040; SSE41-NEXT: pmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1041; SSE41-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1042; SSE41-NEXT: movdqa %xmm2, %xmm4 1043; SSE41-NEXT: pmaxud %xmm0, %xmm4 1044; SSE41-NEXT: pcmpeqd %xmm2, %xmm4 1045; SSE41-NEXT: pcmpeqd %xmm5, %xmm5 1046; SSE41-NEXT: pxor %xmm5, %xmm4 1047; SSE41-NEXT: movdqa %xmm1, %xmm6 1048; SSE41-NEXT: pmaxud %xmm3, %xmm6 1049; SSE41-NEXT: pcmpeqd %xmm1, %xmm6 1050; SSE41-NEXT: pxor %xmm6, %xmm5 1051; SSE41-NEXT: packssdw %xmm4, %xmm5 1052; SSE41-NEXT: psubd %xmm1, %xmm3 1053; SSE41-NEXT: psubd %xmm2, %xmm0 1054; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1055; SSE41-NEXT: pshufb %xmm1, %xmm0 1056; SSE41-NEXT: pshufb %xmm1, %xmm3 1057; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 1058; SSE41-NEXT: pand %xmm5, %xmm3 1059; SSE41-NEXT: movdqa %xmm3, %xmm0 1060; SSE41-NEXT: retq 1061; 1062; AVX1-LABEL: test16: 1063; AVX1: # %bb.0: # %vector.ph 1064; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1065; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1066; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1067; AVX1-NEXT: vpmaxud %xmm0, %xmm1, %xmm3 1068; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3 1069; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1070; AVX1-NEXT: vpmaxud %xmm2, %xmm4, %xmm5 1071; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5 1072; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0 1073; AVX1-NEXT: vpandn %xmm0, %xmm3, %xmm0 1074; AVX1-NEXT: vpsubd %xmm4, %xmm2, %xmm1 1075; AVX1-NEXT: vpandn %xmm1, %xmm5, %xmm1 1076; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1077; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1078; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1079; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1080; AVX1-NEXT: vzeroupper 1081; AVX1-NEXT: retq 1082; 1083; AVX2-LABEL: test16: 1084; AVX2: # %bb.0: # %vector.ph 1085; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1086; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm2 1087; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 1088; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1089; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0 1090; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] 1091; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 1092; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1093; AVX2-NEXT: vzeroupper 1094; AVX2-NEXT: retq 1095; 1096; AVX512-LABEL: test16: 1097; AVX512: # %bb.0: # %vector.ph 1098; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1099; AVX512-NEXT: vpcmpltud %ymm0, %ymm1, %k1 1100; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1101; AVX512-NEXT: vpmovdw %ymm0, %xmm0 {%k1} {z} 1102; AVX512-NEXT: vzeroupper 1103; AVX512-NEXT: retq 1104vector.ph: 1105 %lhs = zext <8 x i16> %x to <8 x i32> 1106 %cond = icmp ult <8 x i32> %y, %lhs 1107 %sub = sub <8 x i32> %lhs, %y 1108 %truncsub = trunc <8 x i32> %sub to <8 x i16> 1109 %res = select <8 x i1> %cond, <8 x i16> %truncsub, <8 x i16> zeroinitializer 1110 ret <8 x i16> %res 1111} 1112 1113define <64 x i8> @test17(<64 x i8> %x, i8 zeroext %w) nounwind { 1114; SSE2-LABEL: test17: 1115; SSE2: # %bb.0: # %vector.ph 1116; SSE2-NEXT: movd %edi, %xmm4 1117; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1118; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,0,2,3,4,5,6,7] 1119; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0] 1120; SSE2-NEXT: psubusb %xmm4, %xmm0 1121; SSE2-NEXT: psubusb %xmm4, %xmm1 1122; SSE2-NEXT: psubusb %xmm4, %xmm2 1123; SSE2-NEXT: psubusb %xmm4, %xmm3 1124; SSE2-NEXT: retq 1125; 1126; SSSE3-LABEL: test17: 1127; SSSE3: # %bb.0: # %vector.ph 1128; SSSE3-NEXT: movd %edi, %xmm4 1129; SSSE3-NEXT: pxor %xmm5, %xmm5 1130; SSSE3-NEXT: pshufb %xmm5, %xmm4 1131; SSSE3-NEXT: psubusb %xmm4, %xmm0 1132; SSSE3-NEXT: psubusb %xmm4, %xmm1 1133; SSSE3-NEXT: psubusb %xmm4, %xmm2 1134; SSSE3-NEXT: psubusb %xmm4, %xmm3 1135; SSSE3-NEXT: retq 1136; 1137; SSE41-LABEL: test17: 1138; SSE41: # %bb.0: # %vector.ph 1139; SSE41-NEXT: movd %edi, %xmm4 1140; SSE41-NEXT: pxor %xmm5, %xmm5 1141; SSE41-NEXT: pshufb %xmm5, %xmm4 1142; SSE41-NEXT: psubusb %xmm4, %xmm0 1143; SSE41-NEXT: psubusb %xmm4, %xmm1 1144; SSE41-NEXT: psubusb %xmm4, %xmm2 1145; SSE41-NEXT: psubusb %xmm4, %xmm3 1146; SSE41-NEXT: retq 1147; 1148; AVX1-LABEL: test17: 1149; AVX1: # %bb.0: # %vector.ph 1150; AVX1-NEXT: vmovd %edi, %xmm2 1151; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 1152; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 1153; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1154; AVX1-NEXT: vpsubusb %xmm2, %xmm3, %xmm3 1155; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0 1156; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 1157; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1158; AVX1-NEXT: vpsubusb %xmm2, %xmm3, %xmm3 1159; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm1 1160; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1161; AVX1-NEXT: retq 1162; 1163; AVX2-LABEL: test17: 1164; AVX2: # %bb.0: # %vector.ph 1165; AVX2-NEXT: vmovd %edi, %xmm2 1166; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2 1167; AVX2-NEXT: vpsubusb %ymm2, %ymm0, %ymm0 1168; AVX2-NEXT: vpsubusb %ymm2, %ymm1, %ymm1 1169; AVX2-NEXT: retq 1170; 1171; AVX512-LABEL: test17: 1172; AVX512: # %bb.0: # %vector.ph 1173; AVX512-NEXT: vpbroadcastb %edi, %zmm1 1174; AVX512-NEXT: vpsubusb %zmm1, %zmm0, %zmm0 1175; AVX512-NEXT: retq 1176vector.ph: 1177 %0 = insertelement <64 x i8> undef, i8 %w, i32 0 1178 %broadcast15 = shufflevector <64 x i8> %0, <64 x i8> undef, <64 x i32> zeroinitializer 1179 %1 = icmp ult <64 x i8> %x, %broadcast15 1180 %2 = sub <64 x i8> %x, %broadcast15 1181 %res = select <64 x i1> %1, <64 x i8> zeroinitializer, <64 x i8> %2 1182 ret <64 x i8> %res 1183} 1184 1185define <32 x i16> @test18(<32 x i16> %x, i16 zeroext %w) nounwind { 1186; SSE-LABEL: test18: 1187; SSE: # %bb.0: # %vector.ph 1188; SSE-NEXT: movd %edi, %xmm4 1189; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm4[0,0,2,3,4,5,6,7] 1190; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0] 1191; SSE-NEXT: psubusw %xmm4, %xmm0 1192; SSE-NEXT: psubusw %xmm4, %xmm1 1193; SSE-NEXT: psubusw %xmm4, %xmm2 1194; SSE-NEXT: psubusw %xmm4, %xmm3 1195; SSE-NEXT: retq 1196; 1197; AVX1-LABEL: test18: 1198; AVX1: # %bb.0: # %vector.ph 1199; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1200; AVX1-NEXT: vmovd %edi, %xmm3 1201; AVX1-NEXT: vpshuflw {{.*#+}} xmm3 = xmm3[0,0,2,3,4,5,6,7] 1202; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,0,0,0] 1203; AVX1-NEXT: vpsubusw %xmm3, %xmm2, %xmm2 1204; AVX1-NEXT: vpsubusw %xmm3, %xmm0, %xmm0 1205; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1206; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1207; AVX1-NEXT: vpsubusw %xmm3, %xmm2, %xmm2 1208; AVX1-NEXT: vpsubusw %xmm3, %xmm1, %xmm1 1209; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1210; AVX1-NEXT: retq 1211; 1212; AVX2-LABEL: test18: 1213; AVX2: # %bb.0: # %vector.ph 1214; AVX2-NEXT: vmovd %edi, %xmm2 1215; AVX2-NEXT: vpbroadcastw %xmm2, %ymm2 1216; AVX2-NEXT: vpsubusw %ymm2, %ymm0, %ymm0 1217; AVX2-NEXT: vpsubusw %ymm2, %ymm1, %ymm1 1218; AVX2-NEXT: retq 1219; 1220; AVX512-LABEL: test18: 1221; AVX512: # %bb.0: # %vector.ph 1222; AVX512-NEXT: vpbroadcastw %edi, %zmm1 1223; AVX512-NEXT: vpsubusw %zmm1, %zmm0, %zmm0 1224; AVX512-NEXT: retq 1225vector.ph: 1226 %0 = insertelement <32 x i16> undef, i16 %w, i32 0 1227 %broadcast15 = shufflevector <32 x i16> %0, <32 x i16> undef, <32 x i32> zeroinitializer 1228 %1 = icmp ult <32 x i16> %x, %broadcast15 1229 %2 = sub <32 x i16> %x, %broadcast15 1230 %res = select <32 x i1> %1, <32 x i16> zeroinitializer, <32 x i16> %2 1231 ret <32 x i16> %res 1232} 1233 1234define <8 x i16> @psubus_8i16_max(<8 x i16> %x, <8 x i16> %y) nounwind { 1235; SSE-LABEL: psubus_8i16_max: 1236; SSE: # %bb.0: # %vector.ph 1237; SSE-NEXT: psubusw %xmm1, %xmm0 1238; SSE-NEXT: retq 1239; 1240; AVX-LABEL: psubus_8i16_max: 1241; AVX: # %bb.0: # %vector.ph 1242; AVX-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1243; AVX-NEXT: retq 1244vector.ph: 1245 %cmp = icmp ult <8 x i16> %x, %y 1246 %max = select <8 x i1> %cmp, <8 x i16> %y, <8 x i16> %x 1247 %res = sub <8 x i16> %max, %y 1248 ret <8 x i16> %res 1249} 1250 1251define <16 x i8> @psubus_16i8_max(<16 x i8> %x, <16 x i8> %y) nounwind { 1252; SSE-LABEL: psubus_16i8_max: 1253; SSE: # %bb.0: # %vector.ph 1254; SSE-NEXT: psubusb %xmm1, %xmm0 1255; SSE-NEXT: retq 1256; 1257; AVX-LABEL: psubus_16i8_max: 1258; AVX: # %bb.0: # %vector.ph 1259; AVX-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 1260; AVX-NEXT: retq 1261vector.ph: 1262 %cmp = icmp ult <16 x i8> %x, %y 1263 %max = select <16 x i1> %cmp, <16 x i8> %y, <16 x i8> %x 1264 %res = sub <16 x i8> %max, %y 1265 ret <16 x i8> %res 1266} 1267 1268define <16 x i16> @psubus_16i16_max(<16 x i16> %x, <16 x i16> %y) nounwind { 1269; SSE-LABEL: psubus_16i16_max: 1270; SSE: # %bb.0: # %vector.ph 1271; SSE-NEXT: psubusw %xmm2, %xmm0 1272; SSE-NEXT: psubusw %xmm3, %xmm1 1273; SSE-NEXT: retq 1274; 1275; AVX1-LABEL: psubus_16i16_max: 1276; AVX1: # %bb.0: # %vector.ph 1277; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1278; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1279; AVX1-NEXT: vpsubusw %xmm2, %xmm3, %xmm2 1280; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1281; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1282; AVX1-NEXT: retq 1283; 1284; AVX2-LABEL: psubus_16i16_max: 1285; AVX2: # %bb.0: # %vector.ph 1286; AVX2-NEXT: vpsubusw %ymm1, %ymm0, %ymm0 1287; AVX2-NEXT: retq 1288; 1289; AVX512-LABEL: psubus_16i16_max: 1290; AVX512: # %bb.0: # %vector.ph 1291; AVX512-NEXT: vpsubusw %ymm1, %ymm0, %ymm0 1292; AVX512-NEXT: retq 1293vector.ph: 1294 %cmp = icmp ult <16 x i16> %x, %y 1295 %max = select <16 x i1> %cmp, <16 x i16> %y, <16 x i16> %x 1296 %res = sub <16 x i16> %max, %y 1297 ret <16 x i16> %res 1298} 1299 1300define <32 x i16> @psubus_32i16_max(<32 x i16> %x, <32 x i16> %y) nounwind { 1301; SSE-LABEL: psubus_32i16_max: 1302; SSE: # %bb.0: # %vector.ph 1303; SSE-NEXT: psubusw %xmm4, %xmm0 1304; SSE-NEXT: psubusw %xmm5, %xmm1 1305; SSE-NEXT: psubusw %xmm6, %xmm2 1306; SSE-NEXT: psubusw %xmm7, %xmm3 1307; SSE-NEXT: retq 1308; 1309; AVX1-LABEL: psubus_32i16_max: 1310; AVX1: # %bb.0: # %vector.ph 1311; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1312; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1313; AVX1-NEXT: vpsubusw %xmm4, %xmm5, %xmm4 1314; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0 1315; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 1316; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 1317; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1318; AVX1-NEXT: vpsubusw %xmm2, %xmm4, %xmm2 1319; AVX1-NEXT: vpsubusw %xmm3, %xmm1, %xmm1 1320; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1321; AVX1-NEXT: retq 1322; 1323; AVX2-LABEL: psubus_32i16_max: 1324; AVX2: # %bb.0: # %vector.ph 1325; AVX2-NEXT: vpsubusw %ymm2, %ymm0, %ymm0 1326; AVX2-NEXT: vpsubusw %ymm3, %ymm1, %ymm1 1327; AVX2-NEXT: retq 1328; 1329; AVX512-LABEL: psubus_32i16_max: 1330; AVX512: # %bb.0: # %vector.ph 1331; AVX512-NEXT: vpsubusw %zmm1, %zmm0, %zmm0 1332; AVX512-NEXT: retq 1333vector.ph: 1334 %cmp = icmp ult <32 x i16> %x, %y 1335 %max = select <32 x i1> %cmp, <32 x i16> %y, <32 x i16> %x 1336 %res = sub <32 x i16> %max, %y 1337 ret <32 x i16> %res 1338} 1339 1340define <64 x i8> @psubus_64i8_max(<64 x i8> %x, <64 x i8> %y) nounwind { 1341; SSE-LABEL: psubus_64i8_max: 1342; SSE: # %bb.0: # %vector.ph 1343; SSE-NEXT: psubusb %xmm4, %xmm0 1344; SSE-NEXT: psubusb %xmm5, %xmm1 1345; SSE-NEXT: psubusb %xmm6, %xmm2 1346; SSE-NEXT: psubusb %xmm7, %xmm3 1347; SSE-NEXT: retq 1348; 1349; AVX1-LABEL: psubus_64i8_max: 1350; AVX1: # %bb.0: # %vector.ph 1351; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1352; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1353; AVX1-NEXT: vpsubusb %xmm4, %xmm5, %xmm4 1354; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0 1355; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 1356; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 1357; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1358; AVX1-NEXT: vpsubusb %xmm2, %xmm4, %xmm2 1359; AVX1-NEXT: vpsubusb %xmm3, %xmm1, %xmm1 1360; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1361; AVX1-NEXT: retq 1362; 1363; AVX2-LABEL: psubus_64i8_max: 1364; AVX2: # %bb.0: # %vector.ph 1365; AVX2-NEXT: vpsubusb %ymm2, %ymm0, %ymm0 1366; AVX2-NEXT: vpsubusb %ymm3, %ymm1, %ymm1 1367; AVX2-NEXT: retq 1368; 1369; AVX512-LABEL: psubus_64i8_max: 1370; AVX512: # %bb.0: # %vector.ph 1371; AVX512-NEXT: vpsubusb %zmm1, %zmm0, %zmm0 1372; AVX512-NEXT: retq 1373vector.ph: 1374 %cmp = icmp ult <64 x i8> %x, %y 1375 %max = select <64 x i1> %cmp, <64 x i8> %y, <64 x i8> %x 1376 %res = sub <64 x i8> %max, %y 1377 ret <64 x i8> %res 1378} 1379 1380define <32 x i8> @psubus_32i8_max(<32 x i8> %x, <32 x i8> %y) nounwind { 1381; SSE-LABEL: psubus_32i8_max: 1382; SSE: # %bb.0: # %vector.ph 1383; SSE-NEXT: psubusb %xmm2, %xmm0 1384; SSE-NEXT: psubusb %xmm3, %xmm1 1385; SSE-NEXT: retq 1386; 1387; AVX1-LABEL: psubus_32i8_max: 1388; AVX1: # %bb.0: # %vector.ph 1389; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1390; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1391; AVX1-NEXT: vpsubusb %xmm2, %xmm3, %xmm2 1392; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 1393; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1394; AVX1-NEXT: retq 1395; 1396; AVX2-LABEL: psubus_32i8_max: 1397; AVX2: # %bb.0: # %vector.ph 1398; AVX2-NEXT: vpsubusb %ymm1, %ymm0, %ymm0 1399; AVX2-NEXT: retq 1400; 1401; AVX512-LABEL: psubus_32i8_max: 1402; AVX512: # %bb.0: # %vector.ph 1403; AVX512-NEXT: vpsubusb %ymm1, %ymm0, %ymm0 1404; AVX512-NEXT: retq 1405vector.ph: 1406 %cmp = icmp ult <32 x i8> %x, %y 1407 %max = select <32 x i1> %cmp, <32 x i8> %y, <32 x i8> %x 1408 %res = sub <32 x i8> %max, %y 1409 ret <32 x i8> %res 1410} 1411 1412define <8 x i16> @psubus_8i32_max(<8 x i16> %x, <8 x i32> %y) nounwind { 1413; SSE2-LABEL: psubus_8i32_max: 1414; SSE2: # %bb.0: # %vector.ph 1415; SSE2-NEXT: movdqa %xmm0, %xmm3 1416; SSE2-NEXT: pxor %xmm4, %xmm4 1417; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3] 1418; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7] 1419; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648] 1420; SSE2-NEXT: movdqa %xmm2, %xmm6 1421; SSE2-NEXT: pxor %xmm5, %xmm6 1422; SSE2-NEXT: movdqa %xmm3, %xmm4 1423; SSE2-NEXT: por %xmm5, %xmm4 1424; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 1425; SSE2-NEXT: pand %xmm4, %xmm3 1426; SSE2-NEXT: pandn %xmm2, %xmm4 1427; SSE2-NEXT: por %xmm3, %xmm4 1428; SSE2-NEXT: movdqa %xmm1, %xmm3 1429; SSE2-NEXT: pxor %xmm5, %xmm3 1430; SSE2-NEXT: por %xmm0, %xmm5 1431; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 1432; SSE2-NEXT: pand %xmm5, %xmm0 1433; SSE2-NEXT: pandn %xmm1, %xmm5 1434; SSE2-NEXT: por %xmm5, %xmm0 1435; SSE2-NEXT: psubd %xmm1, %xmm0 1436; SSE2-NEXT: psubd %xmm2, %xmm4 1437; SSE2-NEXT: pslld $16, %xmm4 1438; SSE2-NEXT: psrad $16, %xmm4 1439; SSE2-NEXT: pslld $16, %xmm0 1440; SSE2-NEXT: psrad $16, %xmm0 1441; SSE2-NEXT: packssdw %xmm4, %xmm0 1442; SSE2-NEXT: retq 1443; 1444; SSSE3-LABEL: psubus_8i32_max: 1445; SSSE3: # %bb.0: # %vector.ph 1446; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1447; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 1448; SSSE3-NEXT: movdqa %xmm2, %xmm5 1449; SSSE3-NEXT: pxor %xmm4, %xmm5 1450; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183] 1451; SSSE3-NEXT: movdqa %xmm6, %xmm7 1452; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 1453; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535] 1454; SSSE3-NEXT: pand %xmm7, %xmm2 1455; SSSE3-NEXT: pandn %xmm5, %xmm7 1456; SSSE3-NEXT: por %xmm2, %xmm7 1457; SSSE3-NEXT: pshufb %xmm3, %xmm7 1458; SSSE3-NEXT: pxor %xmm1, %xmm4 1459; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 1460; SSSE3-NEXT: pand %xmm6, %xmm1 1461; SSSE3-NEXT: pandn %xmm5, %xmm6 1462; SSSE3-NEXT: por %xmm1, %xmm6 1463; SSSE3-NEXT: pshufb %xmm3, %xmm6 1464; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0] 1465; SSSE3-NEXT: psubusw %xmm6, %xmm0 1466; SSSE3-NEXT: retq 1467; 1468; SSE41-LABEL: psubus_8i32_max: 1469; SSE41: # %bb.0: # %vector.ph 1470; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535] 1471; SSE41-NEXT: pminud %xmm3, %xmm2 1472; SSE41-NEXT: pminud %xmm3, %xmm1 1473; SSE41-NEXT: packusdw %xmm2, %xmm1 1474; SSE41-NEXT: psubusw %xmm1, %xmm0 1475; SSE41-NEXT: retq 1476; 1477; AVX1-LABEL: psubus_8i32_max: 1478; AVX1: # %bb.0: # %vector.ph 1479; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1480; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535] 1481; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2 1482; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1 1483; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1484; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1485; AVX1-NEXT: vzeroupper 1486; AVX1-NEXT: retq 1487; 1488; AVX2-LABEL: psubus_8i32_max: 1489; AVX2: # %bb.0: # %vector.ph 1490; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535] 1491; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 1492; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 1493; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1494; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1495; AVX2-NEXT: vzeroupper 1496; AVX2-NEXT: retq 1497; 1498; AVX512-LABEL: psubus_8i32_max: 1499; AVX512: # %bb.0: # %vector.ph 1500; AVX512-NEXT: vpmovusdw %ymm1, %xmm1 1501; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1502; AVX512-NEXT: vzeroupper 1503; AVX512-NEXT: retq 1504vector.ph: 1505 %lhs = zext <8 x i16> %x to <8 x i32> 1506 %cond = icmp ult <8 x i32> %lhs, %y 1507 %max = select <8 x i1> %cond, <8 x i32> %y, <8 x i32> %lhs 1508 %sub = sub <8 x i32> %max, %y 1509 %res = trunc <8 x i32> %sub to <8 x i16> 1510 ret <8 x i16> %res 1511} 1512 1513define <8 x i16> @psubus_8i64_max(<8 x i16> %x, <8 x i64> %y) nounwind { 1514; SSE2-LABEL: psubus_8i64_max: 1515; SSE2: # %bb.0: # %vector.ph 1516; SSE2-NEXT: pxor %xmm5, %xmm5 1517; SSE2-NEXT: movdqa %xmm0, %xmm10 1518; SSE2-NEXT: punpckhwd {{.*#+}} xmm10 = xmm10[4],xmm5[4],xmm10[5],xmm5[5],xmm10[6],xmm5[6],xmm10[7],xmm5[7] 1519; SSE2-NEXT: movdqa %xmm10, %xmm8 1520; SSE2-NEXT: punpckldq {{.*#+}} xmm8 = xmm8[0],xmm5[0],xmm8[1],xmm5[1] 1521; SSE2-NEXT: punpckhdq {{.*#+}} xmm10 = xmm10[2],xmm5[2],xmm10[3],xmm5[3] 1522; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3] 1523; SSE2-NEXT: movdqa %xmm0, %xmm9 1524; SSE2-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm5[0],xmm9[1],xmm5[1] 1525; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm5[2],xmm0[3],xmm5[3] 1526; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002259456,9223372039002259456] 1527; SSE2-NEXT: movdqa %xmm2, %xmm6 1528; SSE2-NEXT: pxor %xmm11, %xmm6 1529; SSE2-NEXT: movdqa %xmm0, %xmm7 1530; SSE2-NEXT: por %xmm11, %xmm7 1531; SSE2-NEXT: movdqa %xmm7, %xmm5 1532; SSE2-NEXT: pcmpgtd %xmm6, %xmm5 1533; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm5[0,0,2,2] 1534; SSE2-NEXT: pcmpeqd %xmm6, %xmm7 1535; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1536; SSE2-NEXT: pand %xmm12, %xmm7 1537; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm5[1,1,3,3] 1538; SSE2-NEXT: por %xmm7, %xmm13 1539; SSE2-NEXT: pand %xmm13, %xmm0 1540; SSE2-NEXT: pandn %xmm2, %xmm13 1541; SSE2-NEXT: por %xmm0, %xmm13 1542; SSE2-NEXT: movdqa %xmm1, %xmm0 1543; SSE2-NEXT: pxor %xmm11, %xmm0 1544; SSE2-NEXT: movdqa %xmm9, %xmm5 1545; SSE2-NEXT: por %xmm11, %xmm5 1546; SSE2-NEXT: movdqa %xmm5, %xmm7 1547; SSE2-NEXT: pcmpgtd %xmm0, %xmm7 1548; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] 1549; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 1550; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1551; SSE2-NEXT: pand %xmm12, %xmm5 1552; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 1553; SSE2-NEXT: por %xmm5, %xmm0 1554; SSE2-NEXT: pand %xmm0, %xmm9 1555; SSE2-NEXT: pandn %xmm1, %xmm0 1556; SSE2-NEXT: por %xmm9, %xmm0 1557; SSE2-NEXT: movdqa %xmm4, %xmm5 1558; SSE2-NEXT: pxor %xmm11, %xmm5 1559; SSE2-NEXT: movdqa %xmm10, %xmm7 1560; SSE2-NEXT: por %xmm11, %xmm7 1561; SSE2-NEXT: movdqa %xmm7, %xmm6 1562; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 1563; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2] 1564; SSE2-NEXT: pcmpeqd %xmm5, %xmm7 1565; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1566; SSE2-NEXT: pand %xmm9, %xmm5 1567; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3] 1568; SSE2-NEXT: por %xmm5, %xmm7 1569; SSE2-NEXT: pand %xmm7, %xmm10 1570; SSE2-NEXT: pandn %xmm4, %xmm7 1571; SSE2-NEXT: por %xmm10, %xmm7 1572; SSE2-NEXT: movdqa %xmm3, %xmm5 1573; SSE2-NEXT: pxor %xmm11, %xmm5 1574; SSE2-NEXT: por %xmm8, %xmm11 1575; SSE2-NEXT: movdqa %xmm11, %xmm6 1576; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 1577; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2] 1578; SSE2-NEXT: pcmpeqd %xmm5, %xmm11 1579; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm11[1,1,3,3] 1580; SSE2-NEXT: pand %xmm9, %xmm5 1581; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1582; SSE2-NEXT: por %xmm5, %xmm6 1583; SSE2-NEXT: pand %xmm6, %xmm8 1584; SSE2-NEXT: pandn %xmm3, %xmm6 1585; SSE2-NEXT: por %xmm8, %xmm6 1586; SSE2-NEXT: psubq %xmm3, %xmm6 1587; SSE2-NEXT: psubq %xmm4, %xmm7 1588; SSE2-NEXT: psubq %xmm1, %xmm0 1589; SSE2-NEXT: psubq %xmm2, %xmm13 1590; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm13[0,2,2,3] 1591; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1592; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1593; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,2,2,3,4,5,6,7] 1594; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 1595; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,2,2,3] 1596; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 1597; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3] 1598; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 1599; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1600; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1] 1601; SSE2-NEXT: retq 1602; 1603; SSSE3-LABEL: psubus_8i64_max: 1604; SSSE3: # %bb.0: # %vector.ph 1605; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] 1606; SSSE3-NEXT: movdqa %xmm2, %xmm7 1607; SSSE3-NEXT: pxor %xmm5, %xmm7 1608; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002324991,9223372039002324991] 1609; SSSE3-NEXT: movdqa %xmm8, %xmm6 1610; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6 1611; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2] 1612; SSSE3-NEXT: pcmpeqd %xmm8, %xmm7 1613; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1614; SSSE3-NEXT: pand %xmm9, %xmm7 1615; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1616; SSSE3-NEXT: por %xmm7, %xmm6 1617; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [65535,65535] 1618; SSSE3-NEXT: pand %xmm6, %xmm2 1619; SSSE3-NEXT: pandn %xmm9, %xmm6 1620; SSSE3-NEXT: por %xmm2, %xmm6 1621; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,2,2,3] 1622; SSSE3-NEXT: pshuflw {{.*#+}} xmm10 = xmm2[0,2,2,3,4,5,6,7] 1623; SSSE3-NEXT: movdqa %xmm1, %xmm6 1624; SSSE3-NEXT: pxor %xmm5, %xmm6 1625; SSSE3-NEXT: movdqa %xmm8, %xmm7 1626; SSSE3-NEXT: pcmpgtd %xmm6, %xmm7 1627; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2] 1628; SSSE3-NEXT: pcmpeqd %xmm8, %xmm6 1629; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1630; SSSE3-NEXT: pand %xmm2, %xmm6 1631; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3] 1632; SSSE3-NEXT: por %xmm6, %xmm2 1633; SSSE3-NEXT: pand %xmm2, %xmm1 1634; SSSE3-NEXT: pandn %xmm9, %xmm2 1635; SSSE3-NEXT: por %xmm1, %xmm2 1636; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 1637; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1638; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm10[0],xmm1[1],xmm10[1] 1639; SSSE3-NEXT: movdqa %xmm4, %xmm2 1640; SSSE3-NEXT: pxor %xmm5, %xmm2 1641; SSSE3-NEXT: movdqa %xmm8, %xmm6 1642; SSSE3-NEXT: pcmpgtd %xmm2, %xmm6 1643; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1644; SSSE3-NEXT: pcmpeqd %xmm8, %xmm2 1645; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1646; SSSE3-NEXT: pand %xmm7, %xmm2 1647; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1648; SSSE3-NEXT: por %xmm2, %xmm6 1649; SSSE3-NEXT: pand %xmm6, %xmm4 1650; SSSE3-NEXT: pandn %xmm9, %xmm6 1651; SSSE3-NEXT: por %xmm4, %xmm6 1652; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,2,2,3] 1653; SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,0,2,4,5,6,7] 1654; SSSE3-NEXT: pxor %xmm3, %xmm5 1655; SSSE3-NEXT: movdqa %xmm8, %xmm4 1656; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 1657; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1658; SSSE3-NEXT: pcmpeqd %xmm8, %xmm5 1659; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1660; SSSE3-NEXT: pand %xmm6, %xmm5 1661; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1662; SSSE3-NEXT: por %xmm5, %xmm4 1663; SSSE3-NEXT: pand %xmm4, %xmm3 1664; SSSE3-NEXT: pandn %xmm9, %xmm4 1665; SSSE3-NEXT: por %xmm3, %xmm4 1666; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3] 1667; SSSE3-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,1,0,2,4,5,6,7] 1668; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 1669; SSSE3-NEXT: movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1] 1670; SSSE3-NEXT: psubusw %xmm3, %xmm0 1671; SSSE3-NEXT: retq 1672; 1673; SSE41-LABEL: psubus_8i64_max: 1674; SSE41: # %bb.0: # %vector.ph 1675; SSE41-NEXT: movdqa %xmm0, %xmm8 1676; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456] 1677; SSE41-NEXT: movdqa %xmm4, %xmm0 1678; SSE41-NEXT: pxor %xmm6, %xmm0 1679; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991] 1680; SSE41-NEXT: movdqa %xmm9, %xmm7 1681; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 1682; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] 1683; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1684; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1685; SSE41-NEXT: pand %xmm5, %xmm0 1686; SSE41-NEXT: por %xmm7, %xmm0 1687; SSE41-NEXT: movapd {{.*#+}} xmm7 = [65535,65535] 1688; SSE41-NEXT: movapd %xmm7, %xmm5 1689; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm5 1690; SSE41-NEXT: movdqa %xmm3, %xmm0 1691; SSE41-NEXT: pxor %xmm6, %xmm0 1692; SSE41-NEXT: movdqa %xmm9, %xmm4 1693; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1694; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2] 1695; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1696; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1697; SSE41-NEXT: pand %xmm10, %xmm0 1698; SSE41-NEXT: por %xmm4, %xmm0 1699; SSE41-NEXT: movapd %xmm7, %xmm4 1700; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4 1701; SSE41-NEXT: packusdw %xmm5, %xmm4 1702; SSE41-NEXT: movdqa %xmm2, %xmm0 1703; SSE41-NEXT: pxor %xmm6, %xmm0 1704; SSE41-NEXT: movdqa %xmm9, %xmm3 1705; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 1706; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 1707; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1708; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1709; SSE41-NEXT: pand %xmm5, %xmm0 1710; SSE41-NEXT: por %xmm3, %xmm0 1711; SSE41-NEXT: movapd %xmm7, %xmm3 1712; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3 1713; SSE41-NEXT: pxor %xmm1, %xmm6 1714; SSE41-NEXT: movdqa %xmm9, %xmm2 1715; SSE41-NEXT: pcmpgtd %xmm6, %xmm2 1716; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 1717; SSE41-NEXT: pcmpeqd %xmm9, %xmm6 1718; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1719; SSE41-NEXT: pand %xmm5, %xmm0 1720; SSE41-NEXT: por %xmm2, %xmm0 1721; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7 1722; SSE41-NEXT: packusdw %xmm3, %xmm7 1723; SSE41-NEXT: packusdw %xmm4, %xmm7 1724; SSE41-NEXT: psubusw %xmm7, %xmm8 1725; SSE41-NEXT: movdqa %xmm8, %xmm0 1726; SSE41-NEXT: retq 1727; 1728; AVX1-LABEL: psubus_8i64_max: 1729; AVX1: # %bb.0: # %vector.ph 1730; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1731; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] 1732; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 1733; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854841343,9223372036854841343] 1734; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 1735; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm6 1736; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6 1737; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3 1738; AVX1-NEXT: vmovapd {{.*#+}} ymm6 = [65535,65535,65535,65535] 1739; AVX1-NEXT: vblendvpd %ymm3, %ymm2, %ymm6, %ymm2 1740; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1741; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 1742; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1743; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 1744; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 1745; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4 1746; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 1747; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 1748; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm6, %ymm1 1749; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1750; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 1751; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1752; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1753; AVX1-NEXT: vzeroupper 1754; AVX1-NEXT: retq 1755; 1756; AVX2-LABEL: psubus_8i64_max: 1757; AVX2: # %bb.0: # %vector.ph 1758; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1759; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm4 1760; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343] 1761; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 1762; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [65535,65535,65535,65535] 1763; AVX2-NEXT: vblendvpd %ymm4, %ymm2, %ymm6, %ymm2 1764; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3 1765; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3 1766; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm6, %ymm1 1767; AVX2-NEXT: vpackusdw %ymm2, %ymm1, %ymm1 1768; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] 1769; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 1770; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1771; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1772; AVX2-NEXT: vzeroupper 1773; AVX2-NEXT: retq 1774; 1775; AVX512-LABEL: psubus_8i64_max: 1776; AVX512: # %bb.0: # %vector.ph 1777; AVX512-NEXT: vpmovusqw %zmm1, %xmm1 1778; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1779; AVX512-NEXT: vzeroupper 1780; AVX512-NEXT: retq 1781vector.ph: 1782 %lhs = zext <8 x i16> %x to <8 x i64> 1783 %cond = icmp ult <8 x i64> %lhs, %y 1784 %max = select <8 x i1> %cond, <8 x i64> %y, <8 x i64> %lhs 1785 %sub = sub <8 x i64> %max, %y 1786 %res = trunc <8 x i64> %sub to <8 x i16> 1787 ret <8 x i16> %res 1788} 1789 1790define <16 x i16> @psubus_16i32_max(<16 x i16> %x, <16 x i32> %y) nounwind { 1791; SSE2-LABEL: psubus_16i32_max: 1792; SSE2: # %bb.0: # %vector.ph 1793; SSE2-NEXT: movdqa %xmm1, %xmm8 1794; SSE2-NEXT: pxor %xmm7, %xmm7 1795; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[1],xmm7[1],xmm1[2],xmm7[2],xmm1[3],xmm7[3] 1796; SSE2-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm7[4],xmm8[5],xmm7[5],xmm8[6],xmm7[6],xmm8[7],xmm7[7] 1797; SSE2-NEXT: movdqa %xmm0, %xmm10 1798; SSE2-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3] 1799; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm7[4],xmm0[5],xmm7[5],xmm0[6],xmm7[6],xmm0[7],xmm7[7] 1800; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648] 1801; SSE2-NEXT: movdqa %xmm3, %xmm6 1802; SSE2-NEXT: pxor %xmm7, %xmm6 1803; SSE2-NEXT: movdqa %xmm0, %xmm9 1804; SSE2-NEXT: por %xmm7, %xmm9 1805; SSE2-NEXT: pcmpgtd %xmm6, %xmm9 1806; SSE2-NEXT: pand %xmm9, %xmm0 1807; SSE2-NEXT: pandn %xmm3, %xmm9 1808; SSE2-NEXT: por %xmm0, %xmm9 1809; SSE2-NEXT: movdqa %xmm2, %xmm6 1810; SSE2-NEXT: pxor %xmm7, %xmm6 1811; SSE2-NEXT: movdqa %xmm10, %xmm0 1812; SSE2-NEXT: por %xmm7, %xmm0 1813; SSE2-NEXT: pcmpgtd %xmm6, %xmm0 1814; SSE2-NEXT: pand %xmm0, %xmm10 1815; SSE2-NEXT: pandn %xmm2, %xmm0 1816; SSE2-NEXT: por %xmm10, %xmm0 1817; SSE2-NEXT: movdqa %xmm5, %xmm10 1818; SSE2-NEXT: pxor %xmm7, %xmm10 1819; SSE2-NEXT: movdqa %xmm8, %xmm6 1820; SSE2-NEXT: por %xmm7, %xmm6 1821; SSE2-NEXT: pcmpgtd %xmm10, %xmm6 1822; SSE2-NEXT: pand %xmm6, %xmm8 1823; SSE2-NEXT: pandn %xmm5, %xmm6 1824; SSE2-NEXT: por %xmm8, %xmm6 1825; SSE2-NEXT: movdqa %xmm4, %xmm8 1826; SSE2-NEXT: pxor %xmm7, %xmm8 1827; SSE2-NEXT: por %xmm1, %xmm7 1828; SSE2-NEXT: pcmpgtd %xmm8, %xmm7 1829; SSE2-NEXT: pand %xmm7, %xmm1 1830; SSE2-NEXT: pandn %xmm4, %xmm7 1831; SSE2-NEXT: por %xmm7, %xmm1 1832; SSE2-NEXT: psubd %xmm4, %xmm1 1833; SSE2-NEXT: psubd %xmm5, %xmm6 1834; SSE2-NEXT: psubd %xmm2, %xmm0 1835; SSE2-NEXT: psubd %xmm3, %xmm9 1836; SSE2-NEXT: pslld $16, %xmm9 1837; SSE2-NEXT: psrad $16, %xmm9 1838; SSE2-NEXT: pslld $16, %xmm0 1839; SSE2-NEXT: psrad $16, %xmm0 1840; SSE2-NEXT: packssdw %xmm9, %xmm0 1841; SSE2-NEXT: pslld $16, %xmm6 1842; SSE2-NEXT: psrad $16, %xmm6 1843; SSE2-NEXT: pslld $16, %xmm1 1844; SSE2-NEXT: psrad $16, %xmm1 1845; SSE2-NEXT: packssdw %xmm6, %xmm1 1846; SSE2-NEXT: retq 1847; 1848; SSSE3-LABEL: psubus_16i32_max: 1849; SSSE3: # %bb.0: # %vector.ph 1850; SSSE3-NEXT: movdqa %xmm1, %xmm8 1851; SSSE3-NEXT: pxor %xmm7, %xmm7 1852; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[1],xmm7[1],xmm1[2],xmm7[2],xmm1[3],xmm7[3] 1853; SSSE3-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm7[4],xmm8[5],xmm7[5],xmm8[6],xmm7[6],xmm8[7],xmm7[7] 1854; SSSE3-NEXT: movdqa %xmm0, %xmm10 1855; SSSE3-NEXT: punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3] 1856; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm7[4],xmm0[5],xmm7[5],xmm0[6],xmm7[6],xmm0[7],xmm7[7] 1857; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648] 1858; SSSE3-NEXT: movdqa %xmm3, %xmm6 1859; SSSE3-NEXT: pxor %xmm7, %xmm6 1860; SSSE3-NEXT: movdqa %xmm0, %xmm9 1861; SSSE3-NEXT: por %xmm7, %xmm9 1862; SSSE3-NEXT: pcmpgtd %xmm6, %xmm9 1863; SSSE3-NEXT: pand %xmm9, %xmm0 1864; SSSE3-NEXT: pandn %xmm3, %xmm9 1865; SSSE3-NEXT: por %xmm0, %xmm9 1866; SSSE3-NEXT: movdqa %xmm2, %xmm6 1867; SSSE3-NEXT: pxor %xmm7, %xmm6 1868; SSSE3-NEXT: movdqa %xmm10, %xmm0 1869; SSSE3-NEXT: por %xmm7, %xmm0 1870; SSSE3-NEXT: pcmpgtd %xmm6, %xmm0 1871; SSSE3-NEXT: pand %xmm0, %xmm10 1872; SSSE3-NEXT: pandn %xmm2, %xmm0 1873; SSSE3-NEXT: por %xmm10, %xmm0 1874; SSSE3-NEXT: movdqa %xmm5, %xmm10 1875; SSSE3-NEXT: pxor %xmm7, %xmm10 1876; SSSE3-NEXT: movdqa %xmm8, %xmm6 1877; SSSE3-NEXT: por %xmm7, %xmm6 1878; SSSE3-NEXT: pcmpgtd %xmm10, %xmm6 1879; SSSE3-NEXT: pand %xmm6, %xmm8 1880; SSSE3-NEXT: pandn %xmm5, %xmm6 1881; SSSE3-NEXT: por %xmm8, %xmm6 1882; SSSE3-NEXT: movdqa %xmm4, %xmm8 1883; SSSE3-NEXT: pxor %xmm7, %xmm8 1884; SSSE3-NEXT: por %xmm1, %xmm7 1885; SSSE3-NEXT: pcmpgtd %xmm8, %xmm7 1886; SSSE3-NEXT: pand %xmm7, %xmm1 1887; SSSE3-NEXT: pandn %xmm4, %xmm7 1888; SSSE3-NEXT: por %xmm7, %xmm1 1889; SSSE3-NEXT: psubd %xmm4, %xmm1 1890; SSSE3-NEXT: psubd %xmm5, %xmm6 1891; SSSE3-NEXT: psubd %xmm2, %xmm0 1892; SSSE3-NEXT: psubd %xmm3, %xmm9 1893; SSSE3-NEXT: pslld $16, %xmm9 1894; SSSE3-NEXT: psrad $16, %xmm9 1895; SSSE3-NEXT: pslld $16, %xmm0 1896; SSSE3-NEXT: psrad $16, %xmm0 1897; SSSE3-NEXT: packssdw %xmm9, %xmm0 1898; SSSE3-NEXT: pslld $16, %xmm6 1899; SSSE3-NEXT: psrad $16, %xmm6 1900; SSSE3-NEXT: pslld $16, %xmm1 1901; SSSE3-NEXT: psrad $16, %xmm1 1902; SSSE3-NEXT: packssdw %xmm6, %xmm1 1903; SSSE3-NEXT: retq 1904; 1905; SSE41-LABEL: psubus_16i32_max: 1906; SSE41: # %bb.0: # %vector.ph 1907; SSE41-NEXT: pxor %xmm8, %xmm8 1908; SSE41-NEXT: pmovzxwd {{.*#+}} xmm6 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero 1909; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm8[4],xmm1[5],xmm8[5],xmm1[6],xmm8[6],xmm1[7],xmm8[7] 1910; SSE41-NEXT: pmovzxwd {{.*#+}} xmm7 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 1911; SSE41-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm8[4],xmm0[5],xmm8[5],xmm0[6],xmm8[6],xmm0[7],xmm8[7] 1912; SSE41-NEXT: pmaxud %xmm3, %xmm0 1913; SSE41-NEXT: pmaxud %xmm2, %xmm7 1914; SSE41-NEXT: pmaxud %xmm5, %xmm1 1915; SSE41-NEXT: pmaxud %xmm4, %xmm6 1916; SSE41-NEXT: psubd %xmm4, %xmm6 1917; SSE41-NEXT: psubd %xmm5, %xmm1 1918; SSE41-NEXT: psubd %xmm2, %xmm7 1919; SSE41-NEXT: psubd %xmm3, %xmm0 1920; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm8[1],xmm0[2],xmm8[3],xmm0[4],xmm8[5],xmm0[6],xmm8[7] 1921; SSE41-NEXT: pblendw {{.*#+}} xmm7 = xmm7[0],xmm8[1],xmm7[2],xmm8[3],xmm7[4],xmm8[5],xmm7[6],xmm8[7] 1922; SSE41-NEXT: packusdw %xmm0, %xmm7 1923; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm8[1],xmm1[2],xmm8[3],xmm1[4],xmm8[5],xmm1[6],xmm8[7] 1924; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0],xmm8[1],xmm6[2],xmm8[3],xmm6[4],xmm8[5],xmm6[6],xmm8[7] 1925; SSE41-NEXT: packusdw %xmm1, %xmm6 1926; SSE41-NEXT: movdqa %xmm7, %xmm0 1927; SSE41-NEXT: movdqa %xmm6, %xmm1 1928; SSE41-NEXT: retq 1929; 1930; AVX1-LABEL: psubus_16i32_max: 1931; AVX1: # %bb.0: # %vector.ph 1932; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1933; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [65535,65535,65535,65535] 1934; AVX1-NEXT: vpminud %xmm4, %xmm3, %xmm3 1935; AVX1-NEXT: vpminud %xmm4, %xmm1, %xmm1 1936; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 1937; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1938; AVX1-NEXT: vpminud %xmm4, %xmm3, %xmm3 1939; AVX1-NEXT: vpminud %xmm4, %xmm2, %xmm2 1940; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 1941; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1942; AVX1-NEXT: vpsubusw %xmm2, %xmm3, %xmm2 1943; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1944; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1945; AVX1-NEXT: retq 1946; 1947; AVX2-LABEL: psubus_16i32_max: 1948; AVX2: # %bb.0: # %vector.ph 1949; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [65535,65535,65535,65535,65535,65535,65535,65535] 1950; AVX2-NEXT: vpminud %ymm3, %ymm1, %ymm1 1951; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm4 1952; AVX2-NEXT: vpackusdw %xmm4, %xmm1, %xmm1 1953; AVX2-NEXT: vpminud %ymm3, %ymm2, %ymm2 1954; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3 1955; AVX2-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 1956; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 1957; AVX2-NEXT: vpsubusw %xmm2, %xmm3, %xmm2 1958; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 1959; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1960; AVX2-NEXT: retq 1961; 1962; AVX512-LABEL: psubus_16i32_max: 1963; AVX512: # %bb.0: # %vector.ph 1964; AVX512-NEXT: vpmovusdw %zmm1, %ymm1 1965; AVX512-NEXT: vpsubusw %ymm1, %ymm0, %ymm0 1966; AVX512-NEXT: retq 1967vector.ph: 1968 %lhs = zext <16 x i16> %x to <16 x i32> 1969 %cond = icmp ult <16 x i32> %lhs, %y 1970 %max = select <16 x i1> %cond, <16 x i32> %y, <16 x i32> %lhs 1971 %sub = sub <16 x i32> %max, %y 1972 %res = trunc <16 x i32> %sub to <16 x i16> 1973 ret <16 x i16> %res 1974} 1975 1976define <8 x i16> @psubus_i16_i32_max_swapped(<8 x i16> %x, <8 x i32> %y) nounwind { 1977; SSE2-LABEL: psubus_i16_i32_max_swapped: 1978; SSE2: # %bb.0: # %vector.ph 1979; SSE2-NEXT: pxor %xmm3, %xmm3 1980; SSE2-NEXT: movdqa %xmm0, %xmm4 1981; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3] 1982; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1983; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648] 1984; SSE2-NEXT: movdqa %xmm2, %xmm3 1985; SSE2-NEXT: pxor %xmm5, %xmm3 1986; SSE2-NEXT: movdqa %xmm0, %xmm6 1987; SSE2-NEXT: por %xmm5, %xmm6 1988; SSE2-NEXT: pcmpgtd %xmm6, %xmm3 1989; SSE2-NEXT: movdqa %xmm2, %xmm6 1990; SSE2-NEXT: pand %xmm3, %xmm6 1991; SSE2-NEXT: pandn %xmm0, %xmm3 1992; SSE2-NEXT: por %xmm6, %xmm3 1993; SSE2-NEXT: movdqa %xmm1, %xmm0 1994; SSE2-NEXT: pxor %xmm5, %xmm0 1995; SSE2-NEXT: por %xmm4, %xmm5 1996; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 1997; SSE2-NEXT: movdqa %xmm1, %xmm5 1998; SSE2-NEXT: pand %xmm0, %xmm5 1999; SSE2-NEXT: pandn %xmm4, %xmm0 2000; SSE2-NEXT: por %xmm5, %xmm0 2001; SSE2-NEXT: psubd %xmm1, %xmm0 2002; SSE2-NEXT: psubd %xmm2, %xmm3 2003; SSE2-NEXT: pslld $16, %xmm3 2004; SSE2-NEXT: psrad $16, %xmm3 2005; SSE2-NEXT: pslld $16, %xmm0 2006; SSE2-NEXT: psrad $16, %xmm0 2007; SSE2-NEXT: packssdw %xmm3, %xmm0 2008; SSE2-NEXT: retq 2009; 2010; SSSE3-LABEL: psubus_i16_i32_max_swapped: 2011; SSSE3: # %bb.0: # %vector.ph 2012; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2013; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 2014; SSSE3-NEXT: movdqa %xmm2, %xmm5 2015; SSSE3-NEXT: pxor %xmm4, %xmm5 2016; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183] 2017; SSSE3-NEXT: movdqa %xmm6, %xmm7 2018; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 2019; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535] 2020; SSSE3-NEXT: pand %xmm7, %xmm2 2021; SSSE3-NEXT: pandn %xmm5, %xmm7 2022; SSSE3-NEXT: por %xmm2, %xmm7 2023; SSSE3-NEXT: pshufb %xmm3, %xmm7 2024; SSSE3-NEXT: pxor %xmm1, %xmm4 2025; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 2026; SSSE3-NEXT: pand %xmm6, %xmm1 2027; SSSE3-NEXT: pandn %xmm5, %xmm6 2028; SSSE3-NEXT: por %xmm1, %xmm6 2029; SSSE3-NEXT: pshufb %xmm3, %xmm6 2030; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0] 2031; SSSE3-NEXT: psubusw %xmm6, %xmm0 2032; SSSE3-NEXT: retq 2033; 2034; SSE41-LABEL: psubus_i16_i32_max_swapped: 2035; SSE41: # %bb.0: # %vector.ph 2036; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535] 2037; SSE41-NEXT: pminud %xmm3, %xmm2 2038; SSE41-NEXT: pminud %xmm3, %xmm1 2039; SSE41-NEXT: packusdw %xmm2, %xmm1 2040; SSE41-NEXT: psubusw %xmm1, %xmm0 2041; SSE41-NEXT: retq 2042; 2043; AVX1-LABEL: psubus_i16_i32_max_swapped: 2044; AVX1: # %bb.0: # %vector.ph 2045; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2046; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535] 2047; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2 2048; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1 2049; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 2050; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2051; AVX1-NEXT: vzeroupper 2052; AVX1-NEXT: retq 2053; 2054; AVX2-LABEL: psubus_i16_i32_max_swapped: 2055; AVX2: # %bb.0: # %vector.ph 2056; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535] 2057; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 2058; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2059; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 2060; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2061; AVX2-NEXT: vzeroupper 2062; AVX2-NEXT: retq 2063; 2064; AVX512-LABEL: psubus_i16_i32_max_swapped: 2065; AVX512: # %bb.0: # %vector.ph 2066; AVX512-NEXT: vpmovusdw %ymm1, %xmm1 2067; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2068; AVX512-NEXT: vzeroupper 2069; AVX512-NEXT: retq 2070vector.ph: 2071 %lhs = zext <8 x i16> %x to <8 x i32> 2072 %cond = icmp ult <8 x i32> %y, %lhs 2073 %max = select <8 x i1> %cond, <8 x i32> %lhs, <8 x i32> %y 2074 %sub = sub <8 x i32> %max, %y 2075 %res = trunc <8 x i32> %sub to <8 x i16> 2076 ret <8 x i16> %res 2077} 2078 2079define <8 x i16> @psubus_i16_i32_min(<8 x i16> %x, <8 x i32> %y) nounwind { 2080; SSE2-LABEL: psubus_i16_i32_min: 2081; SSE2: # %bb.0: # %vector.ph 2082; SSE2-NEXT: pxor %xmm4, %xmm4 2083; SSE2-NEXT: movdqa %xmm0, %xmm3 2084; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3] 2085; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 2086; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 2087; SSE2-NEXT: movdqa %xmm2, %xmm5 2088; SSE2-NEXT: pxor %xmm4, %xmm5 2089; SSE2-NEXT: movdqa %xmm0, %xmm6 2090; SSE2-NEXT: por %xmm4, %xmm6 2091; SSE2-NEXT: pcmpgtd %xmm6, %xmm5 2092; SSE2-NEXT: movdqa %xmm0, %xmm6 2093; SSE2-NEXT: pand %xmm5, %xmm6 2094; SSE2-NEXT: pandn %xmm2, %xmm5 2095; SSE2-NEXT: por %xmm6, %xmm5 2096; SSE2-NEXT: movdqa %xmm1, %xmm2 2097; SSE2-NEXT: pxor %xmm4, %xmm2 2098; SSE2-NEXT: por %xmm3, %xmm4 2099; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 2100; SSE2-NEXT: movdqa %xmm3, %xmm4 2101; SSE2-NEXT: pand %xmm2, %xmm4 2102; SSE2-NEXT: pandn %xmm1, %xmm2 2103; SSE2-NEXT: por %xmm4, %xmm2 2104; SSE2-NEXT: psubd %xmm2, %xmm3 2105; SSE2-NEXT: psubd %xmm5, %xmm0 2106; SSE2-NEXT: pslld $16, %xmm0 2107; SSE2-NEXT: psrad $16, %xmm0 2108; SSE2-NEXT: pslld $16, %xmm3 2109; SSE2-NEXT: psrad $16, %xmm3 2110; SSE2-NEXT: packssdw %xmm0, %xmm3 2111; SSE2-NEXT: movdqa %xmm3, %xmm0 2112; SSE2-NEXT: retq 2113; 2114; SSSE3-LABEL: psubus_i16_i32_min: 2115; SSSE3: # %bb.0: # %vector.ph 2116; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2117; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 2118; SSSE3-NEXT: movdqa %xmm2, %xmm5 2119; SSSE3-NEXT: pxor %xmm4, %xmm5 2120; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183] 2121; SSSE3-NEXT: movdqa %xmm6, %xmm7 2122; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 2123; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535] 2124; SSSE3-NEXT: pand %xmm7, %xmm2 2125; SSSE3-NEXT: pandn %xmm5, %xmm7 2126; SSSE3-NEXT: por %xmm2, %xmm7 2127; SSSE3-NEXT: pshufb %xmm3, %xmm7 2128; SSSE3-NEXT: pxor %xmm1, %xmm4 2129; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 2130; SSSE3-NEXT: pand %xmm6, %xmm1 2131; SSSE3-NEXT: pandn %xmm5, %xmm6 2132; SSSE3-NEXT: por %xmm1, %xmm6 2133; SSSE3-NEXT: pshufb %xmm3, %xmm6 2134; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0] 2135; SSSE3-NEXT: psubusw %xmm6, %xmm0 2136; SSSE3-NEXT: retq 2137; 2138; SSE41-LABEL: psubus_i16_i32_min: 2139; SSE41: # %bb.0: # %vector.ph 2140; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535] 2141; SSE41-NEXT: pminud %xmm3, %xmm2 2142; SSE41-NEXT: pminud %xmm3, %xmm1 2143; SSE41-NEXT: packusdw %xmm2, %xmm1 2144; SSE41-NEXT: psubusw %xmm1, %xmm0 2145; SSE41-NEXT: retq 2146; 2147; AVX1-LABEL: psubus_i16_i32_min: 2148; AVX1: # %bb.0: # %vector.ph 2149; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2150; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535] 2151; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2 2152; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1 2153; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 2154; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2155; AVX1-NEXT: vzeroupper 2156; AVX1-NEXT: retq 2157; 2158; AVX2-LABEL: psubus_i16_i32_min: 2159; AVX2: # %bb.0: # %vector.ph 2160; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535] 2161; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 2162; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2163; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 2164; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2165; AVX2-NEXT: vzeroupper 2166; AVX2-NEXT: retq 2167; 2168; AVX512-LABEL: psubus_i16_i32_min: 2169; AVX512: # %bb.0: # %vector.ph 2170; AVX512-NEXT: vpmovusdw %ymm1, %xmm1 2171; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2172; AVX512-NEXT: vzeroupper 2173; AVX512-NEXT: retq 2174vector.ph: 2175 %lhs = zext <8 x i16> %x to <8 x i32> 2176 %cond = icmp ult <8 x i32> %lhs, %y 2177 %min = select <8 x i1> %cond, <8 x i32> %lhs, <8 x i32> %y 2178 %sub = sub <8 x i32> %lhs, %min 2179 %res = trunc <8 x i32> %sub to <8 x i16> 2180 ret <8 x i16> %res 2181} 2182 2183define void @subus_v8i8(<8 x i8>* %p1, <8 x i8>* %p2) { 2184; SSE-LABEL: subus_v8i8: 2185; SSE: # %bb.0: 2186; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 2187; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 2188; SSE-NEXT: psubusb %xmm1, %xmm0 2189; SSE-NEXT: movq %xmm0, (%rdi) 2190; SSE-NEXT: retq 2191; 2192; AVX1-LABEL: subus_v8i8: 2193; AVX1: # %bb.0: 2194; AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2195; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2196; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2197; AVX1-NEXT: vmovq %xmm0, (%rdi) 2198; AVX1-NEXT: retq 2199; 2200; AVX2-LABEL: subus_v8i8: 2201; AVX2: # %bb.0: 2202; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2203; AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2204; AVX2-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2205; AVX2-NEXT: vmovq %xmm0, (%rdi) 2206; AVX2-NEXT: retq 2207; 2208; AVX512-LABEL: subus_v8i8: 2209; AVX512: # %bb.0: 2210; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2211; AVX512-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2212; AVX512-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2213; AVX512-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 2214; AVX512-NEXT: vpmovwb %xmm0, (%rdi) 2215; AVX512-NEXT: retq 2216 %ld1 = load <8 x i8>, <8 x i8>* %p1, align 8 2217 %ld2 = load <8 x i8>, <8 x i8>* %p2, align 8 2218 %1 = sub <8 x i8> %ld1, %ld2 2219 %2 = icmp ugt <8 x i8> %ld1, %ld2 2220 %sh3 = select <8 x i1> %2, <8 x i8> %1, <8 x i8> zeroinitializer 2221 store <8 x i8> %sh3, <8 x i8>* %p1, align 8 2222 ret void 2223} 2224 2225define void @subus_v4i8(<4 x i8>* %p1, <4 x i8>* %p2) { 2226; SSE-LABEL: subus_v4i8: 2227; SSE: # %bb.0: 2228; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2229; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2230; SSE-NEXT: psubusb %xmm1, %xmm0 2231; SSE-NEXT: movd %xmm0, (%rdi) 2232; SSE-NEXT: retq 2233; 2234; AVX1-LABEL: subus_v4i8: 2235; AVX1: # %bb.0: 2236; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2237; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2238; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2239; AVX1-NEXT: vmovd %xmm0, (%rdi) 2240; AVX1-NEXT: retq 2241; 2242; AVX2-LABEL: subus_v4i8: 2243; AVX2: # %bb.0: 2244; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2245; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2246; AVX2-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2247; AVX2-NEXT: vmovd %xmm0, (%rdi) 2248; AVX2-NEXT: retq 2249; 2250; AVX512-LABEL: subus_v4i8: 2251; AVX512: # %bb.0: 2252; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2253; AVX512-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2254; AVX512-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2255; AVX512-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 2256; AVX512-NEXT: vpmovdb %xmm0, (%rdi) 2257; AVX512-NEXT: retq 2258 %ld1 = load <4 x i8>, <4 x i8>* %p1, align 8 2259 %ld2 = load <4 x i8>, <4 x i8>* %p2, align 8 2260 %1 = sub <4 x i8> %ld1, %ld2 2261 %2 = icmp ugt <4 x i8> %ld1, %ld2 2262 %sh3 = select <4 x i1> %2, <4 x i8> %1, <4 x i8> zeroinitializer 2263 store <4 x i8> %sh3, <4 x i8>* %p1, align 8 2264 ret void 2265} 2266 2267define void @subus_v2i8(<2 x i8>* %p1, <2 x i8>* %p2) { 2268; SSE2-LABEL: subus_v2i8: 2269; SSE2: # %bb.0: 2270; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2271; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2272; SSE2-NEXT: psubusb %xmm1, %xmm0 2273; SSE2-NEXT: movd %xmm0, %eax 2274; SSE2-NEXT: movw %ax, (%rdi) 2275; SSE2-NEXT: retq 2276; 2277; SSSE3-LABEL: subus_v2i8: 2278; SSSE3: # %bb.0: 2279; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2280; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2281; SSSE3-NEXT: psubusb %xmm1, %xmm0 2282; SSSE3-NEXT: movd %xmm0, %eax 2283; SSSE3-NEXT: movw %ax, (%rdi) 2284; SSSE3-NEXT: retq 2285; 2286; SSE41-LABEL: subus_v2i8: 2287; SSE41: # %bb.0: 2288; SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2289; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2290; SSE41-NEXT: psubusb %xmm1, %xmm0 2291; SSE41-NEXT: pextrw $0, %xmm0, (%rdi) 2292; SSE41-NEXT: retq 2293; 2294; AVX1-LABEL: subus_v2i8: 2295; AVX1: # %bb.0: 2296; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2297; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2298; AVX1-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2299; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 2300; AVX1-NEXT: retq 2301; 2302; AVX2-LABEL: subus_v2i8: 2303; AVX2: # %bb.0: 2304; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2305; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2306; AVX2-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2307; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 2308; AVX2-NEXT: retq 2309; 2310; AVX512-LABEL: subus_v2i8: 2311; AVX512: # %bb.0: 2312; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2313; AVX512-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2314; AVX512-NEXT: vpsubusb %xmm1, %xmm0, %xmm0 2315; AVX512-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 2316; AVX512-NEXT: vpmovqb %xmm0, (%rdi) 2317; AVX512-NEXT: retq 2318 %ld1 = load <2 x i8>, <2 x i8>* %p1, align 8 2319 %ld2 = load <2 x i8>, <2 x i8>* %p2, align 8 2320 %1 = sub <2 x i8> %ld1, %ld2 2321 %2 = icmp ugt <2 x i8> %ld1, %ld2 2322 %sh3 = select <2 x i1> %2, <2 x i8> %1, <2 x i8> zeroinitializer 2323 store <2 x i8> %sh3, <2 x i8>* %p1, align 8 2324 ret void 2325} 2326 2327define void @subus_v4i16(<4 x i16>* %p1, <4 x i16>* %p2) { 2328; SSE-LABEL: subus_v4i16: 2329; SSE: # %bb.0: 2330; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 2331; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 2332; SSE-NEXT: psubusw %xmm1, %xmm0 2333; SSE-NEXT: movq %xmm0, (%rdi) 2334; SSE-NEXT: retq 2335; 2336; AVX1-LABEL: subus_v4i16: 2337; AVX1: # %bb.0: 2338; AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2339; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2340; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2341; AVX1-NEXT: vmovq %xmm0, (%rdi) 2342; AVX1-NEXT: retq 2343; 2344; AVX2-LABEL: subus_v4i16: 2345; AVX2: # %bb.0: 2346; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2347; AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2348; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2349; AVX2-NEXT: vmovq %xmm0, (%rdi) 2350; AVX2-NEXT: retq 2351; 2352; AVX512-LABEL: subus_v4i16: 2353; AVX512: # %bb.0: 2354; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2355; AVX512-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2356; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2357; AVX512-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 2358; AVX512-NEXT: vpmovdw %xmm0, (%rdi) 2359; AVX512-NEXT: retq 2360 %ld1 = load <4 x i16>, <4 x i16>* %p1, align 8 2361 %ld2 = load <4 x i16>, <4 x i16>* %p2, align 8 2362 %1 = sub <4 x i16> %ld1, %ld2 2363 %2 = icmp ugt <4 x i16> %ld1, %ld2 2364 %sh3 = select <4 x i1> %2, <4 x i16> %1, <4 x i16> zeroinitializer 2365 store <4 x i16> %sh3, <4 x i16>* %p1, align 8 2366 ret void 2367} 2368 2369define void @subus_v2i16(<2 x i16>* %p1, <2 x i16>* %p2) { 2370; SSE-LABEL: subus_v2i16: 2371; SSE: # %bb.0: 2372; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2373; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2374; SSE-NEXT: psubusw %xmm1, %xmm0 2375; SSE-NEXT: movd %xmm0, (%rdi) 2376; SSE-NEXT: retq 2377; 2378; AVX1-LABEL: subus_v2i16: 2379; AVX1: # %bb.0: 2380; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2381; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2382; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2383; AVX1-NEXT: vmovd %xmm0, (%rdi) 2384; AVX1-NEXT: retq 2385; 2386; AVX2-LABEL: subus_v2i16: 2387; AVX2: # %bb.0: 2388; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2389; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2390; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2391; AVX2-NEXT: vmovd %xmm0, (%rdi) 2392; AVX2-NEXT: retq 2393; 2394; AVX512-LABEL: subus_v2i16: 2395; AVX512: # %bb.0: 2396; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2397; AVX512-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2398; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0 2399; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 2400; AVX512-NEXT: vpmovqw %xmm0, (%rdi) 2401; AVX512-NEXT: retq 2402 %ld1 = load <2 x i16>, <2 x i16>* %p1, align 8 2403 %ld2 = load <2 x i16>, <2 x i16>* %p2, align 8 2404 %1 = sub <2 x i16> %ld1, %ld2 2405 %2 = icmp ugt <2 x i16> %ld1, %ld2 2406 %sh3 = select <2 x i1> %2, <2 x i16> %1, <2 x i16> zeroinitializer 2407 store <2 x i16> %sh3, <2 x i16>* %p1, align 8 2408 ret void 2409} 2410 2411define <16 x i8> @test19(<16 x i8> %x) { 2412; SSE-LABEL: test19: 2413; SSE: # %bb.0: # %entry 2414; SSE-NEXT: psubusb {{.*}}(%rip), %xmm0 2415; SSE-NEXT: retq 2416; 2417; AVX-LABEL: test19: 2418; AVX: # %bb.0: # %entry 2419; AVX-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 2420; AVX-NEXT: retq 2421entry: 2422 %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> 2423 %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> 2424 %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> 2425 ret <16 x i8> %2 2426} 2427 2428define <16 x i8> @test20(<16 x i8> %x) { 2429; SSE-LABEL: test20: 2430; SSE: # %bb.0: # %entry 2431; SSE-NEXT: psubusb {{.*}}(%rip), %xmm0 2432; SSE-NEXT: retq 2433; 2434; AVX-LABEL: test20: 2435; AVX: # %bb.0: # %entry 2436; AVX-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 2437; AVX-NEXT: retq 2438entry: 2439 %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> 2440 %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> 2441 %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> 2442 ret <16 x i8> %2 2443} 2444 2445define <8 x i16> @test21(<8 x i16> %x) { 2446; SSE-LABEL: test21: 2447; SSE: # %bb.0: # %entry 2448; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 2449; SSE-NEXT: retq 2450; 2451; AVX-LABEL: test21: 2452; AVX: # %bb.0: # %entry 2453; AVX-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 2454; AVX-NEXT: retq 2455entry: 2456 %0 = icmp ugt <8 x i16> %x, <i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700> 2457 %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> 2458 %2 = add <8 x i16> %1, <i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700> 2459 ret <8 x i16> %2 2460} 2461 2462define <8 x i16> @test22(<8 x i16> %x) { 2463; SSE-LABEL: test22: 2464; SSE: # %bb.0: # %entry 2465; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 2466; SSE-NEXT: retq 2467; 2468; AVX-LABEL: test22: 2469; AVX: # %bb.0: # %entry 2470; AVX-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 2471; AVX-NEXT: retq 2472entry: 2473 %0 = icmp ugt <8 x i16> %x, <i16 1, i16 -22000, i16 -770, i16 98, i16 19, i16 1000, i16 3456, i16 70> 2474 %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> 2475 %2 = add <8 x i16> %1, <i16 -1, i16 22000, i16 770, i16 -98, i16 -19, i16 -1000, i16 -3456, i16 -70> 2476 ret <8 x i16> %2 2477} 2478 2479define <32 x i8> @test23(<32 x i8> %x) { 2480; SSE-LABEL: test23: 2481; SSE: # %bb.0: # %entry 2482; SSE-NEXT: movdqa {{.*#+}} xmm2 = [70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70] 2483; SSE-NEXT: psubusb %xmm2, %xmm0 2484; SSE-NEXT: psubusb %xmm2, %xmm1 2485; SSE-NEXT: retq 2486; 2487; AVX1-LABEL: test23: 2488; AVX1: # %bb.0: # %entry 2489; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2490; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70] 2491; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm1 2492; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm0 2493; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2494; AVX1-NEXT: retq 2495; 2496; AVX2-LABEL: test23: 2497; AVX2: # %bb.0: # %entry 2498; AVX2-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 2499; AVX2-NEXT: retq 2500; 2501; AVX512-LABEL: test23: 2502; AVX512: # %bb.0: # %entry 2503; AVX512-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 2504; AVX512-NEXT: retq 2505entry: 2506 %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> 2507 %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> 2508 %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> 2509 ret <32 x i8> %2 2510} 2511 2512define <32 x i8> @test24(<32 x i8> %x) { 2513; SSE-LABEL: test24: 2514; SSE: # %bb.0: # %entry 2515; SSE-NEXT: psubusb {{.*}}(%rip), %xmm0 2516; SSE-NEXT: psubusb {{.*}}(%rip), %xmm1 2517; SSE-NEXT: retq 2518; 2519; AVX1-LABEL: test24: 2520; AVX1: # %bb.0: # %entry 2521; AVX1-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm1 2522; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2523; AVX1-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 2524; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 2525; AVX1-NEXT: retq 2526; 2527; AVX2-LABEL: test24: 2528; AVX2: # %bb.0: # %entry 2529; AVX2-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 2530; AVX2-NEXT: retq 2531; 2532; AVX512-LABEL: test24: 2533; AVX512: # %bb.0: # %entry 2534; AVX512-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 2535; AVX512-NEXT: retq 2536entry: 2537 %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> 2538 %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> 2539 %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> 2540 ret <32 x i8> %2 2541} 2542 2543define <16 x i16> @test25(<16 x i16> %x) { 2544; SSE-LABEL: test25: 2545; SSE: # %bb.0: # %entry 2546; SSE-NEXT: movdqa {{.*#+}} xmm2 = [5000,5000,5000,5000,5000,5000,5000,5000] 2547; SSE-NEXT: psubusw %xmm2, %xmm0 2548; SSE-NEXT: psubusw %xmm2, %xmm1 2549; SSE-NEXT: retq 2550; 2551; AVX1-LABEL: test25: 2552; AVX1: # %bb.0: # %entry 2553; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2554; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [5000,5000,5000,5000,5000,5000,5000,5000] 2555; AVX1-NEXT: vpsubusw %xmm2, %xmm1, %xmm1 2556; AVX1-NEXT: vpsubusw %xmm2, %xmm0, %xmm0 2557; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2558; AVX1-NEXT: retq 2559; 2560; AVX2-LABEL: test25: 2561; AVX2: # %bb.0: # %entry 2562; AVX2-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 2563; AVX2-NEXT: retq 2564; 2565; AVX512-LABEL: test25: 2566; AVX512: # %bb.0: # %entry 2567; AVX512-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 2568; AVX512-NEXT: retq 2569entry: 2570 %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> 2571 %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> 2572 %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> 2573 ret <16 x i16> %2 2574} 2575 2576define <16 x i16> @test26(<16 x i16> %x) { 2577; SSE-LABEL: test26: 2578; SSE: # %bb.0: # %entry 2579; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 2580; SSE-NEXT: psubusw {{.*}}(%rip), %xmm1 2581; SSE-NEXT: retq 2582; 2583; AVX1-LABEL: test26: 2584; AVX1: # %bb.0: # %entry 2585; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm1 2586; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2587; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 2588; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 2589; AVX1-NEXT: retq 2590; 2591; AVX2-LABEL: test26: 2592; AVX2: # %bb.0: # %entry 2593; AVX2-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 2594; AVX2-NEXT: retq 2595; 2596; AVX512-LABEL: test26: 2597; AVX512: # %bb.0: # %entry 2598; AVX512-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 2599; AVX512-NEXT: retq 2600entry: 2601 %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> 2602 %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> 2603 %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> 2604 ret <16 x i16> %2 2605} 2606 2607define <64 x i8> @test27(<64 x i8> %x) { 2608; SSE-LABEL: test27: 2609; SSE: # %bb.0: # %entry 2610; SSE-NEXT: movdqa {{.*#+}} xmm4 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154] 2611; SSE-NEXT: psubusb %xmm4, %xmm0 2612; SSE-NEXT: psubusb %xmm4, %xmm1 2613; SSE-NEXT: psubusb %xmm4, %xmm2 2614; SSE-NEXT: psubusb %xmm4, %xmm3 2615; SSE-NEXT: retq 2616; 2617; AVX1-LABEL: test27: 2618; AVX1: # %bb.0: # %entry 2619; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2620; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154] 2621; AVX1-NEXT: vpsubusb %xmm3, %xmm2, %xmm2 2622; AVX1-NEXT: vpsubusb %xmm3, %xmm0, %xmm0 2623; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 2624; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2625; AVX1-NEXT: vpsubusb %xmm3, %xmm2, %xmm2 2626; AVX1-NEXT: vpsubusb %xmm3, %xmm1, %xmm1 2627; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 2628; AVX1-NEXT: retq 2629; 2630; AVX2-LABEL: test27: 2631; AVX2: # %bb.0: # %entry 2632; AVX2-NEXT: vmovdqa {{.*#+}} 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] 2633; AVX2-NEXT: vpsubusb %ymm2, %ymm0, %ymm0 2634; AVX2-NEXT: vpsubusb %ymm2, %ymm1, %ymm1 2635; AVX2-NEXT: retq 2636; 2637; AVX512-LABEL: test27: 2638; AVX512: # %bb.0: # %entry 2639; AVX512-NEXT: vpsubusb {{.*}}(%rip), %zmm0, %zmm0 2640; AVX512-NEXT: retq 2641entry: 2642 %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> 2643 %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> 2644 %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> 2645 ret <64 x i8> %2 2646} 2647 2648define <64 x i8> @test28(<64 x i8> %x) { 2649; SSE-LABEL: test28: 2650; SSE: # %bb.0: # %entry 2651; SSE-NEXT: movdqa {{.*#+}} xmm4 = [1,234,206,142,179,186,123,98,63,19,234,100,25,34,55,70] 2652; SSE-NEXT: psubusb %xmm4, %xmm0 2653; SSE-NEXT: psubusb %xmm4, %xmm2 2654; SSE-NEXT: psubusb {{.*}}(%rip), %xmm1 2655; SSE-NEXT: psubusb {{.*}}(%rip), %xmm3 2656; SSE-NEXT: retq 2657; 2658; AVX1-LABEL: test28: 2659; AVX1: # %bb.0: # %entry 2660; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,234,206,142,179,186,123,98,63,19,234,100,25,34,55,70] 2661; AVX1-NEXT: vpsubusb %xmm2, %xmm0, %xmm3 2662; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2663; AVX1-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 2664; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0 2665; AVX1-NEXT: vpsubusb %xmm2, %xmm1, %xmm2 2666; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2667; AVX1-NEXT: vpsubusb {{.*}}(%rip), %xmm1, %xmm1 2668; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 2669; AVX1-NEXT: retq 2670; 2671; AVX2-LABEL: test28: 2672; AVX2: # %bb.0: # %entry 2673; AVX2-NEXT: vpsubusb {{.*}}(%rip), %ymm0, %ymm0 2674; AVX2-NEXT: vpsubusb {{.*}}(%rip), %ymm1, %ymm1 2675; AVX2-NEXT: retq 2676; 2677; AVX512-LABEL: test28: 2678; AVX512: # %bb.0: # %entry 2679; AVX512-NEXT: vpsubusb {{.*}}(%rip), %zmm0, %zmm0 2680; AVX512-NEXT: retq 2681entry: 2682 %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> 2683 %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> 2684 %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> 2685 ret <64 x i8> %2 2686} 2687 2688define <32 x i16> @test29(<32 x i16> %x) { 2689; SSE-LABEL: test29: 2690; SSE: # %bb.0: # %entry 2691; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 2692; SSE-NEXT: psubusw {{.*}}(%rip), %xmm1 2693; SSE-NEXT: psubusw {{.*}}(%rip), %xmm2 2694; SSE-NEXT: psubusw {{.*}}(%rip), %xmm3 2695; SSE-NEXT: retq 2696; 2697; AVX1-LABEL: test29: 2698; AVX1: # %bb.0: # %entry 2699; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm2 2700; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2701; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 2702; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 2703; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm1, %xmm2 2704; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2705; AVX1-NEXT: vpsubusw {{.*}}(%rip), %xmm1, %xmm1 2706; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 2707; AVX1-NEXT: retq 2708; 2709; AVX2-LABEL: test29: 2710; AVX2: # %bb.0: # %entry 2711; AVX2-NEXT: vpsubusw {{.*}}(%rip), %ymm0, %ymm0 2712; AVX2-NEXT: vpsubusw {{.*}}(%rip), %ymm1, %ymm1 2713; AVX2-NEXT: retq 2714; 2715; AVX512-LABEL: test29: 2716; AVX512: # %bb.0: # %entry 2717; AVX512-NEXT: vpsubusw {{.*}}(%rip), %zmm0, %zmm0 2718; AVX512-NEXT: retq 2719entry: 2720 %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> 2721 %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> 2722 %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> 2723 ret <32 x i16> %2 2724} 2725 2726; PR40083 2727define i64 @test30(<8 x i16> %x) { 2728; SSE-LABEL: test30: 2729; SSE: # %bb.0: # %entry 2730; SSE-NEXT: psubusw {{.*}}(%rip), %xmm0 2731; SSE-NEXT: movq %xmm0, %rax 2732; SSE-NEXT: retq 2733; 2734; AVX-LABEL: test30: 2735; AVX: # %bb.0: # %entry 2736; AVX-NEXT: vpsubusw {{.*}}(%rip), %xmm0, %xmm0 2737; AVX-NEXT: vmovq %xmm0, %rax 2738; AVX-NEXT: retq 2739entry: 2740 %0 = icmp ugt <8 x i16> %x, <i16 1, i16 -2200, i16 -50, i16 -114, i16 undef, i16 undef, i16 undef, i16 undef> 2741 %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> 2742 %2 = add <8 x i16> %1, <i16 -1, i16 2200, i16 50, i16 114, i16 undef, i16 undef, i16 undef, i16 undef> 2743 %3 = bitcast <8 x i16> %2 to <2 x i64> 2744 %4 = extractelement <2 x i64> %3, i32 0 2745 ret i64 %4 2746} 2747 2748; PR40083 2749define i64 @test31(<2 x i64> %x) { 2750; SSE-LABEL: test31: 2751; SSE: # %bb.0: 2752; SSE-NEXT: psubusb {{.*}}(%rip), %xmm0 2753; SSE-NEXT: movq %xmm0, %rax 2754; SSE-NEXT: retq 2755; 2756; AVX-LABEL: test31: 2757; AVX: # %bb.0: 2758; AVX-NEXT: vpsubusb {{.*}}(%rip), %xmm0, %xmm0 2759; AVX-NEXT: vmovq %xmm0, %rax 2760; AVX-NEXT: retq 2761 %t0 = bitcast <2 x i64> %x to <16 x i8> 2762 %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> 2763 %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> 2764 %sel = select <16 x i1> %cmp, <16 x i8> %bop, <16 x i8> zeroinitializer 2765 %bc = bitcast <16 x i8> %sel to <2 x i64> 2766 %ext = extractelement <2 x i64> %bc, i32 0 2767 ret i64 %ext 2768} 2769