brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.6 KiB · 97124f0 Raw
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