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