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