379 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=CHECK,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=CHECK,SSE44; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX25 6; Given:7; icmp eq/ne (urem %x, C), 08; Iff C is not a power of two (those should not get to here though),9; and %x may have at most one bit set, omit the 'urem':10; icmp eq/ne %x, 011 12;------------------------------------------------------------------------------;13; Basic scalar tests14;------------------------------------------------------------------------------;15 16define i1 @p0_scalar_urem_by_const(i32 %x, i32 %y) {17; CHECK-LABEL: p0_scalar_urem_by_const:18; CHECK: # %bb.0:19; CHECK-NEXT: testb %dil, %dil20; CHECK-NEXT: setns %al21; CHECK-NEXT: retq22 %t0 = and i32 %x, 128 ; clearly a power-of-two or zero23 %t1 = urem i32 %t0, 6 ; '6' is clearly not a power of two24 %t2 = icmp eq i32 %t1, 025 ret i1 %t226}27 28define i1 @p1_scalar_urem_by_nonconst(i32 %x, i32 %y) {29; CHECK-LABEL: p1_scalar_urem_by_nonconst:30; CHECK: # %bb.0:31; CHECK-NEXT: testb %dil, %dil32; CHECK-NEXT: setns %al33; CHECK-NEXT: retq34 %t0 = and i32 %x, 128 ; clearly a power-of-two or zero35 %t1 = or i32 %y, 6 ; two bits set, clearly not a power of two36 %t2 = urem i32 %t0, %t137 %t3 = icmp eq i32 %t2, 038 ret i1 %t339}40 41define i1 @p2_scalar_shifted_urem_by_const(i32 %x, i32 %y) {42; CHECK-LABEL: p2_scalar_shifted_urem_by_const:43; CHECK: # %bb.0:44; CHECK-NEXT: movl %esi, %ecx45; CHECK-NEXT: andl $1, %edi46; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx47; CHECK-NEXT: shll %cl, %edi48; CHECK-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB49; CHECK-NEXT: cmpl $1431655766, %eax # imm = 0x5555555650; CHECK-NEXT: setb %al51; CHECK-NEXT: retq52 %t0 = and i32 %x, 1 ; clearly a power-of-two or zero53 %t1 = shl i32 %t0, %y ; will still be a power-of-two or zero with any %y54 %t2 = urem i32 %t1, 3 ; '3' is clearly not a power of two55 %t3 = icmp eq i32 %t2, 056 ret i1 %t357}58 59define i1 @p3_scalar_shifted2_urem_by_const(i32 %x, i32 %y) {60; CHECK-LABEL: p3_scalar_shifted2_urem_by_const:61; CHECK: # %bb.0:62; CHECK-NEXT: movl %esi, %ecx63; CHECK-NEXT: andl $2, %edi64; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx65; CHECK-NEXT: shll %cl, %edi66; CHECK-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB67; CHECK-NEXT: cmpl $1431655766, %eax # imm = 0x5555555668; CHECK-NEXT: setb %al69; CHECK-NEXT: retq70 %t0 = and i32 %x, 2 ; clearly a power-of-two or zero71 %t1 = shl i32 %t0, %y ; will still be a power-of-two or zero with any %y72 %t2 = urem i32 %t1, 3 ; '3' is clearly not a power of two73 %t3 = icmp eq i32 %t2, 074 ret i1 %t375}76 77;------------------------------------------------------------------------------;78; Basic vector tests79;------------------------------------------------------------------------------;80 81define <4 x i1> @p4_vector_urem_by_const__splat(<4 x i32> %x, <4 x i32> %y) {82; SSE2-LABEL: p4_vector_urem_by_const__splat:83; SSE2: # %bb.0:84; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm085; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2863311531,2863311531,2863311531,2863311531]86; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]87; SSE2-NEXT: pmuludq %xmm1, %xmm088; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]89; SSE2-NEXT: pmuludq %xmm1, %xmm290; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]91; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]92; SSE2-NEXT: movdqa %xmm3, %xmm093; SSE2-NEXT: psrld $1, %xmm094; SSE2-NEXT: pslld $31, %xmm395; SSE2-NEXT: por %xmm0, %xmm396; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [715827883,715827883,715827883,715827883]97; SSE2-NEXT: pcmpgtd %xmm3, %xmm098; SSE2-NEXT: retq99;100; SSE4-LABEL: p4_vector_urem_by_const__splat:101; SSE4: # %bb.0:102; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0103; SSE4-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2863311531,2863311531,2863311531,2863311531]104; SSE4-NEXT: psrld $1, %xmm0105; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [715827883,715827883,715827883,715827883]106; SSE4-NEXT: pcmpgtd %xmm0, %xmm1107; SSE4-NEXT: movdqa %xmm1, %xmm0108; SSE4-NEXT: retq109;110; AVX2-LABEL: p4_vector_urem_by_const__splat:111; AVX2: # %bb.0:112; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [128,128,128,128]113; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0114; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2863311531,2863311531,2863311531,2863311531]115; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0116; AVX2-NEXT: vpsrld $1, %xmm0, %xmm0117; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [715827883,715827883,715827883,715827883]118; AVX2-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0119; AVX2-NEXT: retq120 %t0 = and <4 x i32> %x, <i32 128, i32 128, i32 128, i32 128> ; clearly a power-of-two or zero121 %t1 = urem <4 x i32> %t0, <i32 6, i32 6, i32 6, i32 6> ; '6' is clearly not a power of two122 %t2 = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0>123 ret <4 x i1> %t2124}125 126define <4 x i1> @p5_vector_urem_by_const__nonsplat(<4 x i32> %x, <4 x i32> %y) {127; SSE2-LABEL: p5_vector_urem_by_const__nonsplat:128; SSE2: # %bb.0:129; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0130; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]131; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3435973837,u,954437177,u]132; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]133; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2863311531,3435973837,2863311531,954437177]134; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,u,2147483648,u]135; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]136; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]137; SSE2-NEXT: psrlq $32, %xmm0138; SSE2-NEXT: por %xmm2, %xmm0139; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0140; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0141; SSE2-NEXT: pcmpeqd %xmm1, %xmm1142; SSE2-NEXT: pxor %xmm1, %xmm0143; SSE2-NEXT: retq144;145; SSE4-LABEL: p5_vector_urem_by_const__nonsplat:146; SSE4: # %bb.0:147; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0148; SSE4-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2863311531,3435973837,2863311531,954437177]149; SSE4-NEXT: pmovzxdq {{.*#+}} xmm1 = [1,2147483648]150; SSE4-NEXT: pmuludq %xmm0, %xmm1151; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]152; SSE4-NEXT: psrlq $32, %xmm1153; SSE4-NEXT: por %xmm1, %xmm0154; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [1431655765,858993459,715827882,477218588]155; SSE4-NEXT: pminud %xmm0, %xmm1156; SSE4-NEXT: pcmpeqd %xmm1, %xmm0157; SSE4-NEXT: retq158;159; AVX2-LABEL: p5_vector_urem_by_const__nonsplat:160; AVX2: # %bb.0:161; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0162; AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [2863311531,3435973837,2863311531,954437177]163; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1164; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0165; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0166; AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1167; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0168; AVX2-NEXT: retq169 %t0 = and <4 x i32> %x, <i32 128, i32 2, i32 4, i32 8>170 %t1 = urem <4 x i32> %t0, <i32 3, i32 5, i32 6, i32 9>171 %t2 = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0>172 ret <4 x i1> %t2173}174 175define <4 x i1> @p6_vector_urem_by_const__nonsplat_undef0(<4 x i32> %x, <4 x i32> %y) {176; SSE2-LABEL: p6_vector_urem_by_const__nonsplat_undef0:177; SSE2: # %bb.0:178; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0179; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2863311531,2863311531,2863311531,2863311531]180; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]181; SSE2-NEXT: pmuludq %xmm1, %xmm0182; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]183; SSE2-NEXT: pmuludq %xmm1, %xmm2184; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]185; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]186; SSE2-NEXT: movdqa %xmm3, %xmm0187; SSE2-NEXT: psrld $1, %xmm0188; SSE2-NEXT: pslld $31, %xmm3189; SSE2-NEXT: por %xmm0, %xmm3190; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3191; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3192; SSE2-NEXT: pcmpeqd %xmm0, %xmm0193; SSE2-NEXT: pxor %xmm3, %xmm0194; SSE2-NEXT: retq195;196; SSE4-LABEL: p6_vector_urem_by_const__nonsplat_undef0:197; SSE4: # %bb.0:198; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0199; SSE4-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2863311531,2863311531,2863311531,2863311531]200; SSE4-NEXT: movdqa %xmm0, %xmm1201; SSE4-NEXT: psrld $1, %xmm1202; SSE4-NEXT: pslld $31, %xmm0203; SSE4-NEXT: por %xmm1, %xmm0204; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [715827882,715827882,715827882,715827882]205; SSE4-NEXT: pminud %xmm0, %xmm1206; SSE4-NEXT: pcmpeqd %xmm1, %xmm0207; SSE4-NEXT: retq208;209; AVX2-LABEL: p6_vector_urem_by_const__nonsplat_undef0:210; AVX2: # %bb.0:211; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [128,128,128,128]212; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0213; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2863311531,2863311531,2863311531,2863311531]214; AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0215; AVX2-NEXT: vpsrld $1, %xmm0, %xmm0216; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [715827882,715827882,715827882,715827882]217; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm1218; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0219; AVX2-NEXT: retq220 %t0 = and <4 x i32> %x, <i32 128, i32 128, i32 undef, i32 128>221 %t1 = urem <4 x i32> %t0, <i32 6, i32 6, i32 6, i32 6> ; '6' is clearly not a power of two222 %t2 = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0>223 ret <4 x i1> %t2224}225 226define <4 x i1> @p7_vector_urem_by_const__nonsplat_undef2(<4 x i32> %x, <4 x i32> %y) {227; SSE2-LABEL: p7_vector_urem_by_const__nonsplat_undef2:228; SSE2: # %bb.0:229; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0230; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [715827883,715827883,715827883,715827883]231; SSE2-NEXT: movdqa %xmm0, %xmm2232; SSE2-NEXT: pmuludq %xmm1, %xmm2233; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]234; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]235; SSE2-NEXT: pmuludq %xmm1, %xmm3236; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]237; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]238; SSE2-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [6,0,6,0,6,0,6,0]239; SSE2-NEXT: psubd %xmm2, %xmm0240; SSE2-NEXT: pxor %xmm1, %xmm1241; SSE2-NEXT: pcmpeqd %xmm1, %xmm0242; SSE2-NEXT: retq243;244; SSE4-LABEL: p7_vector_urem_by_const__nonsplat_undef2:245; SSE4: # %bb.0:246; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0247; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]248; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [715827883,715827883,715827883,715827883]249; SSE4-NEXT: pmuludq %xmm2, %xmm1250; SSE4-NEXT: pmuludq %xmm0, %xmm2251; SSE4-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]252; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]253; SSE4-NEXT: pmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [6,0,6,0,6,0,6,0]254; SSE4-NEXT: psubd %xmm2, %xmm0255; SSE4-NEXT: pxor %xmm1, %xmm1256; SSE4-NEXT: pcmpeqd %xmm1, %xmm0257; SSE4-NEXT: retq258;259; AVX2-LABEL: p7_vector_urem_by_const__nonsplat_undef2:260; AVX2: # %bb.0:261; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [128,128,128,128]262; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0263; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]264; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [715827883,715827883,715827883,715827883]265; AVX2-NEXT: vpmuludq %xmm2, %xmm1, %xmm1266; AVX2-NEXT: vpmuludq %xmm2, %xmm0, %xmm2267; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]268; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]269; AVX2-NEXT: vpmaddwd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [6,0,6,0,6,0,6,0]270; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0271; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1272; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0273; AVX2-NEXT: retq274 %t0 = and <4 x i32> %x, <i32 128, i32 128, i32 128, i32 128> ; clearly a power-of-two or zero275 %t1 = urem <4 x i32> %t0, <i32 6, i32 6, i32 6, i32 6> ; '6' is clearly not a power of two276 %t2 = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 undef, i32 0>277 ret <4 x i1> %t2278}279 280define <4 x i1> @p8_vector_urem_by_const__nonsplat_undef3(<4 x i32> %x, <4 x i32> %y) {281; SSE2-LABEL: p8_vector_urem_by_const__nonsplat_undef3:282; SSE2: # %bb.0:283; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0284; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2863311531,2863311531,2863311531,2863311531]285; SSE2-NEXT: movdqa %xmm0, %xmm2286; SSE2-NEXT: pmuludq %xmm1, %xmm2287; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]288; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]289; SSE2-NEXT: pmuludq %xmm1, %xmm3290; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]291; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]292; SSE2-NEXT: psrld $2, %xmm2293; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [6,6,6,6]294; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]295; SSE2-NEXT: pmuludq %xmm1, %xmm2296; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]297; SSE2-NEXT: pmuludq %xmm1, %xmm3298; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]299; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]300; SSE2-NEXT: psubd %xmm2, %xmm0301; SSE2-NEXT: pxor %xmm1, %xmm1302; SSE2-NEXT: pcmpeqd %xmm1, %xmm0303; SSE2-NEXT: retq304;305; SSE4-LABEL: p8_vector_urem_by_const__nonsplat_undef3:306; SSE4: # %bb.0:307; SSE4-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0308; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]309; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [2863311531,2863311531,2863311531,2863311531]310; SSE4-NEXT: pmuludq %xmm2, %xmm1311; SSE4-NEXT: pmuludq %xmm0, %xmm2312; SSE4-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]313; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]314; SSE4-NEXT: psrld $2, %xmm2315; SSE4-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [6,6,6,6]316; SSE4-NEXT: psubd %xmm2, %xmm0317; SSE4-NEXT: pxor %xmm1, %xmm1318; SSE4-NEXT: pcmpeqd %xmm1, %xmm0319; SSE4-NEXT: retq320;321; AVX2-LABEL: p8_vector_urem_by_const__nonsplat_undef3:322; AVX2: # %bb.0:323; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [128,128,128,128]324; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0325; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]326; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [2863311531,2863311531,2863311531,2863311531]327; AVX2-NEXT: vpmuludq %xmm2, %xmm1, %xmm1328; AVX2-NEXT: vpmuludq %xmm2, %xmm0, %xmm2329; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]330; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]331; AVX2-NEXT: vpsrld $2, %xmm1, %xmm1332; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [6,6,6,6]333; AVX2-NEXT: vpmulld %xmm2, %xmm1, %xmm1334; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0335; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1336; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0337; AVX2-NEXT: retq338 %t0 = and <4 x i32> %x, <i32 128, i32 128, i32 undef, i32 128>339 %t1 = urem <4 x i32> %t0, <i32 6, i32 6, i32 6, i32 6> ; '6' is clearly not a power of two340 %t2 = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 undef, i32 0>341 ret <4 x i1> %t2342}343 344;------------------------------------------------------------------------------;345; Basic negative tests346;------------------------------------------------------------------------------;347 348define i1 @n0_urem_of_maybe_not_power_of_two(i32 %x, i32 %y) {349; CHECK-LABEL: n0_urem_of_maybe_not_power_of_two:350; CHECK: # %bb.0:351; CHECK-NEXT: andl $3, %edi352; CHECK-NEXT: imull $-1431655765, %edi, %eax # imm = 0xAAAAAAAB353; CHECK-NEXT: cmpl $1431655766, %eax # imm = 0x55555556354; CHECK-NEXT: setb %al355; CHECK-NEXT: retq356 %t0 = and i32 %x, 3 ; up to two bits set, not power-of-two357 %t1 = urem i32 %t0, 3358 %t2 = icmp eq i32 %t1, 0359 ret i1 %t2360}361 362define i1 @n1_urem_by_maybe_power_of_two(i32 %x, i32 %y) {363; CHECK-LABEL: n1_urem_by_maybe_power_of_two:364; CHECK: # %bb.0:365; CHECK-NEXT: movl %edi, %eax366; CHECK-NEXT: andl $128, %eax367; CHECK-NEXT: orl $1, %esi368; CHECK-NEXT: xorl %edx, %edx369; CHECK-NEXT: divl %esi370; CHECK-NEXT: testl %edx, %edx371; CHECK-NEXT: sete %al372; CHECK-NEXT: retq373 %t0 = and i32 %x, 128 ; clearly a power-of-two or zero374 %t1 = or i32 %y, 1 ; one low bit set, may be a power of two375 %t2 = urem i32 %t0, %t1376 %t3 = icmp eq i32 %t2, 0377 ret i1 %t3378}379