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-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE42 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW 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; AVX-LABEL: ne_v2i64: 137; AVX: # BB#0: 138; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 139; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 140; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 141; AVX-NEXT: retq 142; 143; XOP-LABEL: ne_v2i64: 144; XOP: # BB#0: 145; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0 146; XOP-NEXT: retq 147 %1 = icmp ne <2 x i64> %a, %b 148 %2 = sext <2 x i1> %1 to <2 x i64> 149 ret <2 x i64> %2 150} 151 152define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 153; SSE-LABEL: ne_v4i32: 154; SSE: # BB#0: 155; SSE-NEXT: pcmpeqd %xmm1, %xmm0 156; SSE-NEXT: pcmpeqd %xmm1, %xmm1 157; SSE-NEXT: pxor %xmm1, %xmm0 158; SSE-NEXT: retq 159; 160; AVX-LABEL: ne_v4i32: 161; AVX: # BB#0: 162; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 163; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 164; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 165; AVX-NEXT: retq 166; 167; XOP-LABEL: ne_v4i32: 168; XOP: # BB#0: 169; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0 170; XOP-NEXT: retq 171 %1 = icmp ne <4 x i32> %a, %b 172 %2 = sext <4 x i1> %1 to <4 x i32> 173 ret <4 x i32> %2 174} 175 176define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 177; SSE-LABEL: ne_v8i16: 178; SSE: # BB#0: 179; SSE-NEXT: pcmpeqw %xmm1, %xmm0 180; SSE-NEXT: pcmpeqd %xmm1, %xmm1 181; SSE-NEXT: pxor %xmm1, %xmm0 182; SSE-NEXT: retq 183; 184; AVX-LABEL: ne_v8i16: 185; AVX: # BB#0: 186; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 187; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 188; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 189; AVX-NEXT: retq 190; 191; XOP-LABEL: ne_v8i16: 192; XOP: # BB#0: 193; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0 194; XOP-NEXT: retq 195 %1 = icmp ne <8 x i16> %a, %b 196 %2 = sext <8 x i1> %1 to <8 x i16> 197 ret <8 x i16> %2 198} 199 200define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 201; SSE-LABEL: ne_v16i8: 202; SSE: # BB#0: 203; SSE-NEXT: pcmpeqb %xmm1, %xmm0 204; SSE-NEXT: pcmpeqd %xmm1, %xmm1 205; SSE-NEXT: pxor %xmm1, %xmm0 206; SSE-NEXT: retq 207; 208; AVX-LABEL: ne_v16i8: 209; AVX: # BB#0: 210; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 211; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 212; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 213; AVX-NEXT: retq 214; 215; XOP-LABEL: ne_v16i8: 216; XOP: # BB#0: 217; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0 218; XOP-NEXT: retq 219 %1 = icmp ne <16 x i8> %a, %b 220 %2 = sext <16 x i1> %1 to <16 x i8> 221 ret <16 x i8> %2 222} 223 224; 225; Greater Than Or Equal 226; 227 228define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 229; SSE2-LABEL: ge_v2i64: 230; SSE2: # BB#0: 231; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 232; SSE2-NEXT: pxor %xmm2, %xmm0 233; SSE2-NEXT: pxor %xmm2, %xmm1 234; SSE2-NEXT: movdqa %xmm1, %xmm2 235; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 236; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 237; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 238; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 239; SSE2-NEXT: pand %xmm3, %xmm0 240; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 241; SSE2-NEXT: por %xmm0, %xmm1 242; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 243; SSE2-NEXT: pxor %xmm1, %xmm0 244; SSE2-NEXT: retq 245; 246; SSE41-LABEL: ge_v2i64: 247; SSE41: # BB#0: 248; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 249; SSE41-NEXT: pxor %xmm2, %xmm0 250; SSE41-NEXT: pxor %xmm2, %xmm1 251; SSE41-NEXT: movdqa %xmm1, %xmm2 252; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 253; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 254; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 255; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 256; SSE41-NEXT: pand %xmm3, %xmm0 257; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 258; SSE41-NEXT: por %xmm0, %xmm1 259; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 260; SSE41-NEXT: pxor %xmm1, %xmm0 261; SSE41-NEXT: retq 262; 263; SSE42-LABEL: ge_v2i64: 264; SSE42: # BB#0: 265; SSE42-NEXT: pcmpgtq %xmm0, %xmm1 266; SSE42-NEXT: pcmpeqd %xmm0, %xmm0 267; SSE42-NEXT: pxor %xmm1, %xmm0 268; SSE42-NEXT: retq 269; 270; AVX-LABEL: ge_v2i64: 271; AVX: # BB#0: 272; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 273; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 274; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 275; AVX-NEXT: retq 276; 277; XOP-LABEL: ge_v2i64: 278; XOP: # BB#0: 279; XOP-NEXT: vpcomgeq %xmm1, %xmm0, %xmm0 280; XOP-NEXT: retq 281 %1 = icmp sge <2 x i64> %a, %b 282 %2 = sext <2 x i1> %1 to <2 x i64> 283 ret <2 x i64> %2 284} 285 286define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 287; SSE-LABEL: ge_v4i32: 288; SSE: # BB#0: 289; SSE-NEXT: pcmpgtd %xmm0, %xmm1 290; SSE-NEXT: pcmpeqd %xmm0, %xmm0 291; SSE-NEXT: pxor %xmm1, %xmm0 292; SSE-NEXT: retq 293; 294; AVX-LABEL: ge_v4i32: 295; AVX: # BB#0: 296; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 297; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 298; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 299; AVX-NEXT: retq 300; 301; XOP-LABEL: ge_v4i32: 302; XOP: # BB#0: 303; XOP-NEXT: vpcomged %xmm1, %xmm0, %xmm0 304; XOP-NEXT: retq 305 %1 = icmp sge <4 x i32> %a, %b 306 %2 = sext <4 x i1> %1 to <4 x i32> 307 ret <4 x i32> %2 308} 309 310define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 311; SSE-LABEL: ge_v8i16: 312; SSE: # BB#0: 313; SSE-NEXT: pcmpgtw %xmm0, %xmm1 314; SSE-NEXT: pcmpeqd %xmm0, %xmm0 315; SSE-NEXT: pxor %xmm1, %xmm0 316; SSE-NEXT: retq 317; 318; AVX-LABEL: ge_v8i16: 319; AVX: # BB#0: 320; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0 321; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 322; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 323; AVX-NEXT: retq 324; 325; XOP-LABEL: ge_v8i16: 326; XOP: # BB#0: 327; XOP-NEXT: vpcomgew %xmm1, %xmm0, %xmm0 328; XOP-NEXT: retq 329 %1 = icmp sge <8 x i16> %a, %b 330 %2 = sext <8 x i1> %1 to <8 x i16> 331 ret <8 x i16> %2 332} 333 334define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 335; SSE-LABEL: ge_v16i8: 336; SSE: # BB#0: 337; SSE-NEXT: pcmpgtb %xmm0, %xmm1 338; SSE-NEXT: pcmpeqd %xmm0, %xmm0 339; SSE-NEXT: pxor %xmm1, %xmm0 340; SSE-NEXT: retq 341; 342; AVX-LABEL: ge_v16i8: 343; AVX: # BB#0: 344; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0 345; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 346; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 347; AVX-NEXT: retq 348; 349; XOP-LABEL: ge_v16i8: 350; XOP: # BB#0: 351; XOP-NEXT: vpcomgeb %xmm1, %xmm0, %xmm0 352; XOP-NEXT: retq 353 %1 = icmp sge <16 x i8> %a, %b 354 %2 = sext <16 x i1> %1 to <16 x i8> 355 ret <16 x i8> %2 356} 357 358; 359; Greater Than 360; 361 362define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 363; SSE2-LABEL: gt_v2i64: 364; SSE2: # BB#0: 365; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 366; SSE2-NEXT: pxor %xmm2, %xmm1 367; SSE2-NEXT: pxor %xmm2, %xmm0 368; SSE2-NEXT: movdqa %xmm0, %xmm2 369; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 370; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 371; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 372; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 373; SSE2-NEXT: pand %xmm3, %xmm1 374; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 375; SSE2-NEXT: por %xmm1, %xmm0 376; SSE2-NEXT: retq 377; 378; SSE41-LABEL: gt_v2i64: 379; SSE41: # BB#0: 380; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 381; SSE41-NEXT: pxor %xmm2, %xmm1 382; SSE41-NEXT: pxor %xmm2, %xmm0 383; SSE41-NEXT: movdqa %xmm0, %xmm2 384; SSE41-NEXT: pcmpgtd %xmm1, %xmm2 385; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 386; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 387; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 388; SSE41-NEXT: pand %xmm3, %xmm1 389; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 390; SSE41-NEXT: por %xmm1, %xmm0 391; SSE41-NEXT: retq 392; 393; SSE42-LABEL: gt_v2i64: 394; SSE42: # BB#0: 395; SSE42-NEXT: pcmpgtq %xmm1, %xmm0 396; SSE42-NEXT: retq 397; 398; AVX-LABEL: gt_v2i64: 399; AVX: # BB#0: 400; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 401; AVX-NEXT: retq 402; 403; XOP-LABEL: gt_v2i64: 404; XOP: # BB#0: 405; XOP-NEXT: vpcomgtq %xmm1, %xmm0, %xmm0 406; XOP-NEXT: retq 407 %1 = icmp sgt <2 x i64> %a, %b 408 %2 = sext <2 x i1> %1 to <2 x i64> 409 ret <2 x i64> %2 410} 411 412define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 413; SSE-LABEL: gt_v4i32: 414; SSE: # BB#0: 415; SSE-NEXT: pcmpgtd %xmm1, %xmm0 416; SSE-NEXT: retq 417; 418; AVX-LABEL: gt_v4i32: 419; AVX: # BB#0: 420; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 421; AVX-NEXT: retq 422; 423; XOP-LABEL: gt_v4i32: 424; XOP: # BB#0: 425; XOP-NEXT: vpcomgtd %xmm1, %xmm0, %xmm0 426; XOP-NEXT: retq 427 %1 = icmp sgt <4 x i32> %a, %b 428 %2 = sext <4 x i1> %1 to <4 x i32> 429 ret <4 x i32> %2 430} 431 432define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 433; SSE-LABEL: gt_v8i16: 434; SSE: # BB#0: 435; SSE-NEXT: pcmpgtw %xmm1, %xmm0 436; SSE-NEXT: retq 437; 438; AVX-LABEL: gt_v8i16: 439; AVX: # BB#0: 440; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 441; AVX-NEXT: retq 442; 443; XOP-LABEL: gt_v8i16: 444; XOP: # BB#0: 445; XOP-NEXT: vpcomgtw %xmm1, %xmm0, %xmm0 446; XOP-NEXT: retq 447 %1 = icmp sgt <8 x i16> %a, %b 448 %2 = sext <8 x i1> %1 to <8 x i16> 449 ret <8 x i16> %2 450} 451 452define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 453; SSE-LABEL: gt_v16i8: 454; SSE: # BB#0: 455; SSE-NEXT: pcmpgtb %xmm1, %xmm0 456; SSE-NEXT: retq 457; 458; AVX-LABEL: gt_v16i8: 459; AVX: # BB#0: 460; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 461; AVX-NEXT: retq 462; 463; XOP-LABEL: gt_v16i8: 464; XOP: # BB#0: 465; XOP-NEXT: vpcomgtb %xmm1, %xmm0, %xmm0 466; XOP-NEXT: retq 467 %1 = icmp sgt <16 x i8> %a, %b 468 %2 = sext <16 x i1> %1 to <16 x i8> 469 ret <16 x i8> %2 470} 471 472; 473; Less Than Or Equal 474; 475 476define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 477; SSE2-LABEL: le_v2i64: 478; SSE2: # BB#0: 479; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 480; SSE2-NEXT: pxor %xmm2, %xmm1 481; SSE2-NEXT: pxor %xmm2, %xmm0 482; SSE2-NEXT: movdqa %xmm0, %xmm2 483; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 484; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 485; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 486; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 487; SSE2-NEXT: pand %xmm3, %xmm0 488; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 489; SSE2-NEXT: por %xmm0, %xmm1 490; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 491; SSE2-NEXT: pxor %xmm1, %xmm0 492; SSE2-NEXT: retq 493; 494; SSE41-LABEL: le_v2i64: 495; SSE41: # BB#0: 496; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 497; SSE41-NEXT: pxor %xmm2, %xmm1 498; SSE41-NEXT: pxor %xmm2, %xmm0 499; SSE41-NEXT: movdqa %xmm0, %xmm2 500; SSE41-NEXT: pcmpgtd %xmm1, %xmm2 501; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 502; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 503; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 504; SSE41-NEXT: pand %xmm3, %xmm0 505; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 506; SSE41-NEXT: por %xmm0, %xmm1 507; SSE41-NEXT: pcmpeqd %xmm0, %xmm0 508; SSE41-NEXT: pxor %xmm1, %xmm0 509; SSE41-NEXT: retq 510; 511; SSE42-LABEL: le_v2i64: 512; SSE42: # BB#0: 513; SSE42-NEXT: pcmpgtq %xmm1, %xmm0 514; SSE42-NEXT: pcmpeqd %xmm1, %xmm1 515; SSE42-NEXT: pxor %xmm1, %xmm0 516; SSE42-NEXT: retq 517; 518; AVX-LABEL: le_v2i64: 519; AVX: # BB#0: 520; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 521; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 522; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 523; AVX-NEXT: retq 524; 525; XOP-LABEL: le_v2i64: 526; XOP: # BB#0: 527; XOP-NEXT: vpcomleq %xmm1, %xmm0, %xmm0 528; XOP-NEXT: retq 529 %1 = icmp sle <2 x i64> %a, %b 530 %2 = sext <2 x i1> %1 to <2 x i64> 531 ret <2 x i64> %2 532} 533 534define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 535; SSE-LABEL: le_v4i32: 536; SSE: # BB#0: 537; SSE-NEXT: pcmpgtd %xmm1, %xmm0 538; SSE-NEXT: pcmpeqd %xmm1, %xmm1 539; SSE-NEXT: pxor %xmm1, %xmm0 540; SSE-NEXT: retq 541; 542; AVX-LABEL: le_v4i32: 543; AVX: # BB#0: 544; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 545; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 546; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 547; AVX-NEXT: retq 548; 549; XOP-LABEL: le_v4i32: 550; XOP: # BB#0: 551; XOP-NEXT: vpcomled %xmm1, %xmm0, %xmm0 552; XOP-NEXT: retq 553 %1 = icmp sle <4 x i32> %a, %b 554 %2 = sext <4 x i1> %1 to <4 x i32> 555 ret <4 x i32> %2 556} 557 558define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 559; SSE-LABEL: le_v8i16: 560; SSE: # BB#0: 561; SSE-NEXT: pcmpgtw %xmm1, %xmm0 562; SSE-NEXT: pcmpeqd %xmm1, %xmm1 563; SSE-NEXT: pxor %xmm1, %xmm0 564; SSE-NEXT: retq 565; 566; AVX-LABEL: le_v8i16: 567; AVX: # BB#0: 568; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 569; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 570; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 571; AVX-NEXT: retq 572; 573; XOP-LABEL: le_v8i16: 574; XOP: # BB#0: 575; XOP-NEXT: vpcomlew %xmm1, %xmm0, %xmm0 576; XOP-NEXT: retq 577 %1 = icmp sle <8 x i16> %a, %b 578 %2 = sext <8 x i1> %1 to <8 x i16> 579 ret <8 x i16> %2 580} 581 582define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 583; SSE-LABEL: le_v16i8: 584; SSE: # BB#0: 585; SSE-NEXT: pcmpgtb %xmm1, %xmm0 586; SSE-NEXT: pcmpeqd %xmm1, %xmm1 587; SSE-NEXT: pxor %xmm1, %xmm0 588; SSE-NEXT: retq 589; 590; AVX-LABEL: le_v16i8: 591; AVX: # BB#0: 592; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 593; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 594; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 595; AVX-NEXT: retq 596; 597; XOP-LABEL: le_v16i8: 598; XOP: # BB#0: 599; XOP-NEXT: vpcomleb %xmm1, %xmm0, %xmm0 600; XOP-NEXT: retq 601 %1 = icmp sle <16 x i8> %a, %b 602 %2 = sext <16 x i1> %1 to <16 x i8> 603 ret <16 x i8> %2 604} 605 606; 607; Less Than 608; 609 610define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind { 611; SSE2-LABEL: lt_v2i64: 612; SSE2: # BB#0: 613; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 614; SSE2-NEXT: pxor %xmm2, %xmm0 615; SSE2-NEXT: pxor %xmm2, %xmm1 616; SSE2-NEXT: movdqa %xmm1, %xmm2 617; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 618; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 619; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 620; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 621; SSE2-NEXT: pand %xmm3, %xmm1 622; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 623; SSE2-NEXT: por %xmm1, %xmm0 624; SSE2-NEXT: retq 625; 626; SSE41-LABEL: lt_v2i64: 627; SSE41: # BB#0: 628; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 629; SSE41-NEXT: pxor %xmm2, %xmm0 630; SSE41-NEXT: pxor %xmm2, %xmm1 631; SSE41-NEXT: movdqa %xmm1, %xmm2 632; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 633; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 634; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 635; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 636; SSE41-NEXT: pand %xmm3, %xmm1 637; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 638; SSE41-NEXT: por %xmm1, %xmm0 639; SSE41-NEXT: retq 640; 641; SSE42-LABEL: lt_v2i64: 642; SSE42: # BB#0: 643; SSE42-NEXT: pcmpgtq %xmm0, %xmm1 644; SSE42-NEXT: movdqa %xmm1, %xmm0 645; SSE42-NEXT: retq 646; 647; AVX-LABEL: lt_v2i64: 648; AVX: # BB#0: 649; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 650; AVX-NEXT: retq 651; 652; XOP-LABEL: lt_v2i64: 653; XOP: # BB#0: 654; XOP-NEXT: vpcomltq %xmm1, %xmm0, %xmm0 655; XOP-NEXT: retq 656 %1 = icmp slt <2 x i64> %a, %b 657 %2 = sext <2 x i1> %1 to <2 x i64> 658 ret <2 x i64> %2 659} 660 661define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 662; SSE-LABEL: lt_v4i32: 663; SSE: # BB#0: 664; SSE-NEXT: pcmpgtd %xmm0, %xmm1 665; SSE-NEXT: movdqa %xmm1, %xmm0 666; SSE-NEXT: retq 667; 668; AVX-LABEL: lt_v4i32: 669; AVX: # BB#0: 670; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 671; AVX-NEXT: retq 672; 673; XOP-LABEL: lt_v4i32: 674; XOP: # BB#0: 675; XOP-NEXT: vpcomltd %xmm1, %xmm0, %xmm0 676; XOP-NEXT: retq 677 %1 = icmp slt <4 x i32> %a, %b 678 %2 = sext <4 x i1> %1 to <4 x i32> 679 ret <4 x i32> %2 680} 681 682define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind { 683; SSE-LABEL: lt_v8i16: 684; SSE: # BB#0: 685; SSE-NEXT: pcmpgtw %xmm0, %xmm1 686; SSE-NEXT: movdqa %xmm1, %xmm0 687; SSE-NEXT: retq 688; 689; AVX-LABEL: lt_v8i16: 690; AVX: # BB#0: 691; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0 692; AVX-NEXT: retq 693; 694; XOP-LABEL: lt_v8i16: 695; XOP: # BB#0: 696; XOP-NEXT: vpcomltw %xmm1, %xmm0, %xmm0 697; XOP-NEXT: retq 698 %1 = icmp slt <8 x i16> %a, %b 699 %2 = sext <8 x i1> %1 to <8 x i16> 700 ret <8 x i16> %2 701} 702 703define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind { 704; SSE-LABEL: lt_v16i8: 705; SSE: # BB#0: 706; SSE-NEXT: pcmpgtb %xmm0, %xmm1 707; SSE-NEXT: movdqa %xmm1, %xmm0 708; SSE-NEXT: retq 709; 710; AVX-LABEL: lt_v16i8: 711; AVX: # BB#0: 712; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0 713; AVX-NEXT: retq 714; 715; XOP-LABEL: lt_v16i8: 716; XOP: # BB#0: 717; XOP-NEXT: vpcomltb %xmm1, %xmm0, %xmm0 718; XOP-NEXT: retq 719 %1 = icmp slt <16 x i8> %a, %b 720 %2 = sext <16 x i1> %1 to <16 x i8> 721 ret <16 x i8> %2 722} 723