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 i16 @v16i16(<16 x i16> %a, <16 x i16> %b) { 10; SSE2-SSSE3-LABEL: v16i16: 11; SSE2-SSSE3: # %bb.0: 12; SSE2-SSSE3-NEXT: pcmpgtw %xmm3, %xmm1 13; SSE2-SSSE3-NEXT: pcmpgtw %xmm2, %xmm0 14; SSE2-SSSE3-NEXT: packsswb %xmm1, %xmm0 15; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax 16; SSE2-SSSE3-NEXT: # kill: def $ax killed $ax killed $eax 17; SSE2-SSSE3-NEXT: retq 18; 19; AVX1-LABEL: v16i16: 20; AVX1: # %bb.0: 21; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 22; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 23; AVX1-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm2 24; AVX1-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 25; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0 26; AVX1-NEXT: vpmovmskb %xmm0, %eax 27; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 28; AVX1-NEXT: vzeroupper 29; AVX1-NEXT: retq 30; 31; AVX2-LABEL: v16i16: 32; AVX2: # %bb.0: 33; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0 34; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 35; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 36; AVX2-NEXT: vpmovmskb %xmm0, %eax 37; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 38; AVX2-NEXT: vzeroupper 39; AVX2-NEXT: retq 40; 41; AVX512F-LABEL: v16i16: 42; AVX512F: # %bb.0: 43; AVX512F-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0 44; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 45; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 46; AVX512F-NEXT: kmovw %k0, %eax 47; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax 48; AVX512F-NEXT: vzeroupper 49; AVX512F-NEXT: retq 50; 51; AVX512BW-LABEL: v16i16: 52; AVX512BW: # %bb.0: 53; AVX512BW-NEXT: vpcmpgtw %ymm1, %ymm0, %k0 54; AVX512BW-NEXT: kmovd %k0, %eax 55; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 56; AVX512BW-NEXT: vzeroupper 57; AVX512BW-NEXT: retq 58 %x = icmp sgt <16 x i16> %a, %b 59 %res = bitcast <16 x i1> %x to i16 60 ret i16 %res 61} 62 63define i8 @v8i32(<8 x i32> %a, <8 x i32> %b) { 64; SSE2-SSSE3-LABEL: v8i32: 65; SSE2-SSSE3: # %bb.0: 66; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1 67; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 68; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0 69; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 70; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax 71; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 72; SSE2-SSSE3-NEXT: retq 73; 74; AVX1-LABEL: v8i32: 75; AVX1: # %bb.0: 76; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 77; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 78; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2 79; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 80; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 81; AVX1-NEXT: vmovmskps %ymm0, %eax 82; AVX1-NEXT: # kill: def $al killed $al killed $eax 83; AVX1-NEXT: vzeroupper 84; AVX1-NEXT: retq 85; 86; AVX2-LABEL: v8i32: 87; AVX2: # %bb.0: 88; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0 89; AVX2-NEXT: vmovmskps %ymm0, %eax 90; AVX2-NEXT: # kill: def $al killed $al killed $eax 91; AVX2-NEXT: vzeroupper 92; AVX2-NEXT: retq 93; 94; AVX512F-LABEL: v8i32: 95; AVX512F: # %bb.0: 96; AVX512F-NEXT: vpcmpgtd %ymm1, %ymm0, %k0 97; AVX512F-NEXT: kmovw %k0, %eax 98; AVX512F-NEXT: # kill: def $al killed $al killed $eax 99; AVX512F-NEXT: vzeroupper 100; AVX512F-NEXT: retq 101; 102; AVX512BW-LABEL: v8i32: 103; AVX512BW: # %bb.0: 104; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k0 105; AVX512BW-NEXT: kmovd %k0, %eax 106; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 107; AVX512BW-NEXT: vzeroupper 108; AVX512BW-NEXT: retq 109 %x = icmp sgt <8 x i32> %a, %b 110 %res = bitcast <8 x i1> %x to i8 111 ret i8 %res 112} 113 114define i8 @v8f32(<8 x float> %a, <8 x float> %b) { 115; SSE2-SSSE3-LABEL: v8f32: 116; SSE2-SSSE3: # %bb.0: 117; SSE2-SSSE3-NEXT: cmpltps %xmm1, %xmm3 118; SSE2-SSSE3-NEXT: cmpltps %xmm0, %xmm2 119; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2 120; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm2 121; SSE2-SSSE3-NEXT: pmovmskb %xmm2, %eax 122; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 123; SSE2-SSSE3-NEXT: retq 124; 125; AVX12-LABEL: v8f32: 126; AVX12: # %bb.0: 127; AVX12-NEXT: vcmpltps %ymm0, %ymm1, %ymm0 128; AVX12-NEXT: vmovmskps %ymm0, %eax 129; AVX12-NEXT: # kill: def $al killed $al killed $eax 130; AVX12-NEXT: vzeroupper 131; AVX12-NEXT: retq 132; 133; AVX512F-LABEL: v8f32: 134; AVX512F: # %bb.0: 135; AVX512F-NEXT: vcmpltps %ymm0, %ymm1, %k0 136; AVX512F-NEXT: kmovw %k0, %eax 137; AVX512F-NEXT: # kill: def $al killed $al killed $eax 138; AVX512F-NEXT: vzeroupper 139; AVX512F-NEXT: retq 140; 141; AVX512BW-LABEL: v8f32: 142; AVX512BW: # %bb.0: 143; AVX512BW-NEXT: vcmpltps %ymm0, %ymm1, %k0 144; AVX512BW-NEXT: kmovd %k0, %eax 145; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 146; AVX512BW-NEXT: vzeroupper 147; AVX512BW-NEXT: retq 148 %x = fcmp ogt <8 x float> %a, %b 149 %res = bitcast <8 x i1> %x to i8 150 ret i8 %res 151} 152 153define i32 @v32i8(<32 x i8> %a, <32 x i8> %b) { 154; SSE2-SSSE3-LABEL: v32i8: 155; SSE2-SSSE3: # %bb.0: 156; SSE2-SSSE3-NEXT: pcmpgtb %xmm2, %xmm0 157; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %ecx 158; SSE2-SSSE3-NEXT: pcmpgtb %xmm3, %xmm1 159; SSE2-SSSE3-NEXT: pmovmskb %xmm1, %eax 160; SSE2-SSSE3-NEXT: shll $16, %eax 161; SSE2-SSSE3-NEXT: orl %ecx, %eax 162; SSE2-SSSE3-NEXT: retq 163; 164; AVX1-LABEL: v32i8: 165; AVX1: # %bb.0: 166; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm2 167; AVX1-NEXT: vpmovmskb %xmm2, %ecx 168; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 169; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 170; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 171; AVX1-NEXT: vpmovmskb %xmm0, %eax 172; AVX1-NEXT: shll $16, %eax 173; AVX1-NEXT: orl %ecx, %eax 174; AVX1-NEXT: vzeroupper 175; AVX1-NEXT: retq 176; 177; AVX2-LABEL: v32i8: 178; AVX2: # %bb.0: 179; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0 180; AVX2-NEXT: vpmovmskb %ymm0, %eax 181; AVX2-NEXT: vzeroupper 182; AVX2-NEXT: retq 183; 184; AVX512F-LABEL: v32i8: 185; AVX512F: # %bb.0: 186; AVX512F-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0 187; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm1 188; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 189; AVX512F-NEXT: kmovw %k0, %ecx 190; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 191; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 192; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 193; AVX512F-NEXT: kmovw %k0, %eax 194; AVX512F-NEXT: shll $16, %eax 195; AVX512F-NEXT: orl %ecx, %eax 196; AVX512F-NEXT: vzeroupper 197; AVX512F-NEXT: retq 198; 199; AVX512BW-LABEL: v32i8: 200; AVX512BW: # %bb.0: 201; AVX512BW-NEXT: vpcmpgtb %ymm1, %ymm0, %k0 202; AVX512BW-NEXT: kmovd %k0, %eax 203; AVX512BW-NEXT: vzeroupper 204; AVX512BW-NEXT: retq 205 %x = icmp sgt <32 x i8> %a, %b 206 %res = bitcast <32 x i1> %x to i32 207 ret i32 %res 208} 209 210define i4 @v4i64(<4 x i64> %a, <4 x i64> %b) { 211; SSE2-SSSE3-LABEL: v4i64: 212; SSE2-SSSE3: # %bb.0: 213; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0] 214; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm3 215; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm1 216; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5 217; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm5 218; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 219; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1 220; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 221; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1 222; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 223; SSE2-SSSE3-NEXT: por %xmm1, %xmm3 224; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm2 225; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm0 226; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1 227; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 228; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2] 229; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 230; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 231; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0 232; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 233; SSE2-SSSE3-NEXT: por %xmm0, %xmm1 234; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm1 235; SSE2-SSSE3-NEXT: movmskps %xmm1, %eax 236; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 237; SSE2-SSSE3-NEXT: retq 238; 239; AVX1-LABEL: v4i64: 240; AVX1: # %bb.0: 241; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 242; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 243; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 244; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 245; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 246; AVX1-NEXT: vmovmskpd %ymm0, %eax 247; AVX1-NEXT: # kill: def $al killed $al killed $eax 248; AVX1-NEXT: vzeroupper 249; AVX1-NEXT: retq 250; 251; AVX2-LABEL: v4i64: 252; AVX2: # %bb.0: 253; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0 254; AVX2-NEXT: vmovmskpd %ymm0, %eax 255; AVX2-NEXT: # kill: def $al killed $al killed $eax 256; AVX2-NEXT: vzeroupper 257; AVX2-NEXT: retq 258; 259; AVX512F-LABEL: v4i64: 260; AVX512F: # %bb.0: 261; AVX512F-NEXT: vpcmpgtq %ymm1, %ymm0, %k0 262; AVX512F-NEXT: kmovw %k0, %eax 263; AVX512F-NEXT: # kill: def $al killed $al killed $eax 264; AVX512F-NEXT: vzeroupper 265; AVX512F-NEXT: retq 266; 267; AVX512BW-LABEL: v4i64: 268; AVX512BW: # %bb.0: 269; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm0, %k0 270; AVX512BW-NEXT: kmovd %k0, %eax 271; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 272; AVX512BW-NEXT: vzeroupper 273; AVX512BW-NEXT: retq 274 %x = icmp sgt <4 x i64> %a, %b 275 %res = bitcast <4 x i1> %x to i4 276 ret i4 %res 277} 278 279define i4 @v4f64(<4 x double> %a, <4 x double> %b) { 280; SSE2-SSSE3-LABEL: v4f64: 281; SSE2-SSSE3: # %bb.0: 282; SSE2-SSSE3-NEXT: cmpltpd %xmm1, %xmm3 283; SSE2-SSSE3-NEXT: cmpltpd %xmm0, %xmm2 284; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2 285; SSE2-SSSE3-NEXT: movmskps %xmm2, %eax 286; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax 287; SSE2-SSSE3-NEXT: retq 288; 289; AVX12-LABEL: v4f64: 290; AVX12: # %bb.0: 291; AVX12-NEXT: vcmpltpd %ymm0, %ymm1, %ymm0 292; AVX12-NEXT: vmovmskpd %ymm0, %eax 293; AVX12-NEXT: # kill: def $al killed $al killed $eax 294; AVX12-NEXT: vzeroupper 295; AVX12-NEXT: retq 296; 297; AVX512F-LABEL: v4f64: 298; AVX512F: # %bb.0: 299; AVX512F-NEXT: vcmpltpd %ymm0, %ymm1, %k0 300; AVX512F-NEXT: kmovw %k0, %eax 301; AVX512F-NEXT: # kill: def $al killed $al killed $eax 302; AVX512F-NEXT: vzeroupper 303; AVX512F-NEXT: retq 304; 305; AVX512BW-LABEL: v4f64: 306; AVX512BW: # %bb.0: 307; AVX512BW-NEXT: vcmpltpd %ymm0, %ymm1, %k0 308; AVX512BW-NEXT: kmovd %k0, %eax 309; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 310; AVX512BW-NEXT: vzeroupper 311; AVX512BW-NEXT: retq 312 %x = fcmp ogt <4 x double> %a, %b 313 %res = bitcast <4 x i1> %x to i4 314 ret i4 %res 315} 316