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 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512 9 10; FIXME: should be paddusb 11define <16 x i8> @test1(<16 x i8> %x) { 12; SSE-LABEL: test1: 13; SSE: # %bb.0: 14; SSE-NEXT: pcmpeqd %xmm1, %xmm1 15; SSE-NEXT: movdqa %xmm0, %xmm2 16; SSE-NEXT: psubb %xmm1, %xmm2 17; SSE-NEXT: pcmpeqb %xmm1, %xmm0 18; SSE-NEXT: por %xmm2, %xmm0 19; SSE-NEXT: retq 20; 21; AVX1-LABEL: test1: 22; AVX1: # %bb.0: 23; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 24; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm2 25; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 26; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0 27; AVX1-NEXT: retq 28; 29; AVX2-LABEL: test1: 30; AVX2: # %bb.0: 31; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 32; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm2 33; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 34; AVX2-NEXT: vpor %xmm2, %xmm0, %xmm0 35; AVX2-NEXT: retq 36; 37; AVX512-LABEL: test1: 38; AVX512: # %bb.0: 39; AVX512-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 40; AVX512-NEXT: vpsubb %xmm2, %xmm0, %xmm1 41; AVX512-NEXT: vpcmpeqb %xmm2, %xmm0, %k1 42; AVX512-NEXT: vmovdqu8 %xmm2, %xmm1 {%k1} 43; AVX512-NEXT: vmovdqa %xmm1, %xmm0 44; AVX512-NEXT: retq 45 %1 = add <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 46 %2 = icmp eq <16 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 47 %3 = select <16 x i1> %2, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %1 48 ret <16 x i8> %3 49} 50 51define <16 x i8> @test2(<16 x i8> %x) { 52; SSE-LABEL: test2: 53; SSE: # %bb.0: 54; SSE-NEXT: paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 55; SSE-NEXT: retq 56; 57; AVX-LABEL: test2: 58; AVX: # %bb.0: 59; AVX-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 60; AVX-NEXT: retq 61 %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> 62 %2 = icmp ugt <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> 63 %3 = select <16 x i1> %2, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %1 64 ret <16 x i8> %3 65} 66 67define <16 x i8> @test3(<16 x i8> %x) { 68; SSE-LABEL: test3: 69; SSE: # %bb.0: 70; SSE-NEXT: paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 71; SSE-NEXT: retq 72; 73; AVX-LABEL: test3: 74; AVX: # %bb.0: 75; AVX-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 76; AVX-NEXT: retq 77 %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> 78 %2 = 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> 79 %3 = select <16 x i1> %2, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %1 80 ret <16 x i8> %3 81} 82 83define <16 x i8> @test4(<16 x i8> %x) { 84; SSE-LABEL: test4: 85; SSE: # %bb.0: 86; SSE-NEXT: paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 87; SSE-NEXT: retq 88; 89; AVX-LABEL: test4: 90; AVX: # %bb.0: 91; AVX-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 92; AVX-NEXT: retq 93 %1 = add <16 x i8> %x, <i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2> 94 %2 = icmp ugt <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 95 %3 = select <16 x i1> %2, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %1 96 ret <16 x i8> %3 97} 98 99; FIXME: should be paddusb 100define <16 x i8> @test5(<16 x i8> %x) { 101; SSE-LABEL: test5: 102; SSE: # %bb.0: 103; SSE-NEXT: movdqa {{.*#+}} xmm1 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 104; SSE-NEXT: pxor %xmm0, %xmm1 105; SSE-NEXT: pmaxub %xmm1, %xmm0 106; SSE-NEXT: pcmpeqb %xmm1, %xmm0 107; SSE-NEXT: pcmpeqd %xmm2, %xmm2 108; SSE-NEXT: pxor %xmm2, %xmm0 109; SSE-NEXT: por %xmm1, %xmm0 110; SSE-NEXT: retq 111; 112; AVX1-LABEL: test5: 113; AVX1: # %bb.0: 114; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 115; AVX1-NEXT: vpmaxub %xmm0, %xmm1, %xmm0 116; AVX1-NEXT: vpcmpeqb %xmm0, %xmm1, %xmm0 117; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 118; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 119; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 120; AVX1-NEXT: retq 121; 122; AVX2-LABEL: test5: 123; AVX2: # %bb.0: 124; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 125; AVX2-NEXT: vpmaxub %xmm0, %xmm1, %xmm0 126; AVX2-NEXT: vpcmpeqb %xmm0, %xmm1, %xmm0 127; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 128; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 129; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 130; AVX2-NEXT: retq 131; 132; AVX512-LABEL: test5: 133; AVX512: # %bb.0: 134; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 135; AVX512-NEXT: vpcmpltub %xmm0, %xmm1, %k1 136; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 137; AVX512-NEXT: vmovdqu8 %xmm0, %xmm1 {%k1} 138; AVX512-NEXT: vmovdqa %xmm1, %xmm0 139; AVX512-NEXT: retq 140 %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> 141 %2 = icmp ult <16 x i8> %1, %x 142 %3 = select <16 x i1> %2, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %1 143 ret <16 x i8> %3 144} 145 146define <16 x i8> @test6(<16 x i8> %x) { 147; SSE-LABEL: test6: 148; SSE: # %bb.0: 149; SSE-NEXT: paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 150; SSE-NEXT: retq 151; 152; AVX-LABEL: test6: 153; AVX: # %bb.0: 154; AVX-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 155; AVX-NEXT: retq 156 %1 = add <16 x i8> %x, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2> 157 %2 = icmp ugt <16 x i8> %x, <i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3> 158 %3 = select <16 x i1> %2, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %1 159 ret <16 x i8> %3 160} 161 162define <32 x i8> @test7(<32 x i8> %x) { 163; SSE-LABEL: test7: 164; SSE: # %bb.0: 165; SSE-NEXT: pcmpeqd %xmm2, %xmm2 166; SSE-NEXT: movdqa %xmm1, %xmm3 167; SSE-NEXT: psubb %xmm2, %xmm3 168; SSE-NEXT: movdqa %xmm0, %xmm4 169; SSE-NEXT: psubb %xmm2, %xmm4 170; SSE-NEXT: pcmpeqb %xmm2, %xmm1 171; SSE-NEXT: por %xmm3, %xmm1 172; SSE-NEXT: pcmpeqb %xmm2, %xmm0 173; SSE-NEXT: por %xmm4, %xmm0 174; SSE-NEXT: retq 175; 176; AVX1-LABEL: test7: 177; AVX1: # %bb.0: 178; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 179; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 180; AVX1-NEXT: vpsubb %xmm2, %xmm1, %xmm3 181; AVX1-NEXT: vpsubb %xmm2, %xmm0, %xmm4 182; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 183; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 184; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 185; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 186; AVX1-NEXT: vorps %ymm3, %ymm0, %ymm0 187; AVX1-NEXT: retq 188; 189; AVX2-LABEL: test7: 190; AVX2: # %bb.0: 191; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 192; AVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm2 193; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 194; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 195; AVX2-NEXT: retq 196; 197; AVX512-LABEL: test7: 198; AVX512: # %bb.0: 199; AVX512-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 200; AVX512-NEXT: vpsubb %ymm2, %ymm0, %ymm1 201; AVX512-NEXT: vpcmpeqb %ymm2, %ymm0, %k1 202; AVX512-NEXT: vmovdqu8 %ymm2, %ymm1 {%k1} 203; AVX512-NEXT: vmovdqa %ymm1, %ymm0 204; AVX512-NEXT: retq 205 %1 = add <32 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 206 %2 = icmp eq <32 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 207 %3 = select <32 x i1> %2, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> %1 208 ret <32 x i8> %3 209} 210 211define <32 x i8> @test8(<32 x i8> %x) { 212; SSE-LABEL: test8: 213; SSE: # %bb.0: 214; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 215; SSE-NEXT: paddusb %xmm2, %xmm0 216; SSE-NEXT: paddusb %xmm2, %xmm1 217; SSE-NEXT: retq 218; 219; AVX1-LABEL: test8: 220; AVX1: # %bb.0: 221; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 222; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 223; AVX1-NEXT: vpaddusb %xmm2, %xmm1, %xmm1 224; AVX1-NEXT: vpaddusb %xmm2, %xmm0, %xmm0 225; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 226; AVX1-NEXT: retq 227; 228; AVX2-LABEL: test8: 229; AVX2: # %bb.0: 230; AVX2-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 231; AVX2-NEXT: retq 232; 233; AVX512-LABEL: test8: 234; AVX512: # %bb.0: 235; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 236; AVX512-NEXT: retq 237 %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> 238 %2 = icmp ugt <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> 239 %3 = select <32 x i1> %2, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> %1 240 ret <32 x i8> %3 241} 242 243define <32 x i8> @test9(<32 x i8> %x) { 244; SSE-LABEL: test9: 245; SSE: # %bb.0: 246; SSE-NEXT: movdqa {{.*#+}} xmm2 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129] 247; SSE-NEXT: paddusb %xmm2, %xmm0 248; SSE-NEXT: paddusb %xmm2, %xmm1 249; SSE-NEXT: retq 250; 251; AVX1-LABEL: test9: 252; AVX1: # %bb.0: 253; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 254; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129] 255; AVX1-NEXT: vpaddusb %xmm2, %xmm1, %xmm1 256; AVX1-NEXT: vpaddusb %xmm2, %xmm0, %xmm0 257; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 258; AVX1-NEXT: retq 259; 260; AVX2-LABEL: test9: 261; AVX2: # %bb.0: 262; AVX2-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 263; AVX2-NEXT: retq 264; 265; AVX512-LABEL: test9: 266; AVX512: # %bb.0: 267; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 268; AVX512-NEXT: retq 269 %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> 270 %2 = 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> 271 %3 = select <32 x i1> %2, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> %1 272 ret <32 x i8> %3 273} 274 275define <32 x i8> @test10(<32 x i8> %x) { 276; SSE-LABEL: test10: 277; SSE: # %bb.0: 278; SSE-NEXT: movdqa {{.*#+}} xmm2 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254] 279; SSE-NEXT: paddusb %xmm2, %xmm0 280; SSE-NEXT: paddusb %xmm2, %xmm1 281; SSE-NEXT: retq 282; 283; AVX1-LABEL: test10: 284; AVX1: # %bb.0: 285; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 286; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254] 287; AVX1-NEXT: vpaddusb %xmm2, %xmm1, %xmm1 288; AVX1-NEXT: vpaddusb %xmm2, %xmm0, %xmm0 289; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 290; AVX1-NEXT: retq 291; 292; AVX2-LABEL: test10: 293; AVX2: # %bb.0: 294; AVX2-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 295; AVX2-NEXT: retq 296; 297; AVX512-LABEL: test10: 298; AVX512: # %bb.0: 299; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 300; AVX512-NEXT: retq 301 %1 = add <32 x i8> %x, <i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2> 302 %2 = icmp ugt <32 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 303 %3 = select <32 x i1> %2, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> %1 304 ret <32 x i8> %3 305} 306 307define <32 x i8> @test11(<32 x i8> %x) { 308; SSE-LABEL: test11: 309; SSE: # %bb.0: 310; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 311; SSE-NEXT: movdqa %xmm0, %xmm3 312; SSE-NEXT: pxor %xmm2, %xmm3 313; SSE-NEXT: pxor %xmm1, %xmm2 314; SSE-NEXT: pmaxub %xmm2, %xmm1 315; SSE-NEXT: pcmpeqb %xmm2, %xmm1 316; SSE-NEXT: pcmpeqd %xmm4, %xmm4 317; SSE-NEXT: pxor %xmm4, %xmm1 318; SSE-NEXT: pmaxub %xmm3, %xmm0 319; SSE-NEXT: pcmpeqb %xmm3, %xmm0 320; SSE-NEXT: pxor %xmm4, %xmm0 321; SSE-NEXT: por %xmm3, %xmm0 322; SSE-NEXT: por %xmm2, %xmm1 323; SSE-NEXT: retq 324; 325; AVX1-LABEL: test11: 326; AVX1: # %bb.0: 327; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 328; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 329; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 330; AVX1-NEXT: vpmaxub %xmm2, %xmm3, %xmm2 331; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm2 332; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 333; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 334; AVX1-NEXT: vpmaxub %xmm0, %xmm1, %xmm0 335; AVX1-NEXT: vpcmpeqb %xmm0, %xmm1, %xmm0 336; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 337; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 338; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 339; AVX1-NEXT: retq 340; 341; AVX2-LABEL: test11: 342; AVX2: # %bb.0: 343; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 344; AVX2-NEXT: vpmaxub %ymm0, %ymm1, %ymm0 345; AVX2-NEXT: vpcmpeqb %ymm0, %ymm1, %ymm0 346; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 347; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 348; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 349; AVX2-NEXT: retq 350; 351; AVX512-LABEL: test11: 352; AVX512: # %bb.0: 353; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 354; AVX512-NEXT: vpcmpltub %ymm0, %ymm1, %k1 355; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 356; AVX512-NEXT: vmovdqu8 %ymm0, %ymm1 {%k1} 357; AVX512-NEXT: vmovdqa %ymm1, %ymm0 358; AVX512-NEXT: retq 359 %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> 360 %2 = icmp ult <32 x i8> %1, %x 361 %3 = select <32 x i1> %2, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> %1 362 ret <32 x i8> %3 363} 364 365define <32 x i8> @test12(<32 x i8> %x) { 366; SSE-LABEL: test12: 367; SSE: # %bb.0: 368; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 369; SSE-NEXT: paddusb %xmm2, %xmm0 370; SSE-NEXT: paddusb %xmm2, %xmm1 371; SSE-NEXT: retq 372; 373; AVX1-LABEL: test12: 374; AVX1: # %bb.0: 375; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 376; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 377; AVX1-NEXT: vpaddusb %xmm2, %xmm1, %xmm1 378; AVX1-NEXT: vpaddusb %xmm2, %xmm0, %xmm0 379; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 380; AVX1-NEXT: retq 381; 382; AVX2-LABEL: test12: 383; AVX2: # %bb.0: 384; AVX2-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 385; AVX2-NEXT: retq 386; 387; AVX512-LABEL: test12: 388; AVX512: # %bb.0: 389; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 390; AVX512-NEXT: retq 391 %1 = add <32 x i8> %x, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2> 392 %2 = icmp ugt <32 x i8> %x, <i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3> 393 %3 = select <32 x i1> %2, <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <32 x i8> %1 394 ret <32 x i8> %3 395} 396 397define <64 x i8> @test13(<64 x i8> %x) { 398; SSE-LABEL: test13: 399; SSE: # %bb.0: 400; SSE-NEXT: pcmpeqd %xmm8, %xmm8 401; SSE-NEXT: movdqa %xmm3, %xmm5 402; SSE-NEXT: psubb %xmm8, %xmm5 403; SSE-NEXT: movdqa %xmm2, %xmm6 404; SSE-NEXT: psubb %xmm8, %xmm6 405; SSE-NEXT: movdqa %xmm1, %xmm7 406; SSE-NEXT: psubb %xmm8, %xmm7 407; SSE-NEXT: movdqa %xmm0, %xmm4 408; SSE-NEXT: psubb %xmm8, %xmm4 409; SSE-NEXT: pcmpeqb %xmm8, %xmm3 410; SSE-NEXT: por %xmm5, %xmm3 411; SSE-NEXT: pcmpeqb %xmm8, %xmm2 412; SSE-NEXT: por %xmm6, %xmm2 413; SSE-NEXT: pcmpeqb %xmm8, %xmm1 414; SSE-NEXT: por %xmm7, %xmm1 415; SSE-NEXT: pcmpeqb %xmm8, %xmm0 416; SSE-NEXT: por %xmm4, %xmm0 417; SSE-NEXT: retq 418; 419; AVX1-LABEL: test13: 420; AVX1: # %bb.0: 421; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 422; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 423; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm4 424; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm5 425; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 426; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 427; AVX1-NEXT: vpsubb %xmm3, %xmm5, %xmm6 428; AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm7 429; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 430; AVX1-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm2 431; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm1 432; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 433; AVX1-NEXT: vorps %ymm4, %ymm1, %ymm1 434; AVX1-NEXT: vpcmpeqb %xmm3, %xmm5, %xmm2 435; AVX1-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm0 436; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 437; AVX1-NEXT: vorps %ymm6, %ymm0, %ymm0 438; AVX1-NEXT: retq 439; 440; AVX2-LABEL: test13: 441; AVX2: # %bb.0: 442; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 443; AVX2-NEXT: vpsubb %ymm2, %ymm1, %ymm3 444; AVX2-NEXT: vpsubb %ymm2, %ymm0, %ymm4 445; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1 446; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 447; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 448; AVX2-NEXT: vpor %ymm4, %ymm0, %ymm0 449; AVX2-NEXT: retq 450; 451; AVX512-LABEL: test13: 452; AVX512: # %bb.0: 453; AVX512-NEXT: vpternlogd $255, %zmm2, %zmm2, %zmm2 454; AVX512-NEXT: vpsubb %zmm2, %zmm0, %zmm1 455; AVX512-NEXT: vpcmpeqb %zmm2, %zmm0, %k1 456; AVX512-NEXT: vmovdqu8 %zmm2, %zmm1 {%k1} 457; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 458; AVX512-NEXT: retq 459 %1 = add <64 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 460 %2 = icmp eq <64 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 461 %3 = select <64 x i1> %2, <64 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <64 x i8> %1 462 ret <64 x i8> %3 463} 464 465define <64 x i8> @test14(<64 x i8> %x) { 466; SSE-LABEL: test14: 467; SSE: # %bb.0: 468; SSE-NEXT: movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 469; SSE-NEXT: paddusb %xmm4, %xmm0 470; SSE-NEXT: paddusb %xmm4, %xmm1 471; SSE-NEXT: paddusb %xmm4, %xmm2 472; SSE-NEXT: paddusb %xmm4, %xmm3 473; SSE-NEXT: retq 474; 475; AVX1-LABEL: test14: 476; AVX1: # %bb.0: 477; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 478; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 479; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 480; AVX1-NEXT: vpaddusb %xmm3, %xmm0, %xmm0 481; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 482; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 483; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 484; AVX1-NEXT: vpaddusb %xmm3, %xmm1, %xmm1 485; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 486; AVX1-NEXT: retq 487; 488; AVX2-LABEL: test14: 489; AVX2: # %bb.0: 490; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 491; AVX2-NEXT: vpaddusb %ymm2, %ymm0, %ymm0 492; AVX2-NEXT: vpaddusb %ymm2, %ymm1, %ymm1 493; AVX2-NEXT: retq 494; 495; AVX512-LABEL: test14: 496; AVX512: # %bb.0: 497; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 498; AVX512-NEXT: retq 499 %1 = add <64 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, 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> 500 %2 = icmp ugt <64 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, 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> 501 %3 = select <64 x i1> %2, <64 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <64 x i8> %1 502 ret <64 x i8> %3 503} 504 505define <64 x i8> @test15(<64 x i8> %x) { 506; SSE-LABEL: test15: 507; SSE: # %bb.0: 508; SSE-NEXT: movdqa {{.*#+}} xmm4 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129] 509; SSE-NEXT: paddusb %xmm4, %xmm0 510; SSE-NEXT: paddusb %xmm4, %xmm1 511; SSE-NEXT: paddusb %xmm4, %xmm2 512; SSE-NEXT: paddusb %xmm4, %xmm3 513; SSE-NEXT: retq 514; 515; AVX1-LABEL: test15: 516; AVX1: # %bb.0: 517; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 518; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129] 519; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 520; AVX1-NEXT: vpaddusb %xmm3, %xmm0, %xmm0 521; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 522; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 523; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 524; AVX1-NEXT: vpaddusb %xmm3, %xmm1, %xmm1 525; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 526; AVX1-NEXT: retq 527; 528; AVX2-LABEL: test15: 529; AVX2: # %bb.0: 530; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129] 531; AVX2-NEXT: vpaddusb %ymm2, %ymm0, %ymm0 532; AVX2-NEXT: vpaddusb %ymm2, %ymm1, %ymm1 533; AVX2-NEXT: retq 534; 535; AVX512-LABEL: test15: 536; AVX512: # %bb.0: 537; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 538; AVX512-NEXT: retq 539 %1 = add <64 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, 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> 540 %2 = icmp ugt <64 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, 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> 541 %3 = select <64 x i1> %2, <64 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <64 x i8> %1 542 ret <64 x i8> %3 543} 544 545define <64 x i8> @test16(<64 x i8> %x) { 546; SSE-LABEL: test16: 547; SSE: # %bb.0: 548; SSE-NEXT: movdqa {{.*#+}} xmm4 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254] 549; SSE-NEXT: paddusb %xmm4, %xmm0 550; SSE-NEXT: paddusb %xmm4, %xmm1 551; SSE-NEXT: paddusb %xmm4, %xmm2 552; SSE-NEXT: paddusb %xmm4, %xmm3 553; SSE-NEXT: retq 554; 555; AVX1-LABEL: test16: 556; AVX1: # %bb.0: 557; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 558; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254] 559; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 560; AVX1-NEXT: vpaddusb %xmm3, %xmm0, %xmm0 561; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 562; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 563; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 564; AVX1-NEXT: vpaddusb %xmm3, %xmm1, %xmm1 565; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 566; AVX1-NEXT: retq 567; 568; AVX2-LABEL: test16: 569; AVX2: # %bb.0: 570; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254] 571; AVX2-NEXT: vpaddusb %ymm2, %ymm0, %ymm0 572; AVX2-NEXT: vpaddusb %ymm2, %ymm1, %ymm1 573; AVX2-NEXT: retq 574; 575; AVX512-LABEL: test16: 576; AVX512: # %bb.0: 577; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 578; AVX512-NEXT: retq 579 %1 = add <64 x i8> %x, <i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2, i8 -2> 580 %2 = icmp ugt <64 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 581 %3 = select <64 x i1> %2, <64 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <64 x i8> %1 582 ret <64 x i8> %3 583} 584 585define <64 x i8> @test17(<64 x i8> %x) { 586; SSE-LABEL: test17: 587; SSE: # %bb.0: 588; SSE-NEXT: movdqa {{.*#+}} xmm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 589; SSE-NEXT: movdqa %xmm0, %xmm5 590; SSE-NEXT: pxor %xmm4, %xmm5 591; SSE-NEXT: movdqa %xmm1, %xmm6 592; SSE-NEXT: pxor %xmm4, %xmm6 593; SSE-NEXT: movdqa %xmm2, %xmm7 594; SSE-NEXT: pxor %xmm4, %xmm7 595; SSE-NEXT: pxor %xmm3, %xmm4 596; SSE-NEXT: pmaxub %xmm4, %xmm3 597; SSE-NEXT: pcmpeqb %xmm4, %xmm3 598; SSE-NEXT: pcmpeqd %xmm8, %xmm8 599; SSE-NEXT: pxor %xmm8, %xmm3 600; SSE-NEXT: pmaxub %xmm7, %xmm2 601; SSE-NEXT: pcmpeqb %xmm7, %xmm2 602; SSE-NEXT: pxor %xmm8, %xmm2 603; SSE-NEXT: pmaxub %xmm6, %xmm1 604; SSE-NEXT: pcmpeqb %xmm6, %xmm1 605; SSE-NEXT: pxor %xmm8, %xmm1 606; SSE-NEXT: pmaxub %xmm5, %xmm0 607; SSE-NEXT: pcmpeqb %xmm5, %xmm0 608; SSE-NEXT: pxor %xmm8, %xmm0 609; SSE-NEXT: por %xmm5, %xmm0 610; SSE-NEXT: por %xmm6, %xmm1 611; SSE-NEXT: por %xmm7, %xmm2 612; SSE-NEXT: por %xmm4, %xmm3 613; SSE-NEXT: retq 614; 615; AVX1-LABEL: test17: 616; AVX1: # %bb.0: 617; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 618; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm3 619; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm2 620; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 621; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 622; AVX1-NEXT: vpmaxub %xmm5, %xmm4, %xmm5 623; AVX1-NEXT: vpcmpeqb %xmm5, %xmm4, %xmm4 624; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 625; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4 626; AVX1-NEXT: vpmaxub %xmm1, %xmm2, %xmm1 627; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 628; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 629; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1 630; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 631; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 632; AVX1-NEXT: vpmaxub %xmm6, %xmm4, %xmm6 633; AVX1-NEXT: vpcmpeqb %xmm6, %xmm4, %xmm4 634; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4 635; AVX1-NEXT: vpmaxub %xmm0, %xmm3, %xmm0 636; AVX1-NEXT: vpcmpeqb %xmm0, %xmm3, %xmm0 637; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0 638; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 639; AVX1-NEXT: vorps %ymm3, %ymm0, %ymm0 640; AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 641; AVX1-NEXT: retq 642; 643; AVX2-LABEL: test17: 644; AVX2: # %bb.0: 645; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 646; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3 647; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2 648; AVX2-NEXT: vpmaxub %ymm1, %ymm2, %ymm1 649; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 650; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 651; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 652; AVX2-NEXT: vpmaxub %ymm0, %ymm3, %ymm0 653; AVX2-NEXT: vpcmpeqb %ymm0, %ymm3, %ymm0 654; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0 655; AVX2-NEXT: vpor %ymm3, %ymm0, %ymm0 656; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 657; AVX2-NEXT: retq 658; 659; AVX512-LABEL: test17: 660; AVX512: # %bb.0: 661; AVX512-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1 662; AVX512-NEXT: vpcmpltub %zmm0, %zmm1, %k1 663; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 664; AVX512-NEXT: vmovdqu8 %zmm0, %zmm1 {%k1} 665; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 666; AVX512-NEXT: retq 667 %1 = xor <64 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, 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> 668 %2 = icmp ult <64 x i8> %1, %x 669 %3 = select <64 x i1> %2, <64 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <64 x i8> %1 670 ret <64 x i8> %3 671} 672 673define <64 x i8> @test18(<64 x i8> %x) { 674; SSE-LABEL: test18: 675; SSE: # %bb.0: 676; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 677; SSE-NEXT: paddusb %xmm4, %xmm0 678; SSE-NEXT: paddusb %xmm4, %xmm1 679; SSE-NEXT: paddusb %xmm4, %xmm2 680; SSE-NEXT: paddusb %xmm4, %xmm3 681; SSE-NEXT: retq 682; 683; AVX1-LABEL: test18: 684; AVX1: # %bb.0: 685; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 686; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 687; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 688; AVX1-NEXT: vpaddusb %xmm3, %xmm0, %xmm0 689; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 690; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 691; AVX1-NEXT: vpaddusb %xmm3, %xmm2, %xmm2 692; AVX1-NEXT: vpaddusb %xmm3, %xmm1, %xmm1 693; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 694; AVX1-NEXT: retq 695; 696; AVX2-LABEL: test18: 697; AVX2: # %bb.0: 698; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 699; AVX2-NEXT: vpaddusb %ymm2, %ymm0, %ymm0 700; AVX2-NEXT: vpaddusb %ymm2, %ymm1, %ymm1 701; AVX2-NEXT: retq 702; 703; AVX512-LABEL: test18: 704; AVX512: # %bb.0: 705; AVX512-NEXT: vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 706; AVX512-NEXT: retq 707 %1 = add <64 x i8> %x, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2> 708 %2 = icmp ugt <64 x i8> %x, <i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3> 709 %3 = select <64 x i1> %2, <64 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <64 x i8> %1 710 ret <64 x i8> %3 711} 712 713define <8 x i16> @test19(<8 x i16> %x) { 714; SSE-LABEL: test19: 715; SSE: # %bb.0: 716; SSE-NEXT: pcmpeqd %xmm1, %xmm1 717; SSE-NEXT: movdqa %xmm0, %xmm2 718; SSE-NEXT: psubw %xmm1, %xmm2 719; SSE-NEXT: pcmpeqw %xmm1, %xmm0 720; SSE-NEXT: por %xmm2, %xmm0 721; SSE-NEXT: retq 722; 723; AVX1-LABEL: test19: 724; AVX1: # %bb.0: 725; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 726; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm2 727; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 728; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0 729; AVX1-NEXT: retq 730; 731; AVX2-LABEL: test19: 732; AVX2: # %bb.0: 733; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 734; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm2 735; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 736; AVX2-NEXT: vpor %xmm2, %xmm0, %xmm0 737; AVX2-NEXT: retq 738; 739; AVX512-LABEL: test19: 740; AVX512: # %bb.0: 741; AVX512-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 742; AVX512-NEXT: vpsubw %xmm2, %xmm0, %xmm1 743; AVX512-NEXT: vpcmpeqw %xmm2, %xmm0, %k1 744; AVX512-NEXT: vmovdqu16 %xmm2, %xmm1 {%k1} 745; AVX512-NEXT: vmovdqa %xmm1, %xmm0 746; AVX512-NEXT: retq 747 %1 = add <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 748 %2 = icmp eq <8 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 749 %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1 750 ret <8 x i16> %3 751} 752 753define <8 x i16> @test20(<8 x i16> %x) { 754; SSE-LABEL: test20: 755; SSE: # %bb.0: 756; SSE-NEXT: paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 757; SSE-NEXT: retq 758; 759; AVX-LABEL: test20: 760; AVX: # %bb.0: 761; AVX-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 762; AVX-NEXT: retq 763 %1 = add <8 x i16> %x, <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767> 764 %2 = icmp ugt <8 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768> 765 %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1 766 ret <8 x i16> %3 767} 768 769define <8 x i16> @test21(<8 x i16> %x) { 770; SSE-LABEL: test21: 771; SSE: # %bb.0: 772; SSE-NEXT: paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 773; SSE-NEXT: retq 774; 775; AVX-LABEL: test21: 776; AVX: # %bb.0: 777; AVX-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 778; AVX-NEXT: retq 779 %1 = add <8 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767> 780 %2 = icmp ugt <8 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766> 781 %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1 782 ret <8 x i16> %3 783} 784 785define <8 x i16> @test22(<8 x i16> %x) { 786; SSE-LABEL: test22: 787; SSE: # %bb.0: 788; SSE-NEXT: paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 789; SSE-NEXT: retq 790; 791; AVX-LABEL: test22: 792; AVX: # %bb.0: 793; AVX-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 794; AVX-NEXT: retq 795 %1 = add <8 x i16> %x, <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2> 796 %2 = icmp ugt <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 797 %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1 798 ret <8 x i16> %3 799} 800 801define <8 x i16> @test23(<8 x i16> %x) { 802; SSE2-LABEL: test23: 803; SSE2: # %bb.0: 804; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 805; SSE2-NEXT: pxor %xmm0, %xmm2 806; SSE2-NEXT: movdqa %xmm2, %xmm1 807; SSE2-NEXT: pcmpgtw %xmm0, %xmm1 808; SSE2-NEXT: por %xmm2, %xmm1 809; SSE2-NEXT: movdqa %xmm1, %xmm0 810; SSE2-NEXT: retq 811; 812; SSSE3-LABEL: test23: 813; SSSE3: # %bb.0: 814; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 815; SSSE3-NEXT: pxor %xmm0, %xmm2 816; SSSE3-NEXT: movdqa %xmm2, %xmm1 817; SSSE3-NEXT: pcmpgtw %xmm0, %xmm1 818; SSSE3-NEXT: por %xmm2, %xmm1 819; SSSE3-NEXT: movdqa %xmm1, %xmm0 820; SSSE3-NEXT: retq 821; 822; SSE41-LABEL: test23: 823; SSE41: # %bb.0: 824; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768] 825; SSE41-NEXT: pxor %xmm0, %xmm1 826; SSE41-NEXT: pmaxuw %xmm1, %xmm0 827; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 828; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 829; SSE41-NEXT: pxor %xmm2, %xmm0 830; SSE41-NEXT: por %xmm1, %xmm0 831; SSE41-NEXT: retq 832; 833; AVX1-LABEL: test23: 834; AVX1: # %bb.0: 835; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 836; AVX1-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0 837; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0 838; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 839; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 840; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 841; AVX1-NEXT: retq 842; 843; AVX2-LABEL: test23: 844; AVX2: # %bb.0: 845; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 846; AVX2-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0 847; AVX2-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0 848; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 849; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 850; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 851; AVX2-NEXT: retq 852; 853; AVX512-LABEL: test23: 854; AVX512: # %bb.0: 855; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 856; AVX512-NEXT: vpcmpltuw %xmm0, %xmm1, %k1 857; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 858; AVX512-NEXT: vmovdqu16 %xmm0, %xmm1 {%k1} 859; AVX512-NEXT: vmovdqa %xmm1, %xmm0 860; AVX512-NEXT: retq 861 %1 = xor <8 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768> 862 %2 = icmp ult <8 x i16> %1, %x 863 %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1 864 ret <8 x i16> %3 865} 866 867define <8 x i16> @test24(<8 x i16> %x) { 868; SSE-LABEL: test24: 869; SSE: # %bb.0: 870; SSE-NEXT: paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 871; SSE-NEXT: retq 872; 873; AVX-LABEL: test24: 874; AVX: # %bb.0: 875; AVX-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 876; AVX-NEXT: retq 877 %1 = add <8 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 878 %2 = icmp ugt <8 x i16> %x, <i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3> 879 %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1 880 ret <8 x i16> %3 881} 882 883define <16 x i16> @test25(<16 x i16> %x) { 884; SSE-LABEL: test25: 885; SSE: # %bb.0: 886; SSE-NEXT: pcmpeqd %xmm2, %xmm2 887; SSE-NEXT: movdqa %xmm1, %xmm3 888; SSE-NEXT: psubw %xmm2, %xmm3 889; SSE-NEXT: movdqa %xmm0, %xmm4 890; SSE-NEXT: psubw %xmm2, %xmm4 891; SSE-NEXT: pcmpeqw %xmm2, %xmm1 892; SSE-NEXT: por %xmm3, %xmm1 893; SSE-NEXT: pcmpeqw %xmm2, %xmm0 894; SSE-NEXT: por %xmm4, %xmm0 895; SSE-NEXT: retq 896; 897; AVX1-LABEL: test25: 898; AVX1: # %bb.0: 899; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 900; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 901; AVX1-NEXT: vpsubw %xmm2, %xmm1, %xmm3 902; AVX1-NEXT: vpsubw %xmm2, %xmm0, %xmm4 903; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 904; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 905; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0 906; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 907; AVX1-NEXT: vorps %ymm3, %ymm0, %ymm0 908; AVX1-NEXT: retq 909; 910; AVX2-LABEL: test25: 911; AVX2: # %bb.0: 912; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 913; AVX2-NEXT: vpsubw %ymm1, %ymm0, %ymm2 914; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 915; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 916; AVX2-NEXT: retq 917; 918; AVX512-LABEL: test25: 919; AVX512: # %bb.0: 920; AVX512-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 921; AVX512-NEXT: vpsubw %ymm2, %ymm0, %ymm1 922; AVX512-NEXT: vpcmpeqw %ymm2, %ymm0, %k1 923; AVX512-NEXT: vmovdqu16 %ymm2, %ymm1 {%k1} 924; AVX512-NEXT: vmovdqa %ymm1, %ymm0 925; AVX512-NEXT: retq 926 %1 = add <16 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 927 %2 = icmp eq <16 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 928 %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1 929 ret <16 x i16> %3 930} 931 932define <16 x i16> @test26(<16 x i16> %x) { 933; SSE-LABEL: test26: 934; SSE: # %bb.0: 935; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767] 936; SSE-NEXT: paddusw %xmm2, %xmm0 937; SSE-NEXT: paddusw %xmm2, %xmm1 938; SSE-NEXT: retq 939; 940; AVX1-LABEL: test26: 941; AVX1: # %bb.0: 942; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 943; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767] 944; AVX1-NEXT: vpaddusw %xmm2, %xmm1, %xmm1 945; AVX1-NEXT: vpaddusw %xmm2, %xmm0, %xmm0 946; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 947; AVX1-NEXT: retq 948; 949; AVX2-LABEL: test26: 950; AVX2: # %bb.0: 951; AVX2-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 952; AVX2-NEXT: retq 953; 954; AVX512-LABEL: test26: 955; AVX512: # %bb.0: 956; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 957; AVX512-NEXT: retq 958 %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> 959 %2 = icmp ugt <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> 960 %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1 961 ret <16 x i16> %3 962} 963 964define <16 x i16> @test27(<16 x i16> %x) { 965; SSE-LABEL: test27: 966; SSE: # %bb.0: 967; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32769,32769,32769,32769,32769,32769,32769,32769] 968; SSE-NEXT: paddusw %xmm2, %xmm0 969; SSE-NEXT: paddusw %xmm2, %xmm1 970; SSE-NEXT: retq 971; 972; AVX1-LABEL: test27: 973; AVX1: # %bb.0: 974; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 975; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [32769,32769,32769,32769,32769,32769,32769,32769] 976; AVX1-NEXT: vpaddusw %xmm2, %xmm1, %xmm1 977; AVX1-NEXT: vpaddusw %xmm2, %xmm0, %xmm0 978; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 979; AVX1-NEXT: retq 980; 981; AVX2-LABEL: test27: 982; AVX2: # %bb.0: 983; AVX2-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 984; AVX2-NEXT: retq 985; 986; AVX512-LABEL: test27: 987; AVX512: # %bb.0: 988; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 989; AVX512-NEXT: retq 990 %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> 991 %2 = 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> 992 %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1 993 ret <16 x i16> %3 994} 995 996define <16 x i16> @test28(<16 x i16> %x) { 997; SSE-LABEL: test28: 998; SSE: # %bb.0: 999; SSE-NEXT: movdqa {{.*#+}} xmm2 = [65534,65534,65534,65534,65534,65534,65534,65534] 1000; SSE-NEXT: paddusw %xmm2, %xmm0 1001; SSE-NEXT: paddusw %xmm2, %xmm1 1002; SSE-NEXT: retq 1003; 1004; AVX1-LABEL: test28: 1005; AVX1: # %bb.0: 1006; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1007; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65534,65534,65534,65534,65534,65534,65534,65534] 1008; AVX1-NEXT: vpaddusw %xmm2, %xmm1, %xmm1 1009; AVX1-NEXT: vpaddusw %xmm2, %xmm0, %xmm0 1010; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1011; AVX1-NEXT: retq 1012; 1013; AVX2-LABEL: test28: 1014; AVX2: # %bb.0: 1015; AVX2-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1016; AVX2-NEXT: retq 1017; 1018; AVX512-LABEL: test28: 1019; AVX512: # %bb.0: 1020; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1021; AVX512-NEXT: retq 1022 %1 = add <16 x i16> %x, <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2> 1023 %2 = icmp ugt <16 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 1024 %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1 1025 ret <16 x i16> %3 1026} 1027 1028define <16 x i16> @test29(<16 x i16> %x) { 1029; SSE2-LABEL: test29: 1030; SSE2: # %bb.0: 1031; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768] 1032; SSE2-NEXT: movdqa %xmm0, %xmm4 1033; SSE2-NEXT: pxor %xmm3, %xmm4 1034; SSE2-NEXT: pxor %xmm1, %xmm3 1035; SSE2-NEXT: movdqa %xmm3, %xmm2 1036; SSE2-NEXT: pcmpgtw %xmm1, %xmm2 1037; SSE2-NEXT: movdqa %xmm4, %xmm1 1038; SSE2-NEXT: pcmpgtw %xmm0, %xmm1 1039; SSE2-NEXT: por %xmm4, %xmm1 1040; SSE2-NEXT: por %xmm3, %xmm2 1041; SSE2-NEXT: movdqa %xmm1, %xmm0 1042; SSE2-NEXT: movdqa %xmm2, %xmm1 1043; SSE2-NEXT: retq 1044; 1045; SSSE3-LABEL: test29: 1046; SSSE3: # %bb.0: 1047; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768] 1048; SSSE3-NEXT: movdqa %xmm0, %xmm4 1049; SSSE3-NEXT: pxor %xmm3, %xmm4 1050; SSSE3-NEXT: pxor %xmm1, %xmm3 1051; SSSE3-NEXT: movdqa %xmm3, %xmm2 1052; SSSE3-NEXT: pcmpgtw %xmm1, %xmm2 1053; SSSE3-NEXT: movdqa %xmm4, %xmm1 1054; SSSE3-NEXT: pcmpgtw %xmm0, %xmm1 1055; SSSE3-NEXT: por %xmm4, %xmm1 1056; SSSE3-NEXT: por %xmm3, %xmm2 1057; SSSE3-NEXT: movdqa %xmm1, %xmm0 1058; SSSE3-NEXT: movdqa %xmm2, %xmm1 1059; SSSE3-NEXT: retq 1060; 1061; SSE41-LABEL: test29: 1062; SSE41: # %bb.0: 1063; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 1064; SSE41-NEXT: movdqa %xmm0, %xmm3 1065; SSE41-NEXT: pxor %xmm2, %xmm3 1066; SSE41-NEXT: pxor %xmm1, %xmm2 1067; SSE41-NEXT: pmaxuw %xmm2, %xmm1 1068; SSE41-NEXT: pcmpeqw %xmm2, %xmm1 1069; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 1070; SSE41-NEXT: pxor %xmm4, %xmm1 1071; SSE41-NEXT: pmaxuw %xmm3, %xmm0 1072; SSE41-NEXT: pcmpeqw %xmm3, %xmm0 1073; SSE41-NEXT: pxor %xmm4, %xmm0 1074; SSE41-NEXT: por %xmm3, %xmm0 1075; SSE41-NEXT: por %xmm2, %xmm1 1076; SSE41-NEXT: retq 1077; 1078; AVX1-LABEL: test29: 1079; AVX1: # %bb.0: 1080; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 1081; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1082; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1083; AVX1-NEXT: vpmaxuw %xmm2, %xmm3, %xmm2 1084; AVX1-NEXT: vpcmpeqw %xmm2, %xmm3, %xmm2 1085; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 1086; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 1087; AVX1-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0 1088; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0 1089; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0 1090; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1091; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1092; AVX1-NEXT: retq 1093; 1094; AVX2-LABEL: test29: 1095; AVX2: # %bb.0: 1096; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 1097; AVX2-NEXT: vpmaxuw %ymm0, %ymm1, %ymm0 1098; AVX2-NEXT: vpcmpeqw %ymm0, %ymm1, %ymm0 1099; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 1100; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 1101; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1102; AVX2-NEXT: retq 1103; 1104; AVX512-LABEL: test29: 1105; AVX512: # %bb.0: 1106; AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 1107; AVX512-NEXT: vpcmpltuw %ymm0, %ymm1, %k1 1108; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 1109; AVX512-NEXT: vmovdqu16 %ymm0, %ymm1 {%k1} 1110; AVX512-NEXT: vmovdqa %ymm1, %ymm0 1111; AVX512-NEXT: retq 1112 %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> 1113 %2 = icmp ult <16 x i16> %1, %x 1114 %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1 1115 ret <16 x i16> %3 1116} 1117 1118define <16 x i16> @test30(<16 x i16> %x) { 1119; SSE-LABEL: test30: 1120; SSE: # %bb.0: 1121; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2] 1122; SSE-NEXT: paddusw %xmm2, %xmm0 1123; SSE-NEXT: paddusw %xmm2, %xmm1 1124; SSE-NEXT: retq 1125; 1126; AVX1-LABEL: test30: 1127; AVX1: # %bb.0: 1128; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1129; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2] 1130; AVX1-NEXT: vpaddusw %xmm2, %xmm1, %xmm1 1131; AVX1-NEXT: vpaddusw %xmm2, %xmm0, %xmm0 1132; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1133; AVX1-NEXT: retq 1134; 1135; AVX2-LABEL: test30: 1136; AVX2: # %bb.0: 1137; AVX2-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1138; AVX2-NEXT: retq 1139; 1140; AVX512-LABEL: test30: 1141; AVX512: # %bb.0: 1142; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 1143; AVX512-NEXT: retq 1144 %1 = add <16 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 1145 %2 = icmp ugt <16 x i16> %x, <i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3> 1146 %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1 1147 ret <16 x i16> %3 1148} 1149 1150define <32 x i16> @test31(<32 x i16> %x) { 1151; SSE-LABEL: test31: 1152; SSE: # %bb.0: 1153; SSE-NEXT: pcmpeqd %xmm8, %xmm8 1154; SSE-NEXT: movdqa %xmm3, %xmm5 1155; SSE-NEXT: psubw %xmm8, %xmm5 1156; SSE-NEXT: movdqa %xmm2, %xmm6 1157; SSE-NEXT: psubw %xmm8, %xmm6 1158; SSE-NEXT: movdqa %xmm1, %xmm7 1159; SSE-NEXT: psubw %xmm8, %xmm7 1160; SSE-NEXT: movdqa %xmm0, %xmm4 1161; SSE-NEXT: psubw %xmm8, %xmm4 1162; SSE-NEXT: pcmpeqw %xmm8, %xmm3 1163; SSE-NEXT: por %xmm5, %xmm3 1164; SSE-NEXT: pcmpeqw %xmm8, %xmm2 1165; SSE-NEXT: por %xmm6, %xmm2 1166; SSE-NEXT: pcmpeqw %xmm8, %xmm1 1167; SSE-NEXT: por %xmm7, %xmm1 1168; SSE-NEXT: pcmpeqw %xmm8, %xmm0 1169; SSE-NEXT: por %xmm4, %xmm0 1170; SSE-NEXT: retq 1171; 1172; AVX1-LABEL: test31: 1173; AVX1: # %bb.0: 1174; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1175; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 1176; AVX1-NEXT: vpsubw %xmm3, %xmm2, %xmm4 1177; AVX1-NEXT: vpsubw %xmm3, %xmm1, %xmm5 1178; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 1179; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1180; AVX1-NEXT: vpsubw %xmm3, %xmm5, %xmm6 1181; AVX1-NEXT: vpsubw %xmm3, %xmm0, %xmm7 1182; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 1183; AVX1-NEXT: vpcmpeqw %xmm3, %xmm2, %xmm2 1184; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1 1185; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1186; AVX1-NEXT: vorps %ymm4, %ymm1, %ymm1 1187; AVX1-NEXT: vpcmpeqw %xmm3, %xmm5, %xmm2 1188; AVX1-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm0 1189; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1190; AVX1-NEXT: vorps %ymm6, %ymm0, %ymm0 1191; AVX1-NEXT: retq 1192; 1193; AVX2-LABEL: test31: 1194; AVX2: # %bb.0: 1195; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 1196; AVX2-NEXT: vpsubw %ymm2, %ymm1, %ymm3 1197; AVX2-NEXT: vpsubw %ymm2, %ymm0, %ymm4 1198; AVX2-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm1 1199; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1 1200; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0 1201; AVX2-NEXT: vpor %ymm4, %ymm0, %ymm0 1202; AVX2-NEXT: retq 1203; 1204; AVX512-LABEL: test31: 1205; AVX512: # %bb.0: 1206; AVX512-NEXT: vpternlogd $255, %zmm2, %zmm2, %zmm2 1207; AVX512-NEXT: vpsubw %zmm2, %zmm0, %zmm1 1208; AVX512-NEXT: vpcmpeqw %zmm2, %zmm0, %k1 1209; AVX512-NEXT: vmovdqu16 %zmm2, %zmm1 {%k1} 1210; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 1211; AVX512-NEXT: retq 1212 %1 = add <32 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 1213 %2 = icmp eq <32 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 1214 %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1 1215 ret <32 x i16> %3 1216} 1217 1218define <32 x i16> @test32(<32 x i16> %x) { 1219; SSE-LABEL: test32: 1220; SSE: # %bb.0: 1221; SSE-NEXT: movdqa {{.*#+}} xmm4 = [32767,32767,32767,32767,32767,32767,32767,32767] 1222; SSE-NEXT: paddusw %xmm4, %xmm0 1223; SSE-NEXT: paddusw %xmm4, %xmm1 1224; SSE-NEXT: paddusw %xmm4, %xmm2 1225; SSE-NEXT: paddusw %xmm4, %xmm3 1226; SSE-NEXT: retq 1227; 1228; AVX1-LABEL: test32: 1229; AVX1: # %bb.0: 1230; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1231; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32767,32767,32767,32767,32767,32767,32767,32767] 1232; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1233; AVX1-NEXT: vpaddusw %xmm3, %xmm0, %xmm0 1234; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1235; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1236; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1237; AVX1-NEXT: vpaddusw %xmm3, %xmm1, %xmm1 1238; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1239; AVX1-NEXT: retq 1240; 1241; AVX2-LABEL: test32: 1242; AVX2: # %bb.0: 1243; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767] 1244; AVX2-NEXT: vpaddusw %ymm2, %ymm0, %ymm0 1245; AVX2-NEXT: vpaddusw %ymm2, %ymm1, %ymm1 1246; AVX2-NEXT: retq 1247; 1248; AVX512-LABEL: test32: 1249; AVX512: # %bb.0: 1250; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 1251; AVX512-NEXT: retq 1252 %1 = add <32 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, 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> 1253 %2 = icmp ugt <32 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, 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> 1254 %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1 1255 ret <32 x i16> %3 1256} 1257 1258define <32 x i16> @test33(<32 x i16> %x) { 1259; SSE-LABEL: test33: 1260; SSE: # %bb.0: 1261; SSE-NEXT: movdqa {{.*#+}} xmm4 = [32769,32769,32769,32769,32769,32769,32769,32769] 1262; SSE-NEXT: paddusw %xmm4, %xmm0 1263; SSE-NEXT: paddusw %xmm4, %xmm1 1264; SSE-NEXT: paddusw %xmm4, %xmm2 1265; SSE-NEXT: paddusw %xmm4, %xmm3 1266; SSE-NEXT: retq 1267; 1268; AVX1-LABEL: test33: 1269; AVX1: # %bb.0: 1270; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1271; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32769,32769,32769,32769,32769,32769,32769,32769] 1272; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1273; AVX1-NEXT: vpaddusw %xmm3, %xmm0, %xmm0 1274; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1275; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1276; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1277; AVX1-NEXT: vpaddusw %xmm3, %xmm1, %xmm1 1278; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1279; AVX1-NEXT: retq 1280; 1281; AVX2-LABEL: test33: 1282; AVX2: # %bb.0: 1283; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769] 1284; AVX2-NEXT: vpaddusw %ymm2, %ymm0, %ymm0 1285; AVX2-NEXT: vpaddusw %ymm2, %ymm1, %ymm1 1286; AVX2-NEXT: retq 1287; 1288; AVX512-LABEL: test33: 1289; AVX512: # %bb.0: 1290; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 1291; AVX512-NEXT: retq 1292 %1 = add <32 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, 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> 1293 %2 = icmp ugt <32 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, 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> 1294 %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1 1295 ret <32 x i16> %3 1296} 1297 1298define <32 x i16> @test34(<32 x i16> %x) { 1299; SSE-LABEL: test34: 1300; SSE: # %bb.0: 1301; SSE-NEXT: movdqa {{.*#+}} xmm4 = [65534,65534,65534,65534,65534,65534,65534,65534] 1302; SSE-NEXT: paddusw %xmm4, %xmm0 1303; SSE-NEXT: paddusw %xmm4, %xmm1 1304; SSE-NEXT: paddusw %xmm4, %xmm2 1305; SSE-NEXT: paddusw %xmm4, %xmm3 1306; SSE-NEXT: retq 1307; 1308; AVX1-LABEL: test34: 1309; AVX1: # %bb.0: 1310; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1311; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65534,65534,65534,65534,65534,65534,65534,65534] 1312; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1313; AVX1-NEXT: vpaddusw %xmm3, %xmm0, %xmm0 1314; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1315; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1316; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1317; AVX1-NEXT: vpaddusw %xmm3, %xmm1, %xmm1 1318; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1319; AVX1-NEXT: retq 1320; 1321; AVX2-LABEL: test34: 1322; AVX2: # %bb.0: 1323; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534] 1324; AVX2-NEXT: vpaddusw %ymm2, %ymm0, %ymm0 1325; AVX2-NEXT: vpaddusw %ymm2, %ymm1, %ymm1 1326; AVX2-NEXT: retq 1327; 1328; AVX512-LABEL: test34: 1329; AVX512: # %bb.0: 1330; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 1331; AVX512-NEXT: retq 1332 %1 = add <32 x i16> %x, <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2> 1333 %2 = icmp ugt <32 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 1334 %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1 1335 ret <32 x i16> %3 1336} 1337 1338define <32 x i16> @test35(<32 x i16> %x) { 1339; SSE2-LABEL: test35: 1340; SSE2: # %bb.0: 1341; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [32768,32768,32768,32768,32768,32768,32768,32768] 1342; SSE2-NEXT: movdqa %xmm0, %xmm6 1343; SSE2-NEXT: pxor %xmm5, %xmm6 1344; SSE2-NEXT: movdqa %xmm1, %xmm7 1345; SSE2-NEXT: pxor %xmm5, %xmm7 1346; SSE2-NEXT: movdqa %xmm2, %xmm8 1347; SSE2-NEXT: pxor %xmm5, %xmm8 1348; SSE2-NEXT: pxor %xmm3, %xmm5 1349; SSE2-NEXT: movdqa %xmm5, %xmm4 1350; SSE2-NEXT: pcmpgtw %xmm3, %xmm4 1351; SSE2-NEXT: movdqa %xmm8, %xmm3 1352; SSE2-NEXT: pcmpgtw %xmm2, %xmm3 1353; SSE2-NEXT: movdqa %xmm7, %xmm2 1354; SSE2-NEXT: pcmpgtw %xmm1, %xmm2 1355; SSE2-NEXT: movdqa %xmm6, %xmm1 1356; SSE2-NEXT: pcmpgtw %xmm0, %xmm1 1357; SSE2-NEXT: por %xmm6, %xmm1 1358; SSE2-NEXT: por %xmm7, %xmm2 1359; SSE2-NEXT: por %xmm8, %xmm3 1360; SSE2-NEXT: por %xmm5, %xmm4 1361; SSE2-NEXT: movdqa %xmm1, %xmm0 1362; SSE2-NEXT: movdqa %xmm2, %xmm1 1363; SSE2-NEXT: movdqa %xmm3, %xmm2 1364; SSE2-NEXT: movdqa %xmm4, %xmm3 1365; SSE2-NEXT: retq 1366; 1367; SSSE3-LABEL: test35: 1368; SSSE3: # %bb.0: 1369; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [32768,32768,32768,32768,32768,32768,32768,32768] 1370; SSSE3-NEXT: movdqa %xmm0, %xmm6 1371; SSSE3-NEXT: pxor %xmm5, %xmm6 1372; SSSE3-NEXT: movdqa %xmm1, %xmm7 1373; SSSE3-NEXT: pxor %xmm5, %xmm7 1374; SSSE3-NEXT: movdqa %xmm2, %xmm8 1375; SSSE3-NEXT: pxor %xmm5, %xmm8 1376; SSSE3-NEXT: pxor %xmm3, %xmm5 1377; SSSE3-NEXT: movdqa %xmm5, %xmm4 1378; SSSE3-NEXT: pcmpgtw %xmm3, %xmm4 1379; SSSE3-NEXT: movdqa %xmm8, %xmm3 1380; SSSE3-NEXT: pcmpgtw %xmm2, %xmm3 1381; SSSE3-NEXT: movdqa %xmm7, %xmm2 1382; SSSE3-NEXT: pcmpgtw %xmm1, %xmm2 1383; SSSE3-NEXT: movdqa %xmm6, %xmm1 1384; SSSE3-NEXT: pcmpgtw %xmm0, %xmm1 1385; SSSE3-NEXT: por %xmm6, %xmm1 1386; SSSE3-NEXT: por %xmm7, %xmm2 1387; SSSE3-NEXT: por %xmm8, %xmm3 1388; SSSE3-NEXT: por %xmm5, %xmm4 1389; SSSE3-NEXT: movdqa %xmm1, %xmm0 1390; SSSE3-NEXT: movdqa %xmm2, %xmm1 1391; SSSE3-NEXT: movdqa %xmm3, %xmm2 1392; SSSE3-NEXT: movdqa %xmm4, %xmm3 1393; SSSE3-NEXT: retq 1394; 1395; SSE41-LABEL: test35: 1396; SSE41: # %bb.0: 1397; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768] 1398; SSE41-NEXT: movdqa %xmm0, %xmm5 1399; SSE41-NEXT: pxor %xmm4, %xmm5 1400; SSE41-NEXT: movdqa %xmm1, %xmm6 1401; SSE41-NEXT: pxor %xmm4, %xmm6 1402; SSE41-NEXT: movdqa %xmm2, %xmm7 1403; SSE41-NEXT: pxor %xmm4, %xmm7 1404; SSE41-NEXT: pxor %xmm3, %xmm4 1405; SSE41-NEXT: pmaxuw %xmm4, %xmm3 1406; SSE41-NEXT: pcmpeqw %xmm4, %xmm3 1407; SSE41-NEXT: pcmpeqd %xmm8, %xmm8 1408; SSE41-NEXT: pxor %xmm8, %xmm3 1409; SSE41-NEXT: pmaxuw %xmm7, %xmm2 1410; SSE41-NEXT: pcmpeqw %xmm7, %xmm2 1411; SSE41-NEXT: pxor %xmm8, %xmm2 1412; SSE41-NEXT: pmaxuw %xmm6, %xmm1 1413; SSE41-NEXT: pcmpeqw %xmm6, %xmm1 1414; SSE41-NEXT: pxor %xmm8, %xmm1 1415; SSE41-NEXT: pmaxuw %xmm5, %xmm0 1416; SSE41-NEXT: pcmpeqw %xmm5, %xmm0 1417; SSE41-NEXT: pxor %xmm8, %xmm0 1418; SSE41-NEXT: por %xmm5, %xmm0 1419; SSE41-NEXT: por %xmm6, %xmm1 1420; SSE41-NEXT: por %xmm7, %xmm2 1421; SSE41-NEXT: por %xmm4, %xmm3 1422; SSE41-NEXT: retq 1423; 1424; AVX1-LABEL: test35: 1425; AVX1: # %bb.0: 1426; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768] 1427; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm3 1428; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm2 1429; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1430; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 1431; AVX1-NEXT: vpmaxuw %xmm5, %xmm4, %xmm5 1432; AVX1-NEXT: vpcmpeqw %xmm5, %xmm4, %xmm4 1433; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 1434; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4 1435; AVX1-NEXT: vpmaxuw %xmm1, %xmm2, %xmm1 1436; AVX1-NEXT: vpcmpeqw %xmm1, %xmm2, %xmm1 1437; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 1438; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1 1439; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1440; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 1441; AVX1-NEXT: vpmaxuw %xmm6, %xmm4, %xmm6 1442; AVX1-NEXT: vpcmpeqw %xmm6, %xmm4, %xmm4 1443; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4 1444; AVX1-NEXT: vpmaxuw %xmm0, %xmm3, %xmm0 1445; AVX1-NEXT: vpcmpeqw %xmm0, %xmm3, %xmm0 1446; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0 1447; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 1448; AVX1-NEXT: vorps %ymm3, %ymm0, %ymm0 1449; AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 1450; AVX1-NEXT: retq 1451; 1452; AVX2-LABEL: test35: 1453; AVX2: # %bb.0: 1454; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768] 1455; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3 1456; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2 1457; AVX2-NEXT: vpmaxuw %ymm1, %ymm2, %ymm1 1458; AVX2-NEXT: vpcmpeqw %ymm1, %ymm2, %ymm1 1459; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 1460; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 1461; AVX2-NEXT: vpmaxuw %ymm0, %ymm3, %ymm0 1462; AVX2-NEXT: vpcmpeqw %ymm0, %ymm3, %ymm0 1463; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0 1464; AVX2-NEXT: vpor %ymm3, %ymm0, %ymm0 1465; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 1466; AVX2-NEXT: retq 1467; 1468; AVX512-LABEL: test35: 1469; AVX512: # %bb.0: 1470; AVX512-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1 1471; AVX512-NEXT: vpcmpltuw %zmm0, %zmm1, %k1 1472; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 1473; AVX512-NEXT: vmovdqu16 %zmm0, %zmm1 {%k1} 1474; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 1475; AVX512-NEXT: retq 1476 %1 = xor <32 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, 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> 1477 %2 = icmp ult <32 x i16> %1, %x 1478 %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1 1479 ret <32 x i16> %3 1480} 1481 1482define <32 x i16> @test36(<32 x i16> %x) { 1483; SSE-LABEL: test36: 1484; SSE: # %bb.0: 1485; SSE-NEXT: movdqa {{.*#+}} xmm4 = [2,2,2,2,2,2,2,2] 1486; SSE-NEXT: paddusw %xmm4, %xmm0 1487; SSE-NEXT: paddusw %xmm4, %xmm1 1488; SSE-NEXT: paddusw %xmm4, %xmm2 1489; SSE-NEXT: paddusw %xmm4, %xmm3 1490; SSE-NEXT: retq 1491; 1492; AVX1-LABEL: test36: 1493; AVX1: # %bb.0: 1494; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1495; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [2,2,2,2,2,2,2,2] 1496; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1497; AVX1-NEXT: vpaddusw %xmm3, %xmm0, %xmm0 1498; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1499; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1500; AVX1-NEXT: vpaddusw %xmm3, %xmm2, %xmm2 1501; AVX1-NEXT: vpaddusw %xmm3, %xmm1, %xmm1 1502; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1503; AVX1-NEXT: retq 1504; 1505; AVX2-LABEL: test36: 1506; AVX2: # %bb.0: 1507; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] 1508; AVX2-NEXT: vpaddusw %ymm2, %ymm0, %ymm0 1509; AVX2-NEXT: vpaddusw %ymm2, %ymm1, %ymm1 1510; AVX2-NEXT: retq 1511; 1512; AVX512-LABEL: test36: 1513; AVX512: # %bb.0: 1514; AVX512-NEXT: vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 1515; AVX512-NEXT: retq 1516 %1 = add <32 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 1517 %2 = icmp ugt <32 x i16> %x, <i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3> 1518 %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1 1519 ret <32 x i16> %3 1520} 1521 1522define void @addus_v8i8(<8 x i8>* %p1, <8 x i8>* %p2) { 1523; SSE-LABEL: addus_v8i8: 1524; SSE: # %bb.0: 1525; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1526; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1527; SSE-NEXT: paddusb %xmm0, %xmm1 1528; SSE-NEXT: movq %xmm1, (%rdi) 1529; SSE-NEXT: retq 1530; 1531; AVX-LABEL: addus_v8i8: 1532; AVX: # %bb.0: 1533; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 1534; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1535; AVX-NEXT: vpaddusb %xmm0, %xmm1, %xmm0 1536; AVX-NEXT: vmovq %xmm0, (%rdi) 1537; AVX-NEXT: retq 1538 %ld1 = load <8 x i8>, <8 x i8>* %p1, align 8 1539 %ld2 = load <8 x i8>, <8 x i8>* %p2, align 8 1540 %1 = add <8 x i8> %ld2, %ld1 1541 %2 = icmp ugt <8 x i8> %ld1, %1 1542 %sh3 = select <8 x i1> %2, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <8 x i8> %1 1543 store <8 x i8> %sh3, <8 x i8>* %p1, align 8 1544 ret void 1545} 1546 1547define void @addus_v4i8(<4 x i8>* %p1, <4 x i8>* %p2) { 1548; SSE-LABEL: addus_v4i8: 1549; SSE: # %bb.0: 1550; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1551; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1552; SSE-NEXT: paddusb %xmm0, %xmm1 1553; SSE-NEXT: movd %xmm1, (%rdi) 1554; SSE-NEXT: retq 1555; 1556; AVX-LABEL: addus_v4i8: 1557; AVX: # %bb.0: 1558; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1559; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1560; AVX-NEXT: vpaddusb %xmm0, %xmm1, %xmm0 1561; AVX-NEXT: vmovd %xmm0, (%rdi) 1562; AVX-NEXT: retq 1563 %ld1 = load <4 x i8>, <4 x i8>* %p1, align 4 1564 %ld2 = load <4 x i8>, <4 x i8>* %p2, align 4 1565 %1 = add <4 x i8> %ld2, %ld1 1566 %2 = icmp ugt <4 x i8> %ld1, %1 1567 %sh3 = select <4 x i1> %2, <4 x i8> <i8 -1, i8 -1, i8 -1, i8 -1>, <4 x i8> %1 1568 store <4 x i8> %sh3, <4 x i8>* %p1, align 4 1569 ret void 1570} 1571 1572define void @addus_v2i8(<2 x i8>* %p1, <2 x i8>* %p2) { 1573; SSE2-LABEL: addus_v2i8: 1574; SSE2: # %bb.0: 1575; SSE2-NEXT: movzwl (%rdi), %eax 1576; SSE2-NEXT: movd %eax, %xmm0 1577; SSE2-NEXT: movzwl (%rsi), %eax 1578; SSE2-NEXT: movd %eax, %xmm1 1579; SSE2-NEXT: paddusb %xmm0, %xmm1 1580; SSE2-NEXT: movd %xmm1, %eax 1581; SSE2-NEXT: movw %ax, (%rdi) 1582; SSE2-NEXT: retq 1583; 1584; SSSE3-LABEL: addus_v2i8: 1585; SSSE3: # %bb.0: 1586; SSSE3-NEXT: movzwl (%rdi), %eax 1587; SSSE3-NEXT: movd %eax, %xmm0 1588; SSSE3-NEXT: movzwl (%rsi), %eax 1589; SSSE3-NEXT: movd %eax, %xmm1 1590; SSSE3-NEXT: paddusb %xmm0, %xmm1 1591; SSSE3-NEXT: movd %xmm1, %eax 1592; SSSE3-NEXT: movw %ax, (%rdi) 1593; SSSE3-NEXT: retq 1594; 1595; SSE41-LABEL: addus_v2i8: 1596; SSE41: # %bb.0: 1597; SSE41-NEXT: movzwl (%rdi), %eax 1598; SSE41-NEXT: movd %eax, %xmm0 1599; SSE41-NEXT: movzwl (%rsi), %eax 1600; SSE41-NEXT: movd %eax, %xmm1 1601; SSE41-NEXT: paddusb %xmm0, %xmm1 1602; SSE41-NEXT: pextrw $0, %xmm1, (%rdi) 1603; SSE41-NEXT: retq 1604; 1605; AVX-LABEL: addus_v2i8: 1606; AVX: # %bb.0: 1607; AVX-NEXT: movzwl (%rdi), %eax 1608; AVX-NEXT: vmovd %eax, %xmm0 1609; AVX-NEXT: movzwl (%rsi), %eax 1610; AVX-NEXT: vmovd %eax, %xmm1 1611; AVX-NEXT: vpaddusb %xmm0, %xmm1, %xmm0 1612; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) 1613; AVX-NEXT: retq 1614 %ld1 = load <2 x i8>, <2 x i8>* %p1, align 2 1615 %ld2 = load <2 x i8>, <2 x i8>* %p2, align 2 1616 %1 = add <2 x i8> %ld2, %ld1 1617 %2 = icmp ugt <2 x i8> %ld1, %1 1618 %sh3 = select <2 x i1> %2, <2 x i8> <i8 -1, i8 -1>, <2 x i8> %1 1619 store <2 x i8> %sh3, <2 x i8>* %p1, align 2 1620 ret void 1621} 1622 1623define void @addus_v4i16(<4 x i16>* %p1, <4 x i16>* %p2) { 1624; SSE-LABEL: addus_v4i16: 1625; SSE: # %bb.0: 1626; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1627; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1628; SSE-NEXT: paddusw %xmm0, %xmm1 1629; SSE-NEXT: movq %xmm1, (%rdi) 1630; SSE-NEXT: retq 1631; 1632; AVX-LABEL: addus_v4i16: 1633; AVX: # %bb.0: 1634; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 1635; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1636; AVX-NEXT: vpaddusw %xmm0, %xmm1, %xmm0 1637; AVX-NEXT: vmovq %xmm0, (%rdi) 1638; AVX-NEXT: retq 1639 %ld1 = load <4 x i16>, <4 x i16>* %p1, align 4 1640 %ld2 = load <4 x i16>, <4 x i16>* %p2, align 4 1641 %1 = add <4 x i16> %ld2, %ld1 1642 %2 = icmp ugt <4 x i16> %ld1, %1 1643 %sh3 = select <4 x i1> %2, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, <4 x i16> %1 1644 store <4 x i16> %sh3, <4 x i16>* %p1, align 4 1645 ret void 1646} 1647 1648define void @addus_v2i16(<2 x i16>* %p1, <2 x i16>* %p2) { 1649; SSE-LABEL: addus_v2i16: 1650; SSE: # %bb.0: 1651; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1652; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1653; SSE-NEXT: paddusw %xmm0, %xmm1 1654; SSE-NEXT: movd %xmm1, (%rdi) 1655; SSE-NEXT: retq 1656; 1657; AVX-LABEL: addus_v2i16: 1658; AVX: # %bb.0: 1659; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1660; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1661; AVX-NEXT: vpaddusw %xmm0, %xmm1, %xmm0 1662; AVX-NEXT: vmovd %xmm0, (%rdi) 1663; AVX-NEXT: retq 1664 %ld1 = load <2 x i16>, <2 x i16>* %p1, align 2 1665 %ld2 = load <2 x i16>, <2 x i16>* %p2, align 2 1666 %1 = add <2 x i16> %ld2, %ld1 1667 %2 = icmp ugt <2 x i16> %ld1, %1 1668 %sh3 = select <2 x i1> %2, <2 x i16> <i16 -1, i16 -1>, <2 x i16> %1 1669 store <2 x i16> %sh3, <2 x i16>* %p1, align 2 1670 ret void 1671} 1672