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=SSE2-SSSE3,SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX12,AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX12,AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512 --check-prefixes=AVX512F 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX512 --check-prefixes=AVX512BW 8 9define i8 @v8i16(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, <8 x i16> %d) { 10; SSE2-SSSE3-LABEL: v8i16: 11; SSE2-SSSE3: # %bb.0: 12; SSE2-SSSE3-NEXT: pcmpgtw %xmm1, %xmm0 13; SSE2-SSSE3-NEXT: pcmpgtw %xmm3, %xmm2 14; SSE2-SSSE3-NEXT: pand %xmm0, %xmm2 15; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm2 16; SSE2-SSSE3-NEXT: pmovmskb %xmm2, %eax 17; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 18; SSE2-SSSE3-NEXT: retq 19; 20; AVX12-LABEL: v8i16: 21; AVX12: # %bb.0: 22; AVX12-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 23; AVX12-NEXT: vpcmpgtw %xmm3, %xmm2, %xmm1 24; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0 25; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 26; AVX12-NEXT: vpmovmskb %xmm0, %eax 27; AVX12-NEXT: # kill: def $al killed $al killed $eax 28; AVX12-NEXT: retq 29; 30; AVX512F-LABEL: v8i16: 31; AVX512F: # %bb.0: 32; AVX512F-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 33; AVX512F-NEXT: vpmovsxwd %xmm0, %ymm0 34; AVX512F-NEXT: vptestmd %ymm0, %ymm0, %k1 35; AVX512F-NEXT: vpcmpgtw %xmm3, %xmm2, %xmm0 36; AVX512F-NEXT: vpmovsxwd %xmm0, %ymm0 37; AVX512F-NEXT: vptestmd %ymm0, %ymm0, %k0 {%k1} 38; AVX512F-NEXT: kmovw %k0, %eax 39; AVX512F-NEXT: # kill: def $al killed $al killed $eax 40; AVX512F-NEXT: vzeroupper 41; AVX512F-NEXT: retq 42; 43; AVX512BW-LABEL: v8i16: 44; AVX512BW: # %bb.0: 45; AVX512BW-NEXT: vpcmpgtw %xmm1, %xmm0, %k1 46; AVX512BW-NEXT: vpcmpgtw %xmm3, %xmm2, %k0 {%k1} 47; AVX512BW-NEXT: kmovd %k0, %eax 48; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 49; AVX512BW-NEXT: retq 50 %x0 = icmp sgt <8 x i16> %a, %b 51 %x1 = icmp sgt <8 x i16> %c, %d 52 %y = and <8 x i1> %x0, %x1 53 %res = bitcast <8 x i1> %y to i8 54 ret i8 %res 55} 56 57define i4 @v4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) { 58; SSE2-SSSE3-LABEL: v4i32: 59; SSE2-SSSE3: # %bb.0: 60; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 61; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 62; SSE2-SSSE3-NEXT: pand %xmm0, %xmm2 63; SSE2-SSSE3-NEXT: movmskps %xmm2, %eax 64; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 65; SSE2-SSSE3-NEXT: retq 66; 67; AVX12-LABEL: v4i32: 68; AVX12: # %bb.0: 69; AVX12-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 70; AVX12-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm1 71; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0 72; AVX12-NEXT: vmovmskps %xmm0, %eax 73; AVX12-NEXT: # kill: def $al killed $al killed $eax 74; AVX12-NEXT: retq 75; 76; AVX512F-LABEL: v4i32: 77; AVX512F: # %bb.0: 78; AVX512F-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 79; AVX512F-NEXT: vpcmpgtd %xmm3, %xmm2, %k0 {%k1} 80; AVX512F-NEXT: kmovw %k0, %eax 81; AVX512F-NEXT: # kill: def $al killed $al killed $eax 82; AVX512F-NEXT: retq 83; 84; AVX512BW-LABEL: v4i32: 85; AVX512BW: # %bb.0: 86; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 87; AVX512BW-NEXT: vpcmpgtd %xmm3, %xmm2, %k0 {%k1} 88; AVX512BW-NEXT: kmovd %k0, %eax 89; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 90; AVX512BW-NEXT: retq 91 %x0 = icmp sgt <4 x i32> %a, %b 92 %x1 = icmp sgt <4 x i32> %c, %d 93 %y = and <4 x i1> %x0, %x1 94 %res = bitcast <4 x i1> %y to i4 95 ret i4 %res 96} 97 98define i4 @v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) { 99; SSE2-SSSE3-LABEL: v4f32: 100; SSE2-SSSE3: # %bb.0: 101; SSE2-SSSE3-NEXT: cmpltps %xmm0, %xmm1 102; SSE2-SSSE3-NEXT: cmpltps %xmm2, %xmm3 103; SSE2-SSSE3-NEXT: andps %xmm1, %xmm3 104; SSE2-SSSE3-NEXT: movmskps %xmm3, %eax 105; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 106; SSE2-SSSE3-NEXT: retq 107; 108; AVX12-LABEL: v4f32: 109; AVX12: # %bb.0: 110; AVX12-NEXT: vcmpltps %xmm0, %xmm1, %xmm0 111; AVX12-NEXT: vcmpltps %xmm2, %xmm3, %xmm1 112; AVX12-NEXT: vandps %xmm1, %xmm0, %xmm0 113; AVX12-NEXT: vmovmskps %xmm0, %eax 114; AVX12-NEXT: # kill: def $al killed $al killed $eax 115; AVX12-NEXT: retq 116; 117; AVX512F-LABEL: v4f32: 118; AVX512F: # %bb.0: 119; AVX512F-NEXT: vcmpltps %xmm0, %xmm1, %k1 120; AVX512F-NEXT: vcmpltps %xmm2, %xmm3, %k0 {%k1} 121; AVX512F-NEXT: kmovw %k0, %eax 122; AVX512F-NEXT: # kill: def $al killed $al killed $eax 123; AVX512F-NEXT: retq 124; 125; AVX512BW-LABEL: v4f32: 126; AVX512BW: # %bb.0: 127; AVX512BW-NEXT: vcmpltps %xmm0, %xmm1, %k1 128; AVX512BW-NEXT: vcmpltps %xmm2, %xmm3, %k0 {%k1} 129; AVX512BW-NEXT: kmovd %k0, %eax 130; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 131; AVX512BW-NEXT: retq 132 %x0 = fcmp ogt <4 x float> %a, %b 133 %x1 = fcmp ogt <4 x float> %c, %d 134 %y = and <4 x i1> %x0, %x1 135 %res = bitcast <4 x i1> %y to i4 136 ret i4 %res 137} 138 139define i16 @v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, <16 x i8> %d) { 140; SSE2-SSSE3-LABEL: v16i8: 141; SSE2-SSSE3: # %bb.0: 142; SSE2-SSSE3-NEXT: pcmpgtb %xmm1, %xmm0 143; SSE2-SSSE3-NEXT: pcmpgtb %xmm3, %xmm2 144; SSE2-SSSE3-NEXT: pand %xmm0, %xmm2 145; SSE2-SSSE3-NEXT: pmovmskb %xmm2, %eax 146; SSE2-SSSE3-NEXT: # kill: def $ax killed $ax killed $eax 147; SSE2-SSSE3-NEXT: retq 148; 149; AVX12-LABEL: v16i8: 150; AVX12: # %bb.0: 151; AVX12-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 152; AVX12-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm1 153; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0 154; AVX12-NEXT: vpmovmskb %xmm0, %eax 155; AVX12-NEXT: # kill: def $ax killed $ax killed $eax 156; AVX12-NEXT: retq 157; 158; AVX512F-LABEL: v16i8: 159; AVX512F: # %bb.0: 160; AVX512F-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 161; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 162; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k1 163; AVX512F-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm0 164; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 165; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 {%k1} 166; AVX512F-NEXT: kmovw %k0, %eax 167; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax 168; AVX512F-NEXT: vzeroupper 169; AVX512F-NEXT: retq 170; 171; AVX512BW-LABEL: v16i8: 172; AVX512BW: # %bb.0: 173; AVX512BW-NEXT: vpcmpgtb %xmm1, %xmm0, %k1 174; AVX512BW-NEXT: vpcmpgtb %xmm3, %xmm2, %k0 {%k1} 175; AVX512BW-NEXT: kmovd %k0, %eax 176; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 177; AVX512BW-NEXT: retq 178 %x0 = icmp sgt <16 x i8> %a, %b 179 %x1 = icmp sgt <16 x i8> %c, %d 180 %y = and <16 x i1> %x0, %x1 181 %res = bitcast <16 x i1> %y to i16 182 ret i16 %res 183} 184 185define i2 @v2i8(<2 x i8> %a, <2 x i8> %b, <2 x i8> %c, <2 x i8> %d) { 186; SSE2-SSSE3-LABEL: v2i8: 187; SSE2-SSSE3: # %bb.0: 188; SSE2-SSSE3-NEXT: psllq $56, %xmm2 189; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm4 190; SSE2-SSSE3-NEXT: psrad $31, %xmm4 191; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 192; SSE2-SSSE3-NEXT: psrad $24, %xmm2 193; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3] 194; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 195; SSE2-SSSE3-NEXT: psllq $56, %xmm3 196; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4 197; SSE2-SSSE3-NEXT: psrad $31, %xmm4 198; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 199; SSE2-SSSE3-NEXT: psrad $24, %xmm3 200; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3] 201; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1] 202; SSE2-SSSE3-NEXT: psllq $56, %xmm0 203; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4 204; SSE2-SSSE3-NEXT: psrad $31, %xmm4 205; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 206; SSE2-SSSE3-NEXT: psrad $24, %xmm0 207; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3] 208; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 209; SSE2-SSSE3-NEXT: psllq $56, %xmm1 210; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4 211; SSE2-SSSE3-NEXT: psrad $31, %xmm4 212; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 213; SSE2-SSSE3-NEXT: psrad $24, %xmm1 214; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3] 215; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 216; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0] 217; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm1 218; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm0 219; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5 220; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm5 221; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 222; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 223; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 224; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0 225; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 226; SSE2-SSSE3-NEXT: por %xmm0, %xmm1 227; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm3 228; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm2 229; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm0 230; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 231; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 232; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 233; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 234; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2 235; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 236; SSE2-SSSE3-NEXT: por %xmm2, %xmm0 237; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0 238; SSE2-SSSE3-NEXT: movmskpd %xmm0, %eax 239; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 240; SSE2-SSSE3-NEXT: retq 241; 242; AVX1-LABEL: v2i8: 243; AVX1: # %bb.0: 244; AVX1-NEXT: vpsllq $56, %xmm3, %xmm3 245; AVX1-NEXT: vpsrad $31, %xmm3, %xmm4 246; AVX1-NEXT: vpsrad $24, %xmm3, %xmm3 247; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 248; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7] 249; AVX1-NEXT: vpsllq $56, %xmm2, %xmm2 250; AVX1-NEXT: vpsrad $31, %xmm2, %xmm4 251; AVX1-NEXT: vpsrad $24, %xmm2, %xmm2 252; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 253; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 254; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 255; AVX1-NEXT: vpsllq $56, %xmm1, %xmm1 256; AVX1-NEXT: vpsrad $31, %xmm1, %xmm3 257; AVX1-NEXT: vpsrad $24, %xmm1, %xmm1 258; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 259; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7] 260; AVX1-NEXT: vpsllq $56, %xmm0, %xmm0 261; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 262; AVX1-NEXT: vpsrad $24, %xmm0, %xmm0 263; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 264; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7] 265; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 266; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 267; AVX1-NEXT: vmovmskpd %xmm0, %eax 268; AVX1-NEXT: # kill: def $al killed $al killed $eax 269; AVX1-NEXT: retq 270; 271; AVX2-LABEL: v2i8: 272; AVX2: # %bb.0: 273; AVX2-NEXT: vpsllq $56, %xmm3, %xmm3 274; AVX2-NEXT: vpsrad $31, %xmm3, %xmm4 275; AVX2-NEXT: vpsrad $24, %xmm3, %xmm3 276; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 277; AVX2-NEXT: vpblendd {{.*#+}} xmm3 = xmm3[0],xmm4[1],xmm3[2],xmm4[3] 278; AVX2-NEXT: vpsllq $56, %xmm2, %xmm2 279; AVX2-NEXT: vpsrad $31, %xmm2, %xmm4 280; AVX2-NEXT: vpsrad $24, %xmm2, %xmm2 281; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 282; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3] 283; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 284; AVX2-NEXT: vpsllq $56, %xmm1, %xmm1 285; AVX2-NEXT: vpsrad $31, %xmm1, %xmm3 286; AVX2-NEXT: vpsrad $24, %xmm1, %xmm1 287; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 288; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3] 289; AVX2-NEXT: vpsllq $56, %xmm0, %xmm0 290; AVX2-NEXT: vpsrad $31, %xmm0, %xmm3 291; AVX2-NEXT: vpsrad $24, %xmm0, %xmm0 292; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 293; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3] 294; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 295; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 296; AVX2-NEXT: vmovmskpd %xmm0, %eax 297; AVX2-NEXT: # kill: def $al killed $al killed $eax 298; AVX2-NEXT: retq 299; 300; AVX512F-LABEL: v2i8: 301; AVX512F: # %bb.0: 302; AVX512F-NEXT: vpsllq $56, %xmm3, %xmm3 303; AVX512F-NEXT: vpsraq $56, %xmm3, %xmm3 304; AVX512F-NEXT: vpsllq $56, %xmm2, %xmm2 305; AVX512F-NEXT: vpsraq $56, %xmm2, %xmm2 306; AVX512F-NEXT: vpsllq $56, %xmm1, %xmm1 307; AVX512F-NEXT: vpsraq $56, %xmm1, %xmm1 308; AVX512F-NEXT: vpsllq $56, %xmm0, %xmm0 309; AVX512F-NEXT: vpsraq $56, %xmm0, %xmm0 310; AVX512F-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 311; AVX512F-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 312; AVX512F-NEXT: kmovw %k0, %eax 313; AVX512F-NEXT: # kill: def $al killed $al killed $eax 314; AVX512F-NEXT: retq 315; 316; AVX512BW-LABEL: v2i8: 317; AVX512BW: # %bb.0: 318; AVX512BW-NEXT: vpsllq $56, %xmm3, %xmm3 319; AVX512BW-NEXT: vpsraq $56, %xmm3, %xmm3 320; AVX512BW-NEXT: vpsllq $56, %xmm2, %xmm2 321; AVX512BW-NEXT: vpsraq $56, %xmm2, %xmm2 322; AVX512BW-NEXT: vpsllq $56, %xmm1, %xmm1 323; AVX512BW-NEXT: vpsraq $56, %xmm1, %xmm1 324; AVX512BW-NEXT: vpsllq $56, %xmm0, %xmm0 325; AVX512BW-NEXT: vpsraq $56, %xmm0, %xmm0 326; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 327; AVX512BW-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 328; AVX512BW-NEXT: kmovd %k0, %eax 329; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 330; AVX512BW-NEXT: retq 331 %x0 = icmp sgt <2 x i8> %a, %b 332 %x1 = icmp sgt <2 x i8> %c, %d 333 %y = and <2 x i1> %x0, %x1 334 %res = bitcast <2 x i1> %y to i2 335 ret i2 %res 336} 337 338define i2 @v2i16(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c, <2 x i16> %d) { 339; SSE2-SSSE3-LABEL: v2i16: 340; SSE2-SSSE3: # %bb.0: 341; SSE2-SSSE3-NEXT: psllq $48, %xmm2 342; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm4 343; SSE2-SSSE3-NEXT: psrad $31, %xmm4 344; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 345; SSE2-SSSE3-NEXT: psrad $16, %xmm2 346; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3] 347; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 348; SSE2-SSSE3-NEXT: psllq $48, %xmm3 349; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4 350; SSE2-SSSE3-NEXT: psrad $31, %xmm4 351; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 352; SSE2-SSSE3-NEXT: psrad $16, %xmm3 353; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3] 354; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1] 355; SSE2-SSSE3-NEXT: psllq $48, %xmm0 356; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4 357; SSE2-SSSE3-NEXT: psrad $31, %xmm4 358; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 359; SSE2-SSSE3-NEXT: psrad $16, %xmm0 360; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3] 361; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1] 362; SSE2-SSSE3-NEXT: psllq $48, %xmm1 363; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4 364; SSE2-SSSE3-NEXT: psrad $31, %xmm4 365; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3] 366; SSE2-SSSE3-NEXT: psrad $16, %xmm1 367; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3] 368; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1] 369; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0] 370; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm1 371; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm0 372; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5 373; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm5 374; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 375; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 376; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 377; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0 378; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 379; SSE2-SSSE3-NEXT: por %xmm0, %xmm1 380; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm3 381; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm2 382; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm0 383; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 384; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 385; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 386; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 387; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2 388; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 389; SSE2-SSSE3-NEXT: por %xmm2, %xmm0 390; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0 391; SSE2-SSSE3-NEXT: movmskpd %xmm0, %eax 392; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 393; SSE2-SSSE3-NEXT: retq 394; 395; AVX1-LABEL: v2i16: 396; AVX1: # %bb.0: 397; AVX1-NEXT: vpsllq $48, %xmm3, %xmm3 398; AVX1-NEXT: vpsrad $31, %xmm3, %xmm4 399; AVX1-NEXT: vpsrad $16, %xmm3, %xmm3 400; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 401; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7] 402; AVX1-NEXT: vpsllq $48, %xmm2, %xmm2 403; AVX1-NEXT: vpsrad $31, %xmm2, %xmm4 404; AVX1-NEXT: vpsrad $16, %xmm2, %xmm2 405; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 406; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 407; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 408; AVX1-NEXT: vpsllq $48, %xmm1, %xmm1 409; AVX1-NEXT: vpsrad $31, %xmm1, %xmm3 410; AVX1-NEXT: vpsrad $16, %xmm1, %xmm1 411; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 412; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7] 413; AVX1-NEXT: vpsllq $48, %xmm0, %xmm0 414; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 415; AVX1-NEXT: vpsrad $16, %xmm0, %xmm0 416; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 417; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7] 418; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 419; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 420; AVX1-NEXT: vmovmskpd %xmm0, %eax 421; AVX1-NEXT: # kill: def $al killed $al killed $eax 422; AVX1-NEXT: retq 423; 424; AVX2-LABEL: v2i16: 425; AVX2: # %bb.0: 426; AVX2-NEXT: vpsllq $48, %xmm3, %xmm3 427; AVX2-NEXT: vpsrad $31, %xmm3, %xmm4 428; AVX2-NEXT: vpsrad $16, %xmm3, %xmm3 429; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 430; AVX2-NEXT: vpblendd {{.*#+}} xmm3 = xmm3[0],xmm4[1],xmm3[2],xmm4[3] 431; AVX2-NEXT: vpsllq $48, %xmm2, %xmm2 432; AVX2-NEXT: vpsrad $31, %xmm2, %xmm4 433; AVX2-NEXT: vpsrad $16, %xmm2, %xmm2 434; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 435; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3] 436; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 437; AVX2-NEXT: vpsllq $48, %xmm1, %xmm1 438; AVX2-NEXT: vpsrad $31, %xmm1, %xmm3 439; AVX2-NEXT: vpsrad $16, %xmm1, %xmm1 440; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 441; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3] 442; AVX2-NEXT: vpsllq $48, %xmm0, %xmm0 443; AVX2-NEXT: vpsrad $31, %xmm0, %xmm3 444; AVX2-NEXT: vpsrad $16, %xmm0, %xmm0 445; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 446; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3] 447; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 448; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 449; AVX2-NEXT: vmovmskpd %xmm0, %eax 450; AVX2-NEXT: # kill: def $al killed $al killed $eax 451; AVX2-NEXT: retq 452; 453; AVX512F-LABEL: v2i16: 454; AVX512F: # %bb.0: 455; AVX512F-NEXT: vpsllq $48, %xmm3, %xmm3 456; AVX512F-NEXT: vpsraq $48, %xmm3, %xmm3 457; AVX512F-NEXT: vpsllq $48, %xmm2, %xmm2 458; AVX512F-NEXT: vpsraq $48, %xmm2, %xmm2 459; AVX512F-NEXT: vpsllq $48, %xmm1, %xmm1 460; AVX512F-NEXT: vpsraq $48, %xmm1, %xmm1 461; AVX512F-NEXT: vpsllq $48, %xmm0, %xmm0 462; AVX512F-NEXT: vpsraq $48, %xmm0, %xmm0 463; AVX512F-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 464; AVX512F-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 465; AVX512F-NEXT: kmovw %k0, %eax 466; AVX512F-NEXT: # kill: def $al killed $al killed $eax 467; AVX512F-NEXT: retq 468; 469; AVX512BW-LABEL: v2i16: 470; AVX512BW: # %bb.0: 471; AVX512BW-NEXT: vpsllq $48, %xmm3, %xmm3 472; AVX512BW-NEXT: vpsraq $48, %xmm3, %xmm3 473; AVX512BW-NEXT: vpsllq $48, %xmm2, %xmm2 474; AVX512BW-NEXT: vpsraq $48, %xmm2, %xmm2 475; AVX512BW-NEXT: vpsllq $48, %xmm1, %xmm1 476; AVX512BW-NEXT: vpsraq $48, %xmm1, %xmm1 477; AVX512BW-NEXT: vpsllq $48, %xmm0, %xmm0 478; AVX512BW-NEXT: vpsraq $48, %xmm0, %xmm0 479; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 480; AVX512BW-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 481; AVX512BW-NEXT: kmovd %k0, %eax 482; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 483; AVX512BW-NEXT: retq 484 %x0 = icmp sgt <2 x i16> %a, %b 485 %x1 = icmp sgt <2 x i16> %c, %d 486 %y = and <2 x i1> %x0, %x1 487 %res = bitcast <2 x i1> %y to i2 488 ret i2 %res 489} 490 491define i2 @v2i32(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c, <2 x i32> %d) { 492; SSE2-SSSE3-LABEL: v2i32: 493; SSE2-SSSE3: # %bb.0: 494; SSE2-SSSE3-NEXT: psllq $32, %xmm2 495; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3] 496; SSE2-SSSE3-NEXT: psrad $31, %xmm2 497; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3] 498; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1] 499; SSE2-SSSE3-NEXT: psllq $32, %xmm3 500; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3] 501; SSE2-SSSE3-NEXT: psrad $31, %xmm3 502; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3] 503; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 504; SSE2-SSSE3-NEXT: psllq $32, %xmm0 505; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3] 506; SSE2-SSSE3-NEXT: psrad $31, %xmm0 507; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3] 508; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1] 509; SSE2-SSSE3-NEXT: psllq $32, %xmm1 510; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3] 511; SSE2-SSSE3-NEXT: psrad $31, %xmm1 512; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3] 513; SSE2-SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 514; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,0,2147483648,0] 515; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0 516; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm3 517; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm5 518; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm5 519; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 520; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm3 521; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 522; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0 523; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 524; SSE2-SSSE3-NEXT: por %xmm0, %xmm3 525; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2 526; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4 527; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm0 528; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 529; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2] 530; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm4 531; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 532; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2 533; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 534; SSE2-SSSE3-NEXT: por %xmm2, %xmm0 535; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0 536; SSE2-SSSE3-NEXT: movmskpd %xmm0, %eax 537; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 538; SSE2-SSSE3-NEXT: retq 539; 540; AVX1-LABEL: v2i32: 541; AVX1: # %bb.0: 542; AVX1-NEXT: vpsllq $32, %xmm3, %xmm3 543; AVX1-NEXT: vpsrad $31, %xmm3, %xmm4 544; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 545; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7] 546; AVX1-NEXT: vpsllq $32, %xmm2, %xmm2 547; AVX1-NEXT: vpsrad $31, %xmm2, %xmm4 548; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 549; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7] 550; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 551; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1 552; AVX1-NEXT: vpsrad $31, %xmm1, %xmm3 553; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 554; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7] 555; AVX1-NEXT: vpsllq $32, %xmm0, %xmm0 556; AVX1-NEXT: vpsrad $31, %xmm0, %xmm3 557; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 558; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7] 559; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 560; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 561; AVX1-NEXT: vmovmskpd %xmm0, %eax 562; AVX1-NEXT: # kill: def $al killed $al killed $eax 563; AVX1-NEXT: retq 564; 565; AVX2-LABEL: v2i32: 566; AVX2: # %bb.0: 567; AVX2-NEXT: vpsllq $32, %xmm3, %xmm3 568; AVX2-NEXT: vpsrad $31, %xmm3, %xmm4 569; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 570; AVX2-NEXT: vpblendd {{.*#+}} xmm3 = xmm3[0],xmm4[1],xmm3[2],xmm4[3] 571; AVX2-NEXT: vpsllq $32, %xmm2, %xmm2 572; AVX2-NEXT: vpsrad $31, %xmm2, %xmm4 573; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 574; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3] 575; AVX2-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 576; AVX2-NEXT: vpsllq $32, %xmm1, %xmm1 577; AVX2-NEXT: vpsrad $31, %xmm1, %xmm3 578; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 579; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3] 580; AVX2-NEXT: vpsllq $32, %xmm0, %xmm0 581; AVX2-NEXT: vpsrad $31, %xmm0, %xmm3 582; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 583; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3] 584; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 585; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 586; AVX2-NEXT: vmovmskpd %xmm0, %eax 587; AVX2-NEXT: # kill: def $al killed $al killed $eax 588; AVX2-NEXT: retq 589; 590; AVX512F-LABEL: v2i32: 591; AVX512F: # %bb.0: 592; AVX512F-NEXT: vpsllq $32, %xmm3, %xmm3 593; AVX512F-NEXT: vpsraq $32, %xmm3, %xmm3 594; AVX512F-NEXT: vpsllq $32, %xmm2, %xmm2 595; AVX512F-NEXT: vpsraq $32, %xmm2, %xmm2 596; AVX512F-NEXT: vpsllq $32, %xmm1, %xmm1 597; AVX512F-NEXT: vpsraq $32, %xmm1, %xmm1 598; AVX512F-NEXT: vpsllq $32, %xmm0, %xmm0 599; AVX512F-NEXT: vpsraq $32, %xmm0, %xmm0 600; AVX512F-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 601; AVX512F-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 602; AVX512F-NEXT: kmovw %k0, %eax 603; AVX512F-NEXT: # kill: def $al killed $al killed $eax 604; AVX512F-NEXT: retq 605; 606; AVX512BW-LABEL: v2i32: 607; AVX512BW: # %bb.0: 608; AVX512BW-NEXT: vpsllq $32, %xmm3, %xmm3 609; AVX512BW-NEXT: vpsraq $32, %xmm3, %xmm3 610; AVX512BW-NEXT: vpsllq $32, %xmm2, %xmm2 611; AVX512BW-NEXT: vpsraq $32, %xmm2, %xmm2 612; AVX512BW-NEXT: vpsllq $32, %xmm1, %xmm1 613; AVX512BW-NEXT: vpsraq $32, %xmm1, %xmm1 614; AVX512BW-NEXT: vpsllq $32, %xmm0, %xmm0 615; AVX512BW-NEXT: vpsraq $32, %xmm0, %xmm0 616; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 617; AVX512BW-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 618; AVX512BW-NEXT: kmovd %k0, %eax 619; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 620; AVX512BW-NEXT: retq 621 %x0 = icmp sgt <2 x i32> %a, %b 622 %x1 = icmp sgt <2 x i32> %c, %d 623 %y = and <2 x i1> %x0, %x1 624 %res = bitcast <2 x i1> %y to i2 625 ret i2 %res 626} 627 628define i2 @v2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c, <2 x i64> %d) { 629; SSE2-SSSE3-LABEL: v2i64: 630; SSE2-SSSE3: # %bb.0: 631; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0] 632; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm1 633; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm0 634; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5 635; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm5 636; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 637; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 638; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 639; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0 640; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 641; SSE2-SSSE3-NEXT: por %xmm0, %xmm1 642; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm3 643; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm2 644; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm0 645; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 646; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 647; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 648; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 649; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2 650; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 651; SSE2-SSSE3-NEXT: por %xmm2, %xmm0 652; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0 653; SSE2-SSSE3-NEXT: movmskpd %xmm0, %eax 654; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 655; SSE2-SSSE3-NEXT: retq 656; 657; AVX12-LABEL: v2i64: 658; AVX12: # %bb.0: 659; AVX12-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 660; AVX12-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm1 661; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0 662; AVX12-NEXT: vmovmskpd %xmm0, %eax 663; AVX12-NEXT: # kill: def $al killed $al killed $eax 664; AVX12-NEXT: retq 665; 666; AVX512F-LABEL: v2i64: 667; AVX512F: # %bb.0: 668; AVX512F-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 669; AVX512F-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 670; AVX512F-NEXT: kmovw %k0, %eax 671; AVX512F-NEXT: # kill: def $al killed $al killed $eax 672; AVX512F-NEXT: retq 673; 674; AVX512BW-LABEL: v2i64: 675; AVX512BW: # %bb.0: 676; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 677; AVX512BW-NEXT: vpcmpgtq %xmm3, %xmm2, %k0 {%k1} 678; AVX512BW-NEXT: kmovd %k0, %eax 679; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 680; AVX512BW-NEXT: retq 681 %x0 = icmp sgt <2 x i64> %a, %b 682 %x1 = icmp sgt <2 x i64> %c, %d 683 %y = and <2 x i1> %x0, %x1 684 %res = bitcast <2 x i1> %y to i2 685 ret i2 %res 686} 687 688define i2 @v2f64(<2 x double> %a, <2 x double> %b, <2 x double> %c, <2 x double> %d) { 689; SSE2-SSSE3-LABEL: v2f64: 690; SSE2-SSSE3: # %bb.0: 691; SSE2-SSSE3-NEXT: cmpltpd %xmm0, %xmm1 692; SSE2-SSSE3-NEXT: cmpltpd %xmm2, %xmm3 693; SSE2-SSSE3-NEXT: andpd %xmm1, %xmm3 694; SSE2-SSSE3-NEXT: movmskpd %xmm3, %eax 695; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 696; SSE2-SSSE3-NEXT: retq 697; 698; AVX12-LABEL: v2f64: 699; AVX12: # %bb.0: 700; AVX12-NEXT: vcmpltpd %xmm0, %xmm1, %xmm0 701; AVX12-NEXT: vcmpltpd %xmm2, %xmm3, %xmm1 702; AVX12-NEXT: vandpd %xmm1, %xmm0, %xmm0 703; AVX12-NEXT: vmovmskpd %xmm0, %eax 704; AVX12-NEXT: # kill: def $al killed $al killed $eax 705; AVX12-NEXT: retq 706; 707; AVX512F-LABEL: v2f64: 708; AVX512F: # %bb.0: 709; AVX512F-NEXT: vcmpltpd %xmm0, %xmm1, %k1 710; AVX512F-NEXT: vcmpltpd %xmm2, %xmm3, %k0 {%k1} 711; AVX512F-NEXT: kmovw %k0, %eax 712; AVX512F-NEXT: # kill: def $al killed $al killed $eax 713; AVX512F-NEXT: retq 714; 715; AVX512BW-LABEL: v2f64: 716; AVX512BW: # %bb.0: 717; AVX512BW-NEXT: vcmpltpd %xmm0, %xmm1, %k1 718; AVX512BW-NEXT: vcmpltpd %xmm2, %xmm3, %k0 {%k1} 719; AVX512BW-NEXT: kmovd %k0, %eax 720; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 721; AVX512BW-NEXT: retq 722 %x0 = fcmp ogt <2 x double> %a, %b 723 %x1 = fcmp ogt <2 x double> %c, %d 724 %y = and <2 x i1> %x0, %x1 725 %res = bitcast <2 x i1> %y to i2 726 ret i2 %res 727} 728 729define i4 @v4i8(<4 x i8> %a, <4 x i8> %b, <4 x i8> %c, <4 x i8> %d) { 730; SSE2-SSSE3-LABEL: v4i8: 731; SSE2-SSSE3: # %bb.0: 732; SSE2-SSSE3-NEXT: pslld $24, %xmm3 733; SSE2-SSSE3-NEXT: psrad $24, %xmm3 734; SSE2-SSSE3-NEXT: pslld $24, %xmm2 735; SSE2-SSSE3-NEXT: psrad $24, %xmm2 736; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 737; SSE2-SSSE3-NEXT: pslld $24, %xmm1 738; SSE2-SSSE3-NEXT: psrad $24, %xmm1 739; SSE2-SSSE3-NEXT: pslld $24, %xmm0 740; SSE2-SSSE3-NEXT: psrad $24, %xmm0 741; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 742; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0 743; SSE2-SSSE3-NEXT: movmskps %xmm0, %eax 744; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 745; SSE2-SSSE3-NEXT: retq 746; 747; AVX12-LABEL: v4i8: 748; AVX12: # %bb.0: 749; AVX12-NEXT: vpslld $24, %xmm3, %xmm3 750; AVX12-NEXT: vpsrad $24, %xmm3, %xmm3 751; AVX12-NEXT: vpslld $24, %xmm2, %xmm2 752; AVX12-NEXT: vpsrad $24, %xmm2, %xmm2 753; AVX12-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm2 754; AVX12-NEXT: vpslld $24, %xmm1, %xmm1 755; AVX12-NEXT: vpsrad $24, %xmm1, %xmm1 756; AVX12-NEXT: vpslld $24, %xmm0, %xmm0 757; AVX12-NEXT: vpsrad $24, %xmm0, %xmm0 758; AVX12-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 759; AVX12-NEXT: vpand %xmm2, %xmm0, %xmm0 760; AVX12-NEXT: vmovmskps %xmm0, %eax 761; AVX12-NEXT: # kill: def $al killed $al killed $eax 762; AVX12-NEXT: retq 763; 764; AVX512F-LABEL: v4i8: 765; AVX512F: # %bb.0: 766; AVX512F-NEXT: vpslld $24, %xmm3, %xmm3 767; AVX512F-NEXT: vpsrad $24, %xmm3, %xmm3 768; AVX512F-NEXT: vpslld $24, %xmm2, %xmm2 769; AVX512F-NEXT: vpsrad $24, %xmm2, %xmm2 770; AVX512F-NEXT: vpslld $24, %xmm1, %xmm1 771; AVX512F-NEXT: vpsrad $24, %xmm1, %xmm1 772; AVX512F-NEXT: vpslld $24, %xmm0, %xmm0 773; AVX512F-NEXT: vpsrad $24, %xmm0, %xmm0 774; AVX512F-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 775; AVX512F-NEXT: vpcmpgtd %xmm3, %xmm2, %k0 {%k1} 776; AVX512F-NEXT: kmovw %k0, %eax 777; AVX512F-NEXT: # kill: def $al killed $al killed $eax 778; AVX512F-NEXT: retq 779; 780; AVX512BW-LABEL: v4i8: 781; AVX512BW: # %bb.0: 782; AVX512BW-NEXT: vpslld $24, %xmm3, %xmm3 783; AVX512BW-NEXT: vpsrad $24, %xmm3, %xmm3 784; AVX512BW-NEXT: vpslld $24, %xmm2, %xmm2 785; AVX512BW-NEXT: vpsrad $24, %xmm2, %xmm2 786; AVX512BW-NEXT: vpslld $24, %xmm1, %xmm1 787; AVX512BW-NEXT: vpsrad $24, %xmm1, %xmm1 788; AVX512BW-NEXT: vpslld $24, %xmm0, %xmm0 789; AVX512BW-NEXT: vpsrad $24, %xmm0, %xmm0 790; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 791; AVX512BW-NEXT: vpcmpgtd %xmm3, %xmm2, %k0 {%k1} 792; AVX512BW-NEXT: kmovd %k0, %eax 793; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 794; AVX512BW-NEXT: retq 795 %x0 = icmp sgt <4 x i8> %a, %b 796 %x1 = icmp sgt <4 x i8> %c, %d 797 %y = and <4 x i1> %x0, %x1 798 %res = bitcast <4 x i1> %y to i4 799 ret i4 %res 800} 801 802define i4 @v4i16(<4 x i16> %a, <4 x i16> %b, <4 x i16> %c, <4 x i16> %d) { 803; SSE2-SSSE3-LABEL: v4i16: 804; SSE2-SSSE3: # %bb.0: 805; SSE2-SSSE3-NEXT: pslld $16, %xmm3 806; SSE2-SSSE3-NEXT: psrad $16, %xmm3 807; SSE2-SSSE3-NEXT: pslld $16, %xmm2 808; SSE2-SSSE3-NEXT: psrad $16, %xmm2 809; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 810; SSE2-SSSE3-NEXT: pslld $16, %xmm1 811; SSE2-SSSE3-NEXT: psrad $16, %xmm1 812; SSE2-SSSE3-NEXT: pslld $16, %xmm0 813; SSE2-SSSE3-NEXT: psrad $16, %xmm0 814; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 815; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0 816; SSE2-SSSE3-NEXT: movmskps %xmm0, %eax 817; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 818; SSE2-SSSE3-NEXT: retq 819; 820; AVX12-LABEL: v4i16: 821; AVX12: # %bb.0: 822; AVX12-NEXT: vpslld $16, %xmm3, %xmm3 823; AVX12-NEXT: vpsrad $16, %xmm3, %xmm3 824; AVX12-NEXT: vpslld $16, %xmm2, %xmm2 825; AVX12-NEXT: vpsrad $16, %xmm2, %xmm2 826; AVX12-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm2 827; AVX12-NEXT: vpslld $16, %xmm1, %xmm1 828; AVX12-NEXT: vpsrad $16, %xmm1, %xmm1 829; AVX12-NEXT: vpslld $16, %xmm0, %xmm0 830; AVX12-NEXT: vpsrad $16, %xmm0, %xmm0 831; AVX12-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 832; AVX12-NEXT: vpand %xmm2, %xmm0, %xmm0 833; AVX12-NEXT: vmovmskps %xmm0, %eax 834; AVX12-NEXT: # kill: def $al killed $al killed $eax 835; AVX12-NEXT: retq 836; 837; AVX512F-LABEL: v4i16: 838; AVX512F: # %bb.0: 839; AVX512F-NEXT: vpslld $16, %xmm3, %xmm3 840; AVX512F-NEXT: vpsrad $16, %xmm3, %xmm3 841; AVX512F-NEXT: vpslld $16, %xmm2, %xmm2 842; AVX512F-NEXT: vpsrad $16, %xmm2, %xmm2 843; AVX512F-NEXT: vpslld $16, %xmm1, %xmm1 844; AVX512F-NEXT: vpsrad $16, %xmm1, %xmm1 845; AVX512F-NEXT: vpslld $16, %xmm0, %xmm0 846; AVX512F-NEXT: vpsrad $16, %xmm0, %xmm0 847; AVX512F-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 848; AVX512F-NEXT: vpcmpgtd %xmm3, %xmm2, %k0 {%k1} 849; AVX512F-NEXT: kmovw %k0, %eax 850; AVX512F-NEXT: # kill: def $al killed $al killed $eax 851; AVX512F-NEXT: retq 852; 853; AVX512BW-LABEL: v4i16: 854; AVX512BW: # %bb.0: 855; AVX512BW-NEXT: vpslld $16, %xmm3, %xmm3 856; AVX512BW-NEXT: vpsrad $16, %xmm3, %xmm3 857; AVX512BW-NEXT: vpslld $16, %xmm2, %xmm2 858; AVX512BW-NEXT: vpsrad $16, %xmm2, %xmm2 859; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 860; AVX512BW-NEXT: vpsrad $16, %xmm1, %xmm1 861; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 862; AVX512BW-NEXT: vpsrad $16, %xmm0, %xmm0 863; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 864; AVX512BW-NEXT: vpcmpgtd %xmm3, %xmm2, %k0 {%k1} 865; AVX512BW-NEXT: kmovd %k0, %eax 866; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 867; AVX512BW-NEXT: retq 868 %x0 = icmp sgt <4 x i16> %a, %b 869 %x1 = icmp sgt <4 x i16> %c, %d 870 %y = and <4 x i1> %x0, %x1 871 %res = bitcast <4 x i1> %y to i4 872 ret i4 %res 873} 874 875define i8 @v8i8(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c, <8 x i8> %d) { 876; SSE2-SSSE3-LABEL: v8i8: 877; SSE2-SSSE3: # %bb.0: 878; SSE2-SSSE3-NEXT: psllw $8, %xmm3 879; SSE2-SSSE3-NEXT: psraw $8, %xmm3 880; SSE2-SSSE3-NEXT: psllw $8, %xmm2 881; SSE2-SSSE3-NEXT: psraw $8, %xmm2 882; SSE2-SSSE3-NEXT: pcmpgtw %xmm3, %xmm2 883; SSE2-SSSE3-NEXT: psllw $8, %xmm1 884; SSE2-SSSE3-NEXT: psraw $8, %xmm1 885; SSE2-SSSE3-NEXT: psllw $8, %xmm0 886; SSE2-SSSE3-NEXT: psraw $8, %xmm0 887; SSE2-SSSE3-NEXT: pcmpgtw %xmm1, %xmm0 888; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0 889; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 890; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax 891; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 892; SSE2-SSSE3-NEXT: retq 893; 894; AVX12-LABEL: v8i8: 895; AVX12: # %bb.0: 896; AVX12-NEXT: vpsllw $8, %xmm3, %xmm3 897; AVX12-NEXT: vpsraw $8, %xmm3, %xmm3 898; AVX12-NEXT: vpsllw $8, %xmm2, %xmm2 899; AVX12-NEXT: vpsraw $8, %xmm2, %xmm2 900; AVX12-NEXT: vpcmpgtw %xmm3, %xmm2, %xmm2 901; AVX12-NEXT: vpsllw $8, %xmm1, %xmm1 902; AVX12-NEXT: vpsraw $8, %xmm1, %xmm1 903; AVX12-NEXT: vpsllw $8, %xmm0, %xmm0 904; AVX12-NEXT: vpsraw $8, %xmm0, %xmm0 905; AVX12-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 906; AVX12-NEXT: vpand %xmm2, %xmm0, %xmm0 907; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 908; AVX12-NEXT: vpmovmskb %xmm0, %eax 909; AVX12-NEXT: # kill: def $al killed $al killed $eax 910; AVX12-NEXT: retq 911; 912; AVX512F-LABEL: v8i8: 913; AVX512F: # %bb.0: 914; AVX512F-NEXT: vpsllw $8, %xmm3, %xmm3 915; AVX512F-NEXT: vpsraw $8, %xmm3, %xmm3 916; AVX512F-NEXT: vpsllw $8, %xmm2, %xmm2 917; AVX512F-NEXT: vpsraw $8, %xmm2, %xmm2 918; AVX512F-NEXT: vpcmpgtw %xmm3, %xmm2, %xmm2 919; AVX512F-NEXT: vpsllw $8, %xmm1, %xmm1 920; AVX512F-NEXT: vpsraw $8, %xmm1, %xmm1 921; AVX512F-NEXT: vpsllw $8, %xmm0, %xmm0 922; AVX512F-NEXT: vpsraw $8, %xmm0, %xmm0 923; AVX512F-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 924; AVX512F-NEXT: vpmovsxwd %xmm0, %ymm0 925; AVX512F-NEXT: vptestmd %ymm0, %ymm0, %k1 926; AVX512F-NEXT: vpmovsxwd %xmm2, %ymm0 927; AVX512F-NEXT: vptestmd %ymm0, %ymm0, %k0 {%k1} 928; AVX512F-NEXT: kmovw %k0, %eax 929; AVX512F-NEXT: # kill: def $al killed $al killed $eax 930; AVX512F-NEXT: vzeroupper 931; AVX512F-NEXT: retq 932; 933; AVX512BW-LABEL: v8i8: 934; AVX512BW: # %bb.0: 935; AVX512BW-NEXT: vpsllw $8, %xmm3, %xmm3 936; AVX512BW-NEXT: vpsraw $8, %xmm3, %xmm3 937; AVX512BW-NEXT: vpsllw $8, %xmm2, %xmm2 938; AVX512BW-NEXT: vpsraw $8, %xmm2, %xmm2 939; AVX512BW-NEXT: vpsllw $8, %xmm1, %xmm1 940; AVX512BW-NEXT: vpsraw $8, %xmm1, %xmm1 941; AVX512BW-NEXT: vpsllw $8, %xmm0, %xmm0 942; AVX512BW-NEXT: vpsraw $8, %xmm0, %xmm0 943; AVX512BW-NEXT: vpcmpgtw %xmm1, %xmm0, %k1 944; AVX512BW-NEXT: vpcmpgtw %xmm3, %xmm2, %k0 {%k1} 945; AVX512BW-NEXT: kmovd %k0, %eax 946; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 947; AVX512BW-NEXT: retq 948 %x0 = icmp sgt <8 x i8> %a, %b 949 %x1 = icmp sgt <8 x i8> %c, %d 950 %y = and <8 x i1> %x0, %x1 951 %res = bitcast <8 x i1> %y to i8 952 ret i8 %res 953} 954