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