1; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 7; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512VLCD --check-prefix=ALL --check-prefix=AVX512 8; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd | FileCheck %s --check-prefix=AVX512CD --check-prefix=ALL --check-prefix=AVX512 9 10define <2 x i64> @testv2i64(<2 x i64> %in) nounwind { 11; SSE2-LABEL: testv2i64: 12; SSE2: # BB#0: 13; SSE2-NEXT: movd %xmm0, %rax 14; SSE2-NEXT: bsrq %rax, %rax 15; SSE2-NEXT: movl $127, %ecx 16; SSE2-NEXT: cmoveq %rcx, %rax 17; SSE2-NEXT: xorq $63, %rax 18; SSE2-NEXT: movd %rax, %xmm1 19; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 20; SSE2-NEXT: movd %xmm0, %rax 21; SSE2-NEXT: bsrq %rax, %rax 22; SSE2-NEXT: cmoveq %rcx, %rax 23; SSE2-NEXT: xorq $63, %rax 24; SSE2-NEXT: movd %rax, %xmm0 25; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 26; SSE2-NEXT: movdqa %xmm1, %xmm0 27; SSE2-NEXT: retq 28; 29; SSE3-LABEL: testv2i64: 30; SSE3: # BB#0: 31; SSE3-NEXT: movd %xmm0, %rax 32; SSE3-NEXT: bsrq %rax, %rax 33; SSE3-NEXT: movl $127, %ecx 34; SSE3-NEXT: cmoveq %rcx, %rax 35; SSE3-NEXT: xorq $63, %rax 36; SSE3-NEXT: movd %rax, %xmm1 37; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 38; SSE3-NEXT: movd %xmm0, %rax 39; SSE3-NEXT: bsrq %rax, %rax 40; SSE3-NEXT: cmoveq %rcx, %rax 41; SSE3-NEXT: xorq $63, %rax 42; SSE3-NEXT: movd %rax, %xmm0 43; SSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 44; SSE3-NEXT: movdqa %xmm1, %xmm0 45; SSE3-NEXT: retq 46; 47; SSSE3-LABEL: testv2i64: 48; SSSE3: # BB#0: 49; SSSE3-NEXT: movd %xmm0, %rax 50; SSSE3-NEXT: bsrq %rax, %rax 51; SSSE3-NEXT: movl $127, %ecx 52; SSSE3-NEXT: cmoveq %rcx, %rax 53; SSSE3-NEXT: xorq $63, %rax 54; SSSE3-NEXT: movd %rax, %xmm1 55; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 56; SSSE3-NEXT: movd %xmm0, %rax 57; SSSE3-NEXT: bsrq %rax, %rax 58; SSSE3-NEXT: cmoveq %rcx, %rax 59; SSSE3-NEXT: xorq $63, %rax 60; SSSE3-NEXT: movd %rax, %xmm0 61; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 62; SSSE3-NEXT: movdqa %xmm1, %xmm0 63; SSSE3-NEXT: retq 64; 65; SSE41-LABEL: testv2i64: 66; SSE41: # BB#0: 67; SSE41-NEXT: pextrq $1, %xmm0, %rax 68; SSE41-NEXT: bsrq %rax, %rax 69; SSE41-NEXT: movl $127, %ecx 70; SSE41-NEXT: cmoveq %rcx, %rax 71; SSE41-NEXT: xorq $63, %rax 72; SSE41-NEXT: movd %rax, %xmm1 73; SSE41-NEXT: movd %xmm0, %rax 74; SSE41-NEXT: bsrq %rax, %rax 75; SSE41-NEXT: cmoveq %rcx, %rax 76; SSE41-NEXT: xorq $63, %rax 77; SSE41-NEXT: movd %rax, %xmm0 78; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 79; SSE41-NEXT: retq 80; 81; AVX-LABEL: testv2i64: 82; AVX: # BB#0: 83; AVX-NEXT: vpextrq $1, %xmm0, %rax 84; AVX-NEXT: bsrq %rax, %rax 85; AVX-NEXT: movl $127, %ecx 86; AVX-NEXT: cmoveq %rcx, %rax 87; AVX-NEXT: xorq $63, %rax 88; AVX-NEXT: vmovq %rax, %xmm1 89; AVX-NEXT: vmovq %xmm0, %rax 90; AVX-NEXT: bsrq %rax, %rax 91; AVX-NEXT: cmoveq %rcx, %rax 92; AVX-NEXT: xorq $63, %rax 93; AVX-NEXT: vmovq %rax, %xmm0 94; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 95; AVX-NEXT: retq 96; 97; AVX512VLCD-LABEL: testv2i64: 98; AVX512VLCD: ## BB#0: 99; AVX512VLCD-NEXT: vplzcntq %xmm0, %xmm0 100; AVX512VLCD-NEXT: retq 101; 102; AVX512CD-LABEL: testv2i64: 103; AVX512CD: ## BB#0: 104; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0 105; AVX512CD-NEXT: retq 106 107 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 0) 108 ret <2 x i64> %out 109} 110 111define <2 x i64> @testv2i64u(<2 x i64> %in) nounwind { 112; SSE2-LABEL: testv2i64u: 113; SSE2: # BB#0: 114; SSE2-NEXT: movd %xmm0, %rax 115; SSE2-NEXT: bsrq %rax, %rax 116; SSE2-NEXT: xorq $63, %rax 117; SSE2-NEXT: movd %rax, %xmm1 118; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 119; SSE2-NEXT: movd %xmm0, %rax 120; SSE2-NEXT: bsrq %rax, %rax 121; SSE2-NEXT: xorq $63, %rax 122; SSE2-NEXT: movd %rax, %xmm0 123; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 124; SSE2-NEXT: movdqa %xmm1, %xmm0 125; SSE2-NEXT: retq 126; 127; SSE3-LABEL: testv2i64u: 128; SSE3: # BB#0: 129; SSE3-NEXT: movd %xmm0, %rax 130; SSE3-NEXT: bsrq %rax, %rax 131; SSE3-NEXT: xorq $63, %rax 132; SSE3-NEXT: movd %rax, %xmm1 133; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 134; SSE3-NEXT: movd %xmm0, %rax 135; SSE3-NEXT: bsrq %rax, %rax 136; SSE3-NEXT: xorq $63, %rax 137; SSE3-NEXT: movd %rax, %xmm0 138; SSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 139; SSE3-NEXT: movdqa %xmm1, %xmm0 140; SSE3-NEXT: retq 141; 142; SSSE3-LABEL: testv2i64u: 143; SSSE3: # BB#0: 144; SSSE3-NEXT: movd %xmm0, %rax 145; SSSE3-NEXT: bsrq %rax, %rax 146; SSSE3-NEXT: xorq $63, %rax 147; SSSE3-NEXT: movd %rax, %xmm1 148; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 149; SSSE3-NEXT: movd %xmm0, %rax 150; SSSE3-NEXT: bsrq %rax, %rax 151; SSSE3-NEXT: xorq $63, %rax 152; SSSE3-NEXT: movd %rax, %xmm0 153; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 154; SSSE3-NEXT: movdqa %xmm1, %xmm0 155; SSSE3-NEXT: retq 156; 157; SSE41-LABEL: testv2i64u: 158; SSE41: # BB#0: 159; SSE41-NEXT: pextrq $1, %xmm0, %rax 160; SSE41-NEXT: bsrq %rax, %rax 161; SSE41-NEXT: xorq $63, %rax 162; SSE41-NEXT: movd %rax, %xmm1 163; SSE41-NEXT: movd %xmm0, %rax 164; SSE41-NEXT: bsrq %rax, %rax 165; SSE41-NEXT: xorq $63, %rax 166; SSE41-NEXT: movd %rax, %xmm0 167; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 168; SSE41-NEXT: retq 169; 170; AVX-LABEL: testv2i64u: 171; AVX: # BB#0: 172; AVX-NEXT: vpextrq $1, %xmm0, %rax 173; AVX-NEXT: bsrq %rax, %rax 174; AVX-NEXT: xorq $63, %rax 175; AVX-NEXT: vmovq %rax, %xmm1 176; AVX-NEXT: vmovq %xmm0, %rax 177; AVX-NEXT: bsrq %rax, %rax 178; AVX-NEXT: xorq $63, %rax 179; AVX-NEXT: vmovq %rax, %xmm0 180; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 181; AVX-NEXT: retq 182; 183; AVX512VLCD-LABEL: testv2i64u: 184; AVX512VLCD: ## BB#0: 185; AVX512VLCD-NEXT: vplzcntq %xmm0, %xmm0 186; AVX512VLCD-NEXT: retq 187; 188; AVX512CD-LABEL: testv2i64u: 189; AVX512CD: ## BB#0: 190; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0 191; AVX512CD-NEXT: retq 192 193 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 -1) 194 ret <2 x i64> %out 195} 196 197define <4 x i32> @testv4i32(<4 x i32> %in) nounwind { 198; SSE2-LABEL: testv4i32: 199; SSE2: # BB#0: 200; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 201; SSE2-NEXT: movd %xmm1, %eax 202; SSE2-NEXT: bsrl %eax, %eax 203; SSE2-NEXT: movl $63, %ecx 204; SSE2-NEXT: cmovel %ecx, %eax 205; SSE2-NEXT: xorl $31, %eax 206; SSE2-NEXT: movd %eax, %xmm1 207; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 208; SSE2-NEXT: movd %xmm2, %eax 209; SSE2-NEXT: bsrl %eax, %eax 210; SSE2-NEXT: cmovel %ecx, %eax 211; SSE2-NEXT: xorl $31, %eax 212; SSE2-NEXT: movd %eax, %xmm2 213; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 214; SSE2-NEXT: movd %xmm0, %eax 215; SSE2-NEXT: bsrl %eax, %eax 216; SSE2-NEXT: cmovel %ecx, %eax 217; SSE2-NEXT: xorl $31, %eax 218; SSE2-NEXT: movd %eax, %xmm1 219; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 220; SSE2-NEXT: movd %xmm0, %eax 221; SSE2-NEXT: bsrl %eax, %eax 222; SSE2-NEXT: cmovel %ecx, %eax 223; SSE2-NEXT: xorl $31, %eax 224; SSE2-NEXT: movd %eax, %xmm0 225; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 226; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 227; SSE2-NEXT: movdqa %xmm1, %xmm0 228; SSE2-NEXT: retq 229; 230; SSE3-LABEL: testv4i32: 231; SSE3: # BB#0: 232; SSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 233; SSE3-NEXT: movd %xmm1, %eax 234; SSE3-NEXT: bsrl %eax, %eax 235; SSE3-NEXT: movl $63, %ecx 236; SSE3-NEXT: cmovel %ecx, %eax 237; SSE3-NEXT: xorl $31, %eax 238; SSE3-NEXT: movd %eax, %xmm1 239; SSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 240; SSE3-NEXT: movd %xmm2, %eax 241; SSE3-NEXT: bsrl %eax, %eax 242; SSE3-NEXT: cmovel %ecx, %eax 243; SSE3-NEXT: xorl $31, %eax 244; SSE3-NEXT: movd %eax, %xmm2 245; SSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 246; SSE3-NEXT: movd %xmm0, %eax 247; SSE3-NEXT: bsrl %eax, %eax 248; SSE3-NEXT: cmovel %ecx, %eax 249; SSE3-NEXT: xorl $31, %eax 250; SSE3-NEXT: movd %eax, %xmm1 251; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 252; SSE3-NEXT: movd %xmm0, %eax 253; SSE3-NEXT: bsrl %eax, %eax 254; SSE3-NEXT: cmovel %ecx, %eax 255; SSE3-NEXT: xorl $31, %eax 256; SSE3-NEXT: movd %eax, %xmm0 257; SSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 258; SSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 259; SSE3-NEXT: movdqa %xmm1, %xmm0 260; SSE3-NEXT: retq 261; 262; SSSE3-LABEL: testv4i32: 263; SSSE3: # BB#0: 264; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 265; SSSE3-NEXT: movd %xmm1, %eax 266; SSSE3-NEXT: bsrl %eax, %eax 267; SSSE3-NEXT: movl $63, %ecx 268; SSSE3-NEXT: cmovel %ecx, %eax 269; SSSE3-NEXT: xorl $31, %eax 270; SSSE3-NEXT: movd %eax, %xmm1 271; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 272; SSSE3-NEXT: movd %xmm2, %eax 273; SSSE3-NEXT: bsrl %eax, %eax 274; SSSE3-NEXT: cmovel %ecx, %eax 275; SSSE3-NEXT: xorl $31, %eax 276; SSSE3-NEXT: movd %eax, %xmm2 277; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 278; SSSE3-NEXT: movd %xmm0, %eax 279; SSSE3-NEXT: bsrl %eax, %eax 280; SSSE3-NEXT: cmovel %ecx, %eax 281; SSSE3-NEXT: xorl $31, %eax 282; SSSE3-NEXT: movd %eax, %xmm1 283; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 284; SSSE3-NEXT: movd %xmm0, %eax 285; SSSE3-NEXT: bsrl %eax, %eax 286; SSSE3-NEXT: cmovel %ecx, %eax 287; SSSE3-NEXT: xorl $31, %eax 288; SSSE3-NEXT: movd %eax, %xmm0 289; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 290; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 291; SSSE3-NEXT: movdqa %xmm1, %xmm0 292; SSSE3-NEXT: retq 293; 294; SSE41-LABEL: testv4i32: 295; SSE41: # BB#0: 296; SSE41-NEXT: pextrd $1, %xmm0, %eax 297; SSE41-NEXT: bsrl %eax, %eax 298; SSE41-NEXT: movl $63, %ecx 299; SSE41-NEXT: cmovel %ecx, %eax 300; SSE41-NEXT: xorl $31, %eax 301; SSE41-NEXT: movd %xmm0, %edx 302; SSE41-NEXT: bsrl %edx, %edx 303; SSE41-NEXT: cmovel %ecx, %edx 304; SSE41-NEXT: xorl $31, %edx 305; SSE41-NEXT: movd %edx, %xmm1 306; SSE41-NEXT: pinsrd $1, %eax, %xmm1 307; SSE41-NEXT: pextrd $2, %xmm0, %eax 308; SSE41-NEXT: bsrl %eax, %eax 309; SSE41-NEXT: cmovel %ecx, %eax 310; SSE41-NEXT: xorl $31, %eax 311; SSE41-NEXT: pinsrd $2, %eax, %xmm1 312; SSE41-NEXT: pextrd $3, %xmm0, %eax 313; SSE41-NEXT: bsrl %eax, %eax 314; SSE41-NEXT: cmovel %ecx, %eax 315; SSE41-NEXT: xorl $31, %eax 316; SSE41-NEXT: pinsrd $3, %eax, %xmm1 317; SSE41-NEXT: movdqa %xmm1, %xmm0 318; SSE41-NEXT: retq 319; 320; AVX-LABEL: testv4i32: 321; AVX: # BB#0: 322; AVX-NEXT: vpextrd $1, %xmm0, %eax 323; AVX-NEXT: bsrl %eax, %eax 324; AVX-NEXT: movl $63, %ecx 325; AVX-NEXT: cmovel %ecx, %eax 326; AVX-NEXT: xorl $31, %eax 327; AVX-NEXT: vmovd %xmm0, %edx 328; AVX-NEXT: bsrl %edx, %edx 329; AVX-NEXT: cmovel %ecx, %edx 330; AVX-NEXT: xorl $31, %edx 331; AVX-NEXT: vmovd %edx, %xmm1 332; AVX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1 333; AVX-NEXT: vpextrd $2, %xmm0, %eax 334; AVX-NEXT: bsrl %eax, %eax 335; AVX-NEXT: cmovel %ecx, %eax 336; AVX-NEXT: xorl $31, %eax 337; AVX-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1 338; AVX-NEXT: vpextrd $3, %xmm0, %eax 339; AVX-NEXT: bsrl %eax, %eax 340; AVX-NEXT: cmovel %ecx, %eax 341; AVX-NEXT: xorl $31, %eax 342; AVX-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0 343; AVX-NEXT: retq 344; 345; AVX512VLCD-LABEL: testv4i32: 346; AVX512VLCD: ## BB#0: 347; AVX512VLCD-NEXT: vplzcntd %xmm0, %xmm0 348; AVX512VLCD-NEXT: retq 349; 350; AVX512CD-LABEL: testv4i32: 351; AVX512CD: ## BB#0: 352; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 353; AVX512CD-NEXT: retq 354 355 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 0) 356 ret <4 x i32> %out 357} 358 359define <4 x i32> @testv4i32u(<4 x i32> %in) nounwind { 360; SSE2-LABEL: testv4i32u: 361; SSE2: # BB#0: 362; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 363; SSE2-NEXT: movd %xmm1, %eax 364; SSE2-NEXT: bsrl %eax, %eax 365; SSE2-NEXT: xorl $31, %eax 366; SSE2-NEXT: movd %eax, %xmm1 367; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 368; SSE2-NEXT: movd %xmm2, %eax 369; SSE2-NEXT: bsrl %eax, %eax 370; SSE2-NEXT: xorl $31, %eax 371; SSE2-NEXT: movd %eax, %xmm2 372; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 373; SSE2-NEXT: movd %xmm0, %eax 374; SSE2-NEXT: bsrl %eax, %eax 375; SSE2-NEXT: xorl $31, %eax 376; SSE2-NEXT: movd %eax, %xmm1 377; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 378; SSE2-NEXT: movd %xmm0, %eax 379; SSE2-NEXT: bsrl %eax, %eax 380; SSE2-NEXT: xorl $31, %eax 381; SSE2-NEXT: movd %eax, %xmm0 382; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 383; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 384; SSE2-NEXT: movdqa %xmm1, %xmm0 385; SSE2-NEXT: retq 386; 387; SSE3-LABEL: testv4i32u: 388; SSE3: # BB#0: 389; SSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 390; SSE3-NEXT: movd %xmm1, %eax 391; SSE3-NEXT: bsrl %eax, %eax 392; SSE3-NEXT: xorl $31, %eax 393; SSE3-NEXT: movd %eax, %xmm1 394; SSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 395; SSE3-NEXT: movd %xmm2, %eax 396; SSE3-NEXT: bsrl %eax, %eax 397; SSE3-NEXT: xorl $31, %eax 398; SSE3-NEXT: movd %eax, %xmm2 399; SSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 400; SSE3-NEXT: movd %xmm0, %eax 401; SSE3-NEXT: bsrl %eax, %eax 402; SSE3-NEXT: xorl $31, %eax 403; SSE3-NEXT: movd %eax, %xmm1 404; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 405; SSE3-NEXT: movd %xmm0, %eax 406; SSE3-NEXT: bsrl %eax, %eax 407; SSE3-NEXT: xorl $31, %eax 408; SSE3-NEXT: movd %eax, %xmm0 409; SSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 410; SSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 411; SSE3-NEXT: movdqa %xmm1, %xmm0 412; SSE3-NEXT: retq 413; 414; SSSE3-LABEL: testv4i32u: 415; SSSE3: # BB#0: 416; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 417; SSSE3-NEXT: movd %xmm1, %eax 418; SSSE3-NEXT: bsrl %eax, %eax 419; SSSE3-NEXT: xorl $31, %eax 420; SSSE3-NEXT: movd %eax, %xmm1 421; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3] 422; SSSE3-NEXT: movd %xmm2, %eax 423; SSSE3-NEXT: bsrl %eax, %eax 424; SSSE3-NEXT: xorl $31, %eax 425; SSSE3-NEXT: movd %eax, %xmm2 426; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 427; SSSE3-NEXT: movd %xmm0, %eax 428; SSSE3-NEXT: bsrl %eax, %eax 429; SSSE3-NEXT: xorl $31, %eax 430; SSSE3-NEXT: movd %eax, %xmm1 431; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 432; SSSE3-NEXT: movd %xmm0, %eax 433; SSSE3-NEXT: bsrl %eax, %eax 434; SSSE3-NEXT: xorl $31, %eax 435; SSSE3-NEXT: movd %eax, %xmm0 436; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 437; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 438; SSSE3-NEXT: movdqa %xmm1, %xmm0 439; SSSE3-NEXT: retq 440; 441; SSE41-LABEL: testv4i32u: 442; SSE41: # BB#0: 443; SSE41-NEXT: pextrd $1, %xmm0, %eax 444; SSE41-NEXT: bsrl %eax, %eax 445; SSE41-NEXT: xorl $31, %eax 446; SSE41-NEXT: movd %xmm0, %ecx 447; SSE41-NEXT: bsrl %ecx, %ecx 448; SSE41-NEXT: xorl $31, %ecx 449; SSE41-NEXT: movd %ecx, %xmm1 450; SSE41-NEXT: pinsrd $1, %eax, %xmm1 451; SSE41-NEXT: pextrd $2, %xmm0, %eax 452; SSE41-NEXT: bsrl %eax, %eax 453; SSE41-NEXT: xorl $31, %eax 454; SSE41-NEXT: pinsrd $2, %eax, %xmm1 455; SSE41-NEXT: pextrd $3, %xmm0, %eax 456; SSE41-NEXT: bsrl %eax, %eax 457; SSE41-NEXT: xorl $31, %eax 458; SSE41-NEXT: pinsrd $3, %eax, %xmm1 459; SSE41-NEXT: movdqa %xmm1, %xmm0 460; SSE41-NEXT: retq 461; 462; AVX-LABEL: testv4i32u: 463; AVX: # BB#0: 464; AVX-NEXT: vpextrd $1, %xmm0, %eax 465; AVX-NEXT: bsrl %eax, %eax 466; AVX-NEXT: xorl $31, %eax 467; AVX-NEXT: vmovd %xmm0, %ecx 468; AVX-NEXT: bsrl %ecx, %ecx 469; AVX-NEXT: xorl $31, %ecx 470; AVX-NEXT: vmovd %ecx, %xmm1 471; AVX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1 472; AVX-NEXT: vpextrd $2, %xmm0, %eax 473; AVX-NEXT: bsrl %eax, %eax 474; AVX-NEXT: xorl $31, %eax 475; AVX-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1 476; AVX-NEXT: vpextrd $3, %xmm0, %eax 477; AVX-NEXT: bsrl %eax, %eax 478; AVX-NEXT: xorl $31, %eax 479; AVX-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0 480; AVX-NEXT: retq 481; 482; AVX512VLCD-LABEL: testv4i32u: 483; AVX512VLCD: ## BB#0: 484; AVX512VLCD-NEXT: vplzcntd %xmm0, %xmm0 485; AVX512VLCD-NEXT: retq 486; 487; AVX512CD-LABEL: testv4i32u: 488; AVX512CD: ## BB#0: 489; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 490; AVX512CD-NEXT: retq 491 492 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 -1) 493 ret <4 x i32> %out 494} 495 496define <8 x i16> @testv8i16(<8 x i16> %in) nounwind { 497; SSE2-LABEL: testv8i16: 498; SSE2: # BB#0: 499; SSE2-NEXT: pextrw $7, %xmm0, %eax 500; SSE2-NEXT: bsrw %ax, %cx 501; SSE2-NEXT: movw $31, %ax 502; SSE2-NEXT: cmovew %ax, %cx 503; SSE2-NEXT: xorl $15, %ecx 504; SSE2-NEXT: movd %ecx, %xmm1 505; SSE2-NEXT: pextrw $3, %xmm0, %ecx 506; SSE2-NEXT: bsrw %cx, %cx 507; SSE2-NEXT: cmovew %ax, %cx 508; SSE2-NEXT: xorl $15, %ecx 509; SSE2-NEXT: movd %ecx, %xmm2 510; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] 511; SSE2-NEXT: pextrw $5, %xmm0, %ecx 512; SSE2-NEXT: bsrw %cx, %cx 513; SSE2-NEXT: cmovew %ax, %cx 514; SSE2-NEXT: xorl $15, %ecx 515; SSE2-NEXT: movd %ecx, %xmm3 516; SSE2-NEXT: pextrw $1, %xmm0, %ecx 517; SSE2-NEXT: bsrw %cx, %cx 518; SSE2-NEXT: cmovew %ax, %cx 519; SSE2-NEXT: xorl $15, %ecx 520; SSE2-NEXT: movd %ecx, %xmm1 521; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3] 522; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 523; SSE2-NEXT: pextrw $6, %xmm0, %ecx 524; SSE2-NEXT: bsrw %cx, %cx 525; SSE2-NEXT: cmovew %ax, %cx 526; SSE2-NEXT: xorl $15, %ecx 527; SSE2-NEXT: movd %ecx, %xmm2 528; SSE2-NEXT: pextrw $2, %xmm0, %ecx 529; SSE2-NEXT: bsrw %cx, %cx 530; SSE2-NEXT: cmovew %ax, %cx 531; SSE2-NEXT: xorl $15, %ecx 532; SSE2-NEXT: movd %ecx, %xmm3 533; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3] 534; SSE2-NEXT: pextrw $4, %xmm0, %ecx 535; SSE2-NEXT: bsrw %cx, %cx 536; SSE2-NEXT: cmovew %ax, %cx 537; SSE2-NEXT: xorl $15, %ecx 538; SSE2-NEXT: movd %ecx, %xmm2 539; SSE2-NEXT: movd %xmm0, %ecx 540; SSE2-NEXT: bsrw %cx, %cx 541; SSE2-NEXT: cmovew %ax, %cx 542; SSE2-NEXT: xorl $15, %ecx 543; SSE2-NEXT: movd %ecx, %xmm0 544; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 545; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 546; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 547; SSE2-NEXT: retq 548; 549; SSE3-LABEL: testv8i16: 550; SSE3: # BB#0: 551; SSE3-NEXT: pextrw $7, %xmm0, %eax 552; SSE3-NEXT: bsrw %ax, %cx 553; SSE3-NEXT: movw $31, %ax 554; SSE3-NEXT: cmovew %ax, %cx 555; SSE3-NEXT: xorl $15, %ecx 556; SSE3-NEXT: movd %ecx, %xmm1 557; SSE3-NEXT: pextrw $3, %xmm0, %ecx 558; SSE3-NEXT: bsrw %cx, %cx 559; SSE3-NEXT: cmovew %ax, %cx 560; SSE3-NEXT: xorl $15, %ecx 561; SSE3-NEXT: movd %ecx, %xmm2 562; SSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] 563; SSE3-NEXT: pextrw $5, %xmm0, %ecx 564; SSE3-NEXT: bsrw %cx, %cx 565; SSE3-NEXT: cmovew %ax, %cx 566; SSE3-NEXT: xorl $15, %ecx 567; SSE3-NEXT: movd %ecx, %xmm3 568; SSE3-NEXT: pextrw $1, %xmm0, %ecx 569; SSE3-NEXT: bsrw %cx, %cx 570; SSE3-NEXT: cmovew %ax, %cx 571; SSE3-NEXT: xorl $15, %ecx 572; SSE3-NEXT: movd %ecx, %xmm1 573; SSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3] 574; SSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 575; SSE3-NEXT: pextrw $6, %xmm0, %ecx 576; SSE3-NEXT: bsrw %cx, %cx 577; SSE3-NEXT: cmovew %ax, %cx 578; SSE3-NEXT: xorl $15, %ecx 579; SSE3-NEXT: movd %ecx, %xmm2 580; SSE3-NEXT: pextrw $2, %xmm0, %ecx 581; SSE3-NEXT: bsrw %cx, %cx 582; SSE3-NEXT: cmovew %ax, %cx 583; SSE3-NEXT: xorl $15, %ecx 584; SSE3-NEXT: movd %ecx, %xmm3 585; SSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3] 586; SSE3-NEXT: pextrw $4, %xmm0, %ecx 587; SSE3-NEXT: bsrw %cx, %cx 588; SSE3-NEXT: cmovew %ax, %cx 589; SSE3-NEXT: xorl $15, %ecx 590; SSE3-NEXT: movd %ecx, %xmm2 591; SSE3-NEXT: movd %xmm0, %ecx 592; SSE3-NEXT: bsrw %cx, %cx 593; SSE3-NEXT: cmovew %ax, %cx 594; SSE3-NEXT: xorl $15, %ecx 595; SSE3-NEXT: movd %ecx, %xmm0 596; SSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 597; SSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 598; SSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 599; SSE3-NEXT: retq 600; 601; SSSE3-LABEL: testv8i16: 602; SSSE3: # BB#0: 603; SSSE3-NEXT: pextrw $7, %xmm0, %eax 604; SSSE3-NEXT: bsrw %ax, %cx 605; SSSE3-NEXT: movw $31, %ax 606; SSSE3-NEXT: cmovew %ax, %cx 607; SSSE3-NEXT: xorl $15, %ecx 608; SSSE3-NEXT: movd %ecx, %xmm1 609; SSSE3-NEXT: pextrw $3, %xmm0, %ecx 610; SSSE3-NEXT: bsrw %cx, %cx 611; SSSE3-NEXT: cmovew %ax, %cx 612; SSSE3-NEXT: xorl $15, %ecx 613; SSSE3-NEXT: movd %ecx, %xmm2 614; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] 615; SSSE3-NEXT: pextrw $5, %xmm0, %ecx 616; SSSE3-NEXT: bsrw %cx, %cx 617; SSSE3-NEXT: cmovew %ax, %cx 618; SSSE3-NEXT: xorl $15, %ecx 619; SSSE3-NEXT: movd %ecx, %xmm3 620; SSSE3-NEXT: pextrw $1, %xmm0, %ecx 621; SSSE3-NEXT: bsrw %cx, %cx 622; SSSE3-NEXT: cmovew %ax, %cx 623; SSSE3-NEXT: xorl $15, %ecx 624; SSSE3-NEXT: movd %ecx, %xmm1 625; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3] 626; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 627; SSSE3-NEXT: pextrw $6, %xmm0, %ecx 628; SSSE3-NEXT: bsrw %cx, %cx 629; SSSE3-NEXT: cmovew %ax, %cx 630; SSSE3-NEXT: xorl $15, %ecx 631; SSSE3-NEXT: movd %ecx, %xmm2 632; SSSE3-NEXT: pextrw $2, %xmm0, %ecx 633; SSSE3-NEXT: bsrw %cx, %cx 634; SSSE3-NEXT: cmovew %ax, %cx 635; SSSE3-NEXT: xorl $15, %ecx 636; SSSE3-NEXT: movd %ecx, %xmm3 637; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3] 638; SSSE3-NEXT: pextrw $4, %xmm0, %ecx 639; SSSE3-NEXT: bsrw %cx, %cx 640; SSSE3-NEXT: cmovew %ax, %cx 641; SSSE3-NEXT: xorl $15, %ecx 642; SSSE3-NEXT: movd %ecx, %xmm2 643; SSSE3-NEXT: movd %xmm0, %ecx 644; SSSE3-NEXT: bsrw %cx, %cx 645; SSSE3-NEXT: cmovew %ax, %cx 646; SSSE3-NEXT: xorl $15, %ecx 647; SSSE3-NEXT: movd %ecx, %xmm0 648; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 649; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 650; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 651; SSSE3-NEXT: retq 652; 653; SSE41-LABEL: testv8i16: 654; SSE41: # BB#0: 655; SSE41-NEXT: pextrw $1, %xmm0, %eax 656; SSE41-NEXT: bsrw %ax, %cx 657; SSE41-NEXT: movw $31, %ax 658; SSE41-NEXT: cmovew %ax, %cx 659; SSE41-NEXT: xorl $15, %ecx 660; SSE41-NEXT: movd %xmm0, %edx 661; SSE41-NEXT: bsrw %dx, %dx 662; SSE41-NEXT: cmovew %ax, %dx 663; SSE41-NEXT: xorl $15, %edx 664; SSE41-NEXT: movd %edx, %xmm1 665; SSE41-NEXT: pinsrw $1, %ecx, %xmm1 666; SSE41-NEXT: pextrw $2, %xmm0, %ecx 667; SSE41-NEXT: bsrw %cx, %cx 668; SSE41-NEXT: cmovew %ax, %cx 669; SSE41-NEXT: xorl $15, %ecx 670; SSE41-NEXT: pinsrw $2, %ecx, %xmm1 671; SSE41-NEXT: pextrw $3, %xmm0, %ecx 672; SSE41-NEXT: bsrw %cx, %cx 673; SSE41-NEXT: cmovew %ax, %cx 674; SSE41-NEXT: xorl $15, %ecx 675; SSE41-NEXT: pinsrw $3, %ecx, %xmm1 676; SSE41-NEXT: pextrw $4, %xmm0, %ecx 677; SSE41-NEXT: bsrw %cx, %cx 678; SSE41-NEXT: cmovew %ax, %cx 679; SSE41-NEXT: xorl $15, %ecx 680; SSE41-NEXT: pinsrw $4, %ecx, %xmm1 681; SSE41-NEXT: pextrw $5, %xmm0, %ecx 682; SSE41-NEXT: bsrw %cx, %cx 683; SSE41-NEXT: cmovew %ax, %cx 684; SSE41-NEXT: xorl $15, %ecx 685; SSE41-NEXT: pinsrw $5, %ecx, %xmm1 686; SSE41-NEXT: pextrw $6, %xmm0, %ecx 687; SSE41-NEXT: bsrw %cx, %cx 688; SSE41-NEXT: cmovew %ax, %cx 689; SSE41-NEXT: xorl $15, %ecx 690; SSE41-NEXT: pinsrw $6, %ecx, %xmm1 691; SSE41-NEXT: pextrw $7, %xmm0, %ecx 692; SSE41-NEXT: bsrw %cx, %cx 693; SSE41-NEXT: cmovew %ax, %cx 694; SSE41-NEXT: xorl $15, %ecx 695; SSE41-NEXT: pinsrw $7, %ecx, %xmm1 696; SSE41-NEXT: movdqa %xmm1, %xmm0 697; SSE41-NEXT: retq 698; 699; AVX-LABEL: testv8i16: 700; AVX: # BB#0: 701; AVX-NEXT: vpextrw $1, %xmm0, %eax 702; AVX-NEXT: bsrw %ax, %cx 703; AVX-NEXT: movw $31, %ax 704; AVX-NEXT: cmovew %ax, %cx 705; AVX-NEXT: xorl $15, %ecx 706; AVX-NEXT: vmovd %xmm0, %edx 707; AVX-NEXT: bsrw %dx, %dx 708; AVX-NEXT: cmovew %ax, %dx 709; AVX-NEXT: xorl $15, %edx 710; AVX-NEXT: vmovd %edx, %xmm1 711; AVX-NEXT: vpinsrw $1, %ecx, %xmm1, %xmm1 712; AVX-NEXT: vpextrw $2, %xmm0, %ecx 713; AVX-NEXT: bsrw %cx, %cx 714; AVX-NEXT: cmovew %ax, %cx 715; AVX-NEXT: xorl $15, %ecx 716; AVX-NEXT: vpinsrw $2, %ecx, %xmm1, %xmm1 717; AVX-NEXT: vpextrw $3, %xmm0, %ecx 718; AVX-NEXT: bsrw %cx, %cx 719; AVX-NEXT: cmovew %ax, %cx 720; AVX-NEXT: xorl $15, %ecx 721; AVX-NEXT: vpinsrw $3, %ecx, %xmm1, %xmm1 722; AVX-NEXT: vpextrw $4, %xmm0, %ecx 723; AVX-NEXT: bsrw %cx, %cx 724; AVX-NEXT: cmovew %ax, %cx 725; AVX-NEXT: xorl $15, %ecx 726; AVX-NEXT: vpinsrw $4, %ecx, %xmm1, %xmm1 727; AVX-NEXT: vpextrw $5, %xmm0, %ecx 728; AVX-NEXT: bsrw %cx, %cx 729; AVX-NEXT: cmovew %ax, %cx 730; AVX-NEXT: xorl $15, %ecx 731; AVX-NEXT: vpinsrw $5, %ecx, %xmm1, %xmm1 732; AVX-NEXT: vpextrw $6, %xmm0, %ecx 733; AVX-NEXT: bsrw %cx, %cx 734; AVX-NEXT: cmovew %ax, %cx 735; AVX-NEXT: xorl $15, %ecx 736; AVX-NEXT: vpinsrw $6, %ecx, %xmm1, %xmm1 737; AVX-NEXT: vpextrw $7, %xmm0, %ecx 738; AVX-NEXT: bsrw %cx, %cx 739; AVX-NEXT: cmovew %ax, %cx 740; AVX-NEXT: xorl $15, %ecx 741; AVX-NEXT: vpinsrw $7, %ecx, %xmm1, %xmm0 742; AVX-NEXT: retq 743; 744; AVX512VLCD-LABEL: testv8i16: 745; AVX512VLCD: ## BB#0: 746; AVX512VLCD-NEXT: vpmovzxwd %xmm0, %ymm0 747; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0 748; AVX512VLCD-NEXT: vpmovdw %ymm0, %xmm0 749; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 750; AVX512VLCD-NEXT: retq 751; 752; AVX512CD-LABEL: testv8i16: 753; AVX512CD: ## BB#0: 754; AVX512CD-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 755; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 756; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0 757; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 758; AVX512CD-NEXT: retq 759 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 0) 760 ret <8 x i16> %out 761} 762 763define <8 x i16> @testv8i16u(<8 x i16> %in) nounwind { 764; SSE2-LABEL: testv8i16u: 765; SSE2: # BB#0: 766; SSE2-NEXT: pextrw $7, %xmm0, %eax 767; SSE2-NEXT: bsrw %ax, %ax 768; SSE2-NEXT: xorl $15, %eax 769; SSE2-NEXT: movd %eax, %xmm1 770; SSE2-NEXT: pextrw $3, %xmm0, %eax 771; SSE2-NEXT: bsrw %ax, %ax 772; SSE2-NEXT: xorl $15, %eax 773; SSE2-NEXT: movd %eax, %xmm2 774; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] 775; SSE2-NEXT: pextrw $5, %xmm0, %eax 776; SSE2-NEXT: bsrw %ax, %ax 777; SSE2-NEXT: xorl $15, %eax 778; SSE2-NEXT: movd %eax, %xmm3 779; SSE2-NEXT: pextrw $1, %xmm0, %eax 780; SSE2-NEXT: bsrw %ax, %ax 781; SSE2-NEXT: xorl $15, %eax 782; SSE2-NEXT: movd %eax, %xmm1 783; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3] 784; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 785; SSE2-NEXT: pextrw $6, %xmm0, %eax 786; SSE2-NEXT: bsrw %ax, %ax 787; SSE2-NEXT: xorl $15, %eax 788; SSE2-NEXT: movd %eax, %xmm2 789; SSE2-NEXT: pextrw $2, %xmm0, %eax 790; SSE2-NEXT: bsrw %ax, %ax 791; SSE2-NEXT: xorl $15, %eax 792; SSE2-NEXT: movd %eax, %xmm3 793; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3] 794; SSE2-NEXT: pextrw $4, %xmm0, %eax 795; SSE2-NEXT: bsrw %ax, %ax 796; SSE2-NEXT: xorl $15, %eax 797; SSE2-NEXT: movd %eax, %xmm2 798; SSE2-NEXT: movd %xmm0, %eax 799; SSE2-NEXT: bsrw %ax, %ax 800; SSE2-NEXT: xorl $15, %eax 801; SSE2-NEXT: movd %eax, %xmm0 802; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 803; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 804; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 805; SSE2-NEXT: retq 806; 807; SSE3-LABEL: testv8i16u: 808; SSE3: # BB#0: 809; SSE3-NEXT: pextrw $7, %xmm0, %eax 810; SSE3-NEXT: bsrw %ax, %ax 811; SSE3-NEXT: xorl $15, %eax 812; SSE3-NEXT: movd %eax, %xmm1 813; SSE3-NEXT: pextrw $3, %xmm0, %eax 814; SSE3-NEXT: bsrw %ax, %ax 815; SSE3-NEXT: xorl $15, %eax 816; SSE3-NEXT: movd %eax, %xmm2 817; SSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] 818; SSE3-NEXT: pextrw $5, %xmm0, %eax 819; SSE3-NEXT: bsrw %ax, %ax 820; SSE3-NEXT: xorl $15, %eax 821; SSE3-NEXT: movd %eax, %xmm3 822; SSE3-NEXT: pextrw $1, %xmm0, %eax 823; SSE3-NEXT: bsrw %ax, %ax 824; SSE3-NEXT: xorl $15, %eax 825; SSE3-NEXT: movd %eax, %xmm1 826; SSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3] 827; SSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 828; SSE3-NEXT: pextrw $6, %xmm0, %eax 829; SSE3-NEXT: bsrw %ax, %ax 830; SSE3-NEXT: xorl $15, %eax 831; SSE3-NEXT: movd %eax, %xmm2 832; SSE3-NEXT: pextrw $2, %xmm0, %eax 833; SSE3-NEXT: bsrw %ax, %ax 834; SSE3-NEXT: xorl $15, %eax 835; SSE3-NEXT: movd %eax, %xmm3 836; SSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3] 837; SSE3-NEXT: pextrw $4, %xmm0, %eax 838; SSE3-NEXT: bsrw %ax, %ax 839; SSE3-NEXT: xorl $15, %eax 840; SSE3-NEXT: movd %eax, %xmm2 841; SSE3-NEXT: movd %xmm0, %eax 842; SSE3-NEXT: bsrw %ax, %ax 843; SSE3-NEXT: xorl $15, %eax 844; SSE3-NEXT: movd %eax, %xmm0 845; SSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 846; SSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 847; SSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 848; SSE3-NEXT: retq 849; 850; SSSE3-LABEL: testv8i16u: 851; SSSE3: # BB#0: 852; SSSE3-NEXT: pextrw $7, %xmm0, %eax 853; SSSE3-NEXT: bsrw %ax, %ax 854; SSSE3-NEXT: xorl $15, %eax 855; SSSE3-NEXT: movd %eax, %xmm1 856; SSSE3-NEXT: pextrw $3, %xmm0, %eax 857; SSSE3-NEXT: bsrw %ax, %ax 858; SSSE3-NEXT: xorl $15, %eax 859; SSSE3-NEXT: movd %eax, %xmm2 860; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] 861; SSSE3-NEXT: pextrw $5, %xmm0, %eax 862; SSSE3-NEXT: bsrw %ax, %ax 863; SSSE3-NEXT: xorl $15, %eax 864; SSSE3-NEXT: movd %eax, %xmm3 865; SSSE3-NEXT: pextrw $1, %xmm0, %eax 866; SSSE3-NEXT: bsrw %ax, %ax 867; SSSE3-NEXT: xorl $15, %eax 868; SSSE3-NEXT: movd %eax, %xmm1 869; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3] 870; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 871; SSSE3-NEXT: pextrw $6, %xmm0, %eax 872; SSSE3-NEXT: bsrw %ax, %ax 873; SSSE3-NEXT: xorl $15, %eax 874; SSSE3-NEXT: movd %eax, %xmm2 875; SSSE3-NEXT: pextrw $2, %xmm0, %eax 876; SSSE3-NEXT: bsrw %ax, %ax 877; SSSE3-NEXT: xorl $15, %eax 878; SSSE3-NEXT: movd %eax, %xmm3 879; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3] 880; SSSE3-NEXT: pextrw $4, %xmm0, %eax 881; SSSE3-NEXT: bsrw %ax, %ax 882; SSSE3-NEXT: xorl $15, %eax 883; SSSE3-NEXT: movd %eax, %xmm2 884; SSSE3-NEXT: movd %xmm0, %eax 885; SSSE3-NEXT: bsrw %ax, %ax 886; SSSE3-NEXT: xorl $15, %eax 887; SSSE3-NEXT: movd %eax, %xmm0 888; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 889; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 890; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 891; SSSE3-NEXT: retq 892; 893; SSE41-LABEL: testv8i16u: 894; SSE41: # BB#0: 895; SSE41-NEXT: pextrw $1, %xmm0, %eax 896; SSE41-NEXT: bsrw %ax, %ax 897; SSE41-NEXT: xorl $15, %eax 898; SSE41-NEXT: movd %xmm0, %ecx 899; SSE41-NEXT: bsrw %cx, %cx 900; SSE41-NEXT: xorl $15, %ecx 901; SSE41-NEXT: movd %ecx, %xmm1 902; SSE41-NEXT: pinsrw $1, %eax, %xmm1 903; SSE41-NEXT: pextrw $2, %xmm0, %eax 904; SSE41-NEXT: bsrw %ax, %ax 905; SSE41-NEXT: xorl $15, %eax 906; SSE41-NEXT: pinsrw $2, %eax, %xmm1 907; SSE41-NEXT: pextrw $3, %xmm0, %eax 908; SSE41-NEXT: bsrw %ax, %ax 909; SSE41-NEXT: xorl $15, %eax 910; SSE41-NEXT: pinsrw $3, %eax, %xmm1 911; SSE41-NEXT: pextrw $4, %xmm0, %eax 912; SSE41-NEXT: bsrw %ax, %ax 913; SSE41-NEXT: xorl $15, %eax 914; SSE41-NEXT: pinsrw $4, %eax, %xmm1 915; SSE41-NEXT: pextrw $5, %xmm0, %eax 916; SSE41-NEXT: bsrw %ax, %ax 917; SSE41-NEXT: xorl $15, %eax 918; SSE41-NEXT: pinsrw $5, %eax, %xmm1 919; SSE41-NEXT: pextrw $6, %xmm0, %eax 920; SSE41-NEXT: bsrw %ax, %ax 921; SSE41-NEXT: xorl $15, %eax 922; SSE41-NEXT: pinsrw $6, %eax, %xmm1 923; SSE41-NEXT: pextrw $7, %xmm0, %eax 924; SSE41-NEXT: bsrw %ax, %ax 925; SSE41-NEXT: xorl $15, %eax 926; SSE41-NEXT: pinsrw $7, %eax, %xmm1 927; SSE41-NEXT: movdqa %xmm1, %xmm0 928; SSE41-NEXT: retq 929; 930; AVX-LABEL: testv8i16u: 931; AVX: # BB#0: 932; AVX-NEXT: vpextrw $1, %xmm0, %eax 933; AVX-NEXT: bsrw %ax, %ax 934; AVX-NEXT: xorl $15, %eax 935; AVX-NEXT: vmovd %xmm0, %ecx 936; AVX-NEXT: bsrw %cx, %cx 937; AVX-NEXT: xorl $15, %ecx 938; AVX-NEXT: vmovd %ecx, %xmm1 939; AVX-NEXT: vpinsrw $1, %eax, %xmm1, %xmm1 940; AVX-NEXT: vpextrw $2, %xmm0, %eax 941; AVX-NEXT: bsrw %ax, %ax 942; AVX-NEXT: xorl $15, %eax 943; AVX-NEXT: vpinsrw $2, %eax, %xmm1, %xmm1 944; AVX-NEXT: vpextrw $3, %xmm0, %eax 945; AVX-NEXT: bsrw %ax, %ax 946; AVX-NEXT: xorl $15, %eax 947; AVX-NEXT: vpinsrw $3, %eax, %xmm1, %xmm1 948; AVX-NEXT: vpextrw $4, %xmm0, %eax 949; AVX-NEXT: bsrw %ax, %ax 950; AVX-NEXT: xorl $15, %eax 951; AVX-NEXT: vpinsrw $4, %eax, %xmm1, %xmm1 952; AVX-NEXT: vpextrw $5, %xmm0, %eax 953; AVX-NEXT: bsrw %ax, %ax 954; AVX-NEXT: xorl $15, %eax 955; AVX-NEXT: vpinsrw $5, %eax, %xmm1, %xmm1 956; AVX-NEXT: vpextrw $6, %xmm0, %eax 957; AVX-NEXT: bsrw %ax, %ax 958; AVX-NEXT: xorl $15, %eax 959; AVX-NEXT: vpinsrw $6, %eax, %xmm1, %xmm1 960; AVX-NEXT: vpextrw $7, %xmm0, %eax 961; AVX-NEXT: bsrw %ax, %ax 962; AVX-NEXT: xorl $15, %eax 963; AVX-NEXT: vpinsrw $7, %eax, %xmm1, %xmm0 964; AVX-NEXT: retq 965; 966; AVX512VLCD-LABEL: testv8i16u: 967; AVX512VLCD: ## BB#0: 968; AVX512VLCD-NEXT: vpmovzxwd %xmm0, %ymm0 969; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0 970; AVX512VLCD-NEXT: vpmovdw %ymm0, %xmm0 971; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 972; AVX512VLCD-NEXT: retq 973; 974; AVX512CD-LABEL: testv8i16u: 975; AVX512CD: ## BB#0: 976; AVX512CD-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 977; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 978; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0 979; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 980; AVX512CD-NEXT: retq 981 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 -1) 982 ret <8 x i16> %out 983} 984 985define <16 x i8> @testv16i8(<16 x i8> %in) nounwind { 986; SSE2-LABEL: testv16i8: 987; SSE2: # BB#0: 988; SSE2-NEXT: pushq %rbp 989; SSE2-NEXT: pushq %rbx 990; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 991; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 992; SSE2-NEXT: bsrl %eax, %ecx 993; SSE2-NEXT: movl $15, %eax 994; SSE2-NEXT: cmovel %eax, %ecx 995; SSE2-NEXT: xorl $7, %ecx 996; SSE2-NEXT: movd %ecx, %xmm0 997; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebx 998; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edi 999; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r9d 1000; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1001; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r11d 1002; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1003; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r8d 1004; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1005; SSE2-NEXT: bsrl %ecx, %ecx 1006; SSE2-NEXT: cmovel %eax, %ecx 1007; SSE2-NEXT: xorl $7, %ecx 1008; SSE2-NEXT: movd %ecx, %xmm1 1009; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1010; SSE2-NEXT: bsrl %edx, %ecx 1011; SSE2-NEXT: cmovel %eax, %ecx 1012; SSE2-NEXT: xorl $7, %ecx 1013; SSE2-NEXT: movd %ecx, %xmm2 1014; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1015; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1016; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r10d 1017; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebp 1018; SSE2-NEXT: bsrl %ebp, %ebp 1019; SSE2-NEXT: cmovel %eax, %ebp 1020; SSE2-NEXT: xorl $7, %ebp 1021; SSE2-NEXT: movd %ebp, %xmm0 1022; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1023; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1024; SSE2-NEXT: bsrl %edi, %edi 1025; SSE2-NEXT: cmovel %eax, %edi 1026; SSE2-NEXT: xorl $7, %edi 1027; SSE2-NEXT: movd %edi, %xmm1 1028; SSE2-NEXT: bsrl %ecx, %ecx 1029; SSE2-NEXT: cmovel %eax, %ecx 1030; SSE2-NEXT: xorl $7, %ecx 1031; SSE2-NEXT: movd %ecx, %xmm2 1032; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1033; SSE2-NEXT: bsrl %esi, %ecx 1034; SSE2-NEXT: cmovel %eax, %ecx 1035; SSE2-NEXT: xorl $7, %ecx 1036; SSE2-NEXT: movd %ecx, %xmm3 1037; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1038; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1039; SSE2-NEXT: bsrl %ecx, %ecx 1040; SSE2-NEXT: cmovel %eax, %ecx 1041; SSE2-NEXT: xorl $7, %ecx 1042; SSE2-NEXT: movd %ecx, %xmm1 1043; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7] 1044; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1045; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1046; SSE2-NEXT: bsrl %ebx, %ecx 1047; SSE2-NEXT: cmovel %eax, %ecx 1048; SSE2-NEXT: xorl $7, %ecx 1049; SSE2-NEXT: movd %ecx, %xmm0 1050; SSE2-NEXT: bsrl %edx, %ecx 1051; SSE2-NEXT: cmovel %eax, %ecx 1052; SSE2-NEXT: xorl $7, %ecx 1053; SSE2-NEXT: movd %ecx, %xmm3 1054; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1055; SSE2-NEXT: bsrl %r11d, %ecx 1056; SSE2-NEXT: cmovel %eax, %ecx 1057; SSE2-NEXT: xorl $7, %ecx 1058; SSE2-NEXT: movd %ecx, %xmm0 1059; SSE2-NEXT: bsrl %esi, %ecx 1060; SSE2-NEXT: cmovel %eax, %ecx 1061; SSE2-NEXT: xorl $7, %ecx 1062; SSE2-NEXT: movd %ecx, %xmm2 1063; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1064; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7] 1065; SSE2-NEXT: bsrl %r9d, %ecx 1066; SSE2-NEXT: cmovel %eax, %ecx 1067; SSE2-NEXT: xorl $7, %ecx 1068; SSE2-NEXT: movd %ecx, %xmm0 1069; SSE2-NEXT: bsrl %r10d, %ecx 1070; SSE2-NEXT: cmovel %eax, %ecx 1071; SSE2-NEXT: xorl $7, %ecx 1072; SSE2-NEXT: movd %ecx, %xmm3 1073; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1074; SSE2-NEXT: bsrl %r8d, %ecx 1075; SSE2-NEXT: cmovel %eax, %ecx 1076; SSE2-NEXT: xorl $7, %ecx 1077; SSE2-NEXT: movd %ecx, %xmm4 1078; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1079; SSE2-NEXT: bsrl %ecx, %ecx 1080; SSE2-NEXT: cmovel %eax, %ecx 1081; SSE2-NEXT: xorl $7, %ecx 1082; SSE2-NEXT: movd %ecx, %xmm0 1083; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1084; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1085; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1086; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1087; SSE2-NEXT: popq %rbx 1088; SSE2-NEXT: popq %rbp 1089; SSE2-NEXT: retq 1090; 1091; SSE3-LABEL: testv16i8: 1092; SSE3: # BB#0: 1093; SSE3-NEXT: pushq %rbp 1094; SSE3-NEXT: pushq %rbx 1095; SSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 1096; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1097; SSE3-NEXT: bsrl %eax, %ecx 1098; SSE3-NEXT: movl $15, %eax 1099; SSE3-NEXT: cmovel %eax, %ecx 1100; SSE3-NEXT: xorl $7, %ecx 1101; SSE3-NEXT: movd %ecx, %xmm0 1102; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebx 1103; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edi 1104; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r9d 1105; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1106; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r11d 1107; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1108; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r8d 1109; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1110; SSE3-NEXT: bsrl %ecx, %ecx 1111; SSE3-NEXT: cmovel %eax, %ecx 1112; SSE3-NEXT: xorl $7, %ecx 1113; SSE3-NEXT: movd %ecx, %xmm1 1114; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1115; SSE3-NEXT: bsrl %edx, %ecx 1116; SSE3-NEXT: cmovel %eax, %ecx 1117; SSE3-NEXT: xorl $7, %ecx 1118; SSE3-NEXT: movd %ecx, %xmm2 1119; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1120; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1121; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r10d 1122; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebp 1123; SSE3-NEXT: bsrl %ebp, %ebp 1124; SSE3-NEXT: cmovel %eax, %ebp 1125; SSE3-NEXT: xorl $7, %ebp 1126; SSE3-NEXT: movd %ebp, %xmm0 1127; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1128; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1129; SSE3-NEXT: bsrl %edi, %edi 1130; SSE3-NEXT: cmovel %eax, %edi 1131; SSE3-NEXT: xorl $7, %edi 1132; SSE3-NEXT: movd %edi, %xmm1 1133; SSE3-NEXT: bsrl %ecx, %ecx 1134; SSE3-NEXT: cmovel %eax, %ecx 1135; SSE3-NEXT: xorl $7, %ecx 1136; SSE3-NEXT: movd %ecx, %xmm2 1137; SSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1138; SSE3-NEXT: bsrl %esi, %ecx 1139; SSE3-NEXT: cmovel %eax, %ecx 1140; SSE3-NEXT: xorl $7, %ecx 1141; SSE3-NEXT: movd %ecx, %xmm3 1142; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1143; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1144; SSE3-NEXT: bsrl %ecx, %ecx 1145; SSE3-NEXT: cmovel %eax, %ecx 1146; SSE3-NEXT: xorl $7, %ecx 1147; SSE3-NEXT: movd %ecx, %xmm1 1148; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7] 1149; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1150; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1151; SSE3-NEXT: bsrl %ebx, %ecx 1152; SSE3-NEXT: cmovel %eax, %ecx 1153; SSE3-NEXT: xorl $7, %ecx 1154; SSE3-NEXT: movd %ecx, %xmm0 1155; SSE3-NEXT: bsrl %edx, %ecx 1156; SSE3-NEXT: cmovel %eax, %ecx 1157; SSE3-NEXT: xorl $7, %ecx 1158; SSE3-NEXT: movd %ecx, %xmm3 1159; SSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1160; SSE3-NEXT: bsrl %r11d, %ecx 1161; SSE3-NEXT: cmovel %eax, %ecx 1162; SSE3-NEXT: xorl $7, %ecx 1163; SSE3-NEXT: movd %ecx, %xmm0 1164; SSE3-NEXT: bsrl %esi, %ecx 1165; SSE3-NEXT: cmovel %eax, %ecx 1166; SSE3-NEXT: xorl $7, %ecx 1167; SSE3-NEXT: movd %ecx, %xmm2 1168; SSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1169; SSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7] 1170; SSE3-NEXT: bsrl %r9d, %ecx 1171; SSE3-NEXT: cmovel %eax, %ecx 1172; SSE3-NEXT: xorl $7, %ecx 1173; SSE3-NEXT: movd %ecx, %xmm0 1174; SSE3-NEXT: bsrl %r10d, %ecx 1175; SSE3-NEXT: cmovel %eax, %ecx 1176; SSE3-NEXT: xorl $7, %ecx 1177; SSE3-NEXT: movd %ecx, %xmm3 1178; SSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1179; SSE3-NEXT: bsrl %r8d, %ecx 1180; SSE3-NEXT: cmovel %eax, %ecx 1181; SSE3-NEXT: xorl $7, %ecx 1182; SSE3-NEXT: movd %ecx, %xmm4 1183; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1184; SSE3-NEXT: bsrl %ecx, %ecx 1185; SSE3-NEXT: cmovel %eax, %ecx 1186; SSE3-NEXT: xorl $7, %ecx 1187; SSE3-NEXT: movd %ecx, %xmm0 1188; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1189; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1190; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1191; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1192; SSE3-NEXT: popq %rbx 1193; SSE3-NEXT: popq %rbp 1194; SSE3-NEXT: retq 1195; 1196; SSSE3-LABEL: testv16i8: 1197; SSSE3: # BB#0: 1198; SSSE3-NEXT: pushq %rbp 1199; SSSE3-NEXT: pushq %rbx 1200; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 1201; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1202; SSSE3-NEXT: bsrl %eax, %ecx 1203; SSSE3-NEXT: movl $15, %eax 1204; SSSE3-NEXT: cmovel %eax, %ecx 1205; SSSE3-NEXT: xorl $7, %ecx 1206; SSSE3-NEXT: movd %ecx, %xmm0 1207; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebx 1208; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edi 1209; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r9d 1210; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1211; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r11d 1212; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1213; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r8d 1214; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1215; SSSE3-NEXT: bsrl %ecx, %ecx 1216; SSSE3-NEXT: cmovel %eax, %ecx 1217; SSSE3-NEXT: xorl $7, %ecx 1218; SSSE3-NEXT: movd %ecx, %xmm1 1219; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1220; SSSE3-NEXT: bsrl %edx, %ecx 1221; SSSE3-NEXT: cmovel %eax, %ecx 1222; SSSE3-NEXT: xorl $7, %ecx 1223; SSSE3-NEXT: movd %ecx, %xmm2 1224; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1225; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1226; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r10d 1227; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebp 1228; SSSE3-NEXT: bsrl %ebp, %ebp 1229; SSSE3-NEXT: cmovel %eax, %ebp 1230; SSSE3-NEXT: xorl $7, %ebp 1231; SSSE3-NEXT: movd %ebp, %xmm0 1232; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1233; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1234; SSSE3-NEXT: bsrl %edi, %edi 1235; SSSE3-NEXT: cmovel %eax, %edi 1236; SSSE3-NEXT: xorl $7, %edi 1237; SSSE3-NEXT: movd %edi, %xmm1 1238; SSSE3-NEXT: bsrl %ecx, %ecx 1239; SSSE3-NEXT: cmovel %eax, %ecx 1240; SSSE3-NEXT: xorl $7, %ecx 1241; SSSE3-NEXT: movd %ecx, %xmm2 1242; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1243; SSSE3-NEXT: bsrl %esi, %ecx 1244; SSSE3-NEXT: cmovel %eax, %ecx 1245; SSSE3-NEXT: xorl $7, %ecx 1246; SSSE3-NEXT: movd %ecx, %xmm3 1247; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1248; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1249; SSSE3-NEXT: bsrl %ecx, %ecx 1250; SSSE3-NEXT: cmovel %eax, %ecx 1251; SSSE3-NEXT: xorl $7, %ecx 1252; SSSE3-NEXT: movd %ecx, %xmm1 1253; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7] 1254; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1255; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1256; SSSE3-NEXT: bsrl %ebx, %ecx 1257; SSSE3-NEXT: cmovel %eax, %ecx 1258; SSSE3-NEXT: xorl $7, %ecx 1259; SSSE3-NEXT: movd %ecx, %xmm0 1260; SSSE3-NEXT: bsrl %edx, %ecx 1261; SSSE3-NEXT: cmovel %eax, %ecx 1262; SSSE3-NEXT: xorl $7, %ecx 1263; SSSE3-NEXT: movd %ecx, %xmm3 1264; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1265; SSSE3-NEXT: bsrl %r11d, %ecx 1266; SSSE3-NEXT: cmovel %eax, %ecx 1267; SSSE3-NEXT: xorl $7, %ecx 1268; SSSE3-NEXT: movd %ecx, %xmm0 1269; SSSE3-NEXT: bsrl %esi, %ecx 1270; SSSE3-NEXT: cmovel %eax, %ecx 1271; SSSE3-NEXT: xorl $7, %ecx 1272; SSSE3-NEXT: movd %ecx, %xmm2 1273; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1274; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7] 1275; SSSE3-NEXT: bsrl %r9d, %ecx 1276; SSSE3-NEXT: cmovel %eax, %ecx 1277; SSSE3-NEXT: xorl $7, %ecx 1278; SSSE3-NEXT: movd %ecx, %xmm0 1279; SSSE3-NEXT: bsrl %r10d, %ecx 1280; SSSE3-NEXT: cmovel %eax, %ecx 1281; SSSE3-NEXT: xorl $7, %ecx 1282; SSSE3-NEXT: movd %ecx, %xmm3 1283; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1284; SSSE3-NEXT: bsrl %r8d, %ecx 1285; SSSE3-NEXT: cmovel %eax, %ecx 1286; SSSE3-NEXT: xorl $7, %ecx 1287; SSSE3-NEXT: movd %ecx, %xmm4 1288; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1289; SSSE3-NEXT: bsrl %ecx, %ecx 1290; SSSE3-NEXT: cmovel %eax, %ecx 1291; SSSE3-NEXT: xorl $7, %ecx 1292; SSSE3-NEXT: movd %ecx, %xmm0 1293; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1294; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1295; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1296; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1297; SSSE3-NEXT: popq %rbx 1298; SSSE3-NEXT: popq %rbp 1299; SSSE3-NEXT: retq 1300; 1301; SSE41-LABEL: testv16i8: 1302; SSE41: # BB#0: 1303; SSE41-NEXT: pextrb $1, %xmm0, %eax 1304; SSE41-NEXT: bsrl %eax, %ecx 1305; SSE41-NEXT: movl $15, %eax 1306; SSE41-NEXT: cmovel %eax, %ecx 1307; SSE41-NEXT: xorl $7, %ecx 1308; SSE41-NEXT: pextrb $0, %xmm0, %edx 1309; SSE41-NEXT: bsrl %edx, %edx 1310; SSE41-NEXT: cmovel %eax, %edx 1311; SSE41-NEXT: xorl $7, %edx 1312; SSE41-NEXT: movd %edx, %xmm1 1313; SSE41-NEXT: pinsrb $1, %ecx, %xmm1 1314; SSE41-NEXT: pextrb $2, %xmm0, %ecx 1315; SSE41-NEXT: bsrl %ecx, %ecx 1316; SSE41-NEXT: cmovel %eax, %ecx 1317; SSE41-NEXT: xorl $7, %ecx 1318; SSE41-NEXT: pinsrb $2, %ecx, %xmm1 1319; SSE41-NEXT: pextrb $3, %xmm0, %ecx 1320; SSE41-NEXT: bsrl %ecx, %ecx 1321; SSE41-NEXT: cmovel %eax, %ecx 1322; SSE41-NEXT: xorl $7, %ecx 1323; SSE41-NEXT: pinsrb $3, %ecx, %xmm1 1324; SSE41-NEXT: pextrb $4, %xmm0, %ecx 1325; SSE41-NEXT: bsrl %ecx, %ecx 1326; SSE41-NEXT: cmovel %eax, %ecx 1327; SSE41-NEXT: xorl $7, %ecx 1328; SSE41-NEXT: pinsrb $4, %ecx, %xmm1 1329; SSE41-NEXT: pextrb $5, %xmm0, %ecx 1330; SSE41-NEXT: bsrl %ecx, %ecx 1331; SSE41-NEXT: cmovel %eax, %ecx 1332; SSE41-NEXT: xorl $7, %ecx 1333; SSE41-NEXT: pinsrb $5, %ecx, %xmm1 1334; SSE41-NEXT: pextrb $6, %xmm0, %ecx 1335; SSE41-NEXT: bsrl %ecx, %ecx 1336; SSE41-NEXT: cmovel %eax, %ecx 1337; SSE41-NEXT: xorl $7, %ecx 1338; SSE41-NEXT: pinsrb $6, %ecx, %xmm1 1339; SSE41-NEXT: pextrb $7, %xmm0, %ecx 1340; SSE41-NEXT: bsrl %ecx, %ecx 1341; SSE41-NEXT: cmovel %eax, %ecx 1342; SSE41-NEXT: xorl $7, %ecx 1343; SSE41-NEXT: pinsrb $7, %ecx, %xmm1 1344; SSE41-NEXT: pextrb $8, %xmm0, %ecx 1345; SSE41-NEXT: bsrl %ecx, %ecx 1346; SSE41-NEXT: cmovel %eax, %ecx 1347; SSE41-NEXT: xorl $7, %ecx 1348; SSE41-NEXT: pinsrb $8, %ecx, %xmm1 1349; SSE41-NEXT: pextrb $9, %xmm0, %ecx 1350; SSE41-NEXT: bsrl %ecx, %ecx 1351; SSE41-NEXT: cmovel %eax, %ecx 1352; SSE41-NEXT: xorl $7, %ecx 1353; SSE41-NEXT: pinsrb $9, %ecx, %xmm1 1354; SSE41-NEXT: pextrb $10, %xmm0, %ecx 1355; SSE41-NEXT: bsrl %ecx, %ecx 1356; SSE41-NEXT: cmovel %eax, %ecx 1357; SSE41-NEXT: xorl $7, %ecx 1358; SSE41-NEXT: pinsrb $10, %ecx, %xmm1 1359; SSE41-NEXT: pextrb $11, %xmm0, %ecx 1360; SSE41-NEXT: bsrl %ecx, %ecx 1361; SSE41-NEXT: cmovel %eax, %ecx 1362; SSE41-NEXT: xorl $7, %ecx 1363; SSE41-NEXT: pinsrb $11, %ecx, %xmm1 1364; SSE41-NEXT: pextrb $12, %xmm0, %ecx 1365; SSE41-NEXT: bsrl %ecx, %ecx 1366; SSE41-NEXT: cmovel %eax, %ecx 1367; SSE41-NEXT: xorl $7, %ecx 1368; SSE41-NEXT: pinsrb $12, %ecx, %xmm1 1369; SSE41-NEXT: pextrb $13, %xmm0, %ecx 1370; SSE41-NEXT: bsrl %ecx, %ecx 1371; SSE41-NEXT: cmovel %eax, %ecx 1372; SSE41-NEXT: xorl $7, %ecx 1373; SSE41-NEXT: pinsrb $13, %ecx, %xmm1 1374; SSE41-NEXT: pextrb $14, %xmm0, %ecx 1375; SSE41-NEXT: bsrl %ecx, %ecx 1376; SSE41-NEXT: cmovel %eax, %ecx 1377; SSE41-NEXT: xorl $7, %ecx 1378; SSE41-NEXT: pinsrb $14, %ecx, %xmm1 1379; SSE41-NEXT: pextrb $15, %xmm0, %ecx 1380; SSE41-NEXT: bsrl %ecx, %ecx 1381; SSE41-NEXT: cmovel %eax, %ecx 1382; SSE41-NEXT: xorl $7, %ecx 1383; SSE41-NEXT: pinsrb $15, %ecx, %xmm1 1384; SSE41-NEXT: movdqa %xmm1, %xmm0 1385; SSE41-NEXT: retq 1386; 1387; AVX-LABEL: testv16i8: 1388; AVX: # BB#0: 1389; AVX-NEXT: vpextrb $1, %xmm0, %eax 1390; AVX-NEXT: bsrl %eax, %ecx 1391; AVX-NEXT: movl $15, %eax 1392; AVX-NEXT: cmovel %eax, %ecx 1393; AVX-NEXT: xorl $7, %ecx 1394; AVX-NEXT: vpextrb $0, %xmm0, %edx 1395; AVX-NEXT: bsrl %edx, %edx 1396; AVX-NEXT: cmovel %eax, %edx 1397; AVX-NEXT: xorl $7, %edx 1398; AVX-NEXT: vmovd %edx, %xmm1 1399; AVX-NEXT: vpinsrb $1, %ecx, %xmm1, %xmm1 1400; AVX-NEXT: vpextrb $2, %xmm0, %ecx 1401; AVX-NEXT: bsrl %ecx, %ecx 1402; AVX-NEXT: cmovel %eax, %ecx 1403; AVX-NEXT: xorl $7, %ecx 1404; AVX-NEXT: vpinsrb $2, %ecx, %xmm1, %xmm1 1405; AVX-NEXT: vpextrb $3, %xmm0, %ecx 1406; AVX-NEXT: bsrl %ecx, %ecx 1407; AVX-NEXT: cmovel %eax, %ecx 1408; AVX-NEXT: xorl $7, %ecx 1409; AVX-NEXT: vpinsrb $3, %ecx, %xmm1, %xmm1 1410; AVX-NEXT: vpextrb $4, %xmm0, %ecx 1411; AVX-NEXT: bsrl %ecx, %ecx 1412; AVX-NEXT: cmovel %eax, %ecx 1413; AVX-NEXT: xorl $7, %ecx 1414; AVX-NEXT: vpinsrb $4, %ecx, %xmm1, %xmm1 1415; AVX-NEXT: vpextrb $5, %xmm0, %ecx 1416; AVX-NEXT: bsrl %ecx, %ecx 1417; AVX-NEXT: cmovel %eax, %ecx 1418; AVX-NEXT: xorl $7, %ecx 1419; AVX-NEXT: vpinsrb $5, %ecx, %xmm1, %xmm1 1420; AVX-NEXT: vpextrb $6, %xmm0, %ecx 1421; AVX-NEXT: bsrl %ecx, %ecx 1422; AVX-NEXT: cmovel %eax, %ecx 1423; AVX-NEXT: xorl $7, %ecx 1424; AVX-NEXT: vpinsrb $6, %ecx, %xmm1, %xmm1 1425; AVX-NEXT: vpextrb $7, %xmm0, %ecx 1426; AVX-NEXT: bsrl %ecx, %ecx 1427; AVX-NEXT: cmovel %eax, %ecx 1428; AVX-NEXT: xorl $7, %ecx 1429; AVX-NEXT: vpinsrb $7, %ecx, %xmm1, %xmm1 1430; AVX-NEXT: vpextrb $8, %xmm0, %ecx 1431; AVX-NEXT: bsrl %ecx, %ecx 1432; AVX-NEXT: cmovel %eax, %ecx 1433; AVX-NEXT: xorl $7, %ecx 1434; AVX-NEXT: vpinsrb $8, %ecx, %xmm1, %xmm1 1435; AVX-NEXT: vpextrb $9, %xmm0, %ecx 1436; AVX-NEXT: bsrl %ecx, %ecx 1437; AVX-NEXT: cmovel %eax, %ecx 1438; AVX-NEXT: xorl $7, %ecx 1439; AVX-NEXT: vpinsrb $9, %ecx, %xmm1, %xmm1 1440; AVX-NEXT: vpextrb $10, %xmm0, %ecx 1441; AVX-NEXT: bsrl %ecx, %ecx 1442; AVX-NEXT: cmovel %eax, %ecx 1443; AVX-NEXT: xorl $7, %ecx 1444; AVX-NEXT: vpinsrb $10, %ecx, %xmm1, %xmm1 1445; AVX-NEXT: vpextrb $11, %xmm0, %ecx 1446; AVX-NEXT: bsrl %ecx, %ecx 1447; AVX-NEXT: cmovel %eax, %ecx 1448; AVX-NEXT: xorl $7, %ecx 1449; AVX-NEXT: vpinsrb $11, %ecx, %xmm1, %xmm1 1450; AVX-NEXT: vpextrb $12, %xmm0, %ecx 1451; AVX-NEXT: bsrl %ecx, %ecx 1452; AVX-NEXT: cmovel %eax, %ecx 1453; AVX-NEXT: xorl $7, %ecx 1454; AVX-NEXT: vpinsrb $12, %ecx, %xmm1, %xmm1 1455; AVX-NEXT: vpextrb $13, %xmm0, %ecx 1456; AVX-NEXT: bsrl %ecx, %ecx 1457; AVX-NEXT: cmovel %eax, %ecx 1458; AVX-NEXT: xorl $7, %ecx 1459; AVX-NEXT: vpinsrb $13, %ecx, %xmm1, %xmm1 1460; AVX-NEXT: vpextrb $14, %xmm0, %ecx 1461; AVX-NEXT: bsrl %ecx, %ecx 1462; AVX-NEXT: cmovel %eax, %ecx 1463; AVX-NEXT: xorl $7, %ecx 1464; AVX-NEXT: vpinsrb $14, %ecx, %xmm1, %xmm1 1465; AVX-NEXT: vpextrb $15, %xmm0, %ecx 1466; AVX-NEXT: bsrl %ecx, %ecx 1467; AVX-NEXT: cmovel %eax, %ecx 1468; AVX-NEXT: xorl $7, %ecx 1469; AVX-NEXT: vpinsrb $15, %ecx, %xmm1, %xmm0 1470; AVX-NEXT: retq 1471; 1472; AVX512VLCD-LABEL: testv16i8: 1473; AVX512VLCD: ## BB#0: 1474; AVX512VLCD-NEXT: vpmovzxbd %xmm0, %zmm0 1475; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0 1476; AVX512VLCD-NEXT: vpmovdb %zmm0, %xmm0 1477; AVX512VLCD-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1478; AVX512VLCD-NEXT: retq 1479; 1480; AVX512CD-LABEL: testv16i8: 1481; AVX512CD: ## BB#0: 1482; AVX512CD-NEXT: vpmovzxbd %xmm0, %zmm0 1483; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 1484; AVX512CD-NEXT: vpmovdb %zmm0, %xmm0 1485; AVX512CD-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1486; AVX512CD-NEXT: retq 1487 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 0) 1488 ret <16 x i8> %out 1489} 1490 1491define <16 x i8> @testv16i8u(<16 x i8> %in) nounwind { 1492; SSE2-LABEL: testv16i8u: 1493; SSE2: # BB#0: 1494; SSE2-NEXT: pushq %rbx 1495; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 1496; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1497; SSE2-NEXT: bsrl %eax, %eax 1498; SSE2-NEXT: xorl $7, %eax 1499; SSE2-NEXT: movd %eax, %xmm0 1500; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edi 1501; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1502; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r9d 1503; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1504; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r10d 1505; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1506; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r8d 1507; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1508; SSE2-NEXT: bsrl %esi, %esi 1509; SSE2-NEXT: xorl $7, %esi 1510; SSE2-NEXT: movd %esi, %xmm1 1511; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1512; SSE2-NEXT: bsrl %eax, %eax 1513; SSE2-NEXT: xorl $7, %eax 1514; SSE2-NEXT: movd %eax, %xmm0 1515; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1516; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1517; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %r11d 1518; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebx 1519; SSE2-NEXT: bsrl %ebx, %ebx 1520; SSE2-NEXT: xorl $7, %ebx 1521; SSE2-NEXT: movd %ebx, %xmm2 1522; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1523; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1524; SSE2-NEXT: bsrl %edx, %edx 1525; SSE2-NEXT: xorl $7, %edx 1526; SSE2-NEXT: movd %edx, %xmm0 1527; SSE2-NEXT: bsrl %esi, %edx 1528; SSE2-NEXT: xorl $7, %edx 1529; SSE2-NEXT: movd %edx, %xmm3 1530; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1531; SSE2-NEXT: bsrl %ecx, %ecx 1532; SSE2-NEXT: xorl $7, %ecx 1533; SSE2-NEXT: movd %ecx, %xmm0 1534; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1535; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1536; SSE2-NEXT: bsrl %edx, %edx 1537; SSE2-NEXT: xorl $7, %edx 1538; SSE2-NEXT: movd %edx, %xmm1 1539; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1540; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7] 1541; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1542; SSE2-NEXT: bsrl %edi, %edx 1543; SSE2-NEXT: xorl $7, %edx 1544; SSE2-NEXT: movd %edx, %xmm0 1545; SSE2-NEXT: bsrl %eax, %eax 1546; SSE2-NEXT: xorl $7, %eax 1547; SSE2-NEXT: movd %eax, %xmm2 1548; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1549; SSE2-NEXT: bsrl %r10d, %eax 1550; SSE2-NEXT: xorl $7, %eax 1551; SSE2-NEXT: movd %eax, %xmm0 1552; SSE2-NEXT: bsrl %ecx, %eax 1553; SSE2-NEXT: xorl $7, %eax 1554; SSE2-NEXT: movd %eax, %xmm3 1555; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1556; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7] 1557; SSE2-NEXT: bsrl %r9d, %eax 1558; SSE2-NEXT: xorl $7, %eax 1559; SSE2-NEXT: movd %eax, %xmm0 1560; SSE2-NEXT: bsrl %r11d, %eax 1561; SSE2-NEXT: xorl $7, %eax 1562; SSE2-NEXT: movd %eax, %xmm2 1563; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1564; SSE2-NEXT: bsrl %r8d, %eax 1565; SSE2-NEXT: xorl $7, %eax 1566; SSE2-NEXT: movd %eax, %xmm4 1567; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1568; SSE2-NEXT: bsrl %eax, %eax 1569; SSE2-NEXT: xorl $7, %eax 1570; SSE2-NEXT: movd %eax, %xmm0 1571; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1572; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1573; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1574; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1575; SSE2-NEXT: popq %rbx 1576; SSE2-NEXT: retq 1577; 1578; SSE3-LABEL: testv16i8u: 1579; SSE3: # BB#0: 1580; SSE3-NEXT: pushq %rbx 1581; SSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 1582; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1583; SSE3-NEXT: bsrl %eax, %eax 1584; SSE3-NEXT: xorl $7, %eax 1585; SSE3-NEXT: movd %eax, %xmm0 1586; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edi 1587; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1588; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r9d 1589; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1590; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r10d 1591; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1592; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r8d 1593; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1594; SSE3-NEXT: bsrl %esi, %esi 1595; SSE3-NEXT: xorl $7, %esi 1596; SSE3-NEXT: movd %esi, %xmm1 1597; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1598; SSE3-NEXT: bsrl %eax, %eax 1599; SSE3-NEXT: xorl $7, %eax 1600; SSE3-NEXT: movd %eax, %xmm0 1601; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1602; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1603; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r11d 1604; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebx 1605; SSE3-NEXT: bsrl %ebx, %ebx 1606; SSE3-NEXT: xorl $7, %ebx 1607; SSE3-NEXT: movd %ebx, %xmm2 1608; SSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1609; SSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1610; SSE3-NEXT: bsrl %edx, %edx 1611; SSE3-NEXT: xorl $7, %edx 1612; SSE3-NEXT: movd %edx, %xmm0 1613; SSE3-NEXT: bsrl %esi, %edx 1614; SSE3-NEXT: xorl $7, %edx 1615; SSE3-NEXT: movd %edx, %xmm3 1616; SSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1617; SSE3-NEXT: bsrl %ecx, %ecx 1618; SSE3-NEXT: xorl $7, %ecx 1619; SSE3-NEXT: movd %ecx, %xmm0 1620; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1621; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1622; SSE3-NEXT: bsrl %edx, %edx 1623; SSE3-NEXT: xorl $7, %edx 1624; SSE3-NEXT: movd %edx, %xmm1 1625; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1626; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7] 1627; SSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1628; SSE3-NEXT: bsrl %edi, %edx 1629; SSE3-NEXT: xorl $7, %edx 1630; SSE3-NEXT: movd %edx, %xmm0 1631; SSE3-NEXT: bsrl %eax, %eax 1632; SSE3-NEXT: xorl $7, %eax 1633; SSE3-NEXT: movd %eax, %xmm2 1634; SSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1635; SSE3-NEXT: bsrl %r10d, %eax 1636; SSE3-NEXT: xorl $7, %eax 1637; SSE3-NEXT: movd %eax, %xmm0 1638; SSE3-NEXT: bsrl %ecx, %eax 1639; SSE3-NEXT: xorl $7, %eax 1640; SSE3-NEXT: movd %eax, %xmm3 1641; SSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1642; SSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7] 1643; SSE3-NEXT: bsrl %r9d, %eax 1644; SSE3-NEXT: xorl $7, %eax 1645; SSE3-NEXT: movd %eax, %xmm0 1646; SSE3-NEXT: bsrl %r11d, %eax 1647; SSE3-NEXT: xorl $7, %eax 1648; SSE3-NEXT: movd %eax, %xmm2 1649; SSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1650; SSE3-NEXT: bsrl %r8d, %eax 1651; SSE3-NEXT: xorl $7, %eax 1652; SSE3-NEXT: movd %eax, %xmm4 1653; SSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1654; SSE3-NEXT: bsrl %eax, %eax 1655; SSE3-NEXT: xorl $7, %eax 1656; SSE3-NEXT: movd %eax, %xmm0 1657; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1658; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1659; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1660; SSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1661; SSE3-NEXT: popq %rbx 1662; SSE3-NEXT: retq 1663; 1664; SSSE3-LABEL: testv16i8u: 1665; SSSE3: # BB#0: 1666; SSSE3-NEXT: pushq %rbx 1667; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 1668; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1669; SSSE3-NEXT: bsrl %eax, %eax 1670; SSSE3-NEXT: xorl $7, %eax 1671; SSSE3-NEXT: movd %eax, %xmm0 1672; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edi 1673; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1674; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r9d 1675; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1676; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r10d 1677; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1678; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r8d 1679; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1680; SSSE3-NEXT: bsrl %esi, %esi 1681; SSSE3-NEXT: xorl $7, %esi 1682; SSSE3-NEXT: movd %esi, %xmm1 1683; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1684; SSSE3-NEXT: bsrl %eax, %eax 1685; SSSE3-NEXT: xorl $7, %eax 1686; SSSE3-NEXT: movd %eax, %xmm0 1687; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1688; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %esi 1689; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %r11d 1690; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ebx 1691; SSSE3-NEXT: bsrl %ebx, %ebx 1692; SSSE3-NEXT: xorl $7, %ebx 1693; SSSE3-NEXT: movd %ebx, %xmm2 1694; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1695; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 1696; SSSE3-NEXT: bsrl %edx, %edx 1697; SSSE3-NEXT: xorl $7, %edx 1698; SSSE3-NEXT: movd %edx, %xmm0 1699; SSSE3-NEXT: bsrl %esi, %edx 1700; SSSE3-NEXT: xorl $7, %edx 1701; SSSE3-NEXT: movd %edx, %xmm3 1702; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1703; SSSE3-NEXT: bsrl %ecx, %ecx 1704; SSSE3-NEXT: xorl $7, %ecx 1705; SSSE3-NEXT: movd %ecx, %xmm0 1706; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 1707; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 1708; SSSE3-NEXT: bsrl %edx, %edx 1709; SSSE3-NEXT: xorl $7, %edx 1710; SSSE3-NEXT: movd %edx, %xmm1 1711; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1712; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7] 1713; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 1714; SSSE3-NEXT: bsrl %edi, %edx 1715; SSSE3-NEXT: xorl $7, %edx 1716; SSSE3-NEXT: movd %edx, %xmm0 1717; SSSE3-NEXT: bsrl %eax, %eax 1718; SSSE3-NEXT: xorl $7, %eax 1719; SSSE3-NEXT: movd %eax, %xmm2 1720; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1721; SSSE3-NEXT: bsrl %r10d, %eax 1722; SSSE3-NEXT: xorl $7, %eax 1723; SSSE3-NEXT: movd %eax, %xmm0 1724; SSSE3-NEXT: bsrl %ecx, %eax 1725; SSSE3-NEXT: xorl $7, %eax 1726; SSSE3-NEXT: movd %eax, %xmm3 1727; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 1728; SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7] 1729; SSSE3-NEXT: bsrl %r9d, %eax 1730; SSSE3-NEXT: xorl $7, %eax 1731; SSSE3-NEXT: movd %eax, %xmm0 1732; SSSE3-NEXT: bsrl %r11d, %eax 1733; SSSE3-NEXT: xorl $7, %eax 1734; SSSE3-NEXT: movd %eax, %xmm2 1735; SSSE3-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 1736; SSSE3-NEXT: bsrl %r8d, %eax 1737; SSSE3-NEXT: xorl $7, %eax 1738; SSSE3-NEXT: movd %eax, %xmm4 1739; SSSE3-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 1740; SSSE3-NEXT: bsrl %eax, %eax 1741; SSSE3-NEXT: xorl $7, %eax 1742; SSSE3-NEXT: movd %eax, %xmm0 1743; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 1744; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1745; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 1746; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 1747; SSSE3-NEXT: popq %rbx 1748; SSSE3-NEXT: retq 1749; 1750; SSE41-LABEL: testv16i8u: 1751; SSE41: # BB#0: 1752; SSE41-NEXT: pextrb $1, %xmm0, %eax 1753; SSE41-NEXT: bsrl %eax, %eax 1754; SSE41-NEXT: xorl $7, %eax 1755; SSE41-NEXT: pextrb $0, %xmm0, %ecx 1756; SSE41-NEXT: bsrl %ecx, %ecx 1757; SSE41-NEXT: xorl $7, %ecx 1758; SSE41-NEXT: movd %ecx, %xmm1 1759; SSE41-NEXT: pinsrb $1, %eax, %xmm1 1760; SSE41-NEXT: pextrb $2, %xmm0, %eax 1761; SSE41-NEXT: bsrl %eax, %eax 1762; SSE41-NEXT: xorl $7, %eax 1763; SSE41-NEXT: pinsrb $2, %eax, %xmm1 1764; SSE41-NEXT: pextrb $3, %xmm0, %eax 1765; SSE41-NEXT: bsrl %eax, %eax 1766; SSE41-NEXT: xorl $7, %eax 1767; SSE41-NEXT: pinsrb $3, %eax, %xmm1 1768; SSE41-NEXT: pextrb $4, %xmm0, %eax 1769; SSE41-NEXT: bsrl %eax, %eax 1770; SSE41-NEXT: xorl $7, %eax 1771; SSE41-NEXT: pinsrb $4, %eax, %xmm1 1772; SSE41-NEXT: pextrb $5, %xmm0, %eax 1773; SSE41-NEXT: bsrl %eax, %eax 1774; SSE41-NEXT: xorl $7, %eax 1775; SSE41-NEXT: pinsrb $5, %eax, %xmm1 1776; SSE41-NEXT: pextrb $6, %xmm0, %eax 1777; SSE41-NEXT: bsrl %eax, %eax 1778; SSE41-NEXT: xorl $7, %eax 1779; SSE41-NEXT: pinsrb $6, %eax, %xmm1 1780; SSE41-NEXT: pextrb $7, %xmm0, %eax 1781; SSE41-NEXT: bsrl %eax, %eax 1782; SSE41-NEXT: xorl $7, %eax 1783; SSE41-NEXT: pinsrb $7, %eax, %xmm1 1784; SSE41-NEXT: pextrb $8, %xmm0, %eax 1785; SSE41-NEXT: bsrl %eax, %eax 1786; SSE41-NEXT: xorl $7, %eax 1787; SSE41-NEXT: pinsrb $8, %eax, %xmm1 1788; SSE41-NEXT: pextrb $9, %xmm0, %eax 1789; SSE41-NEXT: bsrl %eax, %eax 1790; SSE41-NEXT: xorl $7, %eax 1791; SSE41-NEXT: pinsrb $9, %eax, %xmm1 1792; SSE41-NEXT: pextrb $10, %xmm0, %eax 1793; SSE41-NEXT: bsrl %eax, %eax 1794; SSE41-NEXT: xorl $7, %eax 1795; SSE41-NEXT: pinsrb $10, %eax, %xmm1 1796; SSE41-NEXT: pextrb $11, %xmm0, %eax 1797; SSE41-NEXT: bsrl %eax, %eax 1798; SSE41-NEXT: xorl $7, %eax 1799; SSE41-NEXT: pinsrb $11, %eax, %xmm1 1800; SSE41-NEXT: pextrb $12, %xmm0, %eax 1801; SSE41-NEXT: bsrl %eax, %eax 1802; SSE41-NEXT: xorl $7, %eax 1803; SSE41-NEXT: pinsrb $12, %eax, %xmm1 1804; SSE41-NEXT: pextrb $13, %xmm0, %eax 1805; SSE41-NEXT: bsrl %eax, %eax 1806; SSE41-NEXT: xorl $7, %eax 1807; SSE41-NEXT: pinsrb $13, %eax, %xmm1 1808; SSE41-NEXT: pextrb $14, %xmm0, %eax 1809; SSE41-NEXT: bsrl %eax, %eax 1810; SSE41-NEXT: xorl $7, %eax 1811; SSE41-NEXT: pinsrb $14, %eax, %xmm1 1812; SSE41-NEXT: pextrb $15, %xmm0, %eax 1813; SSE41-NEXT: bsrl %eax, %eax 1814; SSE41-NEXT: xorl $7, %eax 1815; SSE41-NEXT: pinsrb $15, %eax, %xmm1 1816; SSE41-NEXT: movdqa %xmm1, %xmm0 1817; SSE41-NEXT: retq 1818; 1819; AVX-LABEL: testv16i8u: 1820; AVX: # BB#0: 1821; AVX-NEXT: vpextrb $1, %xmm0, %eax 1822; AVX-NEXT: bsrl %eax, %eax 1823; AVX-NEXT: xorl $7, %eax 1824; AVX-NEXT: vpextrb $0, %xmm0, %ecx 1825; AVX-NEXT: bsrl %ecx, %ecx 1826; AVX-NEXT: xorl $7, %ecx 1827; AVX-NEXT: vmovd %ecx, %xmm1 1828; AVX-NEXT: vpinsrb $1, %eax, %xmm1, %xmm1 1829; AVX-NEXT: vpextrb $2, %xmm0, %eax 1830; AVX-NEXT: bsrl %eax, %eax 1831; AVX-NEXT: xorl $7, %eax 1832; AVX-NEXT: vpinsrb $2, %eax, %xmm1, %xmm1 1833; AVX-NEXT: vpextrb $3, %xmm0, %eax 1834; AVX-NEXT: bsrl %eax, %eax 1835; AVX-NEXT: xorl $7, %eax 1836; AVX-NEXT: vpinsrb $3, %eax, %xmm1, %xmm1 1837; AVX-NEXT: vpextrb $4, %xmm0, %eax 1838; AVX-NEXT: bsrl %eax, %eax 1839; AVX-NEXT: xorl $7, %eax 1840; AVX-NEXT: vpinsrb $4, %eax, %xmm1, %xmm1 1841; AVX-NEXT: vpextrb $5, %xmm0, %eax 1842; AVX-NEXT: bsrl %eax, %eax 1843; AVX-NEXT: xorl $7, %eax 1844; AVX-NEXT: vpinsrb $5, %eax, %xmm1, %xmm1 1845; AVX-NEXT: vpextrb $6, %xmm0, %eax 1846; AVX-NEXT: bsrl %eax, %eax 1847; AVX-NEXT: xorl $7, %eax 1848; AVX-NEXT: vpinsrb $6, %eax, %xmm1, %xmm1 1849; AVX-NEXT: vpextrb $7, %xmm0, %eax 1850; AVX-NEXT: bsrl %eax, %eax 1851; AVX-NEXT: xorl $7, %eax 1852; AVX-NEXT: vpinsrb $7, %eax, %xmm1, %xmm1 1853; AVX-NEXT: vpextrb $8, %xmm0, %eax 1854; AVX-NEXT: bsrl %eax, %eax 1855; AVX-NEXT: xorl $7, %eax 1856; AVX-NEXT: vpinsrb $8, %eax, %xmm1, %xmm1 1857; AVX-NEXT: vpextrb $9, %xmm0, %eax 1858; AVX-NEXT: bsrl %eax, %eax 1859; AVX-NEXT: xorl $7, %eax 1860; AVX-NEXT: vpinsrb $9, %eax, %xmm1, %xmm1 1861; AVX-NEXT: vpextrb $10, %xmm0, %eax 1862; AVX-NEXT: bsrl %eax, %eax 1863; AVX-NEXT: xorl $7, %eax 1864; AVX-NEXT: vpinsrb $10, %eax, %xmm1, %xmm1 1865; AVX-NEXT: vpextrb $11, %xmm0, %eax 1866; AVX-NEXT: bsrl %eax, %eax 1867; AVX-NEXT: xorl $7, %eax 1868; AVX-NEXT: vpinsrb $11, %eax, %xmm1, %xmm1 1869; AVX-NEXT: vpextrb $12, %xmm0, %eax 1870; AVX-NEXT: bsrl %eax, %eax 1871; AVX-NEXT: xorl $7, %eax 1872; AVX-NEXT: vpinsrb $12, %eax, %xmm1, %xmm1 1873; AVX-NEXT: vpextrb $13, %xmm0, %eax 1874; AVX-NEXT: bsrl %eax, %eax 1875; AVX-NEXT: xorl $7, %eax 1876; AVX-NEXT: vpinsrb $13, %eax, %xmm1, %xmm1 1877; AVX-NEXT: vpextrb $14, %xmm0, %eax 1878; AVX-NEXT: bsrl %eax, %eax 1879; AVX-NEXT: xorl $7, %eax 1880; AVX-NEXT: vpinsrb $14, %eax, %xmm1, %xmm1 1881; AVX-NEXT: vpextrb $15, %xmm0, %eax 1882; AVX-NEXT: bsrl %eax, %eax 1883; AVX-NEXT: xorl $7, %eax 1884; AVX-NEXT: vpinsrb $15, %eax, %xmm1, %xmm0 1885; AVX-NEXT: retq 1886; 1887; AVX512VLCD-LABEL: testv16i8u: 1888; AVX512VLCD: ## BB#0: 1889; AVX512VLCD-NEXT: vpmovzxbd %xmm0, %zmm0 1890; AVX512VLCD-NEXT: vplzcntd %zmm0, %zmm0 1891; AVX512VLCD-NEXT: vpmovdb %zmm0, %xmm0 1892; AVX512VLCD-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1893; AVX512VLCD-NEXT: retq 1894; 1895; AVX512CD-LABEL: testv16i8u: 1896; AVX512CD: ## BB#0: 1897; AVX512CD-NEXT: vpmovzxbd %xmm0, %zmm0 1898; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 1899; AVX512CD-NEXT: vpmovdb %zmm0, %xmm0 1900; AVX512CD-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1901; AVX512CD-NEXT: retq 1902 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 -1) 1903 ret <16 x i8> %out 1904} 1905 1906define <2 x i64> @foldv2i64() nounwind { 1907; SSE-LABEL: foldv2i64: 1908; SSE: # BB#0: 1909; SSE-NEXT: movl $55, %eax 1910; SSE-NEXT: movd %rax, %xmm0 1911; SSE-NEXT: retq 1912; 1913; AVX-LABEL: foldv2i64: 1914; AVX: # BB#0: 1915; AVX-NEXT: movl $55, %eax 1916; AVX-NEXT: vmovq %rax, %xmm0 1917; AVX-NEXT: retq 1918; 1919; AVX512VLCD-LABEL: foldv2i64: 1920; AVX512VLCD: ## BB#0: 1921; AVX512VLCD-NEXT: movl $55, %eax 1922; AVX512VLCD-NEXT: vmovq %rax, %xmm0 1923; AVX512VLCD-NEXT: retq 1924; 1925; AVX512CD-LABEL: foldv2i64: 1926; AVX512CD: ## BB#0: 1927; AVX512CD-NEXT: movl $55, %eax 1928; AVX512CD-NEXT: vmovq %rax, %xmm0 1929; AVX512CD-NEXT: retq 1930 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 0) 1931 ret <2 x i64> %out 1932} 1933 1934define <2 x i64> @foldv2i64u() nounwind { 1935; SSE-LABEL: foldv2i64u: 1936; SSE: # BB#0: 1937; SSE-NEXT: movl $55, %eax 1938; SSE-NEXT: movd %rax, %xmm0 1939; SSE-NEXT: retq 1940; 1941; AVX-LABEL: foldv2i64u: 1942; AVX: # BB#0: 1943; AVX-NEXT: movl $55, %eax 1944; AVX-NEXT: vmovq %rax, %xmm0 1945; AVX-NEXT: retq 1946; 1947; AVX512VLCD-LABEL: foldv2i64u: 1948; AVX512VLCD: ## BB#0: 1949; AVX512VLCD-NEXT: movl $55, %eax 1950; AVX512VLCD-NEXT: vmovq %rax, %xmm0 1951; AVX512VLCD-NEXT: retq 1952; 1953; AVX512CD-LABEL: foldv2i64u: 1954; AVX512CD: ## BB#0: 1955; AVX512CD-NEXT: movl $55, %eax 1956; AVX512CD-NEXT: vmovq %rax, %xmm0 1957; AVX512CD-NEXT: retq 1958 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 -1) 1959 ret <2 x i64> %out 1960} 1961 1962define <4 x i32> @foldv4i32() nounwind { 1963; SSE-LABEL: foldv4i32: 1964; SSE: # BB#0: 1965; SSE-NEXT: movaps {{.*#+}} xmm0 = [23,0,32,24] 1966; SSE-NEXT: retq 1967; 1968; AVX-LABEL: foldv4i32: 1969; AVX: # BB#0: 1970; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 1971; AVX-NEXT: retq 1972; 1973; AVX512VLCD-LABEL: foldv4i32: 1974; AVX512VLCD: ## BB#0: 1975; AVX512VLCD-NEXT: vmovdqa32 {{.*#+}} xmm0 = [23,0,32,24] 1976; AVX512VLCD-NEXT: retq 1977; 1978; AVX512CD-LABEL: foldv4i32: 1979; AVX512CD: ## BB#0: 1980; AVX512CD-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 1981; AVX512CD-NEXT: retq 1982 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 0) 1983 ret <4 x i32> %out 1984} 1985 1986define <4 x i32> @foldv4i32u() nounwind { 1987; SSE-LABEL: foldv4i32u: 1988; SSE: # BB#0: 1989; SSE-NEXT: movaps {{.*#+}} xmm0 = [23,0,32,24] 1990; SSE-NEXT: retq 1991; 1992; AVX-LABEL: foldv4i32u: 1993; AVX: # BB#0: 1994; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 1995; AVX-NEXT: retq 1996; 1997; AVX512VLCD-LABEL: foldv4i32u: 1998; AVX512VLCD: ## BB#0: 1999; AVX512VLCD-NEXT: vmovdqa32 {{.*#+}} xmm0 = [23,0,32,24] 2000; AVX512VLCD-NEXT: retq 2001; 2002; AVX512CD-LABEL: foldv4i32u: 2003; AVX512CD: ## BB#0: 2004; AVX512CD-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 2005; AVX512CD-NEXT: retq 2006 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 -1) 2007 ret <4 x i32> %out 2008} 2009 2010define <8 x i16> @foldv8i16() nounwind { 2011; SSE-LABEL: foldv8i16: 2012; SSE: # BB#0: 2013; SSE-NEXT: movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2014; SSE-NEXT: retq 2015; 2016; AVX-LABEL: foldv8i16: 2017; AVX: # BB#0: 2018; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2019; AVX-NEXT: retq 2020; 2021; AVX512VLCD-LABEL: foldv8i16: 2022; AVX512VLCD: ## BB#0: 2023; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2024; AVX512VLCD-NEXT: retq 2025; 2026; AVX512CD-LABEL: foldv8i16: 2027; AVX512CD: ## BB#0: 2028; AVX512CD-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2029; AVX512CD-NEXT: retq 2030 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 0) 2031 ret <8 x i16> %out 2032} 2033 2034define <8 x i16> @foldv8i16u() nounwind { 2035; SSE-LABEL: foldv8i16u: 2036; SSE: # BB#0: 2037; SSE-NEXT: movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2038; SSE-NEXT: retq 2039; 2040; AVX-LABEL: foldv8i16u: 2041; AVX: # BB#0: 2042; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2043; AVX-NEXT: retq 2044; 2045; AVX512VLCD-LABEL: foldv8i16u: 2046; AVX512VLCD: ## BB#0: 2047; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2048; AVX512VLCD-NEXT: retq 2049; 2050; AVX512CD-LABEL: foldv8i16u: 2051; AVX512CD: ## BB#0: 2052; AVX512CD-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 2053; AVX512CD-NEXT: retq 2054 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 -1) 2055 ret <8 x i16> %out 2056} 2057 2058define <16 x i8> @foldv16i8() nounwind { 2059; SSE-LABEL: foldv16i8: 2060; SSE: # BB#0: 2061; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2062; SSE-NEXT: retq 2063; 2064; AVX-LABEL: foldv16i8: 2065; AVX: # BB#0: 2066; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2067; AVX-NEXT: retq 2068; 2069; AVX512VLCD-LABEL: foldv16i8: 2070; AVX512VLCD: ## BB#0: 2071; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2072; AVX512VLCD-NEXT: retq 2073; 2074; AVX512CD-LABEL: foldv16i8: 2075; AVX512CD: ## BB#0: 2076; AVX512CD-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2077; AVX512CD-NEXT: retq 2078 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32>, i1 0) 2079 ret <16 x i8> %out 2080} 2081 2082define <16 x i8> @foldv16i8u() nounwind { 2083; SSE-LABEL: foldv16i8u: 2084; SSE: # BB#0: 2085; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2086; SSE-NEXT: retq 2087; 2088; AVX-LABEL: foldv16i8u: 2089; AVX: # BB#0: 2090; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2091; AVX-NEXT: retq 2092; 2093; AVX512VLCD-LABEL: foldv16i8u: 2094; AVX512VLCD: ## BB#0: 2095; AVX512VLCD-NEXT: vmovdqa64 {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2096; AVX512VLCD-NEXT: retq 2097; 2098; AVX512CD-LABEL: foldv16i8u: 2099; AVX512CD: ## BB#0: 2100; AVX512CD-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 2101; AVX512CD-NEXT: retq 2102 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32>, i1 -1) 2103 ret <16 x i8> %out 2104} 2105 2106declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) 2107declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1) 2108declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1) 2109declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1) 2110