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