728 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-prefix=SSE --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX26 7; PR33276 - https://bugs.llvm.org/show_bug.cgi?id=332768; If both operands of an unsigned icmp are known non-negative, then9; we don't need to flip the sign bits in order to map to signed pcmpgt*.10 11define <2 x i1> @ugt_v2i64(<2 x i64> %x, <2 x i64> %y) {12; SSE2-LABEL: ugt_v2i64:13; SSE2: # %bb.0:14; SSE2-NEXT: psrlq $1, %xmm015; SSE2-NEXT: psrlq $1, %xmm116; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]17; SSE2-NEXT: pxor %xmm2, %xmm118; SSE2-NEXT: pxor %xmm2, %xmm019; SSE2-NEXT: movdqa %xmm0, %xmm220; SSE2-NEXT: pcmpgtd %xmm1, %xmm221; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]22; SSE2-NEXT: pcmpeqd %xmm1, %xmm023; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]24; SSE2-NEXT: pand %xmm3, %xmm125; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]26; SSE2-NEXT: por %xmm1, %xmm027; SSE2-NEXT: retq28;29; SSE41-LABEL: ugt_v2i64:30; SSE41: # %bb.0:31; SSE41-NEXT: psrlq $1, %xmm032; SSE41-NEXT: psrlq $1, %xmm133; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]34; SSE41-NEXT: pxor %xmm2, %xmm135; SSE41-NEXT: pxor %xmm2, %xmm036; SSE41-NEXT: movdqa %xmm0, %xmm237; SSE41-NEXT: pcmpgtd %xmm1, %xmm238; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]39; SSE41-NEXT: pcmpeqd %xmm1, %xmm040; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]41; SSE41-NEXT: pand %xmm3, %xmm142; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]43; SSE41-NEXT: por %xmm1, %xmm044; SSE41-NEXT: retq45;46; AVX-LABEL: ugt_v2i64:47; AVX: # %bb.0:48; AVX-NEXT: vpsrlq $1, %xmm0, %xmm049; AVX-NEXT: vpsrlq $1, %xmm1, %xmm150; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm051; AVX-NEXT: retq52 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1>53 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1>54 %cmp = icmp ugt <2 x i64> %sh1, %sh255 ret <2 x i1> %cmp56}57 58define <2 x i1> @ult_v2i64(<2 x i64> %x, <2 x i64> %y) {59; SSE2-LABEL: ult_v2i64:60; SSE2: # %bb.0:61; SSE2-NEXT: psrlq $1, %xmm062; SSE2-NEXT: psrlq $1, %xmm163; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]64; SSE2-NEXT: pxor %xmm2, %xmm065; SSE2-NEXT: pxor %xmm2, %xmm166; SSE2-NEXT: movdqa %xmm1, %xmm267; SSE2-NEXT: pcmpgtd %xmm0, %xmm268; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]69; SSE2-NEXT: pcmpeqd %xmm0, %xmm170; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]71; SSE2-NEXT: pand %xmm3, %xmm172; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]73; SSE2-NEXT: por %xmm1, %xmm074; SSE2-NEXT: retq75;76; SSE41-LABEL: ult_v2i64:77; SSE41: # %bb.0:78; SSE41-NEXT: psrlq $1, %xmm079; SSE41-NEXT: psrlq $1, %xmm180; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]81; SSE41-NEXT: pxor %xmm2, %xmm082; SSE41-NEXT: pxor %xmm2, %xmm183; SSE41-NEXT: movdqa %xmm1, %xmm284; SSE41-NEXT: pcmpgtd %xmm0, %xmm285; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]86; SSE41-NEXT: pcmpeqd %xmm0, %xmm187; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]88; SSE41-NEXT: pand %xmm3, %xmm189; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]90; SSE41-NEXT: por %xmm1, %xmm091; SSE41-NEXT: retq92;93; AVX-LABEL: ult_v2i64:94; AVX: # %bb.0:95; AVX-NEXT: vpsrlq $1, %xmm0, %xmm096; AVX-NEXT: vpsrlq $1, %xmm1, %xmm197; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm098; AVX-NEXT: retq99 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1>100 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1>101 %cmp = icmp ult <2 x i64> %sh1, %sh2102 ret <2 x i1> %cmp103}104 105define <2 x i1> @uge_v2i64(<2 x i64> %x, <2 x i64> %y) {106; SSE2-LABEL: uge_v2i64:107; SSE2: # %bb.0:108; SSE2-NEXT: psrlq $1, %xmm0109; SSE2-NEXT: psrlq $1, %xmm1110; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]111; SSE2-NEXT: pxor %xmm2, %xmm0112; SSE2-NEXT: pxor %xmm2, %xmm1113; SSE2-NEXT: movdqa %xmm1, %xmm2114; SSE2-NEXT: pcmpgtd %xmm0, %xmm2115; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]116; SSE2-NEXT: pcmpeqd %xmm0, %xmm1117; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]118; SSE2-NEXT: pand %xmm3, %xmm0119; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]120; SSE2-NEXT: por %xmm0, %xmm1121; SSE2-NEXT: pcmpeqd %xmm0, %xmm0122; SSE2-NEXT: pxor %xmm1, %xmm0123; SSE2-NEXT: retq124;125; SSE41-LABEL: uge_v2i64:126; SSE41: # %bb.0:127; SSE41-NEXT: psrlq $1, %xmm0128; SSE41-NEXT: psrlq $1, %xmm1129; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]130; SSE41-NEXT: pxor %xmm2, %xmm0131; SSE41-NEXT: pxor %xmm2, %xmm1132; SSE41-NEXT: movdqa %xmm1, %xmm2133; SSE41-NEXT: pcmpgtd %xmm0, %xmm2134; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]135; SSE41-NEXT: pcmpeqd %xmm0, %xmm1136; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]137; SSE41-NEXT: pand %xmm3, %xmm0138; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]139; SSE41-NEXT: por %xmm0, %xmm1140; SSE41-NEXT: pcmpeqd %xmm0, %xmm0141; SSE41-NEXT: pxor %xmm1, %xmm0142; SSE41-NEXT: retq143;144; AVX-LABEL: uge_v2i64:145; AVX: # %bb.0:146; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0147; AVX-NEXT: vpsrlq $1, %xmm1, %xmm1148; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0149; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1150; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0151; AVX-NEXT: retq152 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1>153 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1>154 %cmp = icmp uge <2 x i64> %sh1, %sh2155 ret <2 x i1> %cmp156}157 158define <2 x i1> @ule_v2i64(<2 x i64> %x, <2 x i64> %y) {159; SSE2-LABEL: ule_v2i64:160; SSE2: # %bb.0:161; SSE2-NEXT: psrlq $1, %xmm0162; SSE2-NEXT: psrlq $1, %xmm1163; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]164; SSE2-NEXT: pxor %xmm2, %xmm1165; SSE2-NEXT: pxor %xmm2, %xmm0166; SSE2-NEXT: movdqa %xmm0, %xmm2167; SSE2-NEXT: pcmpgtd %xmm1, %xmm2168; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]169; SSE2-NEXT: pcmpeqd %xmm1, %xmm0170; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]171; SSE2-NEXT: pand %xmm3, %xmm0172; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]173; SSE2-NEXT: por %xmm0, %xmm1174; SSE2-NEXT: pcmpeqd %xmm0, %xmm0175; SSE2-NEXT: pxor %xmm1, %xmm0176; SSE2-NEXT: retq177;178; SSE41-LABEL: ule_v2i64:179; SSE41: # %bb.0:180; SSE41-NEXT: psrlq $1, %xmm0181; SSE41-NEXT: psrlq $1, %xmm1182; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]183; SSE41-NEXT: pxor %xmm2, %xmm1184; SSE41-NEXT: pxor %xmm2, %xmm0185; SSE41-NEXT: movdqa %xmm0, %xmm2186; SSE41-NEXT: pcmpgtd %xmm1, %xmm2187; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]188; SSE41-NEXT: pcmpeqd %xmm1, %xmm0189; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]190; SSE41-NEXT: pand %xmm3, %xmm0191; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]192; SSE41-NEXT: por %xmm0, %xmm1193; SSE41-NEXT: pcmpeqd %xmm0, %xmm0194; SSE41-NEXT: pxor %xmm1, %xmm0195; SSE41-NEXT: retq196;197; AVX-LABEL: ule_v2i64:198; AVX: # %bb.0:199; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0200; AVX-NEXT: vpsrlq $1, %xmm1, %xmm1201; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0202; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1203; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0204; AVX-NEXT: retq205 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1>206 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1>207 %cmp = icmp ule <2 x i64> %sh1, %sh2208 ret <2 x i1> %cmp209}210 211define <4 x i1> @ugt_v4i32(<4 x i32> %x, <4 x i32> %y) {212; SSE-LABEL: ugt_v4i32:213; SSE: # %bb.0:214; SSE-NEXT: psrld $1, %xmm0215; SSE-NEXT: psrld $1, %xmm1216; SSE-NEXT: pcmpgtd %xmm1, %xmm0217; SSE-NEXT: retq218;219; AVX-LABEL: ugt_v4i32:220; AVX: # %bb.0:221; AVX-NEXT: vpsrld $1, %xmm0, %xmm0222; AVX-NEXT: vpsrld $1, %xmm1, %xmm1223; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0224; AVX-NEXT: retq225 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>226 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1>227 %cmp = icmp ugt <4 x i32> %sh1, %sh2228 ret <4 x i1> %cmp229}230 231define <4 x i1> @ult_v4i32(<4 x i32> %x, <4 x i32> %y) {232; SSE-LABEL: ult_v4i32:233; SSE: # %bb.0:234; SSE-NEXT: psrld $1, %xmm0235; SSE-NEXT: psrld $1, %xmm1236; SSE-NEXT: pcmpgtd %xmm0, %xmm1237; SSE-NEXT: movdqa %xmm1, %xmm0238; SSE-NEXT: retq239;240; AVX-LABEL: ult_v4i32:241; AVX: # %bb.0:242; AVX-NEXT: vpsrld $1, %xmm0, %xmm0243; AVX-NEXT: vpsrld $1, %xmm1, %xmm1244; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0245; AVX-NEXT: retq246 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>247 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1>248 %cmp = icmp ult <4 x i32> %sh1, %sh2249 ret <4 x i1> %cmp250}251 252define <4 x i1> @uge_v4i32(<4 x i32> %x, <4 x i32> %y) {253; SSE2-LABEL: uge_v4i32:254; SSE2: # %bb.0:255; SSE2-NEXT: psrld $1, %xmm0256; SSE2-NEXT: psrld $1, %xmm1257; SSE2-NEXT: pcmpgtd %xmm0, %xmm1258; SSE2-NEXT: pcmpeqd %xmm0, %xmm0259; SSE2-NEXT: pxor %xmm1, %xmm0260; SSE2-NEXT: retq261;262; SSE41-LABEL: uge_v4i32:263; SSE41: # %bb.0:264; SSE41-NEXT: psrld $1, %xmm0265; SSE41-NEXT: psrld $1, %xmm1266; SSE41-NEXT: pmaxud %xmm0, %xmm1267; SSE41-NEXT: pcmpeqd %xmm1, %xmm0268; SSE41-NEXT: retq269;270; AVX-LABEL: uge_v4i32:271; AVX: # %bb.0:272; AVX-NEXT: vpsrld $1, %xmm0, %xmm0273; AVX-NEXT: vpsrld $1, %xmm1, %xmm1274; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm1275; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0276; AVX-NEXT: retq277 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>278 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1>279 %cmp = icmp uge <4 x i32> %sh1, %sh2280 ret <4 x i1> %cmp281}282 283define <4 x i1> @ule_v4i32(<4 x i32> %x, <4 x i32> %y) {284; SSE2-LABEL: ule_v4i32:285; SSE2: # %bb.0:286; SSE2-NEXT: psrld $1, %xmm0287; SSE2-NEXT: psrld $1, %xmm1288; SSE2-NEXT: pcmpgtd %xmm1, %xmm0289; SSE2-NEXT: pcmpeqd %xmm1, %xmm1290; SSE2-NEXT: pxor %xmm1, %xmm0291; SSE2-NEXT: retq292;293; SSE41-LABEL: ule_v4i32:294; SSE41: # %bb.0:295; SSE41-NEXT: psrld $1, %xmm0296; SSE41-NEXT: psrld $1, %xmm1297; SSE41-NEXT: pminud %xmm0, %xmm1298; SSE41-NEXT: pcmpeqd %xmm1, %xmm0299; SSE41-NEXT: retq300;301; AVX-LABEL: ule_v4i32:302; AVX: # %bb.0:303; AVX-NEXT: vpsrld $1, %xmm0, %xmm0304; AVX-NEXT: vpsrld $1, %xmm1, %xmm1305; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm1306; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0307; AVX-NEXT: retq308 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>309 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1>310 %cmp = icmp ule <4 x i32> %sh1, %sh2311 ret <4 x i1> %cmp312}313 314define <8 x i1> @ugt_v8i16(<8 x i16> %x, <8 x i16> %y) {315; SSE-LABEL: ugt_v8i16:316; SSE: # %bb.0:317; SSE-NEXT: psrlw $1, %xmm0318; SSE-NEXT: psrlw $1, %xmm1319; SSE-NEXT: pcmpgtw %xmm1, %xmm0320; SSE-NEXT: retq321;322; AVX-LABEL: ugt_v8i16:323; AVX: # %bb.0:324; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0325; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1326; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0327; AVX-NEXT: retq328 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>329 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>330 %cmp = icmp ugt <8 x i16> %sh1, %sh2331 ret <8 x i1> %cmp332}333 334define <8 x i1> @ult_v8i16(<8 x i16> %x, <8 x i16> %y) {335; SSE-LABEL: ult_v8i16:336; SSE: # %bb.0:337; SSE-NEXT: psrlw $1, %xmm0338; SSE-NEXT: psrlw $1, %xmm1339; SSE-NEXT: pcmpgtw %xmm0, %xmm1340; SSE-NEXT: movdqa %xmm1, %xmm0341; SSE-NEXT: retq342;343; AVX-LABEL: ult_v8i16:344; AVX: # %bb.0:345; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0346; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1347; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0348; AVX-NEXT: retq349 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>350 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>351 %cmp = icmp ult <8 x i16> %sh1, %sh2352 ret <8 x i1> %cmp353}354 355define <8 x i1> @uge_v8i16(<8 x i16> %x, <8 x i16> %y) {356; SSE2-LABEL: uge_v8i16:357; SSE2: # %bb.0:358; SSE2-NEXT: psrlw $1, %xmm0359; SSE2-NEXT: psrlw $1, %xmm1360; SSE2-NEXT: pcmpgtw %xmm0, %xmm1361; SSE2-NEXT: pcmpeqd %xmm0, %xmm0362; SSE2-NEXT: pxor %xmm1, %xmm0363; SSE2-NEXT: retq364;365; SSE41-LABEL: uge_v8i16:366; SSE41: # %bb.0:367; SSE41-NEXT: psrlw $1, %xmm0368; SSE41-NEXT: psrlw $1, %xmm1369; SSE41-NEXT: pmaxuw %xmm0, %xmm1370; SSE41-NEXT: pcmpeqw %xmm1, %xmm0371; SSE41-NEXT: retq372;373; AVX-LABEL: uge_v8i16:374; AVX: # %bb.0:375; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0376; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1377; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1378; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0379; AVX-NEXT: retq380 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>381 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>382 %cmp = icmp uge <8 x i16> %sh1, %sh2383 ret <8 x i1> %cmp384}385 386define <8 x i1> @ule_v8i16(<8 x i16> %x, <8 x i16> %y) {387; SSE2-LABEL: ule_v8i16:388; SSE2: # %bb.0:389; SSE2-NEXT: psrlw $1, %xmm0390; SSE2-NEXT: psrlw $1, %xmm1391; SSE2-NEXT: pcmpgtw %xmm1, %xmm0392; SSE2-NEXT: pcmpeqd %xmm1, %xmm1393; SSE2-NEXT: pxor %xmm1, %xmm0394; SSE2-NEXT: retq395;396; SSE41-LABEL: ule_v8i16:397; SSE41: # %bb.0:398; SSE41-NEXT: psrlw $1, %xmm0399; SSE41-NEXT: psrlw $1, %xmm1400; SSE41-NEXT: pminuw %xmm0, %xmm1401; SSE41-NEXT: pcmpeqw %xmm1, %xmm0402; SSE41-NEXT: retq403;404; AVX-LABEL: ule_v8i16:405; AVX: # %bb.0:406; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0407; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1408; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm1409; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0410; AVX-NEXT: retq411 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>412 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>413 %cmp = icmp ule <8 x i16> %sh1, %sh2414 ret <8 x i1> %cmp415}416 417define <16 x i1> @ugt_v16i8(<16 x i8> %x, <16 x i8> %y) {418; SSE-LABEL: ugt_v16i8:419; SSE: # %bb.0:420; SSE-NEXT: psrlw $1, %xmm0421; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]422; SSE-NEXT: pand %xmm2, %xmm0423; SSE-NEXT: psrlw $1, %xmm1424; SSE-NEXT: pand %xmm2, %xmm1425; SSE-NEXT: pcmpgtb %xmm1, %xmm0426; SSE-NEXT: retq427;428; AVX1-LABEL: ugt_v16i8:429; AVX1: # %bb.0:430; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0431; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]432; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0433; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1434; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1435; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0436; AVX1-NEXT: retq437;438; AVX2-LABEL: ugt_v16i8:439; AVX2: # %bb.0:440; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm0441; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]442; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0443; AVX2-NEXT: vpsrlw $1, %xmm1, %xmm1444; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1445; AVX2-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0446; AVX2-NEXT: retq447 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>448 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>449 %cmp = icmp ugt <16 x i8> %sh1, %sh2450 ret <16 x i1> %cmp451}452 453define <16 x i1> @ult_v16i8(<16 x i8> %x, <16 x i8> %y) {454; SSE-LABEL: ult_v16i8:455; SSE: # %bb.0:456; SSE-NEXT: psrlw $1, %xmm0457; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]458; SSE-NEXT: pand %xmm2, %xmm0459; SSE-NEXT: psrlw $1, %xmm1460; SSE-NEXT: pand %xmm1, %xmm2461; SSE-NEXT: pcmpgtb %xmm0, %xmm2462; SSE-NEXT: movdqa %xmm2, %xmm0463; SSE-NEXT: retq464;465; AVX1-LABEL: ult_v16i8:466; AVX1: # %bb.0:467; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0468; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]469; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0470; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1471; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1472; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0473; AVX1-NEXT: retq474;475; AVX2-LABEL: ult_v16i8:476; AVX2: # %bb.0:477; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm0478; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]479; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0480; AVX2-NEXT: vpsrlw $1, %xmm1, %xmm1481; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1482; AVX2-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0483; AVX2-NEXT: retq484 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>485 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>486 %cmp = icmp ult <16 x i8> %sh1, %sh2487 ret <16 x i1> %cmp488}489 490define <16 x i1> @uge_v16i8(<16 x i8> %x, <16 x i8> %y) {491; SSE-LABEL: uge_v16i8:492; SSE: # %bb.0:493; SSE-NEXT: psrlw $1, %xmm0494; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]495; SSE-NEXT: pand %xmm2, %xmm0496; SSE-NEXT: psrlw $1, %xmm1497; SSE-NEXT: pand %xmm1, %xmm2498; SSE-NEXT: pmaxub %xmm0, %xmm2499; SSE-NEXT: pcmpeqb %xmm2, %xmm0500; SSE-NEXT: retq501;502; AVX1-LABEL: uge_v16i8:503; AVX1: # %bb.0:504; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0505; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]506; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0507; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1508; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1509; AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm1510; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0511; AVX1-NEXT: retq512;513; AVX2-LABEL: uge_v16i8:514; AVX2: # %bb.0:515; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm0516; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]517; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0518; AVX2-NEXT: vpsrlw $1, %xmm1, %xmm1519; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1520; AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm1521; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0522; AVX2-NEXT: retq523 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>524 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>525 %cmp = icmp uge <16 x i8> %sh1, %sh2526 ret <16 x i1> %cmp527}528 529define <16 x i1> @ule_v16i8(<16 x i8> %x, <16 x i8> %y) {530; SSE-LABEL: ule_v16i8:531; SSE: # %bb.0:532; SSE-NEXT: psrlw $1, %xmm0533; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]534; SSE-NEXT: pand %xmm2, %xmm0535; SSE-NEXT: psrlw $1, %xmm1536; SSE-NEXT: pand %xmm1, %xmm2537; SSE-NEXT: pminub %xmm0, %xmm2538; SSE-NEXT: pcmpeqb %xmm2, %xmm0539; SSE-NEXT: retq540;541; AVX1-LABEL: ule_v16i8:542; AVX1: # %bb.0:543; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0544; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]545; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0546; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm1547; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1548; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm1549; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0550; AVX1-NEXT: retq551;552; AVX2-LABEL: ule_v16i8:553; AVX2: # %bb.0:554; AVX2-NEXT: vpsrlw $1, %xmm0, %xmm0555; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]556; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0557; AVX2-NEXT: vpsrlw $1, %xmm1, %xmm1558; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1559; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm1560; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0561; AVX2-NEXT: retq562 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>563 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>564 %cmp = icmp ule <16 x i8> %sh1, %sh2565 ret <16 x i1> %cmp566}567 568define <8 x i16> @PR47448_uge(i16 signext %0) {569; SSE2-LABEL: PR47448_uge:570; SSE2: # %bb.0:571; SSE2-NEXT: andl $7, %edi572; SSE2-NEXT: movd %edi, %xmm0573; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]574; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]575; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]576; SSE2-NEXT: pcmpgtw %xmm0, %xmm1577; SSE2-NEXT: pcmpeqd %xmm0, %xmm0578; SSE2-NEXT: pxor %xmm1, %xmm0579; SSE2-NEXT: retq580;581; SSE41-LABEL: PR47448_uge:582; SSE41: # %bb.0:583; SSE41-NEXT: andl $7, %edi584; SSE41-NEXT: movd %edi, %xmm0585; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]586; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]587; SSE41-NEXT: pmovsxbw {{.*#+}} xmm0 = [0,1,2,3,4,5,6,7]588; SSE41-NEXT: pmaxuw %xmm1, %xmm0589; SSE41-NEXT: pcmpeqw %xmm1, %xmm0590; SSE41-NEXT: retq591;592; AVX1-LABEL: PR47448_uge:593; AVX1: # %bb.0:594; AVX1-NEXT: andl $7, %edi595; AVX1-NEXT: vmovd %edi, %xmm0596; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]597; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]598; AVX1-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1599; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0600; AVX1-NEXT: retq601;602; AVX2-LABEL: PR47448_uge:603; AVX2: # %bb.0:604; AVX2-NEXT: andl $7, %edi605; AVX2-NEXT: vmovd %edi, %xmm0606; AVX2-NEXT: vpbroadcastw %xmm0, %xmm0607; AVX2-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1608; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0609; AVX2-NEXT: retq610 %2 = and i16 %0, 7611 %3 = insertelement <8 x i16> undef, i16 %2, i32 0612 %4 = shufflevector <8 x i16> %3, <8 x i16> undef, <8 x i32> zeroinitializer613 %5 = icmp uge <8 x i16> %4, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>614 %6 = sext <8 x i1> %5 to <8 x i16>615 ret <8 x i16> %6616}617 618define <8 x i16> @PR47448_ugt(i16 signext %0) {619; SSE-LABEL: PR47448_ugt:620; SSE: # %bb.0:621; SSE-NEXT: andl $7, %edi622; SSE-NEXT: movd %edi, %xmm0623; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]624; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]625; SSE-NEXT: pcmpgtw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0626; SSE-NEXT: retq627;628; AVX1-LABEL: PR47448_ugt:629; AVX1: # %bb.0:630; AVX1-NEXT: andl $7, %edi631; AVX1-NEXT: vmovd %edi, %xmm0632; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]633; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]634; AVX1-NEXT: vpcmpgtw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0635; AVX1-NEXT: retq636;637; AVX2-LABEL: PR47448_ugt:638; AVX2: # %bb.0:639; AVX2-NEXT: andl $7, %edi640; AVX2-NEXT: vmovd %edi, %xmm0641; AVX2-NEXT: vpbroadcastw %xmm0, %xmm0642; AVX2-NEXT: vpcmpgtw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0643; AVX2-NEXT: retq644 %2 = and i16 %0, 7645 %3 = insertelement <8 x i16> undef, i16 %2, i32 0646 %4 = shufflevector <8 x i16> %3, <8 x i16> undef, <8 x i32> zeroinitializer647 %5 = icmp ugt <8 x i16> %4, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>648 %6 = sext <8 x i1> %5 to <8 x i16>649 ret <8 x i16> %6650}651 652; Recognise the knownbits from X86ISD::AND in previous block.653define void @PR54171(ptr %mask0, ptr %mask1, i64 %i) {654; SSE-LABEL: PR54171:655; SSE: # %bb.0: # %entry656; SSE-NEXT: andq $7, %rdx657; SSE-NEXT: je .LBB18_2658; SSE-NEXT: # %bb.1: # %if.then659; SSE-NEXT: movd %edx, %xmm0660; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]661; SSE-NEXT: movdqa %xmm0, %xmm1662; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1663; SSE-NEXT: movdqa %xmm0, %xmm2664; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2665; SSE-NEXT: movdqa %xmm2, (%rdi)666; SSE-NEXT: movdqa %xmm1, 16(%rdi)667; SSE-NEXT: movdqa %xmm0, %xmm1668; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1669; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0670; SSE-NEXT: movdqa %xmm0, (%rsi)671; SSE-NEXT: movdqa %xmm1, 16(%rsi)672; SSE-NEXT: .LBB18_2: # %if.end673; SSE-NEXT: retq674;675; AVX1-LABEL: PR54171:676; AVX1: # %bb.0: # %entry677; AVX1-NEXT: andq $7, %rdx678; AVX1-NEXT: je .LBB18_2679; AVX1-NEXT: # %bb.1: # %if.then680; AVX1-NEXT: vmovd %edx, %xmm0681; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]682; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0683; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm0684; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [0.0E+0,0.0E+0,1.0E+0,1.0E+0,2.0E+0,2.0E+0,3.0E+0,3.0E+0]685; AVX1-NEXT: vcmpltps %ymm0, %ymm1, %ymm1686; AVX1-NEXT: vmovaps %ymm1, (%rdi)687; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [4.0E+0,4.0E+0,5.0E+0,5.0E+0,6.0E+0,6.0E+0,7.0E+0,7.0E+0]688; AVX1-NEXT: vcmpltps %ymm0, %ymm1, %ymm0689; AVX1-NEXT: vmovaps %ymm0, (%rsi)690; AVX1-NEXT: .LBB18_2: # %if.end691; AVX1-NEXT: vzeroupper692; AVX1-NEXT: retq693;694; AVX2-LABEL: PR54171:695; AVX2: # %bb.0: # %entry696; AVX2-NEXT: andq $7, %rdx697; AVX2-NEXT: je .LBB18_2698; AVX2-NEXT: # %bb.1: # %if.then699; AVX2-NEXT: vmovd %edx, %xmm0700; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0701; AVX2-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1702; AVX2-NEXT: vmovdqa %ymm1, (%rdi)703; AVX2-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0704; AVX2-NEXT: vmovdqa %ymm0, (%rsi)705; AVX2-NEXT: .LBB18_2: # %if.end706; AVX2-NEXT: vzeroupper707; AVX2-NEXT: retq708entry:709 %sub = and i64 %i, 7710 %cmp.not = icmp eq i64 %sub, 0711 br i1 %cmp.not, label %if.end, label %if.then712 713if.then:714 %conv = trunc i64 %sub to i32715 %vecinit.i.i = insertelement <8 x i32> undef, i32 %conv, i64 0716 %vecinit7.i.i = shufflevector <8 x i32> %vecinit.i.i, <8 x i32> poison, <8 x i32> zeroinitializer717 %cmp.i = icmp ugt <8 x i32> %vecinit7.i.i, <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3>718 %sext.i = sext <8 x i1> %cmp.i to <8 x i32>719 store <8 x i32> %sext.i, ptr %mask0, align 32720 %cmp.i18 = icmp ugt <8 x i32> %vecinit7.i.i, <i32 4, i32 4, i32 5, i32 5, i32 6, i32 6, i32 7, i32 7>721 %sext.i19 = sext <8 x i1> %cmp.i18 to <8 x i32>722 store <8 x i32> %sext.i19, ptr %mask1, align 32723 br label %if.end724 725if.end:726 ret void727}728