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