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