brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.3 KiB · 9729fd7 Raw
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