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: testl %eax, %eax 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: testl %eax, %eax 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.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: testl %eax, %eax 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: testl %eax, %eax 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.vector.reduce.or.v4i1(<4 x i1> %a) 111 ret i1 %b 112} 113 114define i1 @trunc_v8i16_v8i1(<8 x i16>) { 115; SSE-LABEL: trunc_v8i16_v8i1: 116; SSE: # %bb.0: 117; SSE-NEXT: psllw $15, %xmm0 118; SSE-NEXT: pmovmskb %xmm0, %eax 119; SSE-NEXT: testl $43690, %eax # imm = 0xAAAA 120; SSE-NEXT: setne %al 121; SSE-NEXT: retq 122; 123; AVX-LABEL: trunc_v8i16_v8i1: 124; AVX: # %bb.0: 125; AVX-NEXT: vpsllw $15, %xmm0, %xmm0 126; AVX-NEXT: vpmovmskb %xmm0, %eax 127; AVX-NEXT: testl $43690, %eax # imm = 0xAAAA 128; AVX-NEXT: setne %al 129; AVX-NEXT: retq 130; 131; AVX512F-LABEL: trunc_v8i16_v8i1: 132; AVX512F: # %bb.0: 133; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 134; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 135; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0 136; AVX512F-NEXT: kmovw %k0, %eax 137; AVX512F-NEXT: testb %al, %al 138; AVX512F-NEXT: setne %al 139; AVX512F-NEXT: vzeroupper 140; AVX512F-NEXT: retq 141; 142; AVX512BW-LABEL: trunc_v8i16_v8i1: 143; AVX512BW: # %bb.0: 144; AVX512BW-NEXT: vpsllw $15, %xmm0, %xmm0 145; AVX512BW-NEXT: vpmovw2m %zmm0, %k0 146; AVX512BW-NEXT: kmovd %k0, %eax 147; AVX512BW-NEXT: testb %al, %al 148; AVX512BW-NEXT: setne %al 149; AVX512BW-NEXT: vzeroupper 150; AVX512BW-NEXT: retq 151; 152; AVX512VL-LABEL: trunc_v8i16_v8i1: 153; AVX512VL: # %bb.0: 154; AVX512VL-NEXT: vpsllw $15, %xmm0, %xmm0 155; AVX512VL-NEXT: vpmovw2m %xmm0, %k0 156; AVX512VL-NEXT: kmovd %k0, %eax 157; AVX512VL-NEXT: testb %al, %al 158; AVX512VL-NEXT: setne %al 159; AVX512VL-NEXT: retq 160 %a = trunc <8 x i16> %0 to <8 x i1> 161 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 162 ret i1 %b 163} 164 165define i1 @trunc_v16i8_v16i1(<16 x i8>) { 166; SSE-LABEL: trunc_v16i8_v16i1: 167; SSE: # %bb.0: 168; SSE-NEXT: psllw $7, %xmm0 169; SSE-NEXT: pmovmskb %xmm0, %eax 170; SSE-NEXT: testl %eax, %eax 171; SSE-NEXT: setne %al 172; SSE-NEXT: retq 173; 174; AVX-LABEL: trunc_v16i8_v16i1: 175; AVX: # %bb.0: 176; AVX-NEXT: vpsllw $7, %xmm0, %xmm0 177; AVX-NEXT: vpmovmskb %xmm0, %eax 178; AVX-NEXT: testl %eax, %eax 179; AVX-NEXT: setne %al 180; AVX-NEXT: retq 181; 182; AVX512-LABEL: trunc_v16i8_v16i1: 183; AVX512: # %bb.0: 184; AVX512-NEXT: vpsllw $7, %xmm0, %xmm0 185; AVX512-NEXT: vpmovmskb %xmm0, %eax 186; AVX512-NEXT: testl %eax, %eax 187; AVX512-NEXT: setne %al 188; AVX512-NEXT: retq 189 %a = trunc <16 x i8> %0 to <16 x i1> 190 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 191 ret i1 %b 192} 193 194define i1 @trunc_v4i64_v4i1(<4 x i64>) { 195; SSE-LABEL: trunc_v4i64_v4i1: 196; SSE: # %bb.0: 197; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 198; SSE-NEXT: pslld $31, %xmm0 199; SSE-NEXT: movmskps %xmm0, %eax 200; SSE-NEXT: testl %eax, %eax 201; SSE-NEXT: setne %al 202; SSE-NEXT: retq 203; 204; AVX1-LABEL: trunc_v4i64_v4i1: 205; AVX1: # %bb.0: 206; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 207; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 208; AVX1-NEXT: vpslld $31, %xmm0, %xmm0 209; AVX1-NEXT: vmovmskps %xmm0, %eax 210; AVX1-NEXT: testl %eax, %eax 211; AVX1-NEXT: setne %al 212; AVX1-NEXT: vzeroupper 213; AVX1-NEXT: retq 214; 215; AVX2-LABEL: trunc_v4i64_v4i1: 216; AVX2: # %bb.0: 217; AVX2-NEXT: vpsllq $63, %ymm0, %ymm0 218; AVX2-NEXT: vmovmskpd %ymm0, %eax 219; AVX2-NEXT: testl %eax, %eax 220; AVX2-NEXT: setne %al 221; AVX2-NEXT: vzeroupper 222; AVX2-NEXT: retq 223; 224; AVX512F-LABEL: trunc_v4i64_v4i1: 225; AVX512F: # %bb.0: 226; AVX512F-NEXT: vpsllq $63, %ymm0, %ymm0 227; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0 228; AVX512F-NEXT: kmovw %k0, %eax 229; AVX512F-NEXT: testb $15, %al 230; AVX512F-NEXT: setne %al 231; AVX512F-NEXT: vzeroupper 232; AVX512F-NEXT: retq 233; 234; AVX512BW-LABEL: trunc_v4i64_v4i1: 235; AVX512BW: # %bb.0: 236; AVX512BW-NEXT: vpsllq $63, %ymm0, %ymm0 237; AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0 238; AVX512BW-NEXT: kmovd %k0, %eax 239; AVX512BW-NEXT: testb $15, %al 240; AVX512BW-NEXT: setne %al 241; AVX512BW-NEXT: vzeroupper 242; AVX512BW-NEXT: retq 243; 244; AVX512VL-LABEL: trunc_v4i64_v4i1: 245; AVX512VL: # %bb.0: 246; AVX512VL-NEXT: vpsllq $63, %ymm0, %ymm0 247; AVX512VL-NEXT: vptestmq %ymm0, %ymm0, %k0 248; AVX512VL-NEXT: kmovd %k0, %eax 249; AVX512VL-NEXT: testb %al, %al 250; AVX512VL-NEXT: setne %al 251; AVX512VL-NEXT: vzeroupper 252; AVX512VL-NEXT: retq 253 %a = trunc <4 x i64> %0 to <4 x i1> 254 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a) 255 ret i1 %b 256} 257 258define i1 @trunc_v8i32_v8i1(<8 x i32>) { 259; SSE2-LABEL: trunc_v8i32_v8i1: 260; SSE2: # %bb.0: 261; SSE2-NEXT: pslld $16, %xmm1 262; SSE2-NEXT: psrad $16, %xmm1 263; SSE2-NEXT: pslld $16, %xmm0 264; SSE2-NEXT: psrad $16, %xmm0 265; SSE2-NEXT: packssdw %xmm1, %xmm0 266; SSE2-NEXT: psllw $15, %xmm0 267; SSE2-NEXT: pmovmskb %xmm0, %eax 268; SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA 269; SSE2-NEXT: setne %al 270; SSE2-NEXT: retq 271; 272; SSE41-LABEL: trunc_v8i32_v8i1: 273; SSE41: # %bb.0: 274; SSE41-NEXT: pxor %xmm2, %xmm2 275; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7] 276; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7] 277; SSE41-NEXT: packusdw %xmm1, %xmm0 278; SSE41-NEXT: psllw $15, %xmm0 279; SSE41-NEXT: pmovmskb %xmm0, %eax 280; SSE41-NEXT: testl $43690, %eax # imm = 0xAAAA 281; SSE41-NEXT: setne %al 282; SSE41-NEXT: retq 283; 284; AVX1-LABEL: trunc_v8i32_v8i1: 285; AVX1: # %bb.0: 286; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 287; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 288; AVX1-NEXT: vpslld $31, %xmm0, %xmm0 289; AVX1-NEXT: vmovmskps %xmm0, %eax 290; AVX1-NEXT: testl %eax, %eax 291; AVX1-NEXT: setne %al 292; AVX1-NEXT: vzeroupper 293; AVX1-NEXT: retq 294; 295; AVX2-LABEL: trunc_v8i32_v8i1: 296; AVX2: # %bb.0: 297; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 298; AVX2-NEXT: vmovmskps %ymm0, %eax 299; AVX2-NEXT: testl %eax, %eax 300; AVX2-NEXT: setne %al 301; AVX2-NEXT: vzeroupper 302; AVX2-NEXT: retq 303; 304; AVX512F-LABEL: trunc_v8i32_v8i1: 305; AVX512F: # %bb.0: 306; AVX512F-NEXT: vpslld $31, %ymm0, %ymm0 307; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 308; AVX512F-NEXT: kmovw %k0, %eax 309; AVX512F-NEXT: testb %al, %al 310; AVX512F-NEXT: setne %al 311; AVX512F-NEXT: vzeroupper 312; AVX512F-NEXT: retq 313; 314; AVX512BW-LABEL: trunc_v8i32_v8i1: 315; AVX512BW: # %bb.0: 316; AVX512BW-NEXT: vpslld $31, %ymm0, %ymm0 317; AVX512BW-NEXT: vptestmd %zmm0, %zmm0, %k0 318; AVX512BW-NEXT: kmovd %k0, %eax 319; AVX512BW-NEXT: testb %al, %al 320; AVX512BW-NEXT: setne %al 321; AVX512BW-NEXT: vzeroupper 322; AVX512BW-NEXT: retq 323; 324; AVX512VL-LABEL: trunc_v8i32_v8i1: 325; AVX512VL: # %bb.0: 326; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0 327; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k0 328; AVX512VL-NEXT: kmovd %k0, %eax 329; AVX512VL-NEXT: testb %al, %al 330; AVX512VL-NEXT: setne %al 331; AVX512VL-NEXT: vzeroupper 332; AVX512VL-NEXT: retq 333 %a = trunc <8 x i32> %0 to <8 x i1> 334 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 335 ret i1 %b 336} 337 338define i1 @trunc_v16i16_v16i1(<16 x i16>) { 339; SSE-LABEL: trunc_v16i16_v16i1: 340; SSE: # %bb.0: 341; SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 342; SSE-NEXT: pand %xmm2, %xmm1 343; SSE-NEXT: pand %xmm2, %xmm0 344; SSE-NEXT: packuswb %xmm1, %xmm0 345; SSE-NEXT: psllw $7, %xmm0 346; SSE-NEXT: pmovmskb %xmm0, %eax 347; SSE-NEXT: testl %eax, %eax 348; SSE-NEXT: setne %al 349; SSE-NEXT: retq 350; 351; AVX1-LABEL: trunc_v16i16_v16i1: 352; AVX1: # %bb.0: 353; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 354; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 355; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 356; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0 357; AVX1-NEXT: vpmovmskb %xmm0, %eax 358; AVX1-NEXT: testl %eax, %eax 359; AVX1-NEXT: setne %al 360; AVX1-NEXT: vzeroupper 361; AVX1-NEXT: retq 362; 363; AVX2-LABEL: trunc_v16i16_v16i1: 364; AVX2: # %bb.0: 365; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 366; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 367; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 368; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0 369; AVX2-NEXT: vpmovmskb %xmm0, %eax 370; AVX2-NEXT: testl %eax, %eax 371; AVX2-NEXT: setne %al 372; AVX2-NEXT: vzeroupper 373; AVX2-NEXT: retq 374; 375; AVX512F-LABEL: trunc_v16i16_v16i1: 376; AVX512F: # %bb.0: 377; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 378; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0 379; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 380; AVX512F-NEXT: kortestw %k0, %k0 381; AVX512F-NEXT: setne %al 382; AVX512F-NEXT: vzeroupper 383; AVX512F-NEXT: retq 384; 385; AVX512BW-LABEL: trunc_v16i16_v16i1: 386; AVX512BW: # %bb.0: 387; AVX512BW-NEXT: vpsllw $15, %ymm0, %ymm0 388; AVX512BW-NEXT: vpmovw2m %zmm0, %k0 389; AVX512BW-NEXT: kortestw %k0, %k0 390; AVX512BW-NEXT: setne %al 391; AVX512BW-NEXT: vzeroupper 392; AVX512BW-NEXT: retq 393; 394; AVX512VL-LABEL: trunc_v16i16_v16i1: 395; AVX512VL: # %bb.0: 396; AVX512VL-NEXT: vpsllw $15, %ymm0, %ymm0 397; AVX512VL-NEXT: vpmovw2m %ymm0, %k0 398; AVX512VL-NEXT: kortestw %k0, %k0 399; AVX512VL-NEXT: setne %al 400; AVX512VL-NEXT: vzeroupper 401; AVX512VL-NEXT: retq 402 %a = trunc <16 x i16> %0 to <16 x i1> 403 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 404 ret i1 %b 405} 406 407define i1 @trunc_v32i8_v32i1(<32 x i8>) { 408; SSE-LABEL: trunc_v32i8_v32i1: 409; SSE: # %bb.0: 410; SSE-NEXT: por %xmm1, %xmm0 411; SSE-NEXT: psllw $7, %xmm0 412; SSE-NEXT: pmovmskb %xmm0, %eax 413; SSE-NEXT: testl %eax, %eax 414; SSE-NEXT: setne %al 415; SSE-NEXT: retq 416; 417; AVX1-LABEL: trunc_v32i8_v32i1: 418; AVX1: # %bb.0: 419; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 420; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 421; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0 422; AVX1-NEXT: vpmovmskb %xmm0, %eax 423; AVX1-NEXT: testl %eax, %eax 424; AVX1-NEXT: setne %al 425; AVX1-NEXT: vzeroupper 426; AVX1-NEXT: retq 427; 428; AVX2-LABEL: trunc_v32i8_v32i1: 429; AVX2: # %bb.0: 430; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0 431; AVX2-NEXT: vpmovmskb %ymm0, %eax 432; AVX2-NEXT: testl %eax, %eax 433; AVX2-NEXT: setne %al 434; AVX2-NEXT: vzeroupper 435; AVX2-NEXT: retq 436; 437; AVX512F-LABEL: trunc_v32i8_v32i1: 438; AVX512F: # %bb.0: 439; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 440; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0 441; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 442; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0 443; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 444; AVX512F-NEXT: kshiftrw $8, %k0, %k1 445; AVX512F-NEXT: korw %k1, %k0, %k0 446; AVX512F-NEXT: kshiftrw $4, %k0, %k1 447; AVX512F-NEXT: korw %k1, %k0, %k0 448; AVX512F-NEXT: kshiftrw $2, %k0, %k1 449; AVX512F-NEXT: korw %k1, %k0, %k0 450; AVX512F-NEXT: kshiftrw $1, %k0, %k1 451; AVX512F-NEXT: korw %k1, %k0, %k0 452; AVX512F-NEXT: kmovw %k0, %eax 453; AVX512F-NEXT: # kill: def $al killed $al killed $eax 454; AVX512F-NEXT: vzeroupper 455; AVX512F-NEXT: retq 456; 457; AVX512BW-LABEL: trunc_v32i8_v32i1: 458; AVX512BW: # %bb.0: 459; AVX512BW-NEXT: vpsllw $7, %ymm0, %ymm0 460; AVX512BW-NEXT: vpmovmskb %ymm0, %eax 461; AVX512BW-NEXT: testl %eax, %eax 462; AVX512BW-NEXT: setne %al 463; AVX512BW-NEXT: vzeroupper 464; AVX512BW-NEXT: retq 465; 466; AVX512VL-LABEL: trunc_v32i8_v32i1: 467; AVX512VL: # %bb.0: 468; AVX512VL-NEXT: vpsllw $7, %ymm0, %ymm0 469; AVX512VL-NEXT: vpmovmskb %ymm0, %eax 470; AVX512VL-NEXT: testl %eax, %eax 471; AVX512VL-NEXT: setne %al 472; AVX512VL-NEXT: vzeroupper 473; AVX512VL-NEXT: retq 474 %a = trunc <32 x i8> %0 to <32 x i1> 475 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a) 476 ret i1 %b 477} 478 479define i1 @trunc_v8i64_v8i1(<8 x i64>) { 480; SSE2-LABEL: trunc_v8i64_v8i1: 481; SSE2: # %bb.0: 482; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 483; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 484; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 485; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 486; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 487; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3] 488; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7] 489; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3] 490; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,1,0,2,4,5,6,7] 491; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 492; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1] 493; SSE2-NEXT: psllw $15, %xmm2 494; SSE2-NEXT: pmovmskb %xmm2, %eax 495; SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA 496; SSE2-NEXT: setne %al 497; SSE2-NEXT: retq 498; 499; SSE41-LABEL: trunc_v8i64_v8i1: 500; SSE41: # %bb.0: 501; SSE41-NEXT: pxor %xmm4, %xmm4 502; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7] 503; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7] 504; SSE41-NEXT: packusdw %xmm3, %xmm2 505; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7] 506; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7] 507; SSE41-NEXT: packusdw %xmm1, %xmm0 508; SSE41-NEXT: packusdw %xmm2, %xmm0 509; SSE41-NEXT: psllw $15, %xmm0 510; SSE41-NEXT: pmovmskb %xmm0, %eax 511; SSE41-NEXT: testl $43690, %eax # imm = 0xAAAA 512; SSE41-NEXT: setne %al 513; SSE41-NEXT: retq 514; 515; AVX1-LABEL: trunc_v8i64_v8i1: 516; AVX1: # %bb.0: 517; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 518; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] 519; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 520; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 521; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0 522; AVX1-NEXT: vpslld $31, %xmm0, %xmm0 523; AVX1-NEXT: vmovmskps %xmm0, %eax 524; AVX1-NEXT: testl %eax, %eax 525; AVX1-NEXT: setne %al 526; AVX1-NEXT: vzeroupper 527; AVX1-NEXT: retq 528; 529; AVX2-LABEL: trunc_v8i64_v8i1: 530; AVX2: # %bb.0: 531; AVX2-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 532; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 533; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 534; AVX2-NEXT: vpslld $31, %ymm0, %ymm0 535; AVX2-NEXT: vmovmskps %ymm0, %eax 536; AVX2-NEXT: testl %eax, %eax 537; AVX2-NEXT: setne %al 538; AVX2-NEXT: vzeroupper 539; AVX2-NEXT: retq 540; 541; AVX512F-LABEL: trunc_v8i64_v8i1: 542; AVX512F: # %bb.0: 543; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0 544; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0 545; AVX512F-NEXT: kmovw %k0, %eax 546; AVX512F-NEXT: testb %al, %al 547; AVX512F-NEXT: setne %al 548; AVX512F-NEXT: vzeroupper 549; AVX512F-NEXT: retq 550; 551; AVX512BW-LABEL: trunc_v8i64_v8i1: 552; AVX512BW: # %bb.0: 553; AVX512BW-NEXT: vpsllq $63, %zmm0, %zmm0 554; AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0 555; AVX512BW-NEXT: kmovd %k0, %eax 556; AVX512BW-NEXT: testb %al, %al 557; AVX512BW-NEXT: setne %al 558; AVX512BW-NEXT: vzeroupper 559; AVX512BW-NEXT: retq 560; 561; AVX512VL-LABEL: trunc_v8i64_v8i1: 562; AVX512VL: # %bb.0: 563; AVX512VL-NEXT: vpsllq $63, %zmm0, %zmm0 564; AVX512VL-NEXT: vptestmq %zmm0, %zmm0, %k0 565; AVX512VL-NEXT: kmovd %k0, %eax 566; AVX512VL-NEXT: testb %al, %al 567; AVX512VL-NEXT: setne %al 568; AVX512VL-NEXT: vzeroupper 569; AVX512VL-NEXT: retq 570 %a = trunc <8 x i64> %0 to <8 x i1> 571 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 572 ret i1 %b 573} 574 575define i1 @trunc_v16i32_v16i1(<16 x i32>) { 576; SSE2-LABEL: trunc_v16i32_v16i1: 577; SSE2: # %bb.0: 578; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 579; SSE2-NEXT: pand %xmm4, %xmm3 580; SSE2-NEXT: pand %xmm4, %xmm2 581; SSE2-NEXT: packuswb %xmm3, %xmm2 582; SSE2-NEXT: pand %xmm4, %xmm1 583; SSE2-NEXT: pand %xmm4, %xmm0 584; SSE2-NEXT: packuswb %xmm1, %xmm0 585; SSE2-NEXT: packuswb %xmm2, %xmm0 586; SSE2-NEXT: psllw $7, %xmm0 587; SSE2-NEXT: pmovmskb %xmm0, %eax 588; SSE2-NEXT: testl %eax, %eax 589; SSE2-NEXT: setne %al 590; SSE2-NEXT: retq 591; 592; SSE41-LABEL: trunc_v16i32_v16i1: 593; SSE41: # %bb.0: 594; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 595; SSE41-NEXT: pand %xmm4, %xmm3 596; SSE41-NEXT: pand %xmm4, %xmm2 597; SSE41-NEXT: packusdw %xmm3, %xmm2 598; SSE41-NEXT: pand %xmm4, %xmm1 599; SSE41-NEXT: pand %xmm4, %xmm0 600; SSE41-NEXT: packusdw %xmm1, %xmm0 601; SSE41-NEXT: packuswb %xmm2, %xmm0 602; SSE41-NEXT: psllw $7, %xmm0 603; SSE41-NEXT: pmovmskb %xmm0, %eax 604; SSE41-NEXT: testl %eax, %eax 605; SSE41-NEXT: setne %al 606; SSE41-NEXT: retq 607; 608; AVX1-LABEL: trunc_v16i32_v16i1: 609; AVX1: # %bb.0: 610; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 611; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 612; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 613; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 614; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 615; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 616; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 617; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 618; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0 619; AVX1-NEXT: vpmovmskb %xmm0, %eax 620; AVX1-NEXT: testl %eax, %eax 621; AVX1-NEXT: setne %al 622; AVX1-NEXT: vzeroupper 623; AVX1-NEXT: retq 624; 625; AVX2-LABEL: trunc_v16i32_v16i1: 626; AVX2: # %bb.0: 627; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 628; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 629; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 630; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 631; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 632; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 633; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 634; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0 635; AVX2-NEXT: vpmovmskb %xmm0, %eax 636; AVX2-NEXT: testl %eax, %eax 637; AVX2-NEXT: setne %al 638; AVX2-NEXT: vzeroupper 639; AVX2-NEXT: retq 640; 641; AVX512-LABEL: trunc_v16i32_v16i1: 642; AVX512: # %bb.0: 643; AVX512-NEXT: vpslld $31, %zmm0, %zmm0 644; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 645; AVX512-NEXT: kortestw %k0, %k0 646; AVX512-NEXT: setne %al 647; AVX512-NEXT: vzeroupper 648; AVX512-NEXT: retq 649 %a = trunc <16 x i32> %0 to <16 x i1> 650 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 651 ret i1 %b 652} 653 654define i1 @trunc_v32i16_v32i1(<32 x i16>) { 655; SSE-LABEL: trunc_v32i16_v32i1: 656; SSE: # %bb.0: 657; SSE-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 658; SSE-NEXT: pand %xmm4, %xmm3 659; SSE-NEXT: pand %xmm4, %xmm2 660; SSE-NEXT: packuswb %xmm3, %xmm2 661; SSE-NEXT: pand %xmm4, %xmm1 662; SSE-NEXT: pand %xmm4, %xmm0 663; SSE-NEXT: packuswb %xmm1, %xmm0 664; SSE-NEXT: por %xmm2, %xmm0 665; SSE-NEXT: psllw $7, %xmm0 666; SSE-NEXT: pmovmskb %xmm0, %eax 667; SSE-NEXT: testl %eax, %eax 668; SSE-NEXT: setne %al 669; SSE-NEXT: retq 670; 671; AVX1-LABEL: trunc_v32i16_v32i1: 672; AVX1: # %bb.0: 673; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 674; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 675; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 676; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 677; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0 678; AVX1-NEXT: vpmovmskb %xmm0, %eax 679; AVX1-NEXT: testl %eax, %eax 680; AVX1-NEXT: setne %al 681; AVX1-NEXT: vzeroupper 682; AVX1-NEXT: retq 683; 684; AVX2-LABEL: trunc_v32i16_v32i1: 685; AVX2: # %bb.0: 686; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 687; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 688; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 689; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 690; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 691; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0 692; AVX2-NEXT: vpmovmskb %ymm0, %eax 693; AVX2-NEXT: testl %eax, %eax 694; AVX2-NEXT: setne %al 695; AVX2-NEXT: vzeroupper 696; AVX2-NEXT: retq 697; 698; AVX512F-LABEL: trunc_v32i16_v32i1: 699; AVX512F: # %bb.0: 700; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 701; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0 702; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 703; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0 704; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 705; AVX512F-NEXT: kshiftrw $8, %k0, %k1 706; AVX512F-NEXT: korw %k1, %k0, %k0 707; AVX512F-NEXT: kshiftrw $4, %k0, %k1 708; AVX512F-NEXT: korw %k1, %k0, %k0 709; AVX512F-NEXT: kshiftrw $2, %k0, %k1 710; AVX512F-NEXT: korw %k1, %k0, %k0 711; AVX512F-NEXT: kshiftrw $1, %k0, %k1 712; AVX512F-NEXT: korw %k1, %k0, %k0 713; AVX512F-NEXT: kmovw %k0, %eax 714; AVX512F-NEXT: # kill: def $al killed $al killed $eax 715; AVX512F-NEXT: vzeroupper 716; AVX512F-NEXT: retq 717; 718; AVX512BW-LABEL: trunc_v32i16_v32i1: 719; AVX512BW: # %bb.0: 720; AVX512BW-NEXT: vpsllw $15, %zmm0, %zmm0 721; AVX512BW-NEXT: vpmovw2m %zmm0, %k0 722; AVX512BW-NEXT: kortestd %k0, %k0 723; AVX512BW-NEXT: setne %al 724; AVX512BW-NEXT: vzeroupper 725; AVX512BW-NEXT: retq 726; 727; AVX512VL-LABEL: trunc_v32i16_v32i1: 728; AVX512VL: # %bb.0: 729; AVX512VL-NEXT: vpsllw $15, %zmm0, %zmm0 730; AVX512VL-NEXT: vpmovw2m %zmm0, %k0 731; AVX512VL-NEXT: kortestd %k0, %k0 732; AVX512VL-NEXT: setne %al 733; AVX512VL-NEXT: vzeroupper 734; AVX512VL-NEXT: retq 735 %a = trunc <32 x i16> %0 to <32 x i1> 736 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a) 737 ret i1 %b 738} 739 740define i1 @trunc_v64i8_v64i1(<64 x i8>) { 741; SSE-LABEL: trunc_v64i8_v64i1: 742; SSE: # %bb.0: 743; SSE-NEXT: por %xmm3, %xmm1 744; SSE-NEXT: por %xmm2, %xmm1 745; SSE-NEXT: por %xmm0, %xmm1 746; SSE-NEXT: psllw $7, %xmm1 747; SSE-NEXT: pmovmskb %xmm1, %eax 748; SSE-NEXT: testl %eax, %eax 749; SSE-NEXT: setne %al 750; SSE-NEXT: retq 751; 752; AVX1-LABEL: trunc_v64i8_v64i1: 753; AVX1: # %bb.0: 754; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 755; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 756; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0 757; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0 758; AVX1-NEXT: vpmovmskb %xmm0, %eax 759; AVX1-NEXT: testl %eax, %eax 760; AVX1-NEXT: setne %al 761; AVX1-NEXT: vzeroupper 762; AVX1-NEXT: retq 763; 764; AVX2-LABEL: trunc_v64i8_v64i1: 765; AVX2: # %bb.0: 766; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 767; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0 768; AVX2-NEXT: vpmovmskb %ymm0, %eax 769; AVX2-NEXT: testl %eax, %eax 770; AVX2-NEXT: setne %al 771; AVX2-NEXT: vzeroupper 772; AVX2-NEXT: retq 773; 774; AVX512F-LABEL: trunc_v64i8_v64i1: 775; AVX512F: # %bb.0: 776; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 777; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 778; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 779; AVX512F-NEXT: vpor %xmm2, %xmm3, %xmm2 780; AVX512F-NEXT: vpor %xmm2, %xmm1, %xmm1 781; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0 782; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 783; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0 784; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 785; AVX512F-NEXT: kshiftrw $8, %k0, %k1 786; AVX512F-NEXT: korw %k1, %k0, %k0 787; AVX512F-NEXT: kshiftrw $4, %k0, %k1 788; AVX512F-NEXT: korw %k1, %k0, %k0 789; AVX512F-NEXT: kshiftrw $2, %k0, %k1 790; AVX512F-NEXT: korw %k1, %k0, %k0 791; AVX512F-NEXT: kshiftrw $1, %k0, %k1 792; AVX512F-NEXT: korw %k1, %k0, %k0 793; AVX512F-NEXT: kmovw %k0, %eax 794; AVX512F-NEXT: # kill: def $al killed $al killed $eax 795; AVX512F-NEXT: vzeroupper 796; AVX512F-NEXT: retq 797; 798; AVX512BW-LABEL: trunc_v64i8_v64i1: 799; AVX512BW: # %bb.0: 800; AVX512BW-NEXT: vpsllw $7, %zmm0, %zmm0 801; AVX512BW-NEXT: vpmovb2m %zmm0, %k0 802; AVX512BW-NEXT: kortestq %k0, %k0 803; AVX512BW-NEXT: setne %al 804; AVX512BW-NEXT: vzeroupper 805; AVX512BW-NEXT: retq 806; 807; AVX512VL-LABEL: trunc_v64i8_v64i1: 808; AVX512VL: # %bb.0: 809; AVX512VL-NEXT: vpsllw $7, %zmm0, %zmm0 810; AVX512VL-NEXT: vpmovb2m %zmm0, %k0 811; AVX512VL-NEXT: kortestq %k0, %k0 812; AVX512VL-NEXT: setne %al 813; AVX512VL-NEXT: vzeroupper 814; AVX512VL-NEXT: retq 815 %a = trunc <64 x i8> %0 to <64 x i1> 816 %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a) 817 ret i1 %b 818} 819 820; 821; Comparison With Zero 822; 823 824define i1 @icmp0_v2i64_v2i1(<2 x i64>) { 825; SSE2-LABEL: icmp0_v2i64_v2i1: 826; SSE2: # %bb.0: 827; SSE2-NEXT: pxor %xmm1, %xmm1 828; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 829; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2] 830; SSE2-NEXT: pand %xmm1, %xmm0 831; SSE2-NEXT: movmskpd %xmm0, %eax 832; SSE2-NEXT: testl %eax, %eax 833; SSE2-NEXT: setne %al 834; SSE2-NEXT: retq 835; 836; SSE41-LABEL: icmp0_v2i64_v2i1: 837; SSE41: # %bb.0: 838; SSE41-NEXT: pxor %xmm1, %xmm1 839; SSE41-NEXT: pcmpeqq %xmm0, %xmm1 840; SSE41-NEXT: movmskpd %xmm1, %eax 841; SSE41-NEXT: testl %eax, %eax 842; SSE41-NEXT: setne %al 843; SSE41-NEXT: retq 844; 845; AVX-LABEL: icmp0_v2i64_v2i1: 846; AVX: # %bb.0: 847; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 848; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 849; AVX-NEXT: vmovmskpd %xmm0, %eax 850; AVX-NEXT: testl %eax, %eax 851; AVX-NEXT: setne %al 852; AVX-NEXT: retq 853; 854; AVX512F-LABEL: icmp0_v2i64_v2i1: 855; AVX512F: # %bb.0: 856; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 857; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0 858; AVX512F-NEXT: kmovw %k0, %eax 859; AVX512F-NEXT: testb $3, %al 860; AVX512F-NEXT: setne %al 861; AVX512F-NEXT: vzeroupper 862; AVX512F-NEXT: retq 863; 864; AVX512BW-LABEL: icmp0_v2i64_v2i1: 865; AVX512BW: # %bb.0: 866; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 867; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k0 868; AVX512BW-NEXT: kmovd %k0, %eax 869; AVX512BW-NEXT: testb $3, %al 870; AVX512BW-NEXT: setne %al 871; AVX512BW-NEXT: vzeroupper 872; AVX512BW-NEXT: retq 873; 874; AVX512VL-LABEL: icmp0_v2i64_v2i1: 875; AVX512VL: # %bb.0: 876; AVX512VL-NEXT: vptestnmq %xmm0, %xmm0, %k0 877; AVX512VL-NEXT: kmovd %k0, %eax 878; AVX512VL-NEXT: testb %al, %al 879; AVX512VL-NEXT: setne %al 880; AVX512VL-NEXT: retq 881 %a = icmp eq <2 x i64> %0, zeroinitializer 882 %b = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a) 883 ret i1 %b 884} 885 886define i1 @icmp0_v4i32_v4i1(<4 x i32>) { 887; SSE-LABEL: icmp0_v4i32_v4i1: 888; SSE: # %bb.0: 889; SSE-NEXT: pxor %xmm1, %xmm1 890; SSE-NEXT: pcmpeqd %xmm0, %xmm1 891; SSE-NEXT: movmskps %xmm1, %eax 892; SSE-NEXT: testl %eax, %eax 893; SSE-NEXT: setne %al 894; SSE-NEXT: retq 895; 896; AVX-LABEL: icmp0_v4i32_v4i1: 897; AVX: # %bb.0: 898; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 899; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 900; AVX-NEXT: vmovmskps %xmm0, %eax 901; AVX-NEXT: testl %eax, %eax 902; AVX-NEXT: setne %al 903; AVX-NEXT: retq 904; 905; AVX512F-LABEL: icmp0_v4i32_v4i1: 906; AVX512F: # %bb.0: 907; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 908; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0 909; AVX512F-NEXT: kmovw %k0, %eax 910; AVX512F-NEXT: testb $15, %al 911; AVX512F-NEXT: setne %al 912; AVX512F-NEXT: vzeroupper 913; AVX512F-NEXT: retq 914; 915; AVX512BW-LABEL: icmp0_v4i32_v4i1: 916; AVX512BW: # %bb.0: 917; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 918; AVX512BW-NEXT: vptestnmd %zmm0, %zmm0, %k0 919; AVX512BW-NEXT: kmovd %k0, %eax 920; AVX512BW-NEXT: testb $15, %al 921; AVX512BW-NEXT: setne %al 922; AVX512BW-NEXT: vzeroupper 923; AVX512BW-NEXT: retq 924; 925; AVX512VL-LABEL: icmp0_v4i32_v4i1: 926; AVX512VL: # %bb.0: 927; AVX512VL-NEXT: vptestnmd %xmm0, %xmm0, %k0 928; AVX512VL-NEXT: kmovd %k0, %eax 929; AVX512VL-NEXT: testb %al, %al 930; AVX512VL-NEXT: setne %al 931; AVX512VL-NEXT: retq 932 %a = icmp eq <4 x i32> %0, zeroinitializer 933 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a) 934 ret i1 %b 935} 936 937define i1 @icmp0_v8i16_v8i1(<8 x i16>) { 938; SSE-LABEL: icmp0_v8i16_v8i1: 939; SSE: # %bb.0: 940; SSE-NEXT: pxor %xmm1, %xmm1 941; SSE-NEXT: pcmpeqw %xmm0, %xmm1 942; SSE-NEXT: pmovmskb %xmm1, %eax 943; SSE-NEXT: testl %eax, %eax 944; SSE-NEXT: setne %al 945; SSE-NEXT: retq 946; 947; AVX-LABEL: icmp0_v8i16_v8i1: 948; AVX: # %bb.0: 949; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 950; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 951; AVX-NEXT: vpmovmskb %xmm0, %eax 952; AVX-NEXT: testl %eax, %eax 953; AVX-NEXT: setne %al 954; AVX-NEXT: retq 955; 956; AVX512F-LABEL: icmp0_v8i16_v8i1: 957; AVX512F: # %bb.0: 958; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 959; AVX512F-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 960; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 961; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0 962; AVX512F-NEXT: kmovw %k0, %eax 963; AVX512F-NEXT: testb %al, %al 964; AVX512F-NEXT: setne %al 965; AVX512F-NEXT: vzeroupper 966; AVX512F-NEXT: retq 967; 968; AVX512BW-LABEL: icmp0_v8i16_v8i1: 969; AVX512BW: # %bb.0: 970; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 971; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k0 972; AVX512BW-NEXT: kmovd %k0, %eax 973; AVX512BW-NEXT: testb %al, %al 974; AVX512BW-NEXT: setne %al 975; AVX512BW-NEXT: vzeroupper 976; AVX512BW-NEXT: retq 977; 978; AVX512VL-LABEL: icmp0_v8i16_v8i1: 979; AVX512VL: # %bb.0: 980; AVX512VL-NEXT: vptestnmw %xmm0, %xmm0, %k0 981; AVX512VL-NEXT: kmovd %k0, %eax 982; AVX512VL-NEXT: testb %al, %al 983; AVX512VL-NEXT: setne %al 984; AVX512VL-NEXT: retq 985 %a = icmp eq <8 x i16> %0, zeroinitializer 986 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 987 ret i1 %b 988} 989 990define i1 @icmp0_v16i8_v16i1(<16 x i8>) { 991; SSE-LABEL: icmp0_v16i8_v16i1: 992; SSE: # %bb.0: 993; SSE-NEXT: pxor %xmm1, %xmm1 994; SSE-NEXT: pcmpeqb %xmm0, %xmm1 995; SSE-NEXT: pmovmskb %xmm1, %eax 996; SSE-NEXT: testl %eax, %eax 997; SSE-NEXT: setne %al 998; SSE-NEXT: retq 999; 1000; AVX-LABEL: icmp0_v16i8_v16i1: 1001; AVX: # %bb.0: 1002; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1003; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1004; AVX-NEXT: vpmovmskb %xmm0, %eax 1005; AVX-NEXT: testl %eax, %eax 1006; AVX-NEXT: setne %al 1007; AVX-NEXT: retq 1008; 1009; AVX512F-LABEL: icmp0_v16i8_v16i1: 1010; AVX512F: # %bb.0: 1011; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1012; AVX512F-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1013; AVX512F-NEXT: vpmovmskb %xmm0, %eax 1014; AVX512F-NEXT: testl %eax, %eax 1015; AVX512F-NEXT: setne %al 1016; AVX512F-NEXT: retq 1017; 1018; AVX512BW-LABEL: icmp0_v16i8_v16i1: 1019; AVX512BW: # %bb.0: 1020; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1021; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k0 1022; AVX512BW-NEXT: kortestw %k0, %k0 1023; AVX512BW-NEXT: setne %al 1024; AVX512BW-NEXT: vzeroupper 1025; AVX512BW-NEXT: retq 1026; 1027; AVX512VL-LABEL: icmp0_v16i8_v16i1: 1028; AVX512VL: # %bb.0: 1029; AVX512VL-NEXT: vptestnmb %xmm0, %xmm0, %k0 1030; AVX512VL-NEXT: kortestw %k0, %k0 1031; AVX512VL-NEXT: setne %al 1032; AVX512VL-NEXT: retq 1033 %a = icmp eq <16 x i8> %0, zeroinitializer 1034 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 1035 ret i1 %b 1036} 1037 1038define i1 @icmp0_v4i64_v4i1(<4 x i64>) { 1039; SSE2-LABEL: icmp0_v4i64_v4i1: 1040; SSE2: # %bb.0: 1041; SSE2-NEXT: pxor %xmm2, %xmm2 1042; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 1043; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,0,3,2] 1044; SSE2-NEXT: pand %xmm1, %xmm3 1045; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 1046; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 1047; SSE2-NEXT: pand %xmm0, %xmm1 1048; SSE2-NEXT: packssdw %xmm3, %xmm1 1049; SSE2-NEXT: movmskps %xmm1, %eax 1050; SSE2-NEXT: testl %eax, %eax 1051; SSE2-NEXT: setne %al 1052; SSE2-NEXT: retq 1053; 1054; SSE41-LABEL: icmp0_v4i64_v4i1: 1055; SSE41: # %bb.0: 1056; SSE41-NEXT: pxor %xmm2, %xmm2 1057; SSE41-NEXT: pcmpeqq %xmm2, %xmm1 1058; SSE41-NEXT: pcmpeqq %xmm2, %xmm0 1059; SSE41-NEXT: packssdw %xmm1, %xmm0 1060; SSE41-NEXT: movmskps %xmm0, %eax 1061; SSE41-NEXT: testl %eax, %eax 1062; SSE41-NEXT: setne %al 1063; SSE41-NEXT: retq 1064; 1065; AVX1-LABEL: icmp0_v4i64_v4i1: 1066; AVX1: # %bb.0: 1067; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1068; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1069; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 1070; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0 1071; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 1072; AVX1-NEXT: vmovmskpd %xmm0, %eax 1073; AVX1-NEXT: testl %eax, %eax 1074; AVX1-NEXT: setne %al 1075; AVX1-NEXT: vzeroupper 1076; AVX1-NEXT: retq 1077; 1078; AVX2-LABEL: icmp0_v4i64_v4i1: 1079; AVX2: # %bb.0: 1080; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1081; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0 1082; AVX2-NEXT: vmovmskpd %ymm0, %eax 1083; AVX2-NEXT: testl %eax, %eax 1084; AVX2-NEXT: setne %al 1085; AVX2-NEXT: vzeroupper 1086; AVX2-NEXT: retq 1087; 1088; AVX512F-LABEL: icmp0_v4i64_v4i1: 1089; AVX512F: # %bb.0: 1090; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1091; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0 1092; AVX512F-NEXT: kmovw %k0, %eax 1093; AVX512F-NEXT: testb $15, %al 1094; AVX512F-NEXT: setne %al 1095; AVX512F-NEXT: vzeroupper 1096; AVX512F-NEXT: retq 1097; 1098; AVX512BW-LABEL: icmp0_v4i64_v4i1: 1099; AVX512BW: # %bb.0: 1100; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1101; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k0 1102; AVX512BW-NEXT: kmovd %k0, %eax 1103; AVX512BW-NEXT: testb $15, %al 1104; AVX512BW-NEXT: setne %al 1105; AVX512BW-NEXT: vzeroupper 1106; AVX512BW-NEXT: retq 1107; 1108; AVX512VL-LABEL: icmp0_v4i64_v4i1: 1109; AVX512VL: # %bb.0: 1110; AVX512VL-NEXT: vptestnmq %ymm0, %ymm0, %k0 1111; AVX512VL-NEXT: kmovd %k0, %eax 1112; AVX512VL-NEXT: testb %al, %al 1113; AVX512VL-NEXT: setne %al 1114; AVX512VL-NEXT: vzeroupper 1115; AVX512VL-NEXT: retq 1116 %a = icmp eq <4 x i64> %0, zeroinitializer 1117 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a) 1118 ret i1 %b 1119} 1120 1121define i1 @icmp0_v8i32_v8i1(<8 x i32>) { 1122; SSE-LABEL: icmp0_v8i32_v8i1: 1123; SSE: # %bb.0: 1124; SSE-NEXT: pxor %xmm2, %xmm2 1125; SSE-NEXT: pcmpeqd %xmm2, %xmm1 1126; SSE-NEXT: pcmpeqd %xmm2, %xmm0 1127; SSE-NEXT: packssdw %xmm1, %xmm0 1128; SSE-NEXT: pmovmskb %xmm0, %eax 1129; SSE-NEXT: testl %eax, %eax 1130; SSE-NEXT: setne %al 1131; SSE-NEXT: retq 1132; 1133; AVX1-LABEL: icmp0_v8i32_v8i1: 1134; AVX1: # %bb.0: 1135; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1136; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1137; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1138; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0 1139; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 1140; AVX1-NEXT: vmovmskps %xmm0, %eax 1141; AVX1-NEXT: testl %eax, %eax 1142; AVX1-NEXT: setne %al 1143; AVX1-NEXT: vzeroupper 1144; AVX1-NEXT: retq 1145; 1146; AVX2-LABEL: icmp0_v8i32_v8i1: 1147; AVX2: # %bb.0: 1148; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1149; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0 1150; AVX2-NEXT: vmovmskps %ymm0, %eax 1151; AVX2-NEXT: testl %eax, %eax 1152; AVX2-NEXT: setne %al 1153; AVX2-NEXT: vzeroupper 1154; AVX2-NEXT: retq 1155; 1156; AVX512F-LABEL: icmp0_v8i32_v8i1: 1157; AVX512F: # %bb.0: 1158; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1159; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0 1160; AVX512F-NEXT: kmovw %k0, %eax 1161; AVX512F-NEXT: testb %al, %al 1162; AVX512F-NEXT: setne %al 1163; AVX512F-NEXT: vzeroupper 1164; AVX512F-NEXT: retq 1165; 1166; AVX512BW-LABEL: icmp0_v8i32_v8i1: 1167; AVX512BW: # %bb.0: 1168; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1169; AVX512BW-NEXT: vptestnmd %zmm0, %zmm0, %k0 1170; AVX512BW-NEXT: kmovd %k0, %eax 1171; AVX512BW-NEXT: testb %al, %al 1172; AVX512BW-NEXT: setne %al 1173; AVX512BW-NEXT: vzeroupper 1174; AVX512BW-NEXT: retq 1175; 1176; AVX512VL-LABEL: icmp0_v8i32_v8i1: 1177; AVX512VL: # %bb.0: 1178; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k0 1179; AVX512VL-NEXT: kmovd %k0, %eax 1180; AVX512VL-NEXT: testb %al, %al 1181; AVX512VL-NEXT: setne %al 1182; AVX512VL-NEXT: vzeroupper 1183; AVX512VL-NEXT: retq 1184 %a = icmp eq <8 x i32> %0, zeroinitializer 1185 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 1186 ret i1 %b 1187} 1188 1189define i1 @icmp0_v16i16_v16i1(<16 x i16>) { 1190; SSE-LABEL: icmp0_v16i16_v16i1: 1191; SSE: # %bb.0: 1192; SSE-NEXT: pxor %xmm2, %xmm2 1193; SSE-NEXT: pcmpeqw %xmm2, %xmm1 1194; SSE-NEXT: pcmpeqw %xmm2, %xmm0 1195; SSE-NEXT: packsswb %xmm1, %xmm0 1196; SSE-NEXT: pmovmskb %xmm0, %eax 1197; SSE-NEXT: testl %eax, %eax 1198; SSE-NEXT: setne %al 1199; SSE-NEXT: retq 1200; 1201; AVX1-LABEL: icmp0_v16i16_v16i1: 1202; AVX1: # %bb.0: 1203; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1204; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1205; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 1206; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0 1207; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 1208; AVX1-NEXT: vpmovmskb %xmm0, %eax 1209; AVX1-NEXT: testl %eax, %eax 1210; AVX1-NEXT: setne %al 1211; AVX1-NEXT: vzeroupper 1212; AVX1-NEXT: retq 1213; 1214; AVX2-LABEL: icmp0_v16i16_v16i1: 1215; AVX2: # %bb.0: 1216; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1217; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 1218; AVX2-NEXT: vpmovmskb %ymm0, %eax 1219; AVX2-NEXT: testl %eax, %eax 1220; AVX2-NEXT: setne %al 1221; AVX2-NEXT: vzeroupper 1222; AVX2-NEXT: retq 1223; 1224; AVX512F-LABEL: icmp0_v16i16_v16i1: 1225; AVX512F: # %bb.0: 1226; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1227; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 1228; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 1229; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 1230; AVX512F-NEXT: kortestw %k0, %k0 1231; AVX512F-NEXT: setne %al 1232; AVX512F-NEXT: vzeroupper 1233; AVX512F-NEXT: retq 1234; 1235; AVX512BW-LABEL: icmp0_v16i16_v16i1: 1236; AVX512BW: # %bb.0: 1237; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1238; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k0 1239; AVX512BW-NEXT: kortestw %k0, %k0 1240; AVX512BW-NEXT: setne %al 1241; AVX512BW-NEXT: vzeroupper 1242; AVX512BW-NEXT: retq 1243; 1244; AVX512VL-LABEL: icmp0_v16i16_v16i1: 1245; AVX512VL: # %bb.0: 1246; AVX512VL-NEXT: vptestnmw %ymm0, %ymm0, %k0 1247; AVX512VL-NEXT: kortestw %k0, %k0 1248; AVX512VL-NEXT: setne %al 1249; AVX512VL-NEXT: vzeroupper 1250; AVX512VL-NEXT: retq 1251 %a = icmp eq <16 x i16> %0, zeroinitializer 1252 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 1253 ret i1 %b 1254} 1255 1256define i1 @icmp0_v32i8_v32i1(<32 x i8>) { 1257; SSE-LABEL: icmp0_v32i8_v32i1: 1258; SSE: # %bb.0: 1259; SSE-NEXT: pxor %xmm2, %xmm2 1260; SSE-NEXT: pcmpeqb %xmm2, %xmm1 1261; SSE-NEXT: pcmpeqb %xmm2, %xmm0 1262; SSE-NEXT: por %xmm1, %xmm0 1263; SSE-NEXT: pmovmskb %xmm0, %eax 1264; SSE-NEXT: testl %eax, %eax 1265; SSE-NEXT: setne %al 1266; SSE-NEXT: retq 1267; 1268; AVX1-LABEL: icmp0_v32i8_v32i1: 1269; AVX1: # %bb.0: 1270; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1271; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1272; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 1273; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 1274; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 1275; AVX1-NEXT: vpmovmskb %xmm0, %eax 1276; AVX1-NEXT: testl %eax, %eax 1277; AVX1-NEXT: setne %al 1278; AVX1-NEXT: vzeroupper 1279; AVX1-NEXT: retq 1280; 1281; AVX2-LABEL: icmp0_v32i8_v32i1: 1282; AVX2: # %bb.0: 1283; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1284; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 1285; AVX2-NEXT: vpmovmskb %ymm0, %eax 1286; AVX2-NEXT: testl %eax, %eax 1287; AVX2-NEXT: setne %al 1288; AVX2-NEXT: vzeroupper 1289; AVX2-NEXT: retq 1290; 1291; AVX512F-LABEL: icmp0_v32i8_v32i1: 1292; AVX512F: # %bb.0: 1293; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1294; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 1295; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 1296; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0 1297; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 1298; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 1299; AVX512F-NEXT: kshiftrw $8, %k0, %k1 1300; AVX512F-NEXT: korw %k1, %k0, %k0 1301; AVX512F-NEXT: kshiftrw $4, %k0, %k1 1302; AVX512F-NEXT: korw %k1, %k0, %k0 1303; AVX512F-NEXT: kshiftrw $2, %k0, %k1 1304; AVX512F-NEXT: korw %k1, %k0, %k0 1305; AVX512F-NEXT: kshiftrw $1, %k0, %k1 1306; AVX512F-NEXT: korw %k1, %k0, %k0 1307; AVX512F-NEXT: kmovw %k0, %eax 1308; AVX512F-NEXT: # kill: def $al killed $al killed $eax 1309; AVX512F-NEXT: vzeroupper 1310; AVX512F-NEXT: retq 1311; 1312; AVX512BW-LABEL: icmp0_v32i8_v32i1: 1313; AVX512BW: # %bb.0: 1314; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1315; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k0 1316; AVX512BW-NEXT: kortestd %k0, %k0 1317; AVX512BW-NEXT: setne %al 1318; AVX512BW-NEXT: vzeroupper 1319; AVX512BW-NEXT: retq 1320; 1321; AVX512VL-LABEL: icmp0_v32i8_v32i1: 1322; AVX512VL: # %bb.0: 1323; AVX512VL-NEXT: vptestnmb %ymm0, %ymm0, %k0 1324; AVX512VL-NEXT: kortestd %k0, %k0 1325; AVX512VL-NEXT: setne %al 1326; AVX512VL-NEXT: vzeroupper 1327; AVX512VL-NEXT: retq 1328 %a = icmp eq <32 x i8> %0, zeroinitializer 1329 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a) 1330 ret i1 %b 1331} 1332 1333define i1 @icmp0_v8i64_v8i1(<8 x i64>) { 1334; SSE2-LABEL: icmp0_v8i64_v8i1: 1335; SSE2: # %bb.0: 1336; SSE2-NEXT: pxor %xmm4, %xmm4 1337; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 1338; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,0,3,2] 1339; SSE2-NEXT: pand %xmm3, %xmm5 1340; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 1341; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2] 1342; SSE2-NEXT: pand %xmm2, %xmm3 1343; SSE2-NEXT: packssdw %xmm5, %xmm3 1344; SSE2-NEXT: pcmpeqd %xmm4, %xmm1 1345; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2] 1346; SSE2-NEXT: pand %xmm1, %xmm2 1347; SSE2-NEXT: pcmpeqd %xmm4, %xmm0 1348; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 1349; SSE2-NEXT: pand %xmm0, %xmm1 1350; SSE2-NEXT: packssdw %xmm2, %xmm1 1351; SSE2-NEXT: packssdw %xmm3, %xmm1 1352; SSE2-NEXT: pmovmskb %xmm1, %eax 1353; SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA 1354; SSE2-NEXT: setne %al 1355; SSE2-NEXT: retq 1356; 1357; SSE41-LABEL: icmp0_v8i64_v8i1: 1358; SSE41: # %bb.0: 1359; SSE41-NEXT: pxor %xmm4, %xmm4 1360; SSE41-NEXT: pcmpeqq %xmm4, %xmm3 1361; SSE41-NEXT: pcmpeqq %xmm4, %xmm2 1362; SSE41-NEXT: packssdw %xmm3, %xmm2 1363; SSE41-NEXT: pcmpeqq %xmm4, %xmm1 1364; SSE41-NEXT: pcmpeqq %xmm4, %xmm0 1365; SSE41-NEXT: packssdw %xmm1, %xmm0 1366; SSE41-NEXT: packssdw %xmm2, %xmm0 1367; SSE41-NEXT: pmovmskb %xmm0, %eax 1368; SSE41-NEXT: testl $43690, %eax # imm = 0xAAAA 1369; SSE41-NEXT: setne %al 1370; SSE41-NEXT: retq 1371; 1372; AVX1-LABEL: icmp0_v8i64_v8i1: 1373; AVX1: # %bb.0: 1374; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1375; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 1376; AVX1-NEXT: vpcmpeqq %xmm3, %xmm2, %xmm2 1377; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm1 1378; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 1379; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1380; AVX1-NEXT: vpcmpeqq %xmm3, %xmm2, %xmm2 1381; AVX1-NEXT: vpcmpeqq %xmm3, %xmm0, %xmm0 1382; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 1383; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 1384; AVX1-NEXT: vmovmskps %xmm0, %eax 1385; AVX1-NEXT: testl %eax, %eax 1386; AVX1-NEXT: setne %al 1387; AVX1-NEXT: vzeroupper 1388; AVX1-NEXT: retq 1389; 1390; AVX2-LABEL: icmp0_v8i64_v8i1: 1391; AVX2: # %bb.0: 1392; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1393; AVX2-NEXT: vpcmpeqq %ymm2, %ymm1, %ymm1 1394; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0 1395; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 1396; AVX2-NEXT: vmovmskps %ymm0, %eax 1397; AVX2-NEXT: testl %eax, %eax 1398; AVX2-NEXT: setne %al 1399; AVX2-NEXT: vzeroupper 1400; AVX2-NEXT: retq 1401; 1402; AVX512F-LABEL: icmp0_v8i64_v8i1: 1403; AVX512F: # %bb.0: 1404; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0 1405; AVX512F-NEXT: kmovw %k0, %eax 1406; AVX512F-NEXT: testb %al, %al 1407; AVX512F-NEXT: setne %al 1408; AVX512F-NEXT: vzeroupper 1409; AVX512F-NEXT: retq 1410; 1411; AVX512BW-LABEL: icmp0_v8i64_v8i1: 1412; AVX512BW: # %bb.0: 1413; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k0 1414; AVX512BW-NEXT: kmovd %k0, %eax 1415; AVX512BW-NEXT: testb %al, %al 1416; AVX512BW-NEXT: setne %al 1417; AVX512BW-NEXT: vzeroupper 1418; AVX512BW-NEXT: retq 1419; 1420; AVX512VL-LABEL: icmp0_v8i64_v8i1: 1421; AVX512VL: # %bb.0: 1422; AVX512VL-NEXT: vptestnmq %zmm0, %zmm0, %k0 1423; AVX512VL-NEXT: kmovd %k0, %eax 1424; AVX512VL-NEXT: testb %al, %al 1425; AVX512VL-NEXT: setne %al 1426; AVX512VL-NEXT: vzeroupper 1427; AVX512VL-NEXT: retq 1428 %a = icmp eq <8 x i64> %0, zeroinitializer 1429 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 1430 ret i1 %b 1431} 1432 1433define i1 @icmp0_v16i32_v16i1(<16 x i32>) { 1434; SSE-LABEL: icmp0_v16i32_v16i1: 1435; SSE: # %bb.0: 1436; SSE-NEXT: pxor %xmm4, %xmm4 1437; SSE-NEXT: pcmpeqd %xmm4, %xmm3 1438; SSE-NEXT: pcmpeqd %xmm4, %xmm2 1439; SSE-NEXT: packssdw %xmm3, %xmm2 1440; SSE-NEXT: pcmpeqd %xmm4, %xmm1 1441; SSE-NEXT: pcmpeqd %xmm4, %xmm0 1442; SSE-NEXT: packssdw %xmm1, %xmm0 1443; SSE-NEXT: packsswb %xmm2, %xmm0 1444; SSE-NEXT: pmovmskb %xmm0, %eax 1445; SSE-NEXT: testl %eax, %eax 1446; SSE-NEXT: setne %al 1447; SSE-NEXT: retq 1448; 1449; AVX1-LABEL: icmp0_v16i32_v16i1: 1450; AVX1: # %bb.0: 1451; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1452; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 1453; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 1454; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 1455; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 1456; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1457; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 1458; AVX1-NEXT: vpcmpeqd %xmm3, %xmm0, %xmm0 1459; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 1460; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 1461; AVX1-NEXT: vpmovmskb %xmm0, %eax 1462; AVX1-NEXT: testl %eax, %eax 1463; AVX1-NEXT: setne %al 1464; AVX1-NEXT: vzeroupper 1465; AVX1-NEXT: retq 1466; 1467; AVX2-LABEL: icmp0_v16i32_v16i1: 1468; AVX2: # %bb.0: 1469; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1470; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 1471; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0 1472; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 1473; AVX2-NEXT: vpmovmskb %ymm0, %eax 1474; AVX2-NEXT: testl %eax, %eax 1475; AVX2-NEXT: setne %al 1476; AVX2-NEXT: vzeroupper 1477; AVX2-NEXT: retq 1478; 1479; AVX512-LABEL: icmp0_v16i32_v16i1: 1480; AVX512: # %bb.0: 1481; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k0 1482; AVX512-NEXT: kortestw %k0, %k0 1483; AVX512-NEXT: setne %al 1484; AVX512-NEXT: vzeroupper 1485; AVX512-NEXT: retq 1486 %a = icmp eq <16 x i32> %0, zeroinitializer 1487 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 1488 ret i1 %b 1489} 1490 1491define i1 @icmp0_v32i16_v32i1(<32 x i16>) { 1492; SSE-LABEL: icmp0_v32i16_v32i1: 1493; SSE: # %bb.0: 1494; SSE-NEXT: pxor %xmm4, %xmm4 1495; SSE-NEXT: pcmpeqw %xmm4, %xmm1 1496; SSE-NEXT: pcmpeqw %xmm4, %xmm0 1497; SSE-NEXT: packsswb %xmm1, %xmm0 1498; SSE-NEXT: pcmpeqw %xmm4, %xmm3 1499; SSE-NEXT: pcmpeqw %xmm4, %xmm2 1500; SSE-NEXT: packsswb %xmm3, %xmm2 1501; SSE-NEXT: por %xmm0, %xmm2 1502; SSE-NEXT: pmovmskb %xmm2, %eax 1503; SSE-NEXT: testl %eax, %eax 1504; SSE-NEXT: setne %al 1505; SSE-NEXT: retq 1506; 1507; AVX1-LABEL: icmp0_v32i16_v32i1: 1508; AVX1: # %bb.0: 1509; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1510; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 1511; AVX1-NEXT: vpcmpeqw %xmm3, %xmm2, %xmm2 1512; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1 1513; AVX1-NEXT: vpacksswb %xmm2, %xmm1, %xmm1 1514; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1515; AVX1-NEXT: vpcmpeqw %xmm3, %xmm2, %xmm2 1516; AVX1-NEXT: vpcmpeqw %xmm3, %xmm0, %xmm0 1517; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0 1518; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 1519; AVX1-NEXT: vpmovmskb %xmm0, %eax 1520; AVX1-NEXT: testl %eax, %eax 1521; AVX1-NEXT: setne %al 1522; AVX1-NEXT: vzeroupper 1523; AVX1-NEXT: retq 1524; 1525; AVX2-LABEL: icmp0_v32i16_v32i1: 1526; AVX2: # %bb.0: 1527; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1528; AVX2-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm1 1529; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0 1530; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0 1531; AVX2-NEXT: vpmovmskb %ymm0, %eax 1532; AVX2-NEXT: testl %eax, %eax 1533; AVX2-NEXT: setne %al 1534; AVX2-NEXT: vzeroupper 1535; AVX2-NEXT: retq 1536; 1537; AVX512F-LABEL: icmp0_v32i16_v32i1: 1538; AVX512F: # %bb.0: 1539; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1540; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 1541; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm1 1542; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0 1543; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0 1544; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 1545; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 1546; AVX512F-NEXT: kshiftrw $8, %k0, %k1 1547; AVX512F-NEXT: korw %k1, %k0, %k0 1548; AVX512F-NEXT: kshiftrw $4, %k0, %k1 1549; AVX512F-NEXT: korw %k1, %k0, %k0 1550; AVX512F-NEXT: kshiftrw $2, %k0, %k1 1551; AVX512F-NEXT: korw %k1, %k0, %k0 1552; AVX512F-NEXT: kshiftrw $1, %k0, %k1 1553; AVX512F-NEXT: korw %k1, %k0, %k0 1554; AVX512F-NEXT: kmovw %k0, %eax 1555; AVX512F-NEXT: # kill: def $al killed $al killed $eax 1556; AVX512F-NEXT: vzeroupper 1557; AVX512F-NEXT: retq 1558; 1559; AVX512BW-LABEL: icmp0_v32i16_v32i1: 1560; AVX512BW: # %bb.0: 1561; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k0 1562; AVX512BW-NEXT: kortestd %k0, %k0 1563; AVX512BW-NEXT: setne %al 1564; AVX512BW-NEXT: vzeroupper 1565; AVX512BW-NEXT: retq 1566; 1567; AVX512VL-LABEL: icmp0_v32i16_v32i1: 1568; AVX512VL: # %bb.0: 1569; AVX512VL-NEXT: vptestnmw %zmm0, %zmm0, %k0 1570; AVX512VL-NEXT: kortestd %k0, %k0 1571; AVX512VL-NEXT: setne %al 1572; AVX512VL-NEXT: vzeroupper 1573; AVX512VL-NEXT: retq 1574 %a = icmp eq <32 x i16> %0, zeroinitializer 1575 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a) 1576 ret i1 %b 1577} 1578 1579define i1 @icmp0_v64i8_v64i1(<64 x i8>) { 1580; SSE-LABEL: icmp0_v64i8_v64i1: 1581; SSE: # %bb.0: 1582; SSE-NEXT: pxor %xmm4, %xmm4 1583; SSE-NEXT: pcmpeqb %xmm4, %xmm2 1584; SSE-NEXT: pcmpeqb %xmm4, %xmm0 1585; SSE-NEXT: pcmpeqb %xmm4, %xmm3 1586; SSE-NEXT: pcmpeqb %xmm4, %xmm1 1587; SSE-NEXT: por %xmm3, %xmm1 1588; SSE-NEXT: por %xmm2, %xmm1 1589; SSE-NEXT: por %xmm0, %xmm1 1590; SSE-NEXT: pmovmskb %xmm1, %eax 1591; SSE-NEXT: testl %eax, %eax 1592; SSE-NEXT: setne %al 1593; SSE-NEXT: retq 1594; 1595; AVX1-LABEL: icmp0_v64i8_v64i1: 1596; AVX1: # %bb.0: 1597; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1598; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm3 1599; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm4 1600; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1601; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 1602; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1603; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 1604; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 1605; AVX1-NEXT: vpor %xmm0, %xmm3, %xmm0 1606; AVX1-NEXT: vpor %xmm0, %xmm4, %xmm0 1607; AVX1-NEXT: vpmovmskb %xmm0, %eax 1608; AVX1-NEXT: testl %eax, %eax 1609; AVX1-NEXT: setne %al 1610; AVX1-NEXT: vzeroupper 1611; AVX1-NEXT: retq 1612; 1613; AVX2-LABEL: icmp0_v64i8_v64i1: 1614; AVX2: # %bb.0: 1615; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1616; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1 1617; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 1618; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1619; AVX2-NEXT: vpmovmskb %ymm0, %eax 1620; AVX2-NEXT: testl %eax, %eax 1621; AVX2-NEXT: setne %al 1622; AVX2-NEXT: vzeroupper 1623; AVX2-NEXT: retq 1624; 1625; AVX512F-LABEL: icmp0_v64i8_v64i1: 1626; AVX512F: # %bb.0: 1627; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1628; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 1629; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1 1630; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 1631; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 1632; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 1633; AVX512F-NEXT: vpor %xmm2, %xmm3, %xmm2 1634; AVX512F-NEXT: vpor %xmm2, %xmm1, %xmm1 1635; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0 1636; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 1637; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0 1638; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 1639; AVX512F-NEXT: kshiftrw $8, %k0, %k1 1640; AVX512F-NEXT: korw %k1, %k0, %k0 1641; AVX512F-NEXT: kshiftrw $4, %k0, %k1 1642; AVX512F-NEXT: korw %k1, %k0, %k0 1643; AVX512F-NEXT: kshiftrw $2, %k0, %k1 1644; AVX512F-NEXT: korw %k1, %k0, %k0 1645; AVX512F-NEXT: kshiftrw $1, %k0, %k1 1646; AVX512F-NEXT: korw %k1, %k0, %k0 1647; AVX512F-NEXT: kmovw %k0, %eax 1648; AVX512F-NEXT: # kill: def $al killed $al killed $eax 1649; AVX512F-NEXT: vzeroupper 1650; AVX512F-NEXT: retq 1651; 1652; AVX512BW-LABEL: icmp0_v64i8_v64i1: 1653; AVX512BW: # %bb.0: 1654; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k0 1655; AVX512BW-NEXT: kortestq %k0, %k0 1656; AVX512BW-NEXT: setne %al 1657; AVX512BW-NEXT: vzeroupper 1658; AVX512BW-NEXT: retq 1659; 1660; AVX512VL-LABEL: icmp0_v64i8_v64i1: 1661; AVX512VL: # %bb.0: 1662; AVX512VL-NEXT: vptestnmb %zmm0, %zmm0, %k0 1663; AVX512VL-NEXT: kortestq %k0, %k0 1664; AVX512VL-NEXT: setne %al 1665; AVX512VL-NEXT: vzeroupper 1666; AVX512VL-NEXT: retq 1667 %a = icmp eq <64 x i8> %0, zeroinitializer 1668 %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a) 1669 ret i1 %b 1670} 1671 1672; Comparison 1673; 1674 1675define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) { 1676; SSE2-LABEL: icmp_v2i64_v2i1: 1677; SSE2: # %bb.0: 1678; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 1679; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 1680; SSE2-NEXT: pand %xmm0, %xmm1 1681; SSE2-NEXT: movmskpd %xmm1, %eax 1682; SSE2-NEXT: testl %eax, %eax 1683; SSE2-NEXT: setne %al 1684; SSE2-NEXT: retq 1685; 1686; SSE41-LABEL: icmp_v2i64_v2i1: 1687; SSE41: # %bb.0: 1688; SSE41-NEXT: pcmpeqq %xmm1, %xmm0 1689; SSE41-NEXT: movmskpd %xmm0, %eax 1690; SSE41-NEXT: testl %eax, %eax 1691; SSE41-NEXT: setne %al 1692; SSE41-NEXT: retq 1693; 1694; AVX-LABEL: icmp_v2i64_v2i1: 1695; AVX: # %bb.0: 1696; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 1697; AVX-NEXT: vmovmskpd %xmm0, %eax 1698; AVX-NEXT: testl %eax, %eax 1699; AVX-NEXT: setne %al 1700; AVX-NEXT: retq 1701; 1702; AVX512F-LABEL: icmp_v2i64_v2i1: 1703; AVX512F: # %bb.0: 1704; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1705; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1706; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k0 1707; AVX512F-NEXT: kmovw %k0, %eax 1708; AVX512F-NEXT: testb $3, %al 1709; AVX512F-NEXT: setne %al 1710; AVX512F-NEXT: vzeroupper 1711; AVX512F-NEXT: retq 1712; 1713; AVX512BW-LABEL: icmp_v2i64_v2i1: 1714; AVX512BW: # %bb.0: 1715; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1716; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1717; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k0 1718; AVX512BW-NEXT: kmovd %k0, %eax 1719; AVX512BW-NEXT: testb $3, %al 1720; AVX512BW-NEXT: setne %al 1721; AVX512BW-NEXT: vzeroupper 1722; AVX512BW-NEXT: retq 1723; 1724; AVX512VL-LABEL: icmp_v2i64_v2i1: 1725; AVX512VL: # %bb.0: 1726; AVX512VL-NEXT: vpcmpeqq %xmm1, %xmm0, %k0 1727; AVX512VL-NEXT: kmovd %k0, %eax 1728; AVX512VL-NEXT: testb %al, %al 1729; AVX512VL-NEXT: setne %al 1730; AVX512VL-NEXT: retq 1731 %a = icmp eq <2 x i64> %0, %1 1732 %b = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a) 1733 ret i1 %b 1734} 1735 1736define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) { 1737; SSE-LABEL: icmp_v4i32_v4i1: 1738; SSE: # %bb.0: 1739; SSE-NEXT: pcmpeqd %xmm1, %xmm0 1740; SSE-NEXT: movmskps %xmm0, %eax 1741; SSE-NEXT: testl %eax, %eax 1742; SSE-NEXT: setne %al 1743; SSE-NEXT: retq 1744; 1745; AVX-LABEL: icmp_v4i32_v4i1: 1746; AVX: # %bb.0: 1747; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1748; AVX-NEXT: vmovmskps %xmm0, %eax 1749; AVX-NEXT: testl %eax, %eax 1750; AVX-NEXT: setne %al 1751; AVX-NEXT: retq 1752; 1753; AVX512F-LABEL: icmp_v4i32_v4i1: 1754; AVX512F: # %bb.0: 1755; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1756; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1757; AVX512F-NEXT: vpcmpeqd %zmm1, %zmm0, %k0 1758; AVX512F-NEXT: kmovw %k0, %eax 1759; AVX512F-NEXT: testb $15, %al 1760; AVX512F-NEXT: setne %al 1761; AVX512F-NEXT: vzeroupper 1762; AVX512F-NEXT: retq 1763; 1764; AVX512BW-LABEL: icmp_v4i32_v4i1: 1765; AVX512BW: # %bb.0: 1766; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1767; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1768; AVX512BW-NEXT: vpcmpeqd %zmm1, %zmm0, %k0 1769; AVX512BW-NEXT: kmovd %k0, %eax 1770; AVX512BW-NEXT: testb $15, %al 1771; AVX512BW-NEXT: setne %al 1772; AVX512BW-NEXT: vzeroupper 1773; AVX512BW-NEXT: retq 1774; 1775; AVX512VL-LABEL: icmp_v4i32_v4i1: 1776; AVX512VL: # %bb.0: 1777; AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %k0 1778; AVX512VL-NEXT: kmovd %k0, %eax 1779; AVX512VL-NEXT: testb %al, %al 1780; AVX512VL-NEXT: setne %al 1781; AVX512VL-NEXT: retq 1782 %a = icmp eq <4 x i32> %0, %1 1783 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a) 1784 ret i1 %b 1785} 1786 1787define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) { 1788; SSE-LABEL: icmp_v8i16_v8i1: 1789; SSE: # %bb.0: 1790; SSE-NEXT: pcmpeqw %xmm1, %xmm0 1791; SSE-NEXT: pmovmskb %xmm0, %eax 1792; SSE-NEXT: testl %eax, %eax 1793; SSE-NEXT: setne %al 1794; SSE-NEXT: retq 1795; 1796; AVX-LABEL: icmp_v8i16_v8i1: 1797; AVX: # %bb.0: 1798; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 1799; AVX-NEXT: vpmovmskb %xmm0, %eax 1800; AVX-NEXT: testl %eax, %eax 1801; AVX-NEXT: setne %al 1802; AVX-NEXT: retq 1803; 1804; AVX512F-LABEL: icmp_v8i16_v8i1: 1805; AVX512F: # %bb.0: 1806; AVX512F-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 1807; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0 1808; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0 1809; AVX512F-NEXT: kmovw %k0, %eax 1810; AVX512F-NEXT: testb %al, %al 1811; AVX512F-NEXT: setne %al 1812; AVX512F-NEXT: vzeroupper 1813; AVX512F-NEXT: retq 1814; 1815; AVX512BW-LABEL: icmp_v8i16_v8i1: 1816; AVX512BW: # %bb.0: 1817; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1818; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1819; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k0 1820; AVX512BW-NEXT: kmovd %k0, %eax 1821; AVX512BW-NEXT: testb %al, %al 1822; AVX512BW-NEXT: setne %al 1823; AVX512BW-NEXT: vzeroupper 1824; AVX512BW-NEXT: retq 1825; 1826; AVX512VL-LABEL: icmp_v8i16_v8i1: 1827; AVX512VL: # %bb.0: 1828; AVX512VL-NEXT: vpcmpeqw %xmm1, %xmm0, %k0 1829; AVX512VL-NEXT: kmovd %k0, %eax 1830; AVX512VL-NEXT: testb %al, %al 1831; AVX512VL-NEXT: setne %al 1832; AVX512VL-NEXT: retq 1833 %a = icmp eq <8 x i16> %0, %1 1834 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 1835 ret i1 %b 1836} 1837 1838define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) { 1839; SSE-LABEL: icmp_v16i8_v16i1: 1840; SSE: # %bb.0: 1841; SSE-NEXT: pcmpeqb %xmm1, %xmm0 1842; SSE-NEXT: pmovmskb %xmm0, %eax 1843; SSE-NEXT: testl %eax, %eax 1844; SSE-NEXT: setne %al 1845; SSE-NEXT: retq 1846; 1847; AVX-LABEL: icmp_v16i8_v16i1: 1848; AVX: # %bb.0: 1849; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1850; AVX-NEXT: vpmovmskb %xmm0, %eax 1851; AVX-NEXT: testl %eax, %eax 1852; AVX-NEXT: setne %al 1853; AVX-NEXT: retq 1854; 1855; AVX512F-LABEL: icmp_v16i8_v16i1: 1856; AVX512F: # %bb.0: 1857; AVX512F-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1858; AVX512F-NEXT: vpmovmskb %xmm0, %eax 1859; AVX512F-NEXT: testl %eax, %eax 1860; AVX512F-NEXT: setne %al 1861; AVX512F-NEXT: retq 1862; 1863; AVX512BW-LABEL: icmp_v16i8_v16i1: 1864; AVX512BW: # %bb.0: 1865; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1866; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1867; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k0 1868; AVX512BW-NEXT: kortestw %k0, %k0 1869; AVX512BW-NEXT: setne %al 1870; AVX512BW-NEXT: vzeroupper 1871; AVX512BW-NEXT: retq 1872; 1873; AVX512VL-LABEL: icmp_v16i8_v16i1: 1874; AVX512VL: # %bb.0: 1875; AVX512VL-NEXT: vpcmpeqb %xmm1, %xmm0, %k0 1876; AVX512VL-NEXT: kortestw %k0, %k0 1877; AVX512VL-NEXT: setne %al 1878; AVX512VL-NEXT: retq 1879 %a = icmp eq <16 x i8> %0, %1 1880 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 1881 ret i1 %b 1882} 1883 1884define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) { 1885; SSE2-LABEL: icmp_v4i64_v4i1: 1886; SSE2: # %bb.0: 1887; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 1888; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,0,3,2] 1889; SSE2-NEXT: pand %xmm1, %xmm3 1890; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 1891; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 1892; SSE2-NEXT: pand %xmm0, %xmm1 1893; SSE2-NEXT: packssdw %xmm3, %xmm1 1894; SSE2-NEXT: movmskps %xmm1, %eax 1895; SSE2-NEXT: testl %eax, %eax 1896; SSE2-NEXT: setne %al 1897; SSE2-NEXT: retq 1898; 1899; SSE41-LABEL: icmp_v4i64_v4i1: 1900; SSE41: # %bb.0: 1901; SSE41-NEXT: pcmpeqq %xmm3, %xmm1 1902; SSE41-NEXT: pcmpeqq %xmm2, %xmm0 1903; SSE41-NEXT: packssdw %xmm1, %xmm0 1904; SSE41-NEXT: movmskps %xmm0, %eax 1905; SSE41-NEXT: testl %eax, %eax 1906; SSE41-NEXT: setne %al 1907; SSE41-NEXT: retq 1908; 1909; AVX1-LABEL: icmp_v4i64_v4i1: 1910; AVX1: # %bb.0: 1911; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1912; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1913; AVX1-NEXT: vpcmpeqq %xmm2, %xmm3, %xmm2 1914; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 1915; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0 1916; AVX1-NEXT: vmovmskpd %xmm0, %eax 1917; AVX1-NEXT: testl %eax, %eax 1918; AVX1-NEXT: setne %al 1919; AVX1-NEXT: vzeroupper 1920; AVX1-NEXT: retq 1921; 1922; AVX2-LABEL: icmp_v4i64_v4i1: 1923; AVX2: # %bb.0: 1924; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0 1925; AVX2-NEXT: vmovmskpd %ymm0, %eax 1926; AVX2-NEXT: testl %eax, %eax 1927; AVX2-NEXT: setne %al 1928; AVX2-NEXT: vzeroupper 1929; AVX2-NEXT: retq 1930; 1931; AVX512F-LABEL: icmp_v4i64_v4i1: 1932; AVX512F: # %bb.0: 1933; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1934; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1935; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k0 1936; AVX512F-NEXT: kmovw %k0, %eax 1937; AVX512F-NEXT: testb $15, %al 1938; AVX512F-NEXT: setne %al 1939; AVX512F-NEXT: vzeroupper 1940; AVX512F-NEXT: retq 1941; 1942; AVX512BW-LABEL: icmp_v4i64_v4i1: 1943; AVX512BW: # %bb.0: 1944; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1945; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1946; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k0 1947; AVX512BW-NEXT: kmovd %k0, %eax 1948; AVX512BW-NEXT: testb $15, %al 1949; AVX512BW-NEXT: setne %al 1950; AVX512BW-NEXT: vzeroupper 1951; AVX512BW-NEXT: retq 1952; 1953; AVX512VL-LABEL: icmp_v4i64_v4i1: 1954; AVX512VL: # %bb.0: 1955; AVX512VL-NEXT: vpcmpeqq %ymm1, %ymm0, %k0 1956; AVX512VL-NEXT: kmovd %k0, %eax 1957; AVX512VL-NEXT: testb %al, %al 1958; AVX512VL-NEXT: setne %al 1959; AVX512VL-NEXT: vzeroupper 1960; AVX512VL-NEXT: retq 1961 %a = icmp eq <4 x i64> %0, %1 1962 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a) 1963 ret i1 %b 1964} 1965 1966define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) { 1967; SSE-LABEL: icmp_v8i32_v8i1: 1968; SSE: # %bb.0: 1969; SSE-NEXT: pcmpeqd %xmm3, %xmm1 1970; SSE-NEXT: pcmpeqd %xmm2, %xmm0 1971; SSE-NEXT: packssdw %xmm1, %xmm0 1972; SSE-NEXT: pmovmskb %xmm0, %eax 1973; SSE-NEXT: testl %eax, %eax 1974; SSE-NEXT: setne %al 1975; SSE-NEXT: retq 1976; 1977; AVX1-LABEL: icmp_v8i32_v8i1: 1978; AVX1: # %bb.0: 1979; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1980; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1981; AVX1-NEXT: vpcmpeqd %xmm2, %xmm3, %xmm2 1982; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1983; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0 1984; AVX1-NEXT: vmovmskps %xmm0, %eax 1985; AVX1-NEXT: testl %eax, %eax 1986; AVX1-NEXT: setne %al 1987; AVX1-NEXT: vzeroupper 1988; AVX1-NEXT: retq 1989; 1990; AVX2-LABEL: icmp_v8i32_v8i1: 1991; AVX2: # %bb.0: 1992; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0 1993; AVX2-NEXT: vmovmskps %ymm0, %eax 1994; AVX2-NEXT: testl %eax, %eax 1995; AVX2-NEXT: setne %al 1996; AVX2-NEXT: vzeroupper 1997; AVX2-NEXT: retq 1998; 1999; AVX512F-LABEL: icmp_v8i32_v8i1: 2000; AVX512F: # %bb.0: 2001; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 2002; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2003; AVX512F-NEXT: vpcmpeqd %zmm1, %zmm0, %k0 2004; AVX512F-NEXT: kmovw %k0, %eax 2005; AVX512F-NEXT: testb %al, %al 2006; AVX512F-NEXT: setne %al 2007; AVX512F-NEXT: vzeroupper 2008; AVX512F-NEXT: retq 2009; 2010; AVX512BW-LABEL: icmp_v8i32_v8i1: 2011; AVX512BW: # %bb.0: 2012; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 2013; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2014; AVX512BW-NEXT: vpcmpeqd %zmm1, %zmm0, %k0 2015; AVX512BW-NEXT: kmovd %k0, %eax 2016; AVX512BW-NEXT: testb %al, %al 2017; AVX512BW-NEXT: setne %al 2018; AVX512BW-NEXT: vzeroupper 2019; AVX512BW-NEXT: retq 2020; 2021; AVX512VL-LABEL: icmp_v8i32_v8i1: 2022; AVX512VL: # %bb.0: 2023; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm0, %k0 2024; AVX512VL-NEXT: kmovd %k0, %eax 2025; AVX512VL-NEXT: testb %al, %al 2026; AVX512VL-NEXT: setne %al 2027; AVX512VL-NEXT: vzeroupper 2028; AVX512VL-NEXT: retq 2029 %a = icmp eq <8 x i32> %0, %1 2030 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 2031 ret i1 %b 2032} 2033 2034define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) { 2035; SSE-LABEL: icmp_v16i16_v16i1: 2036; SSE: # %bb.0: 2037; SSE-NEXT: pcmpeqw %xmm3, %xmm1 2038; SSE-NEXT: pcmpeqw %xmm2, %xmm0 2039; SSE-NEXT: packsswb %xmm1, %xmm0 2040; SSE-NEXT: pmovmskb %xmm0, %eax 2041; SSE-NEXT: testl %eax, %eax 2042; SSE-NEXT: setne %al 2043; SSE-NEXT: retq 2044; 2045; AVX1-LABEL: icmp_v16i16_v16i1: 2046; AVX1: # %bb.0: 2047; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2048; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 2049; AVX1-NEXT: vpcmpeqw %xmm2, %xmm3, %xmm2 2050; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 2051; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0 2052; AVX1-NEXT: vpmovmskb %xmm0, %eax 2053; AVX1-NEXT: testl %eax, %eax 2054; AVX1-NEXT: setne %al 2055; AVX1-NEXT: vzeroupper 2056; AVX1-NEXT: retq 2057; 2058; AVX2-LABEL: icmp_v16i16_v16i1: 2059; AVX2: # %bb.0: 2060; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 2061; AVX2-NEXT: vpmovmskb %ymm0, %eax 2062; AVX2-NEXT: testl %eax, %eax 2063; AVX2-NEXT: setne %al 2064; AVX2-NEXT: vzeroupper 2065; AVX2-NEXT: retq 2066; 2067; AVX512F-LABEL: icmp_v16i16_v16i1: 2068; AVX512F: # %bb.0: 2069; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 2070; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 2071; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 2072; AVX512F-NEXT: kortestw %k0, %k0 2073; AVX512F-NEXT: setne %al 2074; AVX512F-NEXT: vzeroupper 2075; AVX512F-NEXT: retq 2076; 2077; AVX512BW-LABEL: icmp_v16i16_v16i1: 2078; AVX512BW: # %bb.0: 2079; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 2080; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2081; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k0 2082; AVX512BW-NEXT: kortestw %k0, %k0 2083; AVX512BW-NEXT: setne %al 2084; AVX512BW-NEXT: vzeroupper 2085; AVX512BW-NEXT: retq 2086; 2087; AVX512VL-LABEL: icmp_v16i16_v16i1: 2088; AVX512VL: # %bb.0: 2089; AVX512VL-NEXT: vpcmpeqw %ymm1, %ymm0, %k0 2090; AVX512VL-NEXT: kortestw %k0, %k0 2091; AVX512VL-NEXT: setne %al 2092; AVX512VL-NEXT: vzeroupper 2093; AVX512VL-NEXT: retq 2094 %a = icmp eq <16 x i16> %0, %1 2095 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 2096 ret i1 %b 2097} 2098 2099define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) { 2100; SSE-LABEL: icmp_v32i8_v32i1: 2101; SSE: # %bb.0: 2102; SSE-NEXT: pcmpeqb %xmm3, %xmm1 2103; SSE-NEXT: pcmpeqb %xmm2, %xmm0 2104; SSE-NEXT: por %xmm1, %xmm0 2105; SSE-NEXT: pmovmskb %xmm0, %eax 2106; SSE-NEXT: testl %eax, %eax 2107; SSE-NEXT: setne %al 2108; SSE-NEXT: retq 2109; 2110; AVX1-LABEL: icmp_v32i8_v32i1: 2111; AVX1: # %bb.0: 2112; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2113; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 2114; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm2 2115; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 2116; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0 2117; AVX1-NEXT: vpmovmskb %xmm0, %eax 2118; AVX1-NEXT: testl %eax, %eax 2119; AVX1-NEXT: setne %al 2120; AVX1-NEXT: vzeroupper 2121; AVX1-NEXT: retq 2122; 2123; AVX2-LABEL: icmp_v32i8_v32i1: 2124; AVX2: # %bb.0: 2125; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 2126; AVX2-NEXT: vpmovmskb %ymm0, %eax 2127; AVX2-NEXT: testl %eax, %eax 2128; AVX2-NEXT: setne %al 2129; AVX2-NEXT: vzeroupper 2130; AVX2-NEXT: retq 2131; 2132; AVX512F-LABEL: icmp_v32i8_v32i1: 2133; AVX512F: # %bb.0: 2134; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 2135; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 2136; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0 2137; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 2138; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 2139; AVX512F-NEXT: kshiftrw $8, %k0, %k1 2140; AVX512F-NEXT: korw %k1, %k0, %k0 2141; AVX512F-NEXT: kshiftrw $4, %k0, %k1 2142; AVX512F-NEXT: korw %k1, %k0, %k0 2143; AVX512F-NEXT: kshiftrw $2, %k0, %k1 2144; AVX512F-NEXT: korw %k1, %k0, %k0 2145; AVX512F-NEXT: kshiftrw $1, %k0, %k1 2146; AVX512F-NEXT: korw %k1, %k0, %k0 2147; AVX512F-NEXT: kmovw %k0, %eax 2148; AVX512F-NEXT: # kill: def $al killed $al killed $eax 2149; AVX512F-NEXT: vzeroupper 2150; AVX512F-NEXT: retq 2151; 2152; AVX512BW-LABEL: icmp_v32i8_v32i1: 2153; AVX512BW: # %bb.0: 2154; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 2155; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2156; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k0 2157; AVX512BW-NEXT: kortestd %k0, %k0 2158; AVX512BW-NEXT: setne %al 2159; AVX512BW-NEXT: vzeroupper 2160; AVX512BW-NEXT: retq 2161; 2162; AVX512VL-LABEL: icmp_v32i8_v32i1: 2163; AVX512VL: # %bb.0: 2164; AVX512VL-NEXT: vpcmpeqb %ymm1, %ymm0, %k0 2165; AVX512VL-NEXT: kortestd %k0, %k0 2166; AVX512VL-NEXT: setne %al 2167; AVX512VL-NEXT: vzeroupper 2168; AVX512VL-NEXT: retq 2169 %a = icmp eq <32 x i8> %0, %1 2170 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a) 2171 ret i1 %b 2172} 2173 2174define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) { 2175; SSE2-LABEL: icmp_v8i64_v8i1: 2176; SSE2: # %bb.0: 2177; SSE2-NEXT: pcmpeqd %xmm7, %xmm3 2178; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,0,3,2] 2179; SSE2-NEXT: pand %xmm3, %xmm7 2180; SSE2-NEXT: pcmpeqd %xmm6, %xmm2 2181; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2] 2182; SSE2-NEXT: pand %xmm2, %xmm3 2183; SSE2-NEXT: packssdw %xmm7, %xmm3 2184; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 2185; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2] 2186; SSE2-NEXT: pand %xmm1, %xmm2 2187; SSE2-NEXT: pcmpeqd %xmm4, %xmm0 2188; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 2189; SSE2-NEXT: pand %xmm0, %xmm1 2190; SSE2-NEXT: packssdw %xmm2, %xmm1 2191; SSE2-NEXT: packssdw %xmm3, %xmm1 2192; SSE2-NEXT: pmovmskb %xmm1, %eax 2193; SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA 2194; SSE2-NEXT: setne %al 2195; SSE2-NEXT: retq 2196; 2197; SSE41-LABEL: icmp_v8i64_v8i1: 2198; SSE41: # %bb.0: 2199; SSE41-NEXT: pcmpeqq %xmm7, %xmm3 2200; SSE41-NEXT: pcmpeqq %xmm6, %xmm2 2201; SSE41-NEXT: packssdw %xmm3, %xmm2 2202; SSE41-NEXT: pcmpeqq %xmm5, %xmm1 2203; SSE41-NEXT: pcmpeqq %xmm4, %xmm0 2204; SSE41-NEXT: packssdw %xmm1, %xmm0 2205; SSE41-NEXT: packssdw %xmm2, %xmm0 2206; SSE41-NEXT: pmovmskb %xmm0, %eax 2207; SSE41-NEXT: testl $43690, %eax # imm = 0xAAAA 2208; SSE41-NEXT: setne %al 2209; SSE41-NEXT: retq 2210; 2211; AVX1-LABEL: icmp_v8i64_v8i1: 2212; AVX1: # %bb.0: 2213; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 2214; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2215; AVX1-NEXT: vpcmpeqq %xmm4, %xmm5, %xmm4 2216; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm1 2217; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1 2218; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 2219; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 2220; AVX1-NEXT: vpcmpeqq %xmm3, %xmm4, %xmm3 2221; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0 2222; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 2223; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 2224; AVX1-NEXT: vmovmskps %xmm0, %eax 2225; AVX1-NEXT: testl %eax, %eax 2226; AVX1-NEXT: setne %al 2227; AVX1-NEXT: vzeroupper 2228; AVX1-NEXT: retq 2229; 2230; AVX2-LABEL: icmp_v8i64_v8i1: 2231; AVX2: # %bb.0: 2232; AVX2-NEXT: vpcmpeqq %ymm3, %ymm1, %ymm1 2233; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0 2234; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 2235; AVX2-NEXT: vmovmskps %ymm0, %eax 2236; AVX2-NEXT: testl %eax, %eax 2237; AVX2-NEXT: setne %al 2238; AVX2-NEXT: vzeroupper 2239; AVX2-NEXT: retq 2240; 2241; AVX512F-LABEL: icmp_v8i64_v8i1: 2242; AVX512F: # %bb.0: 2243; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k0 2244; AVX512F-NEXT: kmovw %k0, %eax 2245; AVX512F-NEXT: testb %al, %al 2246; AVX512F-NEXT: setne %al 2247; AVX512F-NEXT: vzeroupper 2248; AVX512F-NEXT: retq 2249; 2250; AVX512BW-LABEL: icmp_v8i64_v8i1: 2251; AVX512BW: # %bb.0: 2252; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k0 2253; AVX512BW-NEXT: kmovd %k0, %eax 2254; AVX512BW-NEXT: testb %al, %al 2255; AVX512BW-NEXT: setne %al 2256; AVX512BW-NEXT: vzeroupper 2257; AVX512BW-NEXT: retq 2258; 2259; AVX512VL-LABEL: icmp_v8i64_v8i1: 2260; AVX512VL: # %bb.0: 2261; AVX512VL-NEXT: vpcmpeqq %zmm1, %zmm0, %k0 2262; AVX512VL-NEXT: kmovd %k0, %eax 2263; AVX512VL-NEXT: testb %al, %al 2264; AVX512VL-NEXT: setne %al 2265; AVX512VL-NEXT: vzeroupper 2266; AVX512VL-NEXT: retq 2267 %a = icmp eq <8 x i64> %0, %1 2268 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a) 2269 ret i1 %b 2270} 2271 2272define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) { 2273; SSE-LABEL: icmp_v16i32_v16i1: 2274; SSE: # %bb.0: 2275; SSE-NEXT: pcmpeqd %xmm7, %xmm3 2276; SSE-NEXT: pcmpeqd %xmm6, %xmm2 2277; SSE-NEXT: packssdw %xmm3, %xmm2 2278; SSE-NEXT: pcmpeqd %xmm5, %xmm1 2279; SSE-NEXT: pcmpeqd %xmm4, %xmm0 2280; SSE-NEXT: packssdw %xmm1, %xmm0 2281; SSE-NEXT: packsswb %xmm2, %xmm0 2282; SSE-NEXT: pmovmskb %xmm0, %eax 2283; SSE-NEXT: testl %eax, %eax 2284; SSE-NEXT: setne %al 2285; SSE-NEXT: retq 2286; 2287; AVX1-LABEL: icmp_v16i32_v16i1: 2288; AVX1: # %bb.0: 2289; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 2290; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2291; AVX1-NEXT: vpcmpeqd %xmm4, %xmm5, %xmm4 2292; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 2293; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1 2294; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 2295; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 2296; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3 2297; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0 2298; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 2299; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 2300; AVX1-NEXT: vpmovmskb %xmm0, %eax 2301; AVX1-NEXT: testl %eax, %eax 2302; AVX1-NEXT: setne %al 2303; AVX1-NEXT: vzeroupper 2304; AVX1-NEXT: retq 2305; 2306; AVX2-LABEL: icmp_v16i32_v16i1: 2307; AVX2: # %bb.0: 2308; AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm1 2309; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0 2310; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 2311; AVX2-NEXT: vpmovmskb %ymm0, %eax 2312; AVX2-NEXT: testl %eax, %eax 2313; AVX2-NEXT: setne %al 2314; AVX2-NEXT: vzeroupper 2315; AVX2-NEXT: retq 2316; 2317; AVX512-LABEL: icmp_v16i32_v16i1: 2318; AVX512: # %bb.0: 2319; AVX512-NEXT: vpcmpeqd %zmm1, %zmm0, %k0 2320; AVX512-NEXT: kortestw %k0, %k0 2321; AVX512-NEXT: setne %al 2322; AVX512-NEXT: vzeroupper 2323; AVX512-NEXT: retq 2324 %a = icmp eq <16 x i32> %0, %1 2325 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a) 2326 ret i1 %b 2327} 2328 2329define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) { 2330; SSE-LABEL: icmp_v32i16_v32i1: 2331; SSE: # %bb.0: 2332; SSE-NEXT: pcmpeqw %xmm5, %xmm1 2333; SSE-NEXT: pcmpeqw %xmm4, %xmm0 2334; SSE-NEXT: packsswb %xmm1, %xmm0 2335; SSE-NEXT: pcmpeqw %xmm7, %xmm3 2336; SSE-NEXT: pcmpeqw %xmm6, %xmm2 2337; SSE-NEXT: packsswb %xmm3, %xmm2 2338; SSE-NEXT: por %xmm0, %xmm2 2339; SSE-NEXT: pmovmskb %xmm2, %eax 2340; SSE-NEXT: testl %eax, %eax 2341; SSE-NEXT: setne %al 2342; SSE-NEXT: retq 2343; 2344; AVX1-LABEL: icmp_v32i16_v32i1: 2345; AVX1: # %bb.0: 2346; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 2347; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2348; AVX1-NEXT: vpcmpeqw %xmm4, %xmm5, %xmm4 2349; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1 2350; AVX1-NEXT: vpacksswb %xmm4, %xmm1, %xmm1 2351; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 2352; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 2353; AVX1-NEXT: vpcmpeqw %xmm3, %xmm4, %xmm3 2354; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0 2355; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm0 2356; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 2357; AVX1-NEXT: vpmovmskb %xmm0, %eax 2358; AVX1-NEXT: testl %eax, %eax 2359; AVX1-NEXT: setne %al 2360; AVX1-NEXT: vzeroupper 2361; AVX1-NEXT: retq 2362; 2363; AVX2-LABEL: icmp_v32i16_v32i1: 2364; AVX2: # %bb.0: 2365; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm1 2366; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0 2367; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0 2368; AVX2-NEXT: vpmovmskb %ymm0, %eax 2369; AVX2-NEXT: testl %eax, %eax 2370; AVX2-NEXT: setne %al 2371; AVX2-NEXT: vzeroupper 2372; AVX2-NEXT: retq 2373; 2374; AVX512F-LABEL: icmp_v32i16_v32i1: 2375; AVX512F: # %bb.0: 2376; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2 2377; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3 2378; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm3, %ymm2 2379; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 2380; AVX512F-NEXT: vpor %ymm2, %ymm0, %ymm0 2381; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 2382; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 2383; AVX512F-NEXT: kshiftrw $8, %k0, %k1 2384; AVX512F-NEXT: korw %k1, %k0, %k0 2385; AVX512F-NEXT: kshiftrw $4, %k0, %k1 2386; AVX512F-NEXT: korw %k1, %k0, %k0 2387; AVX512F-NEXT: kshiftrw $2, %k0, %k1 2388; AVX512F-NEXT: korw %k1, %k0, %k0 2389; AVX512F-NEXT: kshiftrw $1, %k0, %k1 2390; AVX512F-NEXT: korw %k1, %k0, %k0 2391; AVX512F-NEXT: kmovw %k0, %eax 2392; AVX512F-NEXT: # kill: def $al killed $al killed $eax 2393; AVX512F-NEXT: vzeroupper 2394; AVX512F-NEXT: retq 2395; 2396; AVX512BW-LABEL: icmp_v32i16_v32i1: 2397; AVX512BW: # %bb.0: 2398; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k0 2399; AVX512BW-NEXT: kortestd %k0, %k0 2400; AVX512BW-NEXT: setne %al 2401; AVX512BW-NEXT: vzeroupper 2402; AVX512BW-NEXT: retq 2403; 2404; AVX512VL-LABEL: icmp_v32i16_v32i1: 2405; AVX512VL: # %bb.0: 2406; AVX512VL-NEXT: vpcmpeqw %zmm1, %zmm0, %k0 2407; AVX512VL-NEXT: kortestd %k0, %k0 2408; AVX512VL-NEXT: setne %al 2409; AVX512VL-NEXT: vzeroupper 2410; AVX512VL-NEXT: retq 2411 %a = icmp eq <32 x i16> %0, %1 2412 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a) 2413 ret i1 %b 2414} 2415 2416define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) { 2417; SSE-LABEL: icmp_v64i8_v64i1: 2418; SSE: # %bb.0: 2419; SSE-NEXT: pcmpeqb %xmm6, %xmm2 2420; SSE-NEXT: pcmpeqb %xmm4, %xmm0 2421; SSE-NEXT: pcmpeqb %xmm7, %xmm3 2422; SSE-NEXT: pcmpeqb %xmm5, %xmm1 2423; SSE-NEXT: por %xmm3, %xmm1 2424; SSE-NEXT: por %xmm2, %xmm1 2425; SSE-NEXT: por %xmm0, %xmm1 2426; SSE-NEXT: pmovmskb %xmm1, %eax 2427; SSE-NEXT: testl %eax, %eax 2428; SSE-NEXT: setne %al 2429; SSE-NEXT: retq 2430; 2431; AVX1-LABEL: icmp_v64i8_v64i1: 2432; AVX1: # %bb.0: 2433; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm4 2434; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm5 2435; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 2436; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 2437; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm1 2438; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 2439; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2440; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 2441; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 2442; AVX1-NEXT: vpor %xmm0, %xmm4, %xmm0 2443; AVX1-NEXT: vpor %xmm0, %xmm5, %xmm0 2444; AVX1-NEXT: vpmovmskb %xmm0, %eax 2445; AVX1-NEXT: testl %eax, %eax 2446; AVX1-NEXT: setne %al 2447; AVX1-NEXT: vzeroupper 2448; AVX1-NEXT: retq 2449; 2450; AVX2-LABEL: icmp_v64i8_v64i1: 2451; AVX2: # %bb.0: 2452; AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1 2453; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 2454; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 2455; AVX2-NEXT: vpmovmskb %ymm0, %eax 2456; AVX2-NEXT: testl %eax, %eax 2457; AVX2-NEXT: setne %al 2458; AVX2-NEXT: vzeroupper 2459; AVX2-NEXT: retq 2460; 2461; AVX512F-LABEL: icmp_v64i8_v64i1: 2462; AVX512F: # %bb.0: 2463; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2 2464; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3 2465; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm3, %ymm2 2466; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 2467; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm1 2468; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 2469; AVX512F-NEXT: vpor %xmm1, %xmm3, %xmm1 2470; AVX512F-NEXT: vpor %xmm1, %xmm2, %xmm1 2471; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0 2472; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 2473; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0 2474; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 2475; AVX512F-NEXT: kshiftrw $8, %k0, %k1 2476; AVX512F-NEXT: korw %k1, %k0, %k0 2477; AVX512F-NEXT: kshiftrw $4, %k0, %k1 2478; AVX512F-NEXT: korw %k1, %k0, %k0 2479; AVX512F-NEXT: kshiftrw $2, %k0, %k1 2480; AVX512F-NEXT: korw %k1, %k0, %k0 2481; AVX512F-NEXT: kshiftrw $1, %k0, %k1 2482; AVX512F-NEXT: korw %k1, %k0, %k0 2483; AVX512F-NEXT: kmovw %k0, %eax 2484; AVX512F-NEXT: # kill: def $al killed $al killed $eax 2485; AVX512F-NEXT: vzeroupper 2486; AVX512F-NEXT: retq 2487; 2488; AVX512BW-LABEL: icmp_v64i8_v64i1: 2489; AVX512BW: # %bb.0: 2490; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k0 2491; AVX512BW-NEXT: kortestq %k0, %k0 2492; AVX512BW-NEXT: setne %al 2493; AVX512BW-NEXT: vzeroupper 2494; AVX512BW-NEXT: retq 2495; 2496; AVX512VL-LABEL: icmp_v64i8_v64i1: 2497; AVX512VL: # %bb.0: 2498; AVX512VL-NEXT: vpcmpeqb %zmm1, %zmm0, %k0 2499; AVX512VL-NEXT: kortestq %k0, %k0 2500; AVX512VL-NEXT: setne %al 2501; AVX512VL-NEXT: vzeroupper 2502; AVX512VL-NEXT: retq 2503 %a = icmp eq <64 x i8> %0, %1 2504 %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a) 2505 ret i1 %b 2506} 2507 2508declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>) 2509declare i1 @llvm.vector.reduce.or.v4i1(<4 x i1>) 2510declare i1 @llvm.vector.reduce.or.v8i1(<8 x i1>) 2511declare i1 @llvm.vector.reduce.or.v16i1(<16 x i1>) 2512declare i1 @llvm.vector.reduce.or.v32i1(<32 x i1>) 2513declare i1 @llvm.vector.reduce.or.v64i1(<64 x i1>) 2514