903 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE425; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=XOP8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s --check-prefix=XOP9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX51210; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVX51211 12;13; Equal14;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, %xmm020; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]21; SSE2-NEXT: pand %xmm1, %xmm022; SSE2-NEXT: retq23;24; SSE41-LABEL: eq_v2i64:25; SSE41: # %bb.0:26; SSE41-NEXT: pcmpeqq %xmm1, %xmm027; SSE41-NEXT: retq28;29; SSE42-LABEL: eq_v2i64:30; SSE42: # %bb.0:31; SSE42-NEXT: pcmpeqq %xmm1, %xmm032; SSE42-NEXT: retq33;34; AVX-LABEL: eq_v2i64:35; AVX: # %bb.0:36; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm037; AVX-NEXT: retq38;39; XOP-LABEL: eq_v2i64:40; XOP: # %bb.0:41; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm042; XOP-NEXT: retq43 %1 = icmp eq <2 x i64> %a, %b44 %2 = sext <2 x i1> %1 to <2 x i64>45 ret <2 x i64> %246}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, %xmm052; SSE-NEXT: retq53;54; AVX-LABEL: eq_v4i32:55; AVX: # %bb.0:56; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm057; AVX-NEXT: retq58;59; XOP-LABEL: eq_v4i32:60; XOP: # %bb.0:61; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm062; XOP-NEXT: retq63 %1 = icmp eq <4 x i32> %a, %b64 %2 = sext <4 x i1> %1 to <4 x i32>65 ret <4 x i32> %266}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, %xmm072; SSE-NEXT: retq73;74; AVX-LABEL: eq_v8i16:75; AVX: # %bb.0:76; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm077; AVX-NEXT: retq78;79; XOP-LABEL: eq_v8i16:80; XOP: # %bb.0:81; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm082; XOP-NEXT: retq83 %1 = icmp eq <8 x i16> %a, %b84 %2 = sext <8 x i1> %1 to <8 x i16>85 ret <8 x i16> %286}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, %xmm092; SSE-NEXT: retq93;94; AVX-LABEL: eq_v16i8:95; AVX: # %bb.0:96; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm097; AVX-NEXT: retq98;99; XOP-LABEL: eq_v16i8:100; XOP: # %bb.0:101; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm0102; XOP-NEXT: retq103 %1 = icmp eq <16 x i8> %a, %b104 %2 = sext <16 x i1> %1 to <16 x i8>105 ret <16 x i8> %2106}107 108;109; Not Equal110;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, %xmm0116; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]117; SSE2-NEXT: pand %xmm1, %xmm0118; SSE2-NEXT: pcmpeqd %xmm1, %xmm1119; SSE2-NEXT: pxor %xmm1, %xmm0120; SSE2-NEXT: retq121;122; SSE41-LABEL: ne_v2i64:123; SSE41: # %bb.0:124; SSE41-NEXT: pcmpeqq %xmm1, %xmm0125; SSE41-NEXT: pcmpeqd %xmm1, %xmm1126; SSE41-NEXT: pxor %xmm1, %xmm0127; SSE41-NEXT: retq128;129; SSE42-LABEL: ne_v2i64:130; SSE42: # %bb.0:131; SSE42-NEXT: pcmpeqq %xmm1, %xmm0132; SSE42-NEXT: pcmpeqd %xmm1, %xmm1133; SSE42-NEXT: pxor %xmm1, %xmm0134; SSE42-NEXT: retq135;136; AVX1-LABEL: ne_v2i64:137; AVX1: # %bb.0:138; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0139; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1140; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0141; AVX1-NEXT: retq142;143; AVX2-LABEL: ne_v2i64:144; AVX2: # %bb.0:145; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0146; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1147; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0148; AVX2-NEXT: retq149;150; XOP-LABEL: ne_v2i64:151; XOP: # %bb.0:152; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0153; XOP-NEXT: retq154;155; AVX512-LABEL: ne_v2i64:156; AVX512: # %bb.0:157; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0158; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0159; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0160; AVX512-NEXT: vzeroupper161; AVX512-NEXT: retq162 %1 = icmp ne <2 x i64> %a, %b163 %2 = sext <2 x i1> %1 to <2 x i64>164 ret <2 x i64> %2165}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, %xmm0171; SSE-NEXT: pcmpeqd %xmm1, %xmm1172; SSE-NEXT: pxor %xmm1, %xmm0173; SSE-NEXT: retq174;175; AVX1-LABEL: ne_v4i32:176; AVX1: # %bb.0:177; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0178; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1179; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0180; AVX1-NEXT: retq181;182; AVX2-LABEL: ne_v4i32:183; AVX2: # %bb.0:184; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0185; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1186; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0187; AVX2-NEXT: retq188;189; XOP-LABEL: ne_v4i32:190; XOP: # %bb.0:191; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0192; XOP-NEXT: retq193;194; AVX512-LABEL: ne_v4i32:195; AVX512: # %bb.0:196; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0197; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0198; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0199; AVX512-NEXT: vzeroupper200; AVX512-NEXT: retq201 %1 = icmp ne <4 x i32> %a, %b202 %2 = sext <4 x i1> %1 to <4 x i32>203 ret <4 x i32> %2204}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, %xmm0210; SSE-NEXT: pcmpeqd %xmm1, %xmm1211; SSE-NEXT: pxor %xmm1, %xmm0212; SSE-NEXT: retq213;214; AVX1-LABEL: ne_v8i16:215; AVX1: # %bb.0:216; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0217; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1218; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0219; AVX1-NEXT: retq220;221; AVX2-LABEL: ne_v8i16:222; AVX2: # %bb.0:223; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0224; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1225; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0226; AVX2-NEXT: retq227;228; XOP-LABEL: ne_v8i16:229; XOP: # %bb.0:230; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0231; XOP-NEXT: retq232;233; AVX512-LABEL: ne_v8i16:234; AVX512: # %bb.0:235; AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0236; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0237; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0238; AVX512-NEXT: vzeroupper239; AVX512-NEXT: retq240 %1 = icmp ne <8 x i16> %a, %b241 %2 = sext <8 x i1> %1 to <8 x i16>242 ret <8 x i16> %2243}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, %xmm0249; SSE-NEXT: pcmpeqd %xmm1, %xmm1250; SSE-NEXT: pxor %xmm1, %xmm0251; SSE-NEXT: retq252;253; AVX1-LABEL: ne_v16i8:254; AVX1: # %bb.0:255; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0256; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1257; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0258; AVX1-NEXT: retq259;260; AVX2-LABEL: ne_v16i8:261; AVX2: # %bb.0:262; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0263; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1264; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0265; AVX2-NEXT: retq266;267; XOP-LABEL: ne_v16i8:268; XOP: # %bb.0:269; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0270; XOP-NEXT: retq271;272; AVX512-LABEL: ne_v16i8:273; AVX512: # %bb.0:274; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0275; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0276; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0277; AVX512-NEXT: vzeroupper278; AVX512-NEXT: retq279 %1 = icmp ne <16 x i8> %a, %b280 %2 = sext <16 x i1> %1 to <16 x i8>281 ret <16 x i8> %2282}283 284;285; Greater Than Or Equal286;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, %xmm0293; SSE2-NEXT: pxor %xmm2, %xmm1294; SSE2-NEXT: movdqa %xmm1, %xmm2295; SSE2-NEXT: pcmpgtd %xmm0, %xmm2296; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]297; SSE2-NEXT: pcmpeqd %xmm0, %xmm1298; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]299; SSE2-NEXT: pand %xmm3, %xmm0300; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]301; SSE2-NEXT: por %xmm0, %xmm1302; SSE2-NEXT: pcmpeqd %xmm0, %xmm0303; SSE2-NEXT: pxor %xmm1, %xmm0304; SSE2-NEXT: retq305;306; SSE41-LABEL: ge_v2i64:307; SSE41: # %bb.0:308; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]309; SSE41-NEXT: pxor %xmm2, %xmm0310; SSE41-NEXT: pxor %xmm2, %xmm1311; SSE41-NEXT: movdqa %xmm1, %xmm2312; SSE41-NEXT: pcmpgtd %xmm0, %xmm2313; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]314; SSE41-NEXT: pcmpeqd %xmm0, %xmm1315; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]316; SSE41-NEXT: pand %xmm3, %xmm0317; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]318; SSE41-NEXT: por %xmm0, %xmm1319; SSE41-NEXT: pcmpeqd %xmm0, %xmm0320; SSE41-NEXT: pxor %xmm1, %xmm0321; SSE41-NEXT: retq322;323; SSE42-LABEL: ge_v2i64:324; SSE42: # %bb.0:325; SSE42-NEXT: pcmpgtq %xmm0, %xmm1326; SSE42-NEXT: pcmpeqd %xmm0, %xmm0327; SSE42-NEXT: pxor %xmm1, %xmm0328; SSE42-NEXT: retq329;330; AVX1-LABEL: ge_v2i64:331; AVX1: # %bb.0:332; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0333; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1334; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0335; AVX1-NEXT: retq336;337; AVX2-LABEL: ge_v2i64:338; AVX2: # %bb.0:339; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0340; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1341; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0342; AVX2-NEXT: retq343;344; XOP-LABEL: ge_v2i64:345; XOP: # %bb.0:346; XOP-NEXT: vpcomgeq %xmm1, %xmm0, %xmm0347; XOP-NEXT: retq348;349; AVX512-LABEL: ge_v2i64:350; AVX512: # %bb.0:351; AVX512-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0352; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0353; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0354; AVX512-NEXT: vzeroupper355; AVX512-NEXT: retq356 %1 = icmp sge <2 x i64> %a, %b357 %2 = sext <2 x i1> %1 to <2 x i64>358 ret <2 x i64> %2359}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, %xmm1365; SSE-NEXT: pcmpeqd %xmm0, %xmm0366; SSE-NEXT: pxor %xmm1, %xmm0367; SSE-NEXT: retq368;369; AVX1-LABEL: ge_v4i32:370; AVX1: # %bb.0:371; AVX1-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0372; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1373; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0374; AVX1-NEXT: retq375;376; AVX2-LABEL: ge_v4i32:377; AVX2: # %bb.0:378; AVX2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0379; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1380; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0381; AVX2-NEXT: retq382;383; XOP-LABEL: ge_v4i32:384; XOP: # %bb.0:385; XOP-NEXT: vpcomged %xmm1, %xmm0, %xmm0386; XOP-NEXT: retq387;388; AVX512-LABEL: ge_v4i32:389; AVX512: # %bb.0:390; AVX512-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0391; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0392; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0393; AVX512-NEXT: vzeroupper394; AVX512-NEXT: retq395 %1 = icmp sge <4 x i32> %a, %b396 %2 = sext <4 x i1> %1 to <4 x i32>397 ret <4 x i32> %2398}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, %xmm1404; SSE-NEXT: pcmpeqd %xmm0, %xmm0405; SSE-NEXT: pxor %xmm1, %xmm0406; SSE-NEXT: retq407;408; AVX1-LABEL: ge_v8i16:409; AVX1: # %bb.0:410; AVX1-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0411; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1412; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0413; AVX1-NEXT: retq414;415; AVX2-LABEL: ge_v8i16:416; AVX2: # %bb.0:417; AVX2-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0418; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1419; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0420; AVX2-NEXT: retq421;422; XOP-LABEL: ge_v8i16:423; XOP: # %bb.0:424; XOP-NEXT: vpcomgew %xmm1, %xmm0, %xmm0425; XOP-NEXT: retq426;427; AVX512-LABEL: ge_v8i16:428; AVX512: # %bb.0:429; AVX512-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0430; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0431; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0432; AVX512-NEXT: vzeroupper433; AVX512-NEXT: retq434 %1 = icmp sge <8 x i16> %a, %b435 %2 = sext <8 x i1> %1 to <8 x i16>436 ret <8 x i16> %2437}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, %xmm1443; SSE-NEXT: pcmpeqd %xmm0, %xmm0444; SSE-NEXT: pxor %xmm1, %xmm0445; SSE-NEXT: retq446;447; AVX1-LABEL: ge_v16i8:448; AVX1: # %bb.0:449; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0450; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1451; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0452; AVX1-NEXT: retq453;454; AVX2-LABEL: ge_v16i8:455; AVX2: # %bb.0:456; AVX2-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0457; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1458; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0459; AVX2-NEXT: retq460;461; XOP-LABEL: ge_v16i8:462; XOP: # %bb.0:463; XOP-NEXT: vpcomgeb %xmm1, %xmm0, %xmm0464; XOP-NEXT: retq465;466; AVX512-LABEL: ge_v16i8:467; AVX512: # %bb.0:468; AVX512-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0469; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0470; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0471; AVX512-NEXT: vzeroupper472; AVX512-NEXT: retq473 %1 = icmp sge <16 x i8> %a, %b474 %2 = sext <16 x i1> %1 to <16 x i8>475 ret <16 x i8> %2476}477 478;479; Greater Than480;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, %xmm1487; SSE2-NEXT: pxor %xmm2, %xmm0488; SSE2-NEXT: movdqa %xmm0, %xmm2489; SSE2-NEXT: pcmpgtd %xmm1, %xmm2490; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]491; SSE2-NEXT: pcmpeqd %xmm1, %xmm0492; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]493; SSE2-NEXT: pand %xmm3, %xmm1494; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]495; SSE2-NEXT: por %xmm1, %xmm0496; SSE2-NEXT: retq497;498; SSE41-LABEL: gt_v2i64:499; SSE41: # %bb.0:500; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]501; SSE41-NEXT: pxor %xmm2, %xmm1502; SSE41-NEXT: pxor %xmm2, %xmm0503; SSE41-NEXT: movdqa %xmm0, %xmm2504; SSE41-NEXT: pcmpgtd %xmm1, %xmm2505; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]506; SSE41-NEXT: pcmpeqd %xmm1, %xmm0507; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]508; SSE41-NEXT: pand %xmm3, %xmm1509; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]510; SSE41-NEXT: por %xmm1, %xmm0511; SSE41-NEXT: retq512;513; SSE42-LABEL: gt_v2i64:514; SSE42: # %bb.0:515; SSE42-NEXT: pcmpgtq %xmm1, %xmm0516; SSE42-NEXT: retq517;518; AVX-LABEL: gt_v2i64:519; AVX: # %bb.0:520; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0521; AVX-NEXT: retq522;523; XOP-LABEL: gt_v2i64:524; XOP: # %bb.0:525; XOP-NEXT: vpcomgtq %xmm1, %xmm0, %xmm0526; XOP-NEXT: retq527 %1 = icmp sgt <2 x i64> %a, %b528 %2 = sext <2 x i1> %1 to <2 x i64>529 ret <2 x i64> %2530}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, %xmm0536; SSE-NEXT: retq537;538; AVX-LABEL: gt_v4i32:539; AVX: # %bb.0:540; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0541; AVX-NEXT: retq542;543; XOP-LABEL: gt_v4i32:544; XOP: # %bb.0:545; XOP-NEXT: vpcomgtd %xmm1, %xmm0, %xmm0546; XOP-NEXT: retq547 %1 = icmp sgt <4 x i32> %a, %b548 %2 = sext <4 x i1> %1 to <4 x i32>549 ret <4 x i32> %2550}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, %xmm0556; SSE-NEXT: retq557;558; AVX-LABEL: gt_v8i16:559; AVX: # %bb.0:560; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0561; AVX-NEXT: retq562;563; XOP-LABEL: gt_v8i16:564; XOP: # %bb.0:565; XOP-NEXT: vpcomgtw %xmm1, %xmm0, %xmm0566; XOP-NEXT: retq567 %1 = icmp sgt <8 x i16> %a, %b568 %2 = sext <8 x i1> %1 to <8 x i16>569 ret <8 x i16> %2570}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, %xmm0576; SSE-NEXT: retq577;578; AVX-LABEL: gt_v16i8:579; AVX: # %bb.0:580; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0581; AVX-NEXT: retq582;583; XOP-LABEL: gt_v16i8:584; XOP: # %bb.0:585; XOP-NEXT: vpcomgtb %xmm1, %xmm0, %xmm0586; XOP-NEXT: retq587 %1 = icmp sgt <16 x i8> %a, %b588 %2 = sext <16 x i1> %1 to <16 x i8>589 ret <16 x i8> %2590}591 592;593; Less Than Or Equal594;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, %xmm1601; SSE2-NEXT: pxor %xmm2, %xmm0602; SSE2-NEXT: movdqa %xmm0, %xmm2603; SSE2-NEXT: pcmpgtd %xmm1, %xmm2604; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]605; SSE2-NEXT: pcmpeqd %xmm1, %xmm0606; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]607; SSE2-NEXT: pand %xmm3, %xmm0608; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]609; SSE2-NEXT: por %xmm0, %xmm1610; SSE2-NEXT: pcmpeqd %xmm0, %xmm0611; SSE2-NEXT: pxor %xmm1, %xmm0612; SSE2-NEXT: retq613;614; SSE41-LABEL: le_v2i64:615; SSE41: # %bb.0:616; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]617; SSE41-NEXT: pxor %xmm2, %xmm1618; SSE41-NEXT: pxor %xmm2, %xmm0619; SSE41-NEXT: movdqa %xmm0, %xmm2620; SSE41-NEXT: pcmpgtd %xmm1, %xmm2621; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]622; SSE41-NEXT: pcmpeqd %xmm1, %xmm0623; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]624; SSE41-NEXT: pand %xmm3, %xmm0625; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]626; SSE41-NEXT: por %xmm0, %xmm1627; SSE41-NEXT: pcmpeqd %xmm0, %xmm0628; SSE41-NEXT: pxor %xmm1, %xmm0629; SSE41-NEXT: retq630;631; SSE42-LABEL: le_v2i64:632; SSE42: # %bb.0:633; SSE42-NEXT: pcmpgtq %xmm1, %xmm0634; SSE42-NEXT: pcmpeqd %xmm1, %xmm1635; SSE42-NEXT: pxor %xmm1, %xmm0636; SSE42-NEXT: retq637;638; AVX1-LABEL: le_v2i64:639; AVX1: # %bb.0:640; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0641; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1642; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0643; AVX1-NEXT: retq644;645; AVX2-LABEL: le_v2i64:646; AVX2: # %bb.0:647; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0648; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1649; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0650; AVX2-NEXT: retq651;652; XOP-LABEL: le_v2i64:653; XOP: # %bb.0:654; XOP-NEXT: vpcomleq %xmm1, %xmm0, %xmm0655; XOP-NEXT: retq656;657; AVX512-LABEL: le_v2i64:658; AVX512: # %bb.0:659; AVX512-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0660; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0661; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0662; AVX512-NEXT: vzeroupper663; AVX512-NEXT: retq664 %1 = icmp sle <2 x i64> %a, %b665 %2 = sext <2 x i1> %1 to <2 x i64>666 ret <2 x i64> %2667}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, %xmm0673; SSE-NEXT: pcmpeqd %xmm1, %xmm1674; SSE-NEXT: pxor %xmm1, %xmm0675; SSE-NEXT: retq676;677; AVX1-LABEL: le_v4i32:678; AVX1: # %bb.0:679; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0680; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1681; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0682; AVX1-NEXT: retq683;684; AVX2-LABEL: le_v4i32:685; AVX2: # %bb.0:686; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0687; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1688; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0689; AVX2-NEXT: retq690;691; XOP-LABEL: le_v4i32:692; XOP: # %bb.0:693; XOP-NEXT: vpcomled %xmm1, %xmm0, %xmm0694; XOP-NEXT: retq695;696; AVX512-LABEL: le_v4i32:697; AVX512: # %bb.0:698; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0699; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0700; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0701; AVX512-NEXT: vzeroupper702; AVX512-NEXT: retq703 %1 = icmp sle <4 x i32> %a, %b704 %2 = sext <4 x i1> %1 to <4 x i32>705 ret <4 x i32> %2706}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, %xmm0712; SSE-NEXT: pcmpeqd %xmm1, %xmm1713; SSE-NEXT: pxor %xmm1, %xmm0714; SSE-NEXT: retq715;716; AVX1-LABEL: le_v8i16:717; AVX1: # %bb.0:718; AVX1-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0719; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1720; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0721; AVX1-NEXT: retq722;723; AVX2-LABEL: le_v8i16:724; AVX2: # %bb.0:725; AVX2-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0726; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1727; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0728; AVX2-NEXT: retq729;730; XOP-LABEL: le_v8i16:731; XOP: # %bb.0:732; XOP-NEXT: vpcomlew %xmm1, %xmm0, %xmm0733; XOP-NEXT: retq734;735; AVX512-LABEL: le_v8i16:736; AVX512: # %bb.0:737; AVX512-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0738; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0739; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0740; AVX512-NEXT: vzeroupper741; AVX512-NEXT: retq742 %1 = icmp sle <8 x i16> %a, %b743 %2 = sext <8 x i1> %1 to <8 x i16>744 ret <8 x i16> %2745}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, %xmm0751; SSE-NEXT: pcmpeqd %xmm1, %xmm1752; SSE-NEXT: pxor %xmm1, %xmm0753; SSE-NEXT: retq754;755; AVX1-LABEL: le_v16i8:756; AVX1: # %bb.0:757; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0758; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1759; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0760; AVX1-NEXT: retq761;762; AVX2-LABEL: le_v16i8:763; AVX2: # %bb.0:764; AVX2-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0765; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1766; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0767; AVX2-NEXT: retq768;769; XOP-LABEL: le_v16i8:770; XOP: # %bb.0:771; XOP-NEXT: vpcomleb %xmm1, %xmm0, %xmm0772; XOP-NEXT: retq773;774; AVX512-LABEL: le_v16i8:775; AVX512: # %bb.0:776; AVX512-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0777; AVX512-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0778; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0779; AVX512-NEXT: vzeroupper780; AVX512-NEXT: retq781 %1 = icmp sle <16 x i8> %a, %b782 %2 = sext <16 x i1> %1 to <16 x i8>783 ret <16 x i8> %2784}785 786;787; Less Than788;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, %xmm0795; SSE2-NEXT: pxor %xmm2, %xmm1796; SSE2-NEXT: movdqa %xmm1, %xmm2797; SSE2-NEXT: pcmpgtd %xmm0, %xmm2798; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]799; SSE2-NEXT: pcmpeqd %xmm0, %xmm1800; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]801; SSE2-NEXT: pand %xmm3, %xmm1802; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]803; SSE2-NEXT: por %xmm1, %xmm0804; SSE2-NEXT: retq805;806; SSE41-LABEL: lt_v2i64:807; SSE41: # %bb.0:808; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]809; SSE41-NEXT: pxor %xmm2, %xmm0810; SSE41-NEXT: pxor %xmm2, %xmm1811; SSE41-NEXT: movdqa %xmm1, %xmm2812; SSE41-NEXT: pcmpgtd %xmm0, %xmm2813; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]814; SSE41-NEXT: pcmpeqd %xmm0, %xmm1815; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]816; SSE41-NEXT: pand %xmm3, %xmm1817; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]818; SSE41-NEXT: por %xmm1, %xmm0819; SSE41-NEXT: retq820;821; SSE42-LABEL: lt_v2i64:822; SSE42: # %bb.0:823; SSE42-NEXT: pcmpgtq %xmm0, %xmm1824; SSE42-NEXT: movdqa %xmm1, %xmm0825; SSE42-NEXT: retq826;827; AVX-LABEL: lt_v2i64:828; AVX: # %bb.0:829; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0830; AVX-NEXT: retq831;832; XOP-LABEL: lt_v2i64:833; XOP: # %bb.0:834; XOP-NEXT: vpcomltq %xmm1, %xmm0, %xmm0835; XOP-NEXT: retq836 %1 = icmp slt <2 x i64> %a, %b837 %2 = sext <2 x i1> %1 to <2 x i64>838 ret <2 x i64> %2839}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, %xmm1845; SSE-NEXT: movdqa %xmm1, %xmm0846; SSE-NEXT: retq847;848; AVX-LABEL: lt_v4i32:849; AVX: # %bb.0:850; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0851; AVX-NEXT: retq852;853; XOP-LABEL: lt_v4i32:854; XOP: # %bb.0:855; XOP-NEXT: vpcomltd %xmm1, %xmm0, %xmm0856; XOP-NEXT: retq857 %1 = icmp slt <4 x i32> %a, %b858 %2 = sext <4 x i1> %1 to <4 x i32>859 ret <4 x i32> %2860}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, %xmm1866; SSE-NEXT: movdqa %xmm1, %xmm0867; SSE-NEXT: retq868;869; AVX-LABEL: lt_v8i16:870; AVX: # %bb.0:871; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0872; AVX-NEXT: retq873;874; XOP-LABEL: lt_v8i16:875; XOP: # %bb.0:876; XOP-NEXT: vpcomltw %xmm1, %xmm0, %xmm0877; XOP-NEXT: retq878 %1 = icmp slt <8 x i16> %a, %b879 %2 = sext <8 x i1> %1 to <8 x i16>880 ret <8 x i16> %2881}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, %xmm1887; SSE-NEXT: movdqa %xmm1, %xmm0888; SSE-NEXT: retq889;890; AVX-LABEL: lt_v16i8:891; AVX: # %bb.0:892; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0893; AVX-NEXT: retq894;895; XOP-LABEL: lt_v16i8:896; XOP: # %bb.0:897; XOP-NEXT: vpcomltb %xmm1, %xmm0, %xmm0898; XOP-NEXT: retq899 %1 = icmp slt <16 x i8> %a, %b900 %2 = sext <16 x i1> %1 to <16 x i8>901 ret <16 x i8> %2902}903