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 = [9223372039002259456,9223372039002259456] 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: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 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: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 326; SSE42-NEXT: pxor %xmm2, %xmm0 327; SSE42-NEXT: pxor %xmm1, %xmm2 328; SSE42-NEXT: pcmpgtq %xmm0, %xmm2 329; SSE42-NEXT: pcmpeqd %xmm0, %xmm0 330; SSE42-NEXT: pxor %xmm2, %xmm0 331; SSE42-NEXT: retq 332; 333; AVX1-LABEL: ge_v2i64: 334; AVX1: # %bb.0: 335; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 336; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 337; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 338; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 339; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 340; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 341; AVX1-NEXT: retq 342; 343; AVX2-LABEL: ge_v2i64: 344; AVX2: # %bb.0: 345; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 346; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 347; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 348; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 349; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 350; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 351; AVX2-NEXT: retq 352; 353; XOP-LABEL: ge_v2i64: 354; XOP: # %bb.0: 355; XOP-NEXT: vpcomgeuq %xmm1, %xmm0, %xmm0 356; XOP-NEXT: retq 357; 358; AVX512-LABEL: ge_v2i64: 359; AVX512: # %bb.0: 360; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 361; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 362; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm1 363; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 364; AVX512-NEXT: vzeroupper 365; AVX512-NEXT: retq 366 %1 = icmp uge <2 x i64> %a, %b 367 %2 = sext <2 x i1> %1 to <2 x i64> 368 ret <2 x i64> %2 369} 370 371define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 372; SSE2-LABEL: ge_v4i32: 373; SSE2: # %bb.0: 374; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 375; SSE2-NEXT: pxor %xmm2, %xmm0 376; SSE2-NEXT: pxor %xmm1, %xmm2 377; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 378; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 379; SSE2-NEXT: pxor %xmm2, %xmm0 380; SSE2-NEXT: retq 381; 382; SSE41-LABEL: ge_v4i32: 383; SSE41: # %bb.0: 384; SSE41-NEXT: pmaxud %xmm0, %xmm1 385; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 386; SSE41-NEXT: retq 387; 388; SSE42-LABEL: ge_v4i32: 389; SSE42: # %bb.0: 390; SSE42-NEXT: pmaxud %xmm0, %xmm1 391; SSE42-NEXT: pcmpeqd %xmm1, %xmm0 392; SSE42-NEXT: retq 393; 394; AVX-LABEL: ge_v4i32: 395; AVX: # %bb.0: 396; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm1 397; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 398; AVX-NEXT: retq 399; 400; XOP-LABEL: ge_v4i32: 401; XOP: # %bb.0: 402; XOP-NEXT: vpcomgeud %xmm1, %xmm0, %xmm0 403; XOP-NEXT: retq 404 %1 = icmp uge <4 x i32> %a, %b 405 %2 = sext <4 x i1> %1 to <4 x i32> 406 ret <4 x i32> %2 407} 408 409define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 410; SSE2-LABEL: ge_v8i16: 411; SSE2: # %bb.0: 412; SSE2-NEXT: psubusw %xmm0, %xmm1 413; SSE2-NEXT: pxor %xmm0, %xmm0 414; SSE2-NEXT: pcmpeqw %xmm1, %xmm0 415; SSE2-NEXT: retq 416; 417; SSE41-LABEL: ge_v8i16: 418; SSE41: # %bb.0: 419; SSE41-NEXT: pmaxuw %xmm0, %xmm1 420; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 421; SSE41-NEXT: retq 422; 423; SSE42-LABEL: ge_v8i16: 424; SSE42: # %bb.0: 425; SSE42-NEXT: pmaxuw %xmm0, %xmm1 426; SSE42-NEXT: pcmpeqw %xmm1, %xmm0 427; SSE42-NEXT: retq 428; 429; AVX-LABEL: ge_v8i16: 430; AVX: # %bb.0: 431; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1 432; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 433; AVX-NEXT: retq 434; 435; XOP-LABEL: ge_v8i16: 436; XOP: # %bb.0: 437; XOP-NEXT: vpcomgeuw %xmm1, %xmm0, %xmm0 438; XOP-NEXT: retq 439 %1 = icmp uge <8 x i16> %a, %b 440 %2 = sext <8 x i1> %1 to <8 x i16> 441 ret <8 x i16> %2 442} 443 444define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 445; SSE-LABEL: ge_v16i8: 446; SSE: # %bb.0: 447; SSE-NEXT: pmaxub %xmm0, %xmm1 448; SSE-NEXT: pcmpeqb %xmm1, %xmm0 449; SSE-NEXT: retq 450; 451; AVX-LABEL: ge_v16i8: 452; AVX: # %bb.0: 453; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm1 454; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 455; AVX-NEXT: retq 456; 457; XOP-LABEL: ge_v16i8: 458; XOP: # %bb.0: 459; XOP-NEXT: vpcomgeub %xmm1, %xmm0, %xmm0 460; XOP-NEXT: retq 461 %1 = icmp uge <16 x i8> %a, %b 462 %2 = sext <16 x i1> %1 to <16 x i8> 463 ret <16 x i8> %2 464} 465 466; 467; Greater Than 468; 469 470define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 471; SSE2-LABEL: gt_v2i64: 472; SSE2: # %bb.0: 473; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 474; SSE2-NEXT: pxor %xmm2, %xmm1 475; SSE2-NEXT: pxor %xmm2, %xmm0 476; SSE2-NEXT: movdqa %xmm0, %xmm2 477; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 478; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 479; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 480; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 481; SSE2-NEXT: pand %xmm3, %xmm1 482; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 483; SSE2-NEXT: por %xmm1, %xmm0 484; SSE2-NEXT: retq 485; 486; SSE41-LABEL: gt_v2i64: 487; SSE41: # %bb.0: 488; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 489; SSE41-NEXT: pxor %xmm2, %xmm1 490; SSE41-NEXT: pxor %xmm2, %xmm0 491; SSE41-NEXT: movdqa %xmm0, %xmm2 492; SSE41-NEXT: pcmpgtd %xmm1, %xmm2 493; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 494; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 495; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 496; SSE41-NEXT: pand %xmm3, %xmm1 497; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 498; SSE41-NEXT: por %xmm1, %xmm0 499; SSE41-NEXT: retq 500; 501; SSE42-LABEL: gt_v2i64: 502; SSE42: # %bb.0: 503; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 504; SSE42-NEXT: pxor %xmm2, %xmm1 505; SSE42-NEXT: pxor %xmm2, %xmm0 506; SSE42-NEXT: pcmpgtq %xmm1, %xmm0 507; SSE42-NEXT: retq 508; 509; AVX1-LABEL: gt_v2i64: 510; AVX1: # %bb.0: 511; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 512; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 513; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 514; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 515; AVX1-NEXT: retq 516; 517; AVX2-LABEL: gt_v2i64: 518; AVX2: # %bb.0: 519; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 520; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 521; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 522; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 523; AVX2-NEXT: retq 524; 525; XOP-LABEL: gt_v2i64: 526; XOP: # %bb.0: 527; XOP-NEXT: vpcomgtuq %xmm1, %xmm0, %xmm0 528; XOP-NEXT: retq 529; 530; AVX512-LABEL: gt_v2i64: 531; AVX512: # %bb.0: 532; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 533; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 534; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm1 535; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 536; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 537; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 538; AVX512-NEXT: vzeroupper 539; AVX512-NEXT: retq 540 %1 = icmp ugt <2 x i64> %a, %b 541 %2 = sext <2 x i1> %1 to <2 x i64> 542 ret <2 x i64> %2 543} 544 545define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 546; SSE2-LABEL: gt_v4i32: 547; SSE2: # %bb.0: 548; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 549; SSE2-NEXT: pxor %xmm2, %xmm1 550; SSE2-NEXT: pxor %xmm2, %xmm0 551; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 552; SSE2-NEXT: retq 553; 554; SSE41-LABEL: gt_v4i32: 555; SSE41: # %bb.0: 556; SSE41-NEXT: pminud %xmm0, %xmm1 557; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 558; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 559; SSE41-NEXT: pxor %xmm1, %xmm0 560; SSE41-NEXT: retq 561; 562; SSE42-LABEL: gt_v4i32: 563; SSE42: # %bb.0: 564; SSE42-NEXT: pminud %xmm0, %xmm1 565; SSE42-NEXT: pcmpeqd %xmm1, %xmm0 566; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 567; SSE42-NEXT: pxor %xmm1, %xmm0 568; SSE42-NEXT: retq 569; 570; AVX1-LABEL: gt_v4i32: 571; AVX1: # %bb.0: 572; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm1 573; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 574; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 575; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 576; AVX1-NEXT: retq 577; 578; AVX2-LABEL: gt_v4i32: 579; AVX2: # %bb.0: 580; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm1 581; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 582; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 583; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 584; AVX2-NEXT: retq 585; 586; XOP-LABEL: gt_v4i32: 587; XOP: # %bb.0: 588; XOP-NEXT: vpcomgtud %xmm1, %xmm0, %xmm0 589; XOP-NEXT: retq 590; 591; AVX512-LABEL: gt_v4i32: 592; AVX512: # %bb.0: 593; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm1 594; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 595; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 596; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 597; AVX512-NEXT: vzeroupper 598; AVX512-NEXT: retq 599 %1 = icmp ugt <4 x i32> %a, %b 600 %2 = sext <4 x i1> %1 to <4 x i32> 601 ret <4 x i32> %2 602} 603 604define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 605; SSE2-LABEL: gt_v8i16: 606; SSE2: # %bb.0: 607; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 608; SSE2-NEXT: pxor %xmm2, %xmm1 609; SSE2-NEXT: pxor %xmm2, %xmm0 610; SSE2-NEXT: pcmpgtw %xmm1, %xmm0 611; SSE2-NEXT: retq 612; 613; SSE41-LABEL: gt_v8i16: 614; SSE41: # %bb.0: 615; SSE41-NEXT: pminuw %xmm0, %xmm1 616; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 617; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 618; SSE41-NEXT: pxor %xmm1, %xmm0 619; SSE41-NEXT: retq 620; 621; SSE42-LABEL: gt_v8i16: 622; SSE42: # %bb.0: 623; SSE42-NEXT: pminuw %xmm0, %xmm1 624; SSE42-NEXT: pcmpeqw %xmm1, %xmm0 625; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 626; SSE42-NEXT: pxor %xmm1, %xmm0 627; SSE42-NEXT: retq 628; 629; AVX1-LABEL: gt_v8i16: 630; AVX1: # %bb.0: 631; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm1 632; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 633; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 634; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 635; AVX1-NEXT: retq 636; 637; AVX2-LABEL: gt_v8i16: 638; AVX2: # %bb.0: 639; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm1 640; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 641; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 642; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 643; AVX2-NEXT: retq 644; 645; XOP-LABEL: gt_v8i16: 646; XOP: # %bb.0: 647; XOP-NEXT: vpcomgtuw %xmm1, %xmm0, %xmm0 648; XOP-NEXT: retq 649; 650; AVX512-LABEL: gt_v8i16: 651; AVX512: # %bb.0: 652; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm1 653; AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 654; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 655; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 656; AVX512-NEXT: vzeroupper 657; AVX512-NEXT: retq 658 %1 = icmp ugt <8 x i16> %a, %b 659 %2 = sext <8 x i1> %1 to <8 x i16> 660 ret <8 x i16> %2 661} 662 663define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 664; SSE-LABEL: gt_v16i8: 665; SSE: # %bb.0: 666; SSE-NEXT: pminub %xmm0, %xmm1 667; SSE-NEXT: pcmpeqb %xmm1, %xmm0 668; SSE-NEXT: pcmpeqd %xmm1, %xmm1 669; SSE-NEXT: pxor %xmm1, %xmm0 670; SSE-NEXT: retq 671; 672; AVX1-LABEL: gt_v16i8: 673; AVX1: # %bb.0: 674; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm1 675; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 676; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 677; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 678; AVX1-NEXT: retq 679; 680; AVX2-LABEL: gt_v16i8: 681; AVX2: # %bb.0: 682; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm1 683; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 684; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 685; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 686; AVX2-NEXT: retq 687; 688; XOP-LABEL: gt_v16i8: 689; XOP: # %bb.0: 690; XOP-NEXT: vpcomgtub %xmm1, %xmm0, %xmm0 691; XOP-NEXT: retq 692; 693; AVX512-LABEL: gt_v16i8: 694; AVX512: # %bb.0: 695; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm1 696; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 697; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 698; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 699; AVX512-NEXT: vzeroupper 700; AVX512-NEXT: retq 701 %1 = icmp ugt <16 x i8> %a, %b 702 %2 = sext <16 x i1> %1 to <16 x i8> 703 ret <16 x i8> %2 704} 705 706; 707; Less Than Or Equal 708; 709 710define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 711; SSE2-LABEL: le_v2i64: 712; SSE2: # %bb.0: 713; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 714; SSE2-NEXT: pxor %xmm2, %xmm1 715; SSE2-NEXT: pxor %xmm2, %xmm0 716; SSE2-NEXT: movdqa %xmm0, %xmm2 717; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 718; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 719; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 720; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 721; SSE2-NEXT: pand %xmm3, %xmm0 722; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 723; SSE2-NEXT: por %xmm0, %xmm1 724; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 725; SSE2-NEXT: pxor %xmm1, %xmm0 726; SSE2-NEXT: retq 727; 728; SSE41-LABEL: le_v2i64: 729; SSE41: # %bb.0: 730; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 731; SSE41-NEXT: pxor %xmm2, %xmm1 732; SSE41-NEXT: pxor %xmm2, %xmm0 733; SSE41-NEXT: movdqa %xmm0, %xmm2 734; SSE41-NEXT: pcmpgtd %xmm1, %xmm2 735; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 736; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 737; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 738; SSE41-NEXT: pand %xmm3, %xmm0 739; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 740; SSE41-NEXT: por %xmm0, %xmm1 741; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 742; SSE41-NEXT: pxor %xmm1, %xmm0 743; SSE41-NEXT: retq 744; 745; SSE42-LABEL: le_v2i64: 746; SSE42: # %bb.0: 747; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 748; SSE42-NEXT: pxor %xmm2, %xmm1 749; SSE42-NEXT: pxor %xmm2, %xmm0 750; SSE42-NEXT: pcmpgtq %xmm1, %xmm0 751; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 752; SSE42-NEXT: pxor %xmm1, %xmm0 753; SSE42-NEXT: retq 754; 755; AVX1-LABEL: le_v2i64: 756; AVX1: # %bb.0: 757; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 758; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 759; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 760; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 761; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 762; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 763; AVX1-NEXT: retq 764; 765; AVX2-LABEL: le_v2i64: 766; AVX2: # %bb.0: 767; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 768; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 769; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 770; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 771; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 772; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 773; AVX2-NEXT: retq 774; 775; XOP-LABEL: le_v2i64: 776; XOP: # %bb.0: 777; XOP-NEXT: vpcomleuq %xmm1, %xmm0, %xmm0 778; XOP-NEXT: retq 779; 780; AVX512-LABEL: le_v2i64: 781; AVX512: # %bb.0: 782; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 783; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 784; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm1 785; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 786; AVX512-NEXT: vzeroupper 787; AVX512-NEXT: retq 788 %1 = icmp ule <2 x i64> %a, %b 789 %2 = sext <2 x i1> %1 to <2 x i64> 790 ret <2 x i64> %2 791} 792 793define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 794; SSE2-LABEL: le_v4i32: 795; SSE2: # %bb.0: 796; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 797; SSE2-NEXT: pxor %xmm2, %xmm1 798; SSE2-NEXT: pxor %xmm2, %xmm0 799; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 800; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 801; SSE2-NEXT: pxor %xmm1, %xmm0 802; SSE2-NEXT: retq 803; 804; SSE41-LABEL: le_v4i32: 805; SSE41: # %bb.0: 806; SSE41-NEXT: pminud %xmm0, %xmm1 807; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 808; SSE41-NEXT: retq 809; 810; SSE42-LABEL: le_v4i32: 811; SSE42: # %bb.0: 812; SSE42-NEXT: pminud %xmm0, %xmm1 813; SSE42-NEXT: pcmpeqd %xmm1, %xmm0 814; SSE42-NEXT: retq 815; 816; AVX-LABEL: le_v4i32: 817; AVX: # %bb.0: 818; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm1 819; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 820; AVX-NEXT: retq 821; 822; XOP-LABEL: le_v4i32: 823; XOP: # %bb.0: 824; XOP-NEXT: vpcomleud %xmm1, %xmm0, %xmm0 825; XOP-NEXT: retq 826 %1 = icmp ule <4 x i32> %a, %b 827 %2 = sext <4 x i1> %1 to <4 x i32> 828 ret <4 x i32> %2 829} 830 831define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 832; SSE2-LABEL: le_v8i16: 833; SSE2: # %bb.0: 834; SSE2-NEXT: psubusw %xmm1, %xmm0 835; SSE2-NEXT: pxor %xmm1, %xmm1 836; SSE2-NEXT: pcmpeqw %xmm1, %xmm0 837; SSE2-NEXT: retq 838; 839; SSE41-LABEL: le_v8i16: 840; SSE41: # %bb.0: 841; SSE41-NEXT: pminuw %xmm0, %xmm1 842; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 843; SSE41-NEXT: retq 844; 845; SSE42-LABEL: le_v8i16: 846; SSE42: # %bb.0: 847; SSE42-NEXT: pminuw %xmm0, %xmm1 848; SSE42-NEXT: pcmpeqw %xmm1, %xmm0 849; SSE42-NEXT: retq 850; 851; AVX-LABEL: le_v8i16: 852; AVX: # %bb.0: 853; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm1 854; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 855; AVX-NEXT: retq 856; 857; XOP-LABEL: le_v8i16: 858; XOP: # %bb.0: 859; XOP-NEXT: vpcomleuw %xmm1, %xmm0, %xmm0 860; XOP-NEXT: retq 861 %1 = icmp ule <8 x i16> %a, %b 862 %2 = sext <8 x i1> %1 to <8 x i16> 863 ret <8 x i16> %2 864} 865 866define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 867; SSE-LABEL: le_v16i8: 868; SSE: # %bb.0: 869; SSE-NEXT: pminub %xmm0, %xmm1 870; SSE-NEXT: pcmpeqb %xmm1, %xmm0 871; SSE-NEXT: retq 872; 873; AVX-LABEL: le_v16i8: 874; AVX: # %bb.0: 875; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm1 876; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 877; AVX-NEXT: retq 878; 879; XOP-LABEL: le_v16i8: 880; XOP: # %bb.0: 881; XOP-NEXT: vpcomleub %xmm1, %xmm0, %xmm0 882; XOP-NEXT: retq 883 %1 = icmp ule <16 x i8> %a, %b 884 %2 = sext <16 x i1> %1 to <16 x i8> 885 ret <16 x i8> %2 886} 887 888; 889; Less Than 890; 891 892define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 893; SSE2-LABEL: lt_v2i64: 894; SSE2: # %bb.0: 895; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 896; SSE2-NEXT: pxor %xmm2, %xmm0 897; SSE2-NEXT: pxor %xmm2, %xmm1 898; SSE2-NEXT: movdqa %xmm1, %xmm2 899; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 900; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 901; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 902; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 903; SSE2-NEXT: pand %xmm3, %xmm1 904; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 905; SSE2-NEXT: por %xmm1, %xmm0 906; SSE2-NEXT: retq 907; 908; SSE41-LABEL: lt_v2i64: 909; SSE41: # %bb.0: 910; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 911; SSE41-NEXT: pxor %xmm2, %xmm0 912; SSE41-NEXT: pxor %xmm2, %xmm1 913; SSE41-NEXT: movdqa %xmm1, %xmm2 914; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 915; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 916; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 917; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 918; SSE41-NEXT: pand %xmm3, %xmm1 919; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 920; SSE41-NEXT: por %xmm1, %xmm0 921; SSE41-NEXT: retq 922; 923; SSE42-LABEL: lt_v2i64: 924; SSE42: # %bb.0: 925; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 926; SSE42-NEXT: pxor %xmm2, %xmm0 927; SSE42-NEXT: pxor %xmm1, %xmm2 928; SSE42-NEXT: pcmpgtq %xmm0, %xmm2 929; SSE42-NEXT: movdqa %xmm2, %xmm0 930; SSE42-NEXT: retq 931; 932; AVX1-LABEL: lt_v2i64: 933; AVX1: # %bb.0: 934; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 935; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 936; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 937; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 938; AVX1-NEXT: retq 939; 940; AVX2-LABEL: lt_v2i64: 941; AVX2: # %bb.0: 942; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 943; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 944; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 945; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 946; AVX2-NEXT: retq 947; 948; XOP-LABEL: lt_v2i64: 949; XOP: # %bb.0: 950; XOP-NEXT: vpcomltuq %xmm1, %xmm0, %xmm0 951; XOP-NEXT: retq 952; 953; AVX512-LABEL: lt_v2i64: 954; AVX512: # %bb.0: 955; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 956; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 957; AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm1 958; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 959; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 960; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 961; AVX512-NEXT: vzeroupper 962; AVX512-NEXT: retq 963 %1 = icmp ult <2 x i64> %a, %b 964 %2 = sext <2 x i1> %1 to <2 x i64> 965 ret <2 x i64> %2 966} 967 968define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 969; SSE2-LABEL: lt_v4i32: 970; SSE2: # %bb.0: 971; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 972; SSE2-NEXT: pxor %xmm2, %xmm0 973; SSE2-NEXT: pxor %xmm1, %xmm2 974; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 975; SSE2-NEXT: movdqa %xmm2, %xmm0 976; SSE2-NEXT: retq 977; 978; SSE41-LABEL: lt_v4i32: 979; SSE41: # %bb.0: 980; SSE41-NEXT: pmaxud %xmm0, %xmm1 981; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 982; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 983; SSE41-NEXT: pxor %xmm1, %xmm0 984; SSE41-NEXT: retq 985; 986; SSE42-LABEL: lt_v4i32: 987; SSE42: # %bb.0: 988; SSE42-NEXT: pmaxud %xmm0, %xmm1 989; SSE42-NEXT: pcmpeqd %xmm1, %xmm0 990; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 991; SSE42-NEXT: pxor %xmm1, %xmm0 992; SSE42-NEXT: retq 993; 994; AVX1-LABEL: lt_v4i32: 995; AVX1: # %bb.0: 996; AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm1 997; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 998; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 999; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 1000; AVX1-NEXT: retq 1001; 1002; AVX2-LABEL: lt_v4i32: 1003; AVX2: # %bb.0: 1004; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm1 1005; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1006; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1007; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 1008; AVX2-NEXT: retq 1009; 1010; XOP-LABEL: lt_v4i32: 1011; XOP: # %bb.0: 1012; XOP-NEXT: vpcomltud %xmm1, %xmm0, %xmm0 1013; XOP-NEXT: retq 1014; 1015; AVX512-LABEL: lt_v4i32: 1016; AVX512: # %bb.0: 1017; AVX512-NEXT: vpmaxud %xmm1, %xmm0, %xmm1 1018; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1019; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1020; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 1021; AVX512-NEXT: vzeroupper 1022; AVX512-NEXT: retq 1023 %1 = icmp ult <4 x i32> %a, %b 1024 %2 = sext <4 x i1> %1 to <4 x i32> 1025 ret <4 x i32> %2 1026} 1027 1028define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 1029; SSE2-LABEL: lt_v8i16: 1030; SSE2: # %bb.0: 1031; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 1032; SSE2-NEXT: pxor %xmm2, %xmm0 1033; SSE2-NEXT: pxor %xmm1, %xmm2 1034; SSE2-NEXT: pcmpgtw %xmm0, %xmm2 1035; SSE2-NEXT: movdqa %xmm2, %xmm0 1036; SSE2-NEXT: retq 1037; 1038; SSE41-LABEL: lt_v8i16: 1039; SSE41: # %bb.0: 1040; SSE41-NEXT: pmaxuw %xmm0, %xmm1 1041; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 1042; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 1043; SSE41-NEXT: pxor %xmm1, %xmm0 1044; SSE41-NEXT: retq 1045; 1046; SSE42-LABEL: lt_v8i16: 1047; SSE42: # %bb.0: 1048; SSE42-NEXT: pmaxuw %xmm0, %xmm1 1049; SSE42-NEXT: pcmpeqw %xmm1, %xmm0 1050; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 1051; SSE42-NEXT: pxor %xmm1, %xmm0 1052; SSE42-NEXT: retq 1053; 1054; AVX1-LABEL: lt_v8i16: 1055; AVX1: # %bb.0: 1056; AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1 1057; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 1058; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1059; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 1060; AVX1-NEXT: retq 1061; 1062; AVX2-LABEL: lt_v8i16: 1063; AVX2: # %bb.0: 1064; AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1 1065; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 1066; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1067; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 1068; AVX2-NEXT: retq 1069; 1070; XOP-LABEL: lt_v8i16: 1071; XOP: # %bb.0: 1072; XOP-NEXT: vpcomltuw %xmm1, %xmm0, %xmm0 1073; XOP-NEXT: retq 1074; 1075; AVX512-LABEL: lt_v8i16: 1076; AVX512: # %bb.0: 1077; AVX512-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1 1078; AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 1079; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1080; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 1081; AVX512-NEXT: vzeroupper 1082; AVX512-NEXT: retq 1083 %1 = icmp ult <8 x i16> %a, %b 1084 %2 = sext <8 x i1> %1 to <8 x i16> 1085 ret <8 x i16> %2 1086} 1087 1088define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 1089; SSE-LABEL: lt_v16i8: 1090; SSE: # %bb.0: 1091; SSE-NEXT: pmaxub %xmm0, %xmm1 1092; SSE-NEXT: pcmpeqb %xmm1, %xmm0 1093; SSE-NEXT: pcmpeqd %xmm1, %xmm1 1094; SSE-NEXT: pxor %xmm1, %xmm0 1095; SSE-NEXT: retq 1096; 1097; AVX1-LABEL: lt_v16i8: 1098; AVX1: # %bb.0: 1099; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm1 1100; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1101; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1102; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 1103; AVX1-NEXT: retq 1104; 1105; AVX2-LABEL: lt_v16i8: 1106; AVX2: # %bb.0: 1107; AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm1 1108; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1109; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 1110; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 1111; AVX2-NEXT: retq 1112; 1113; XOP-LABEL: lt_v16i8: 1114; XOP: # %bb.0: 1115; XOP-NEXT: vpcomltub %xmm1, %xmm0, %xmm0 1116; XOP-NEXT: retq 1117; 1118; AVX512-LABEL: lt_v16i8: 1119; AVX512: # %bb.0: 1120; AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm1 1121; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 1122; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 1123; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 1124; AVX512-NEXT: vzeroupper 1125; AVX512-NEXT: retq 1126 %1 = icmp ult <16 x i8> %a, %b 1127 %2 = sext <16 x i1> %1 to <16 x i8> 1128 ret <16 x i8> %2 1129} 1130