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