2490 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 < %s | FileCheck %s --check-prefix=CHECK-SSE23; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 < %s | FileCheck %s --check-prefix=CHECK-SSE414; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefix=CHECK-AVX15; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefix=CHECK-AVX26; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefix=CHECK-AVX512VL7 8; Odd+Even divisors9define <4 x i32> @test_srem_odd_even(<4 x i32> %X) nounwind {10; CHECK-SSE2-LABEL: test_srem_odd_even:11; CHECK-SSE2: # %bb.0:12; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]13; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,3264175145,3264175145]14; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]15; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3067833783,u,3264175145,u]16; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]17; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]18; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm019; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]20; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]21; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,2147483648,1073741824,1073741824]22; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]23; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]24; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm025; CHECK-SSE2-NEXT: por %xmm1, %xmm026; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm027; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm028; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm029; CHECK-SSE2-NEXT: retq30;31; CHECK-SSE41-LABEL: test_srem_odd_even:32; CHECK-SSE41: # %bb.0:33; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,3264175145,3264175145]34; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm035; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]36; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2147483648,2147483648,1073741824,1073741824]37; CHECK-SSE41-NEXT: pxor %xmm2, %xmm238; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]39; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]40; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]41; CHECK-SSE41-NEXT: por %xmm2, %xmm042; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,306783378,171798690,42949672]43; CHECK-SSE41-NEXT: pminud %xmm0, %xmm144; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm045; CHECK-SSE41-NEXT: psrld $31, %xmm046; CHECK-SSE41-NEXT: retq47;48; CHECK-AVX1-LABEL: test_srem_odd_even:49; CHECK-AVX1: # %bb.0:50; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,3264175145,3264175145]51; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm052; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]53; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2147483648,2147483648,1073741824,1073741824]54; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm255; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]56; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]57; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]58; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm059; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm160; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm061; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm062; CHECK-AVX1-NEXT: retq63;64; CHECK-AVX2-LABEL: test_srem_odd_even:65; CHECK-AVX2: # %bb.0:66; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,3264175145,3264175145]67; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm068; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm169; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm070; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm071; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm172; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm073; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm074; CHECK-AVX2-NEXT: retq75;76; CHECK-AVX512VL-LABEL: test_srem_odd_even:77; CHECK-AVX512VL: # %bb.0:78; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,3264175145,3264175145]79; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm080; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm081; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm182; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm083; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm084; CHECK-AVX512VL-NEXT: retq85 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 25, i32 100>86 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>87 %ret = zext <4 x i1> %cmp to <4 x i32>88 ret <4 x i32> %ret89}90 91;==============================================================================;92 93; One all-ones divisor in odd divisor94define <4 x i32> @test_srem_odd_allones_eq(<4 x i32> %X) nounwind {95; CHECK-SSE2-LABEL: test_srem_odd_allones_eq:96; CHECK-SSE2: # %bb.0:97; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]98; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]99; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm0100; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]101; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm2102; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]103; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]104; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0105; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0106; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0107; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0108; CHECK-SSE2-NEXT: retq109;110; CHECK-SSE41-LABEL: test_srem_odd_allones_eq:111; CHECK-SSE41: # %bb.0:112; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3435973837,3435973837,3435973837]113; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0114; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,858993458,4294967295,858993458]115; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1116; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0117; CHECK-SSE41-NEXT: psrld $31, %xmm0118; CHECK-SSE41-NEXT: retq119;120; CHECK-AVX1-LABEL: test_srem_odd_allones_eq:121; CHECK-AVX1: # %bb.0:122; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,3435973837,3435973837]123; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0124; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1125; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0126; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0127; CHECK-AVX1-NEXT: retq128;129; CHECK-AVX2-LABEL: test_srem_odd_allones_eq:130; CHECK-AVX2: # %bb.0:131; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]132; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0133; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [429496729,429496729,429496729,429496729]134; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0135; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1136; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0137; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0138; CHECK-AVX2-NEXT: retq139;140; CHECK-AVX512VL-LABEL: test_srem_odd_allones_eq:141; CHECK-AVX512VL: # %bb.0:142; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0143; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0144; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1145; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0146; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0147; CHECK-AVX512VL-NEXT: retq148 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 4294967295, i32 5>149 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>150 %ret = zext <4 x i1> %cmp to <4 x i32>151 ret <4 x i32> %ret152}153define <4 x i32> @test_srem_odd_allones_ne(<4 x i32> %X) nounwind {154; CHECK-SSE2-LABEL: test_srem_odd_allones_ne:155; CHECK-SSE2: # %bb.0:156; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]157; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]158; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm0159; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]160; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm2161; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]162; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]163; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0164; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0165; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0166; CHECK-SSE2-NEXT: psrld $31, %xmm0167; CHECK-SSE2-NEXT: retq168;169; CHECK-SSE41-LABEL: test_srem_odd_allones_ne:170; CHECK-SSE41: # %bb.0:171; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3435973837,3435973837,3435973837]172; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0173; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,858993458,4294967295,858993458]174; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1175; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0176; CHECK-SSE41-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0177; CHECK-SSE41-NEXT: retq178;179; CHECK-AVX1-LABEL: test_srem_odd_allones_ne:180; CHECK-AVX1: # %bb.0:181; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,3435973837,3435973837]182; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0183; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1184; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0185; CHECK-AVX1-NEXT: vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0186; CHECK-AVX1-NEXT: retq187;188; CHECK-AVX2-LABEL: test_srem_odd_allones_ne:189; CHECK-AVX2: # %bb.0:190; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]191; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0192; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [429496729,429496729,429496729,429496729]193; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0194; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1195; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0196; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]197; CHECK-AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm0198; CHECK-AVX2-NEXT: retq199;200; CHECK-AVX512VL-LABEL: test_srem_odd_allones_ne:201; CHECK-AVX512VL: # %bb.0:202; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0203; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0204; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1205; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0206; CHECK-AVX512VL-NEXT: vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0207; CHECK-AVX512VL-NEXT: retq208 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 4294967295, i32 5>209 %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>210 %ret = zext <4 x i1> %cmp to <4 x i32>211 ret <4 x i32> %ret212}213 214; One all-ones divisor in even divisor215define <4 x i32> @test_srem_even_allones_eq(<4 x i32> %X) nounwind {216; CHECK-SSE2-LABEL: test_srem_even_allones_eq:217; CHECK-SSE2: # %bb.0:218; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]219; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]220; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm0221; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]222; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm2223; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]224; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]225; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0226; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm1227; CHECK-SSE2-NEXT: psrld $1, %xmm1228; CHECK-SSE2-NEXT: pslld $31, %xmm0229; CHECK-SSE2-NEXT: por %xmm1, %xmm0230; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0231; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0232; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0233; CHECK-SSE2-NEXT: retq234;235; CHECK-SSE41-LABEL: test_srem_even_allones_eq:236; CHECK-SSE41: # %bb.0:237; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,3067833783,3067833783,3067833783]238; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0239; CHECK-SSE41-NEXT: movdqa %xmm0, %xmm1240; CHECK-SSE41-NEXT: psrld $1, %xmm1241; CHECK-SSE41-NEXT: pslld $31, %xmm0242; CHECK-SSE41-NEXT: por %xmm1, %xmm0243; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,306783378,4294967295,306783378]244; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1245; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0246; CHECK-SSE41-NEXT: psrld $31, %xmm0247; CHECK-SSE41-NEXT: retq248;249; CHECK-AVX1-LABEL: test_srem_even_allones_eq:250; CHECK-AVX1: # %bb.0:251; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,3067833783,3067833783]252; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0253; CHECK-AVX1-NEXT: vpsrld $1, %xmm0, %xmm1254; CHECK-AVX1-NEXT: vpslld $31, %xmm0, %xmm0255; CHECK-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0256; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1257; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0258; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0259; CHECK-AVX1-NEXT: retq260;261; CHECK-AVX2-LABEL: test_srem_even_allones_eq:262; CHECK-AVX2: # %bb.0:263; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]264; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0265; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [306783378,306783378,306783378,306783378]266; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0267; CHECK-AVX2-NEXT: vpsrld $1, %xmm0, %xmm1268; CHECK-AVX2-NEXT: vpslld $31, %xmm0, %xmm0269; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0270; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1271; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0272; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0273; CHECK-AVX2-NEXT: retq274;275; CHECK-AVX512VL-LABEL: test_srem_even_allones_eq:276; CHECK-AVX512VL: # %bb.0:277; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0278; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0279; CHECK-AVX512VL-NEXT: vprord $1, %xmm0, %xmm0280; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1281; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0282; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0283; CHECK-AVX512VL-NEXT: retq284 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 4294967295, i32 14>285 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>286 %ret = zext <4 x i1> %cmp to <4 x i32>287 ret <4 x i32> %ret288}289define <4 x i32> @test_srem_even_allones_ne(<4 x i32> %X) nounwind {290; CHECK-SSE2-LABEL: test_srem_even_allones_ne:291; CHECK-SSE2: # %bb.0:292; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]293; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]294; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm0295; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]296; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm2297; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]298; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]299; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0300; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm1301; CHECK-SSE2-NEXT: psrld $1, %xmm1302; CHECK-SSE2-NEXT: pslld $31, %xmm0303; CHECK-SSE2-NEXT: por %xmm1, %xmm0304; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0305; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0306; CHECK-SSE2-NEXT: psrld $31, %xmm0307; CHECK-SSE2-NEXT: retq308;309; CHECK-SSE41-LABEL: test_srem_even_allones_ne:310; CHECK-SSE41: # %bb.0:311; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,3067833783,3067833783,3067833783]312; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0313; CHECK-SSE41-NEXT: movdqa %xmm0, %xmm1314; CHECK-SSE41-NEXT: psrld $1, %xmm1315; CHECK-SSE41-NEXT: pslld $31, %xmm0316; CHECK-SSE41-NEXT: por %xmm1, %xmm0317; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,306783378,4294967295,306783378]318; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1319; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0320; CHECK-SSE41-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0321; CHECK-SSE41-NEXT: retq322;323; CHECK-AVX1-LABEL: test_srem_even_allones_ne:324; CHECK-AVX1: # %bb.0:325; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,3067833783,3067833783]326; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0327; CHECK-AVX1-NEXT: vpsrld $1, %xmm0, %xmm1328; CHECK-AVX1-NEXT: vpslld $31, %xmm0, %xmm0329; CHECK-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0330; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1331; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0332; CHECK-AVX1-NEXT: vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0333; CHECK-AVX1-NEXT: retq334;335; CHECK-AVX2-LABEL: test_srem_even_allones_ne:336; CHECK-AVX2: # %bb.0:337; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]338; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0339; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [306783378,306783378,306783378,306783378]340; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0341; CHECK-AVX2-NEXT: vpsrld $1, %xmm0, %xmm1342; CHECK-AVX2-NEXT: vpslld $31, %xmm0, %xmm0343; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0344; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1345; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0346; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]347; CHECK-AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm0348; CHECK-AVX2-NEXT: retq349;350; CHECK-AVX512VL-LABEL: test_srem_even_allones_ne:351; CHECK-AVX512VL: # %bb.0:352; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0353; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0354; CHECK-AVX512VL-NEXT: vprord $1, %xmm0, %xmm0355; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1356; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0357; CHECK-AVX512VL-NEXT: vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0358; CHECK-AVX512VL-NEXT: retq359 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 4294967295, i32 14>360 %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>361 %ret = zext <4 x i1> %cmp to <4 x i32>362 ret <4 x i32> %ret363}364 365; One all-ones divisor in odd+even divisor366define <4 x i32> @test_srem_odd_even_allones_eq(<4 x i32> %X) nounwind {367; CHECK-SSE2-LABEL: test_srem_odd_even_allones_eq:368; CHECK-SSE2: # %bb.0:369; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]370; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,0,3264175145]371; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]372; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3067833783,u,3264175145,u]373; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]374; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]375; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0376; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]377; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]378; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,2147483648,1073741824,1073741824]379; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]380; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]381; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0382; CHECK-SSE2-NEXT: por %xmm1, %xmm0383; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0384; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0385; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0386; CHECK-SSE2-NEXT: retq387;388; CHECK-SSE41-LABEL: test_srem_odd_even_allones_eq:389; CHECK-SSE41: # %bb.0:390; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,0,3264175145]391; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0392; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]393; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2147483648,2147483648,1073741824,1073741824]394; CHECK-SSE41-NEXT: pxor %xmm2, %xmm2395; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]396; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]397; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]398; CHECK-SSE41-NEXT: por %xmm2, %xmm0399; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,306783378,4294967295,42949672]400; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1401; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0402; CHECK-SSE41-NEXT: psrld $31, %xmm0403; CHECK-SSE41-NEXT: retq404;405; CHECK-AVX1-LABEL: test_srem_odd_even_allones_eq:406; CHECK-AVX1: # %bb.0:407; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]408; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0409; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]410; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2147483648,2147483648,1073741824,1073741824]411; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2412; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]413; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]414; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]415; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0416; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1417; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0418; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0419; CHECK-AVX1-NEXT: retq420;421; CHECK-AVX2-LABEL: test_srem_odd_even_allones_eq:422; CHECK-AVX2: # %bb.0:423; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]424; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0425; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1426; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0427; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0428; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1429; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0430; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0431; CHECK-AVX2-NEXT: retq432;433; CHECK-AVX512VL-LABEL: test_srem_odd_even_allones_eq:434; CHECK-AVX512VL: # %bb.0:435; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]436; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0437; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0438; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1439; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0440; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0441; CHECK-AVX512VL-NEXT: retq442 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 4294967295, i32 100>443 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>444 %ret = zext <4 x i1> %cmp to <4 x i32>445 ret <4 x i32> %ret446}447define <4 x i32> @test_srem_odd_even_allones_ne(<4 x i32> %X) nounwind {448; CHECK-SSE2-LABEL: test_srem_odd_even_allones_ne:449; CHECK-SSE2: # %bb.0:450; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]451; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,0,3264175145]452; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]453; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3067833783,u,3264175145,u]454; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]455; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]456; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0457; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]458; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]459; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,2147483648,1073741824,1073741824]460; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]461; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]462; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0463; CHECK-SSE2-NEXT: por %xmm1, %xmm0464; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0465; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0466; CHECK-SSE2-NEXT: psrld $31, %xmm0467; CHECK-SSE2-NEXT: retq468;469; CHECK-SSE41-LABEL: test_srem_odd_even_allones_ne:470; CHECK-SSE41: # %bb.0:471; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,0,3264175145]472; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0473; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]474; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2147483648,2147483648,1073741824,1073741824]475; CHECK-SSE41-NEXT: pxor %xmm2, %xmm2476; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]477; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]478; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]479; CHECK-SSE41-NEXT: por %xmm2, %xmm0480; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,306783378,4294967295,42949672]481; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1482; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0483; CHECK-SSE41-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0484; CHECK-SSE41-NEXT: retq485;486; CHECK-AVX1-LABEL: test_srem_odd_even_allones_ne:487; CHECK-AVX1: # %bb.0:488; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]489; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0490; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]491; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2147483648,2147483648,1073741824,1073741824]492; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2493; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]494; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]495; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]496; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0497; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1498; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0499; CHECK-AVX1-NEXT: vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0500; CHECK-AVX1-NEXT: retq501;502; CHECK-AVX2-LABEL: test_srem_odd_even_allones_ne:503; CHECK-AVX2: # %bb.0:504; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]505; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0506; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1507; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0508; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0509; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1510; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0511; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]512; CHECK-AVX2-NEXT: vpandn %xmm1, %xmm0, %xmm0513; CHECK-AVX2-NEXT: retq514;515; CHECK-AVX512VL-LABEL: test_srem_odd_even_allones_ne:516; CHECK-AVX512VL: # %bb.0:517; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]518; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0519; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0520; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1521; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0522; CHECK-AVX512VL-NEXT: vpandnd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0523; CHECK-AVX512VL-NEXT: retq524 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 4294967295, i32 100>525 %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>526 %ret = zext <4 x i1> %cmp to <4 x i32>527 ret <4 x i32> %ret528}529 530;------------------------------------------------------------------------------;531 532; One power-of-two divisor in odd divisor533define <4 x i32> @test_srem_odd_poweroftwo(<4 x i32> %X) nounwind {534; CHECK-SSE2-LABEL: test_srem_odd_poweroftwo:535; CHECK-SSE2: # %bb.0:536; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]537; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,u,1,u]538; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]539; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3435973837,3435973837,3435973837,3435973837]540; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]541; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]542; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0543; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]544; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,u,268435456,u]545; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]546; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]547; CHECK-SSE2-NEXT: psrlq $32, %xmm0548; CHECK-SSE2-NEXT: por %xmm2, %xmm0549; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0550; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0551; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0552; CHECK-SSE2-NEXT: retq553;554; CHECK-SSE41-LABEL: test_srem_odd_poweroftwo:555; CHECK-SSE41: # %bb.0:556; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3435973837,1,3435973837]557; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0558; CHECK-SSE41-NEXT: pmovsxdq {{.*#+}} xmm1 = [1,268435456]559; CHECK-SSE41-NEXT: pmuludq %xmm0, %xmm1560; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]561; CHECK-SSE41-NEXT: psrlq $32, %xmm1562; CHECK-SSE41-NEXT: por %xmm1, %xmm0563; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,858993458,268435455,858993458]564; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1565; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0566; CHECK-SSE41-NEXT: psrld $31, %xmm0567; CHECK-SSE41-NEXT: retq568;569; CHECK-AVX1-LABEL: test_srem_odd_poweroftwo:570; CHECK-AVX1: # %bb.0:571; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,1,3435973837]572; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0573; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [1,u,268435456,u]574; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]575; CHECK-AVX1-NEXT: vpsrlq $32, %xmm1, %xmm1576; CHECK-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0577; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1578; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0579; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0580; CHECK-AVX1-NEXT: retq581;582; CHECK-AVX2-LABEL: test_srem_odd_poweroftwo:583; CHECK-AVX2: # %bb.0:584; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,1,3435973837]585; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0586; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1587; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0588; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0589; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1590; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0591; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0592; CHECK-AVX2-NEXT: retq593;594; CHECK-AVX512VL-LABEL: test_srem_odd_poweroftwo:595; CHECK-AVX512VL: # %bb.0:596; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,1,3435973837]597; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0598; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0599; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1600; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0601; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0602; CHECK-AVX512VL-NEXT: retq603 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 16, i32 5>604 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>605 %ret = zext <4 x i1> %cmp to <4 x i32>606 ret <4 x i32> %ret607}608 609; One power-of-two divisor in even divisor610define <4 x i32> @test_srem_even_poweroftwo(<4 x i32> %X) nounwind {611; CHECK-SSE2-LABEL: test_srem_even_poweroftwo:612; CHECK-SSE2: # %bb.0:613; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]614; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,u,1,u]615; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]616; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3067833783,3067833783,3067833783,3067833783]617; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]618; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]619; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0620; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,268435456,2147483648]621; CHECK-SSE2-NEXT: pmuludq %xmm0, %xmm1622; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]623; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]624; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]625; CHECK-SSE2-NEXT: pmuludq %xmm4, %xmm3626; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,3,2,3]627; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]628; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]629; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]630; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]631; CHECK-SSE2-NEXT: por %xmm2, %xmm0632; CHECK-SSE2-NEXT: pxor %xmm4, %xmm0633; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0634; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0635; CHECK-SSE2-NEXT: retq636;637; CHECK-SSE41-LABEL: test_srem_even_poweroftwo:638; CHECK-SSE41: # %bb.0:639; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,3067833783,1,3067833783]640; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0641; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]642; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2147483648,2147483648,2147483648,2147483648]643; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,2147483648,268435456,2147483648]644; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]645; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]646; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]647; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]648; CHECK-SSE41-NEXT: por %xmm2, %xmm0649; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,306783378,268435455,306783378]650; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1651; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0652; CHECK-SSE41-NEXT: psrld $31, %xmm0653; CHECK-SSE41-NEXT: retq654;655; CHECK-AVX1-LABEL: test_srem_even_poweroftwo:656; CHECK-AVX1: # %bb.0:657; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,1,3067833783]658; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0659; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]660; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2147483648,2147483648,2147483648,2147483648]661; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [2147483648,2147483648,268435456,2147483648]662; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]663; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]664; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]665; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]666; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0667; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1668; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0669; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0670; CHECK-AVX1-NEXT: retq671;672; CHECK-AVX2-LABEL: test_srem_even_poweroftwo:673; CHECK-AVX2: # %bb.0:674; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,1,3067833783]675; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0676; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1677; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0678; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0679; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1680; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0681; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0682; CHECK-AVX2-NEXT: retq683;684; CHECK-AVX512VL-LABEL: test_srem_even_poweroftwo:685; CHECK-AVX512VL: # %bb.0:686; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,1,3067833783]687; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0688; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0689; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1690; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0691; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0692; CHECK-AVX512VL-NEXT: retq693 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 16, i32 14>694 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>695 %ret = zext <4 x i1> %cmp to <4 x i32>696 ret <4 x i32> %ret697}698 699; One power-of-two divisor in odd+even divisor700define <4 x i32> @test_srem_odd_even_poweroftwo(<4 x i32> %X) nounwind {701; CHECK-SSE2-LABEL: test_srem_odd_even_poweroftwo:702; CHECK-SSE2: # %bb.0:703; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]704; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,1,3264175145]705; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]706; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3067833783,u,3264175145,u]707; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]708; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]709; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0710; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2147483648,268435456,1073741824]711; CHECK-SSE2-NEXT: pmuludq %xmm0, %xmm1712; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]713; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]714; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [2147483648,u,1073741824,u]715; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,3,2,3]716; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]717; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]718; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]719; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]720; CHECK-SSE2-NEXT: por %xmm2, %xmm0721; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0722; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0723; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0724; CHECK-SSE2-NEXT: retq725;726; CHECK-SSE41-LABEL: test_srem_odd_even_poweroftwo:727; CHECK-SSE41: # %bb.0:728; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,1,3264175145]729; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0730; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]731; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2147483648,u,1073741824,u]732; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2147483648,268435456,1073741824]733; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]734; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]735; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]736; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]737; CHECK-SSE41-NEXT: por %xmm2, %xmm0738; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,306783378,268435455,42949672]739; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1740; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0741; CHECK-SSE41-NEXT: psrld $31, %xmm0742; CHECK-SSE41-NEXT: retq743;744; CHECK-AVX1-LABEL: test_srem_odd_even_poweroftwo:745; CHECK-AVX1: # %bb.0:746; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,1,3264175145]747; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0748; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]749; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2147483648,u,1073741824,u]750; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2147483648,268435456,1073741824]751; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]752; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]753; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]754; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]755; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0756; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1757; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0758; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0759; CHECK-AVX1-NEXT: retq760;761; CHECK-AVX2-LABEL: test_srem_odd_even_poweroftwo:762; CHECK-AVX2: # %bb.0:763; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,1,3264175145]764; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0765; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1766; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0767; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0768; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1769; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0770; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0771; CHECK-AVX2-NEXT: retq772;773; CHECK-AVX512VL-LABEL: test_srem_odd_even_poweroftwo:774; CHECK-AVX512VL: # %bb.0:775; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,1,3264175145]776; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0777; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0778; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1779; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0780; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0781; CHECK-AVX512VL-NEXT: retq782 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 16, i32 100>783 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>784 %ret = zext <4 x i1> %cmp to <4 x i32>785 ret <4 x i32> %ret786}787 788;------------------------------------------------------------------------------;789 790; One one divisor in odd divisor791define <4 x i32> @test_srem_odd_one(<4 x i32> %X) nounwind {792; CHECK-SSE2-LABEL: test_srem_odd_one:793; CHECK-SSE2: # %bb.0:794; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]795; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]796; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm0797; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]798; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm2799; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]800; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]801; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0802; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0803; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0804; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0805; CHECK-SSE2-NEXT: retq806;807; CHECK-SSE41-LABEL: test_srem_odd_one:808; CHECK-SSE41: # %bb.0:809; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3435973837,3435973837,3435973837]810; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0811; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,858993458,4294967295,858993458]812; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1813; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0814; CHECK-SSE41-NEXT: psrld $31, %xmm0815; CHECK-SSE41-NEXT: retq816;817; CHECK-AVX1-LABEL: test_srem_odd_one:818; CHECK-AVX1: # %bb.0:819; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,3435973837,3435973837]820; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0821; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1822; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0823; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0824; CHECK-AVX1-NEXT: retq825;826; CHECK-AVX2-LABEL: test_srem_odd_one:827; CHECK-AVX2: # %bb.0:828; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]829; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0830; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [429496729,429496729,429496729,429496729]831; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0832; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1833; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0834; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0835; CHECK-AVX2-NEXT: retq836;837; CHECK-AVX512VL-LABEL: test_srem_odd_one:838; CHECK-AVX512VL: # %bb.0:839; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0840; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0841; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1842; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0843; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0844; CHECK-AVX512VL-NEXT: retq845 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 1, i32 5>846 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>847 %ret = zext <4 x i1> %cmp to <4 x i32>848 ret <4 x i32> %ret849}850 851; One one divisor in even divisor852define <4 x i32> @test_srem_even_one(<4 x i32> %X) nounwind {853; CHECK-SSE2-LABEL: test_srem_even_one:854; CHECK-SSE2: # %bb.0:855; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]856; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]857; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm0858; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]859; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm2860; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]861; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]862; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0863; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm1864; CHECK-SSE2-NEXT: psrld $1, %xmm1865; CHECK-SSE2-NEXT: pslld $31, %xmm0866; CHECK-SSE2-NEXT: por %xmm1, %xmm0867; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0868; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0869; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0870; CHECK-SSE2-NEXT: retq871;872; CHECK-SSE41-LABEL: test_srem_even_one:873; CHECK-SSE41: # %bb.0:874; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,3067833783,3067833783,3067833783]875; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0876; CHECK-SSE41-NEXT: movdqa %xmm0, %xmm1877; CHECK-SSE41-NEXT: psrld $1, %xmm1878; CHECK-SSE41-NEXT: pslld $31, %xmm0879; CHECK-SSE41-NEXT: por %xmm1, %xmm0880; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,306783378,4294967295,306783378]881; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1882; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0883; CHECK-SSE41-NEXT: psrld $31, %xmm0884; CHECK-SSE41-NEXT: retq885;886; CHECK-AVX1-LABEL: test_srem_even_one:887; CHECK-AVX1: # %bb.0:888; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,3067833783,3067833783]889; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0890; CHECK-AVX1-NEXT: vpsrld $1, %xmm0, %xmm1891; CHECK-AVX1-NEXT: vpslld $31, %xmm0, %xmm0892; CHECK-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0893; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1894; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0895; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0896; CHECK-AVX1-NEXT: retq897;898; CHECK-AVX2-LABEL: test_srem_even_one:899; CHECK-AVX2: # %bb.0:900; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]901; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0902; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [306783378,306783378,306783378,306783378]903; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0904; CHECK-AVX2-NEXT: vpsrld $1, %xmm0, %xmm1905; CHECK-AVX2-NEXT: vpslld $31, %xmm0, %xmm0906; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0907; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1908; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0909; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0910; CHECK-AVX2-NEXT: retq911;912; CHECK-AVX512VL-LABEL: test_srem_even_one:913; CHECK-AVX512VL: # %bb.0:914; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0915; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0916; CHECK-AVX512VL-NEXT: vprord $1, %xmm0, %xmm0917; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1918; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0919; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm0920; CHECK-AVX512VL-NEXT: retq921 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 1, i32 14>922 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>923 %ret = zext <4 x i1> %cmp to <4 x i32>924 ret <4 x i32> %ret925}926 927; One one divisor in odd+even divisor928define <4 x i32> @test_srem_odd_even_one(<4 x i32> %X) nounwind {929; CHECK-SSE2-LABEL: test_srem_odd_even_one:930; CHECK-SSE2: # %bb.0:931; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]932; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,0,3264175145]933; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]934; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3067833783,u,3264175145,u]935; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]936; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]937; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0938; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]939; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]940; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,2147483648,1073741824,1073741824]941; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]942; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]943; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0944; CHECK-SSE2-NEXT: por %xmm1, %xmm0945; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0946; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0947; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0948; CHECK-SSE2-NEXT: retq949;950; CHECK-SSE41-LABEL: test_srem_odd_even_one:951; CHECK-SSE41: # %bb.0:952; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3067833783,0,3264175145]953; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0954; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]955; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2147483648,2147483648,1073741824,1073741824]956; CHECK-SSE41-NEXT: pxor %xmm2, %xmm2957; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]958; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]959; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]960; CHECK-SSE41-NEXT: por %xmm2, %xmm0961; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,306783378,4294967295,42949672]962; CHECK-SSE41-NEXT: pminud %xmm0, %xmm1963; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm0964; CHECK-SSE41-NEXT: psrld $31, %xmm0965; CHECK-SSE41-NEXT: retq966;967; CHECK-AVX1-LABEL: test_srem_odd_even_one:968; CHECK-AVX1: # %bb.0:969; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]970; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0971; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]972; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2147483648,2147483648,1073741824,1073741824]973; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2974; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]975; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]976; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]977; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0978; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1979; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0980; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm0981; CHECK-AVX1-NEXT: retq982;983; CHECK-AVX2-LABEL: test_srem_odd_even_one:984; CHECK-AVX2: # %bb.0:985; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]986; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0987; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1988; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0989; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0990; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1991; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0992; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm0993; CHECK-AVX2-NEXT: retq994;995; CHECK-AVX512VL-LABEL: test_srem_odd_even_one:996; CHECK-AVX512VL: # %bb.0:997; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,0,3264175145]998; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0999; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01000; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11001; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01002; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01003; CHECK-AVX512VL-NEXT: retq1004 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 1, i32 100>1005 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1006 %ret = zext <4 x i1> %cmp to <4 x i32>1007 ret <4 x i32> %ret1008}1009 1010;------------------------------------------------------------------------------;1011 1012; One INT_MIN divisor in odd divisor1013define <4 x i32> @test_srem_odd_INT_MIN(<4 x i32> %X) nounwind {1014; CHECK-SSE2-LABEL: test_srem_odd_INT_MIN:1015; CHECK-SSE2: # %bb.0:1016; CHECK-SSE2-NEXT: pxor %xmm1, %xmm11017; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]1018; CHECK-SSE2-NEXT: pand %xmm0, %xmm21019; CHECK-SSE2-NEXT: pcmpeqd %xmm1, %xmm21020; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1021; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,u,1,u]1022; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]1023; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [3435973837,3435973837,3435973837,3435973837]1024; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]1025; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]1026; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31027; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31028; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31029; CHECK-SSE2-NEXT: pcmpeqd %xmm0, %xmm01030; CHECK-SSE2-NEXT: pxor %xmm3, %xmm01031; CHECK-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[2,0],xmm0[3,0]1032; CHECK-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0,2]1033; CHECK-SSE2-NEXT: psrld $31, %xmm01034; CHECK-SSE2-NEXT: retq1035;1036; CHECK-SSE41-LABEL: test_srem_odd_INT_MIN:1037; CHECK-SSE41: # %bb.0:1038; CHECK-SSE41-NEXT: pxor %xmm1, %xmm11039; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]1040; CHECK-SSE41-NEXT: pand %xmm0, %xmm21041; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm21042; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3435973837,1,3435973837]1043; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01044; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,858993458,1,858993458]1045; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11046; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01047; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5],xmm0[6,7]1048; CHECK-SSE41-NEXT: psrld $31, %xmm01049; CHECK-SSE41-NEXT: retq1050;1051; CHECK-AVX1-LABEL: test_srem_odd_INT_MIN:1052; CHECK-AVX1: # %bb.0:1053; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11054; CHECK-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm21055; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm11056; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,1,3435973837]1057; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01058; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm21059; CHECK-AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm01060; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]1061; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01062; CHECK-AVX1-NEXT: retq1063;1064; CHECK-AVX2-LABEL: test_srem_odd_INT_MIN:1065; CHECK-AVX2: # %bb.0:1066; CHECK-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11067; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]1068; CHECK-AVX2-NEXT: vpand %xmm2, %xmm0, %xmm21069; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm11070; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,1,3435973837]1071; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01072; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm21073; CHECK-AVX2-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm01074; CHECK-AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]1075; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01076; CHECK-AVX2-NEXT: retq1077;1078; CHECK-AVX512VL-LABEL: test_srem_odd_INT_MIN:1079; CHECK-AVX512VL: # %bb.0:1080; CHECK-AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11081; CHECK-AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm21082; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm11083; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,1,3435973837]1084; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01085; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm21086; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm01087; CHECK-AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]1088; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01089; CHECK-AVX512VL-NEXT: retq1090 %srem = srem <4 x i32> %X, <i32 5, i32 5, i32 2147483648, i32 5>1091 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1092 %ret = zext <4 x i1> %cmp to <4 x i32>1093 ret <4 x i32> %ret1094}1095 1096; One INT_MIN divisor in even divisor1097define <4 x i32> @test_srem_even_INT_MIN(<4 x i32> %X) nounwind {1098; CHECK-SSE2-LABEL: test_srem_even_INT_MIN:1099; CHECK-SSE2: # %bb.0:1100; CHECK-SSE2-NEXT: pxor %xmm2, %xmm21101; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3067833783,u,1,u]1102; CHECK-SSE2-NEXT: pmuludq %xmm0, %xmm11103; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1104; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]1105; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [3067833783,3067833783,3067833783,3067833783]1106; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]1107; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]1108; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11109; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2,2147483648]1110; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm31111; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,3,2,3]1112; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1113; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]1114; CHECK-SSE2-NEXT: pmuludq %xmm5, %xmm11115; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,3,2,3]1116; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]1117; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]1118; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1119; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]1120; CHECK-SSE2-NEXT: por %xmm4, %xmm31121; CHECK-SSE2-NEXT: pxor %xmm5, %xmm31122; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31123; CHECK-SSE2-NEXT: pcmpeqd %xmm1, %xmm11124; CHECK-SSE2-NEXT: pxor %xmm3, %xmm11125; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01126; CHECK-SSE2-NEXT: pcmpeqd %xmm2, %xmm01127; CHECK-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]1128; CHECK-SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2]1129; CHECK-SSE2-NEXT: psrld $31, %xmm11130; CHECK-SSE2-NEXT: movdqa %xmm1, %xmm01131; CHECK-SSE2-NEXT: retq1132;1133; CHECK-SSE41-LABEL: test_srem_even_INT_MIN:1134; CHECK-SSE41: # %bb.0:1135; CHECK-SSE41-NEXT: pxor %xmm1, %xmm11136; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm2 = [3067833783,3067833783,1,3067833783]1137; CHECK-SSE41-NEXT: pmulld %xmm0, %xmm21138; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21139; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1140; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [2147483648,2147483648,2147483648,2147483648]1141; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [2147483648,2147483648,2,2147483648]1142; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1143; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5],xmm3[6,7]1144; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]1145; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1146; CHECK-SSE41-NEXT: por %xmm4, %xmm31147; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm2 = [306783378,306783378,1,306783378]1148; CHECK-SSE41-NEXT: pminud %xmm3, %xmm21149; CHECK-SSE41-NEXT: pcmpeqd %xmm3, %xmm21150; CHECK-SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01151; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01152; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5],xmm2[6,7]1153; CHECK-SSE41-NEXT: psrld $31, %xmm01154; CHECK-SSE41-NEXT: retq1155;1156; CHECK-AVX1-LABEL: test_srem_even_INT_MIN:1157; CHECK-AVX1: # %bb.0:1158; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11159; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2 # [3067833783,3067833783,1,3067833783]1160; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21161; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1162; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [2147483648,2147483648,2147483648,2147483648]1163; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [2147483648,2147483648,2,2147483648]1164; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1165; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5],xmm3[6,7]1166; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]1167; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1168; CHECK-AVX1-NEXT: vpor %xmm4, %xmm2, %xmm21169; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm31170; CHECK-AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21171; CHECK-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01172; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01173; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5],xmm2[6,7]1174; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01175; CHECK-AVX1-NEXT: retq1176;1177; CHECK-AVX2-LABEL: test_srem_even_INT_MIN:1178; CHECK-AVX2: # %bb.0:1179; CHECK-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11180; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2 # [3067833783,3067833783,1,3067833783]1181; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21182; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm31183; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21184; CHECK-AVX2-NEXT: vpor %xmm3, %xmm2, %xmm21185; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm31186; CHECK-AVX2-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21187; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]1188; CHECK-AVX2-NEXT: vpand %xmm3, %xmm0, %xmm01189; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01190; CHECK-AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm0[2],xmm2[3]1191; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01192; CHECK-AVX2-NEXT: retq1193;1194; CHECK-AVX512VL-LABEL: test_srem_even_INT_MIN:1195; CHECK-AVX512VL: # %bb.0:1196; CHECK-AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11197; CHECK-AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm21198; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm11199; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,1,3067833783]1200; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01201; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01202; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm21203; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm01204; CHECK-AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]1205; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01206; CHECK-AVX512VL-NEXT: retq1207 %srem = srem <4 x i32> %X, <i32 14, i32 14, i32 2147483648, i32 14>1208 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1209 %ret = zext <4 x i1> %cmp to <4 x i32>1210 ret <4 x i32> %ret1211}1212 1213; One INT_MIN divisor in odd+even divisor1214define <4 x i32> @test_srem_odd_even_INT_MIN(<4 x i32> %X) nounwind {1215; CHECK-SSE2-LABEL: test_srem_odd_even_INT_MIN:1216; CHECK-SSE2: # %bb.0:1217; CHECK-SSE2-NEXT: pxor %xmm2, %xmm21218; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3435973837,3067833783,1,3264175145]1219; CHECK-SSE2-NEXT: pmuludq %xmm0, %xmm11220; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1221; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]1222; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [3067833783,u,3264175145,u]1223; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]1224; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]1225; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11226; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1,2147483648,2,1073741824]1227; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm31228; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,3,2,3]1229; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1230; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2147483648,u,1073741824,u]1231; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,3,2,3]1232; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]1233; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]1234; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1235; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]1236; CHECK-SSE2-NEXT: por %xmm4, %xmm31237; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31238; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31239; CHECK-SSE2-NEXT: pcmpeqd %xmm1, %xmm11240; CHECK-SSE2-NEXT: pxor %xmm3, %xmm11241; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01242; CHECK-SSE2-NEXT: pcmpeqd %xmm2, %xmm01243; CHECK-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]1244; CHECK-SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2]1245; CHECK-SSE2-NEXT: psrld $31, %xmm11246; CHECK-SSE2-NEXT: movdqa %xmm1, %xmm01247; CHECK-SSE2-NEXT: retq1248;1249; CHECK-SSE41-LABEL: test_srem_odd_even_INT_MIN:1250; CHECK-SSE41: # %bb.0:1251; CHECK-SSE41-NEXT: pxor %xmm1, %xmm11252; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm2 = [3435973837,3067833783,1,3264175145]1253; CHECK-SSE41-NEXT: pmulld %xmm0, %xmm21254; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21255; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1256; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [2147483648,u,1073741824,u]1257; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [1,2147483648,2,1073741824]1258; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1259; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5],xmm3[6,7]1260; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]1261; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1262; CHECK-SSE41-NEXT: por %xmm4, %xmm31263; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm2 = [858993458,306783378,1,42949672]1264; CHECK-SSE41-NEXT: pminud %xmm3, %xmm21265; CHECK-SSE41-NEXT: pcmpeqd %xmm3, %xmm21266; CHECK-SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01267; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01268; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5],xmm2[6,7]1269; CHECK-SSE41-NEXT: psrld $31, %xmm01270; CHECK-SSE41-NEXT: retq1271;1272; CHECK-AVX1-LABEL: test_srem_odd_even_INT_MIN:1273; CHECK-AVX1: # %bb.0:1274; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11275; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2 # [3435973837,3067833783,1,3264175145]1276; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21277; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1278; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [2147483648,u,1073741824,u]1279; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [1,2147483648,2,1073741824]1280; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1281; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm3[2,3],xmm4[4,5],xmm3[6,7]1282; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]1283; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1284; CHECK-AVX1-NEXT: vpor %xmm4, %xmm2, %xmm21285; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm31286; CHECK-AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21287; CHECK-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01288; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01289; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5],xmm2[6,7]1290; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01291; CHECK-AVX1-NEXT: retq1292;1293; CHECK-AVX2-LABEL: test_srem_odd_even_INT_MIN:1294; CHECK-AVX2: # %bb.0:1295; CHECK-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11296; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2 # [3435973837,3067833783,1,3264175145]1297; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21298; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm31299; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21300; CHECK-AVX2-NEXT: vpor %xmm3, %xmm2, %xmm21301; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm31302; CHECK-AVX2-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21303; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]1304; CHECK-AVX2-NEXT: vpand %xmm3, %xmm0, %xmm01305; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01306; CHECK-AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm0[2],xmm2[3]1307; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01308; CHECK-AVX2-NEXT: retq1309;1310; CHECK-AVX512VL-LABEL: test_srem_odd_even_INT_MIN:1311; CHECK-AVX512VL: # %bb.0:1312; CHECK-AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11313; CHECK-AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm21314; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm11315; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3067833783,1,3264175145]1316; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01317; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01318; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm21319; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm01320; CHECK-AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]1321; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01322; CHECK-AVX512VL-NEXT: retq1323 %srem = srem <4 x i32> %X, <i32 5, i32 14, i32 2147483648, i32 100>1324 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1325 %ret = zext <4 x i1> %cmp to <4 x i32>1326 ret <4 x i32> %ret1327}1328 1329;==============================================================================;1330 1331; One all-ones divisor and power-of-two divisor divisor in odd divisor1332define <4 x i32> @test_srem_odd_allones_and_poweroftwo(<4 x i32> %X) nounwind {1333; CHECK-SSE2-LABEL: test_srem_odd_allones_and_poweroftwo:1334; CHECK-SSE2: # %bb.0:1335; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1336; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,0,1,3435973837]1337; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1338; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [0,u,3435973837,u]1339; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1340; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1341; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01342; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]1343; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,u,268435456,u]1344; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]1345; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]1346; CHECK-SSE2-NEXT: psrlq $32, %xmm01347; CHECK-SSE2-NEXT: por %xmm2, %xmm01348; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01349; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01350; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01351; CHECK-SSE2-NEXT: retq1352;1353; CHECK-SSE41-LABEL: test_srem_odd_allones_and_poweroftwo:1354; CHECK-SSE41: # %bb.0:1355; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,0,1,3435973837]1356; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01357; CHECK-SSE41-NEXT: pmovsxdq {{.*#+}} xmm1 = [1,268435456]1358; CHECK-SSE41-NEXT: pmuludq %xmm0, %xmm11359; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]1360; CHECK-SSE41-NEXT: psrlq $32, %xmm11361; CHECK-SSE41-NEXT: por %xmm1, %xmm01362; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,4294967295,268435455,858993458]1363; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11364; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01365; CHECK-SSE41-NEXT: psrld $31, %xmm01366; CHECK-SSE41-NEXT: retq1367;1368; CHECK-AVX1-LABEL: test_srem_odd_allones_and_poweroftwo:1369; CHECK-AVX1: # %bb.0:1370; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,3435973837]1371; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01372; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [1,u,268435456,u]1373; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]1374; CHECK-AVX1-NEXT: vpsrlq $32, %xmm1, %xmm11375; CHECK-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01376; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11377; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01378; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01379; CHECK-AVX1-NEXT: retq1380;1381; CHECK-AVX2-LABEL: test_srem_odd_allones_and_poweroftwo:1382; CHECK-AVX2: # %bb.0:1383; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,3435973837]1384; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01385; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11386; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01387; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01388; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11389; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01390; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01391; CHECK-AVX2-NEXT: retq1392;1393; CHECK-AVX512VL-LABEL: test_srem_odd_allones_and_poweroftwo:1394; CHECK-AVX512VL: # %bb.0:1395; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,3435973837]1396; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01397; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01398; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11399; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01400; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01401; CHECK-AVX512VL-NEXT: retq1402 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 16, i32 5>1403 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1404 %ret = zext <4 x i1> %cmp to <4 x i32>1405 ret <4 x i32> %ret1406}1407 1408; One all-ones divisor and power-of-two divisor divisor in even divisor1409define <4 x i32> @test_srem_even_allones_and_poweroftwo(<4 x i32> %X) nounwind {1410; CHECK-SSE2-LABEL: test_srem_even_allones_and_poweroftwo:1411; CHECK-SSE2: # %bb.0:1412; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1413; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,0,1,3067833783]1414; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1415; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [0,u,3067833783,u]1416; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1417; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1418; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01419; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,1,268435456,2147483648]1420; CHECK-SSE2-NEXT: pmuludq %xmm0, %xmm11421; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]1422; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]1423; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [1,u,2147483648,u]1424; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,3,2,3]1425; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]1426; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]1427; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]1428; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1429; CHECK-SSE2-NEXT: por %xmm2, %xmm01430; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01431; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01432; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01433; CHECK-SSE2-NEXT: retq1434;1435; CHECK-SSE41-LABEL: test_srem_even_allones_and_poweroftwo:1436; CHECK-SSE41: # %bb.0:1437; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,0,1,3067833783]1438; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01439; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1440; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,u,2147483648,u]1441; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,1,268435456,2147483648]1442; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1443; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1444; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1445; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1446; CHECK-SSE41-NEXT: por %xmm2, %xmm01447; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,4294967295,268435455,306783378]1448; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11449; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01450; CHECK-SSE41-NEXT: psrld $31, %xmm01451; CHECK-SSE41-NEXT: retq1452;1453; CHECK-AVX1-LABEL: test_srem_even_allones_and_poweroftwo:1454; CHECK-AVX1: # %bb.0:1455; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,0,1,3067833783]1456; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01457; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1458; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,u,2147483648,u]1459; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [2147483648,1,268435456,2147483648]1460; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1461; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1462; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1463; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1464; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01465; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11466; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01467; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01468; CHECK-AVX1-NEXT: retq1469;1470; CHECK-AVX2-LABEL: test_srem_even_allones_and_poweroftwo:1471; CHECK-AVX2: # %bb.0:1472; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,0,1,3067833783]1473; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01474; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11475; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01476; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01477; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11478; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01479; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01480; CHECK-AVX2-NEXT: retq1481;1482; CHECK-AVX512VL-LABEL: test_srem_even_allones_and_poweroftwo:1483; CHECK-AVX512VL: # %bb.0:1484; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,0,1,3067833783]1485; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01486; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01487; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11488; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01489; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01490; CHECK-AVX512VL-NEXT: retq1491 %srem = srem <4 x i32> %X, <i32 14, i32 4294967295, i32 16, i32 14>1492 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1493 %ret = zext <4 x i1> %cmp to <4 x i32>1494 ret <4 x i32> %ret1495}1496 1497; One all-ones divisor and power-of-two divisor divisor in odd+even divisor1498define <4 x i32> @test_srem_odd_even_allones_and_poweroftwo(<4 x i32> %X) nounwind {1499; CHECK-SSE2-LABEL: test_srem_odd_even_allones_and_poweroftwo:1500; CHECK-SSE2: # %bb.0:1501; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1502; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,0,1,3264175145]1503; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1504; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [0,u,3264175145,u]1505; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1506; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1507; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01508; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,1,268435456,1073741824]1509; CHECK-SSE2-NEXT: pmuludq %xmm0, %xmm11510; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]1511; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]1512; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [1,u,1073741824,u]1513; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,3,2,3]1514; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]1515; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]1516; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]1517; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1518; CHECK-SSE2-NEXT: por %xmm2, %xmm01519; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01520; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01521; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01522; CHECK-SSE2-NEXT: retq1523;1524; CHECK-SSE41-LABEL: test_srem_odd_even_allones_and_poweroftwo:1525; CHECK-SSE41: # %bb.0:1526; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,0,1,3264175145]1527; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01528; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1529; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,u,1073741824,u]1530; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,1,268435456,1073741824]1531; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1532; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1533; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1534; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1535; CHECK-SSE41-NEXT: por %xmm2, %xmm01536; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,4294967295,268435455,42949672]1537; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11538; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01539; CHECK-SSE41-NEXT: psrld $31, %xmm01540; CHECK-SSE41-NEXT: retq1541;1542; CHECK-AVX1-LABEL: test_srem_odd_even_allones_and_poweroftwo:1543; CHECK-AVX1: # %bb.0:1544; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,3264175145]1545; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01546; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1547; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,u,1073741824,u]1548; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,1,268435456,1073741824]1549; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1550; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1551; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1552; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1553; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01554; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11555; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01556; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01557; CHECK-AVX1-NEXT: retq1558;1559; CHECK-AVX2-LABEL: test_srem_odd_even_allones_and_poweroftwo:1560; CHECK-AVX2: # %bb.0:1561; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,3264175145]1562; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01563; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11564; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01565; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01566; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11567; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01568; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01569; CHECK-AVX2-NEXT: retq1570;1571; CHECK-AVX512VL-LABEL: test_srem_odd_even_allones_and_poweroftwo:1572; CHECK-AVX512VL: # %bb.0:1573; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,3264175145]1574; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01575; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01576; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11577; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01578; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01579; CHECK-AVX512VL-NEXT: retq1580 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 16, i32 100>1581 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1582 %ret = zext <4 x i1> %cmp to <4 x i32>1583 ret <4 x i32> %ret1584}1585 1586;------------------------------------------------------------------------------;1587 1588; One all-ones divisor and one one divisor in odd divisor1589define <4 x i32> @test_srem_odd_allones_and_one(<4 x i32> %X) nounwind {1590; CHECK-SSE2-LABEL: test_srem_odd_allones_and_one:1591; CHECK-SSE2: # %bb.0:1592; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]1593; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1594; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm01595; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1596; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm21597; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]1598; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1599; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01600; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01601; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01602; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01603; CHECK-SSE2-NEXT: retq1604;1605; CHECK-SSE41-LABEL: test_srem_odd_allones_and_one:1606; CHECK-SSE41: # %bb.0:1607; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,3435973837,3435973837,3435973837]1608; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01609; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,4294967295,4294967295,858993458]1610; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11611; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01612; CHECK-SSE41-NEXT: psrld $31, %xmm01613; CHECK-SSE41-NEXT: retq1614;1615; CHECK-AVX1-LABEL: test_srem_odd_allones_and_one:1616; CHECK-AVX1: # %bb.0:1617; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,3435973837,3435973837,3435973837]1618; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01619; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11620; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01621; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01622; CHECK-AVX1-NEXT: retq1623;1624; CHECK-AVX2-LABEL: test_srem_odd_allones_and_one:1625; CHECK-AVX2: # %bb.0:1626; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3435973837,3435973837,3435973837,3435973837]1627; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm01628; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [429496729,429496729,429496729,429496729]1629; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm01630; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11631; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01632; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01633; CHECK-AVX2-NEXT: retq1634;1635; CHECK-AVX512VL-LABEL: test_srem_odd_allones_and_one:1636; CHECK-AVX512VL: # %bb.0:1637; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01638; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01639; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11640; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01641; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01642; CHECK-AVX512VL-NEXT: retq1643 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 1, i32 5>1644 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1645 %ret = zext <4 x i1> %cmp to <4 x i32>1646 ret <4 x i32> %ret1647}1648 1649; One all-ones divisor and one one divisor in even divisor1650define <4 x i32> @test_srem_even_allones_and_one(<4 x i32> %X) nounwind {1651; CHECK-SSE2-LABEL: test_srem_even_allones_and_one:1652; CHECK-SSE2: # %bb.0:1653; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]1654; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1655; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm01656; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1657; CHECK-SSE2-NEXT: pmuludq %xmm1, %xmm21658; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]1659; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1660; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01661; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm11662; CHECK-SSE2-NEXT: psrld $1, %xmm11663; CHECK-SSE2-NEXT: pslld $31, %xmm01664; CHECK-SSE2-NEXT: por %xmm1, %xmm01665; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01666; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01667; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01668; CHECK-SSE2-NEXT: retq1669;1670; CHECK-SSE41-LABEL: test_srem_even_allones_and_one:1671; CHECK-SSE41: # %bb.0:1672; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,3067833783,3067833783,3067833783]1673; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01674; CHECK-SSE41-NEXT: movdqa %xmm0, %xmm11675; CHECK-SSE41-NEXT: psrld $1, %xmm11676; CHECK-SSE41-NEXT: pslld $31, %xmm01677; CHECK-SSE41-NEXT: por %xmm1, %xmm01678; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,4294967295,4294967295,306783378]1679; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11680; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01681; CHECK-SSE41-NEXT: psrld $31, %xmm01682; CHECK-SSE41-NEXT: retq1683;1684; CHECK-AVX1-LABEL: test_srem_even_allones_and_one:1685; CHECK-AVX1: # %bb.0:1686; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,3067833783,3067833783,3067833783]1687; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01688; CHECK-AVX1-NEXT: vpsrld $1, %xmm0, %xmm11689; CHECK-AVX1-NEXT: vpslld $31, %xmm0, %xmm01690; CHECK-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01691; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11692; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01693; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01694; CHECK-AVX1-NEXT: retq1695;1696; CHECK-AVX2-LABEL: test_srem_even_allones_and_one:1697; CHECK-AVX2: # %bb.0:1698; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3067833783,3067833783,3067833783,3067833783]1699; CHECK-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm01700; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [306783378,306783378,306783378,306783378]1701; CHECK-AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm01702; CHECK-AVX2-NEXT: vpsrld $1, %xmm0, %xmm11703; CHECK-AVX2-NEXT: vpslld $31, %xmm0, %xmm01704; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01705; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11706; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01707; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01708; CHECK-AVX2-NEXT: retq1709;1710; CHECK-AVX512VL-LABEL: test_srem_even_allones_and_one:1711; CHECK-AVX512VL: # %bb.0:1712; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01713; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01714; CHECK-AVX512VL-NEXT: vprord $1, %xmm0, %xmm01715; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11716; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01717; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01718; CHECK-AVX512VL-NEXT: retq1719 %srem = srem <4 x i32> %X, <i32 14, i32 4294967295, i32 1, i32 14>1720 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1721 %ret = zext <4 x i1> %cmp to <4 x i32>1722 ret <4 x i32> %ret1723}1724 1725; One all-ones divisor and one one divisor in odd+even divisor1726define <4 x i32> @test_srem_odd_even_allones_and_one(<4 x i32> %X) nounwind {1727; CHECK-SSE2-LABEL: test_srem_odd_even_allones_and_one:1728; CHECK-SSE2: # %bb.0:1729; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1730; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,0,0,3264175145]1731; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1732; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [0,u,3264175145,u]1733; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1734; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1735; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01736; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]1737; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1738; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,1,1073741824,1073741824]1739; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]1740; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1741; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01742; CHECK-SSE2-NEXT: por %xmm1, %xmm01743; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01744; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01745; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01746; CHECK-SSE2-NEXT: retq1747;1748; CHECK-SSE41-LABEL: test_srem_odd_even_allones_and_one:1749; CHECK-SSE41: # %bb.0:1750; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,0,0,3264175145]1751; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01752; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1753; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,1,1073741824,1073741824]1754; CHECK-SSE41-NEXT: pxor %xmm2, %xmm21755; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1756; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1757; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1758; CHECK-SSE41-NEXT: por %xmm2, %xmm01759; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,4294967295,4294967295,42949672]1760; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11761; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01762; CHECK-SSE41-NEXT: psrld $31, %xmm01763; CHECK-SSE41-NEXT: retq1764;1765; CHECK-AVX1-LABEL: test_srem_odd_even_allones_and_one:1766; CHECK-AVX1: # %bb.0:1767; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,0,3264175145]1768; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01769; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1770; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1,1,1073741824,1073741824]1771; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21772; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1773; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1774; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1775; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01776; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11777; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01778; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01779; CHECK-AVX1-NEXT: retq1780;1781; CHECK-AVX2-LABEL: test_srem_odd_even_allones_and_one:1782; CHECK-AVX2: # %bb.0:1783; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,0,3264175145]1784; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01785; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11786; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01787; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01788; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11789; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01790; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01791; CHECK-AVX2-NEXT: retq1792;1793; CHECK-AVX512VL-LABEL: test_srem_odd_even_allones_and_one:1794; CHECK-AVX512VL: # %bb.0:1795; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,0,3264175145]1796; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01797; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01798; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11799; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01800; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01801; CHECK-AVX512VL-NEXT: retq1802 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 1, i32 100>1803 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1804 %ret = zext <4 x i1> %cmp to <4 x i32>1805 ret <4 x i32> %ret1806}1807 1808;------------------------------------------------------------------------------;1809 1810; One power-of-two divisor divisor and one divisor in odd divisor1811define <4 x i32> @test_srem_odd_poweroftwo_and_one(<4 x i32> %X) nounwind {1812; CHECK-SSE2-LABEL: test_srem_odd_poweroftwo_and_one:1813; CHECK-SSE2: # %bb.0:1814; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1815; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,1,0,3435973837]1816; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1817; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,u,3435973837,u]1818; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1819; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1820; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01821; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]1822; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1823; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [268435456,268435456,1,1]1824; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]1825; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1826; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01827; CHECK-SSE2-NEXT: por %xmm1, %xmm01828; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01829; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01830; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01831; CHECK-SSE2-NEXT: retq1832;1833; CHECK-SSE41-LABEL: test_srem_odd_poweroftwo_and_one:1834; CHECK-SSE41: # %bb.0:1835; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,1,0,3435973837]1836; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01837; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1838; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [268435456,268435456,1,1]1839; CHECK-SSE41-NEXT: pxor %xmm2, %xmm21840; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1841; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1842; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1843; CHECK-SSE41-NEXT: por %xmm2, %xmm01844; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,268435455,4294967295,858993458]1845; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11846; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01847; CHECK-SSE41-NEXT: psrld $31, %xmm01848; CHECK-SSE41-NEXT: retq1849;1850; CHECK-AVX1-LABEL: test_srem_odd_poweroftwo_and_one:1851; CHECK-AVX1: # %bb.0:1852; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,1,0,3435973837]1853; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01854; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1855; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [268435456,268435456,1,1]1856; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21857; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1858; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1859; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1860; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01861; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11862; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01863; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01864; CHECK-AVX1-NEXT: retq1865;1866; CHECK-AVX2-LABEL: test_srem_odd_poweroftwo_and_one:1867; CHECK-AVX2: # %bb.0:1868; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,1,0,3435973837]1869; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01870; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11871; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01872; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01873; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11874; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01875; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01876; CHECK-AVX2-NEXT: retq1877;1878; CHECK-AVX512VL-LABEL: test_srem_odd_poweroftwo_and_one:1879; CHECK-AVX512VL: # %bb.0:1880; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,1,0,3435973837]1881; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01882; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01883; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11884; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01885; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01886; CHECK-AVX512VL-NEXT: retq1887 %srem = srem <4 x i32> %X, <i32 5, i32 16, i32 1, i32 5>1888 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1889 %ret = zext <4 x i1> %cmp to <4 x i32>1890 ret <4 x i32> %ret1891}1892 1893; One power-of-two divisor divisor and one divisor in even divisor1894define <4 x i32> @test_srem_even_poweroftwo_and_one(<4 x i32> %X) nounwind {1895; CHECK-SSE2-LABEL: test_srem_even_poweroftwo_and_one:1896; CHECK-SSE2: # %bb.0:1897; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1898; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,1,0,3067833783]1899; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1900; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,u,3067833783,u]1901; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1902; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1903; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01904; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,268435456,1,2147483648]1905; CHECK-SSE2-NEXT: pmuludq %xmm0, %xmm11906; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]1907; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]1908; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [268435456,u,2147483648,u]1909; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,3,2,3]1910; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]1911; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]1912; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]1913; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1914; CHECK-SSE2-NEXT: por %xmm2, %xmm01915; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01916; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01917; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01918; CHECK-SSE2-NEXT: retq1919;1920; CHECK-SSE41-LABEL: test_srem_even_poweroftwo_and_one:1921; CHECK-SSE41: # %bb.0:1922; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,1,0,3067833783]1923; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01924; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1925; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [268435456,u,2147483648,u]1926; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,268435456,1,2147483648]1927; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1928; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1929; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1930; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1931; CHECK-SSE41-NEXT: por %xmm2, %xmm01932; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,268435455,4294967295,306783378]1933; CHECK-SSE41-NEXT: pminud %xmm0, %xmm11934; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm01935; CHECK-SSE41-NEXT: psrld $31, %xmm01936; CHECK-SSE41-NEXT: retq1937;1938; CHECK-AVX1-LABEL: test_srem_even_poweroftwo_and_one:1939; CHECK-AVX1: # %bb.0:1940; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,1,0,3067833783]1941; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01942; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1943; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [268435456,u,2147483648,u]1944; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [2147483648,268435456,1,2147483648]1945; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]1946; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1947; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]1948; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1949; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01950; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11951; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01952; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm01953; CHECK-AVX1-NEXT: retq1954;1955; CHECK-AVX2-LABEL: test_srem_even_poweroftwo_and_one:1956; CHECK-AVX2: # %bb.0:1957; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,1,0,3067833783]1958; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01959; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11960; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01961; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01962; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11963; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01964; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm01965; CHECK-AVX2-NEXT: retq1966;1967; CHECK-AVX512VL-LABEL: test_srem_even_poweroftwo_and_one:1968; CHECK-AVX512VL: # %bb.0:1969; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,1,0,3067833783]1970; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01971; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01972; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11973; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01974; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm01975; CHECK-AVX512VL-NEXT: retq1976 %srem = srem <4 x i32> %X, <i32 14, i32 16, i32 1, i32 14>1977 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>1978 %ret = zext <4 x i1> %cmp to <4 x i32>1979 ret <4 x i32> %ret1980}1981 1982; One power-of-two divisor divisor and one divisor in odd+even divisor1983define <4 x i32> @test_srem_odd_even_poweroftwo_and_one(<4 x i32> %X) nounwind {1984; CHECK-SSE2-LABEL: test_srem_odd_even_poweroftwo_and_one:1985; CHECK-SSE2: # %bb.0:1986; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1987; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,1,0,3264175145]1988; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1989; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1,u,3264175145,u]1990; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1991; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1992; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01993; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]1994; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1995; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [268435456,268435456,1073741824,1073741824]1996; CHECK-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]1997; CHECK-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1998; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01999; CHECK-SSE2-NEXT: por %xmm1, %xmm02000; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02001; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02002; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02003; CHECK-SSE2-NEXT: retq2004;2005; CHECK-SSE41-LABEL: test_srem_odd_even_poweroftwo_and_one:2006; CHECK-SSE41: # %bb.0:2007; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,1,0,3264175145]2008; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02009; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]2010; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [268435456,268435456,1073741824,1073741824]2011; CHECK-SSE41-NEXT: pxor %xmm2, %xmm22012; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]2013; CHECK-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]2014; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]2015; CHECK-SSE41-NEXT: por %xmm2, %xmm02016; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,268435455,4294967295,42949672]2017; CHECK-SSE41-NEXT: pminud %xmm0, %xmm12018; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm02019; CHECK-SSE41-NEXT: psrld $31, %xmm02020; CHECK-SSE41-NEXT: retq2021;2022; CHECK-AVX1-LABEL: test_srem_odd_even_poweroftwo_and_one:2023; CHECK-AVX1: # %bb.0:2024; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,1,0,3264175145]2025; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02026; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]2027; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [268435456,268435456,1073741824,1073741824]2028; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm22029; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]2030; CHECK-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]2031; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]2032; CHECK-AVX1-NEXT: vpor %xmm2, %xmm0, %xmm02033; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12034; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02035; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm02036; CHECK-AVX1-NEXT: retq2037;2038; CHECK-AVX2-LABEL: test_srem_odd_even_poweroftwo_and_one:2039; CHECK-AVX2: # %bb.0:2040; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,1,0,3264175145]2041; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02042; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12043; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02044; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm02045; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12046; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02047; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm02048; CHECK-AVX2-NEXT: retq2049;2050; CHECK-AVX512VL-LABEL: test_srem_odd_even_poweroftwo_and_one:2051; CHECK-AVX512VL: # %bb.0:2052; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,1,0,3264175145]2053; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02054; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02055; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12056; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02057; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm02058; CHECK-AVX512VL-NEXT: retq2059 %srem = srem <4 x i32> %X, <i32 5, i32 16, i32 1, i32 100>2060 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>2061 %ret = zext <4 x i1> %cmp to <4 x i32>2062 ret <4 x i32> %ret2063}2064 2065;------------------------------------------------------------------------------;2066 2067define <4 x i32> @test_srem_odd_allones_and_poweroftwo_and_one(<4 x i32> %X) nounwind {2068; CHECK-SSE2-LABEL: test_srem_odd_allones_and_poweroftwo_and_one:2069; CHECK-SSE2: # %bb.0:2070; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,u,1,u]2071; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02072; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,u,268435456,u]2073; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm12074; CHECK-SSE2-NEXT: psrlq $32, %xmm12075; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02076; CHECK-SSE2-NEXT: por %xmm1, %xmm02077; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02078; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02079; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02080; CHECK-SSE2-NEXT: retq2081;2082; CHECK-SSE41-LABEL: test_srem_odd_allones_and_poweroftwo_and_one:2083; CHECK-SSE41: # %bb.0:2084; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3435973837,u,1,u]2085; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02086; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,u,268435456,u]2087; CHECK-SSE41-NEXT: pxor %xmm1, %xmm12088; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]2089; CHECK-SSE41-NEXT: psrlq $32, %xmm02090; CHECK-SSE41-NEXT: por %xmm1, %xmm02091; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [858993458,4294967295,268435455,4294967295]2092; CHECK-SSE41-NEXT: pminud %xmm0, %xmm12093; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm02094; CHECK-SSE41-NEXT: psrld $31, %xmm02095; CHECK-SSE41-NEXT: retq2096;2097; CHECK-AVX1-LABEL: test_srem_odd_allones_and_poweroftwo_and_one:2098; CHECK-AVX1: # %bb.0:2099; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,u,1,u]2100; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02101; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,u,268435456,u]2102; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12103; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]2104; CHECK-AVX1-NEXT: vpsrlq $32, %xmm0, %xmm02105; CHECK-AVX1-NEXT: vpor %xmm0, %xmm1, %xmm02106; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12107; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02108; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm02109; CHECK-AVX1-NEXT: retq2110;2111; CHECK-AVX2-LABEL: test_srem_odd_allones_and_poweroftwo_and_one:2112; CHECK-AVX2: # %bb.0:2113; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,0]2114; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02115; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12116; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02117; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm02118; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12119; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02120; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm02121; CHECK-AVX2-NEXT: retq2122;2123; CHECK-AVX512VL-LABEL: test_srem_odd_allones_and_poweroftwo_and_one:2124; CHECK-AVX512VL: # %bb.0:2125; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3435973837,0,1,0]2126; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02127; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02128; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12129; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02130; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm02131; CHECK-AVX512VL-NEXT: retq2132 %srem = srem <4 x i32> %X, <i32 5, i32 4294967295, i32 16, i32 1>2133 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>2134 %ret = zext <4 x i1> %cmp to <4 x i32>2135 ret <4 x i32> %ret2136}2137 2138define <4 x i32> @test_srem_even_allones_and_poweroftwo_and_one(<4 x i32> %X) nounwind {2139; CHECK-SSE2-LABEL: test_srem_even_allones_and_poweroftwo_and_one:2140; CHECK-SSE2: # %bb.0:2141; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,u,1,u]2142; CHECK-SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02143; CHECK-SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,u,268435456,u]2144; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm12145; CHECK-SSE2-NEXT: psrlq $32, %xmm12146; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02147; CHECK-SSE2-NEXT: por %xmm1, %xmm02148; CHECK-SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02149; CHECK-SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02150; CHECK-SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02151; CHECK-SSE2-NEXT: retq2152;2153; CHECK-SSE41-LABEL: test_srem_even_allones_and_poweroftwo_and_one:2154; CHECK-SSE41: # %bb.0:2155; CHECK-SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3067833783,u,1,u]2156; CHECK-SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02157; CHECK-SSE41-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2147483648,u,268435456,u]2158; CHECK-SSE41-NEXT: pxor %xmm1, %xmm12159; CHECK-SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]2160; CHECK-SSE41-NEXT: psrlq $32, %xmm02161; CHECK-SSE41-NEXT: por %xmm1, %xmm02162; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm1 = [306783378,4294967295,268435455,4294967295]2163; CHECK-SSE41-NEXT: pminud %xmm0, %xmm12164; CHECK-SSE41-NEXT: pcmpeqd %xmm1, %xmm02165; CHECK-SSE41-NEXT: psrld $31, %xmm02166; CHECK-SSE41-NEXT: retq2167;2168; CHECK-AVX1-LABEL: test_srem_even_allones_and_poweroftwo_and_one:2169; CHECK-AVX1: # %bb.0:2170; CHECK-AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,u,1,u]2171; CHECK-AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02172; CHECK-AVX1-NEXT: vpmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [2147483648,u,268435456,u]2173; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12174; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]2175; CHECK-AVX1-NEXT: vpsrlq $32, %xmm0, %xmm02176; CHECK-AVX1-NEXT: vpor %xmm0, %xmm1, %xmm02177; CHECK-AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12178; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02179; CHECK-AVX1-NEXT: vpsrld $31, %xmm0, %xmm02180; CHECK-AVX1-NEXT: retq2181;2182; CHECK-AVX2-LABEL: test_srem_even_allones_and_poweroftwo_and_one:2183; CHECK-AVX2: # %bb.0:2184; CHECK-AVX2-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,0,1,0]2185; CHECK-AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02186; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12187; CHECK-AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02188; CHECK-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm02189; CHECK-AVX2-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12190; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02191; CHECK-AVX2-NEXT: vpsrld $31, %xmm0, %xmm02192; CHECK-AVX2-NEXT: retq2193;2194; CHECK-AVX512VL-LABEL: test_srem_even_allones_and_poweroftwo_and_one:2195; CHECK-AVX512VL: # %bb.0:2196; CHECK-AVX512VL-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3067833783,0,1,0]2197; CHECK-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02198; CHECK-AVX512VL-NEXT: vprorvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02199; CHECK-AVX512VL-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12200; CHECK-AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02201; CHECK-AVX512VL-NEXT: vpsrld $31, %xmm0, %xmm02202; CHECK-AVX512VL-NEXT: retq2203 %srem = srem <4 x i32> %X, <i32 14, i32 4294967295, i32 16, i32 1>2204 %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>2205 %ret = zext <4 x i1> %cmp to <4 x i32>2206 ret <4 x i32> %ret2207}2208 2209; PR51133: the VSELECT should have i1 element type2210define <32 x i1> @pr51133(<32 x i8> %x, <32 x i8> %y) {2211; CHECK-SSE2-LABEL: pr51133:2212; CHECK-SSE2: # %bb.0:2213; CHECK-SSE2-NEXT: movq %rdi, %rax2214; CHECK-SSE2-NEXT: movdqa %xmm1, %xmm52215; CHECK-SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2216; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [9,u,0,u,41,u,183,u,1,u,1,u,161,u,221,u]2217; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]2218; CHECK-SSE2-NEXT: pand %xmm4, %xmm52219; CHECK-SSE2-NEXT: movdqa %xmm1, %xmm62220; CHECK-SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2221; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [171,u,103,u,183,u,171,u,61,u,1,u,127,u,183,u]2222; CHECK-SSE2-NEXT: pand %xmm4, %xmm62223; CHECK-SSE2-NEXT: packuswb %xmm5, %xmm62224; CHECK-SSE2-NEXT: paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm62225; CHECK-SSE2-NEXT: movdqa %xmm6, %xmm52226; CHECK-SSE2-NEXT: punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm6[8],xmm5[9],xmm6[9],xmm5[10],xmm6[10],xmm5[11],xmm6[11],xmm5[12],xmm6[12],xmm5[13],xmm6[13],xmm5[14],xmm6[14],xmm5[15],xmm6[15]2227; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [128,1,128,1,128,32,1,1]2228; CHECK-SSE2-NEXT: psrlw $8, %xmm52229; CHECK-SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2230; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [1,1,1,128,64,2,1,32]2231; CHECK-SSE2-NEXT: psrlw $8, %xmm62232; CHECK-SSE2-NEXT: packuswb %xmm5, %xmm62233; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm7 = [84,2,36,42,2,1,2,4,2,255,4,36,127,31,2,2]2234; CHECK-SSE2-NEXT: pminub %xmm6, %xmm72235; CHECK-SSE2-NEXT: pcmpeqb %xmm6, %xmm72236; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]2237; CHECK-SSE2-NEXT: pandn %xmm5, %xmm72238; CHECK-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12239; CHECK-SSE2-NEXT: pxor %xmm6, %xmm62240; CHECK-SSE2-NEXT: pcmpgtb %xmm6, %xmm12241; CHECK-SSE2-NEXT: pandn %xmm1, %xmm52242; CHECK-SSE2-NEXT: por %xmm7, %xmm52243; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm12244; CHECK-SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2245; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [223,u,223,u,205,u,183,u,161,u,1,u,171,u,239,u]2246; CHECK-SSE2-NEXT: pand %xmm4, %xmm12247; CHECK-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2248; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [197,u,205,u,27,u,241,u,1,u,1,u,1,u,163,u]2249; CHECK-SSE2-NEXT: pand %xmm4, %xmm02250; CHECK-SSE2-NEXT: packuswb %xmm1, %xmm02251; CHECK-SSE2-NEXT: paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02252; CHECK-SSE2-NEXT: movdqa %xmm0, %xmm12253; CHECK-SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]2254; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [128,128,1,1,1,128,1,64]2255; CHECK-SSE2-NEXT: psrlw $8, %xmm12256; CHECK-SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2257; CHECK-SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,1,1,128,128,32,128,32]2258; CHECK-SSE2-NEXT: psrlw $8, %xmm02259; CHECK-SSE2-NEXT: packuswb %xmm1, %xmm02260; CHECK-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [19,51,13,7,128,32,128,3,5,5,51,37,3,128,85,5]2261; CHECK-SSE2-NEXT: pmaxub %xmm0, %xmm12262; CHECK-SSE2-NEXT: pcmpeqb %xmm0, %xmm12263; CHECK-SSE2-NEXT: pcmpeqb %xmm6, %xmm32264; CHECK-SSE2-NEXT: pandn %xmm5, %xmm32265; CHECK-SSE2-NEXT: pcmpeqb %xmm6, %xmm22266; CHECK-SSE2-NEXT: pandn %xmm1, %xmm22267; CHECK-SSE2-NEXT: pmovmskb %xmm2, %ecx2268; CHECK-SSE2-NEXT: pmovmskb %xmm3, %edx2269; CHECK-SSE2-NEXT: shll $16, %edx2270; CHECK-SSE2-NEXT: orl %ecx, %edx2271; CHECK-SSE2-NEXT: movl %edx, (%rdi)2272; CHECK-SSE2-NEXT: retq2273;2274; CHECK-SSE41-LABEL: pr51133:2275; CHECK-SSE41: # %bb.0:2276; CHECK-SSE41-NEXT: movdqa %xmm0, %xmm42277; CHECK-SSE41-NEXT: movq %rdi, %rax2278; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm0 = [171,103,183,171,61,1,127,183,9,0,41,183,1,1,161,221]2279; CHECK-SSE41-NEXT: pmullw %xmm1, %xmm02280; CHECK-SSE41-NEXT: pmovzxbw {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]2281; CHECK-SSE41-NEXT: pand %xmm5, %xmm02282; CHECK-SSE41-NEXT: movdqa %xmm1, %xmm62283; CHECK-SSE41-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [0,103,0,171,0,1,0,183,0,0,0,183,0,1,0,221]2284; CHECK-SSE41-NEXT: psllw $8, %xmm62285; CHECK-SSE41-NEXT: por %xmm0, %xmm62286; CHECK-SSE41-NEXT: paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm62287; CHECK-SSE41-NEXT: movdqa %xmm6, %xmm02288; CHECK-SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm6[8],xmm0[9],xmm6[9],xmm0[10],xmm6[10],xmm0[11],xmm6[11],xmm0[12],xmm6[12],xmm0[13],xmm6[13],xmm0[14],xmm6[14],xmm0[15],xmm6[15]2289; CHECK-SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [128,1,128,1,128,32,1,1]2290; CHECK-SSE41-NEXT: psrlw $8, %xmm02291; CHECK-SSE41-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2292; CHECK-SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [1,1,1,128,64,2,1,32]2293; CHECK-SSE41-NEXT: psrlw $8, %xmm62294; CHECK-SSE41-NEXT: packuswb %xmm0, %xmm62295; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm0 = [84,2,36,42,2,1,2,4,2,255,4,36,127,31,2,2]2296; CHECK-SSE41-NEXT: pminub %xmm6, %xmm02297; CHECK-SSE41-NEXT: pcmpeqb %xmm6, %xmm02298; CHECK-SSE41-NEXT: pcmpeqd %xmm7, %xmm72299; CHECK-SSE41-NEXT: pxor %xmm0, %xmm72300; CHECK-SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12301; CHECK-SSE41-NEXT: pxor %xmm6, %xmm62302; CHECK-SSE41-NEXT: pcmpgtb %xmm6, %xmm12303; CHECK-SSE41-NEXT: movaps {{.*#+}} xmm0 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]2304; CHECK-SSE41-NEXT: pblendvb %xmm0, %xmm7, %xmm12305; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm0 = [197,205,27,241,1,1,1,163,223,223,205,183,161,1,171,239]2306; CHECK-SSE41-NEXT: pmullw %xmm4, %xmm02307; CHECK-SSE41-NEXT: pand %xmm5, %xmm02308; CHECK-SSE41-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,205,0,241,0,1,0,163,0,223,0,183,0,1,0,239]2309; CHECK-SSE41-NEXT: psllw $8, %xmm42310; CHECK-SSE41-NEXT: por %xmm0, %xmm42311; CHECK-SSE41-NEXT: paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm42312; CHECK-SSE41-NEXT: movdqa %xmm4, %xmm02313; CHECK-SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15]2314; CHECK-SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [128,128,1,1,1,128,1,64]2315; CHECK-SSE41-NEXT: psrlw $8, %xmm02316; CHECK-SSE41-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2317; CHECK-SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [1,1,1,128,128,32,128,32]2318; CHECK-SSE41-NEXT: psrlw $8, %xmm42319; CHECK-SSE41-NEXT: packuswb %xmm0, %xmm42320; CHECK-SSE41-NEXT: movdqa {{.*#+}} xmm0 = [19,51,13,7,128,32,128,3,5,5,51,37,3,128,85,5]2321; CHECK-SSE41-NEXT: pmaxub %xmm4, %xmm02322; CHECK-SSE41-NEXT: pcmpeqb %xmm4, %xmm02323; CHECK-SSE41-NEXT: pcmpeqb %xmm6, %xmm32324; CHECK-SSE41-NEXT: pandn %xmm1, %xmm32325; CHECK-SSE41-NEXT: pcmpeqb %xmm6, %xmm22326; CHECK-SSE41-NEXT: pandn %xmm0, %xmm22327; CHECK-SSE41-NEXT: pmovmskb %xmm2, %ecx2328; CHECK-SSE41-NEXT: pmovmskb %xmm3, %edx2329; CHECK-SSE41-NEXT: shll $16, %edx2330; CHECK-SSE41-NEXT: orl %ecx, %edx2331; CHECK-SSE41-NEXT: movl %edx, (%rdi)2332; CHECK-SSE41-NEXT: retq2333;2334; CHECK-AVX1-LABEL: pr51133:2335; CHECK-AVX1: # %bb.0:2336; CHECK-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm22337; CHECK-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]2338; CHECK-AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,133,0,133,0,103,0,147,0,85,0,129,0,86,0,137]2339; CHECK-AVX1-NEXT: vpsrlw $8, %xmm3, %xmm32340; CHECK-AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]2341; CHECK-AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,79,0,103,0,27,0,121,0,129,0,129,0,129,0,47]2342; CHECK-AVX1-NEXT: vpsrlw $8, %xmm4, %xmm42343; CHECK-AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm42344; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm5 # [0,0,0,0,1,1,1,0,1,1,0,1,0,1,0,1]2345; CHECK-AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]2346; CHECK-AVX1-NEXT: vpand %xmm3, %xmm5, %xmm52347; CHECK-AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm6 # [0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1]2348; CHECK-AVX1-NEXT: vpsllw $8, %xmm6, %xmm62349; CHECK-AVX1-NEXT: vpor %xmm6, %xmm5, %xmm52350; CHECK-AVX1-NEXT: vpaddb %xmm5, %xmm4, %xmm42351; CHECK-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2352; CHECK-AVX1-NEXT: vpsraw $8, %xmm5, %xmm52353; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5 # [8,8,128,64,8,256,256,8]2354; CHECK-AVX1-NEXT: vpsrlw $8, %xmm5, %xmm52355; CHECK-AVX1-NEXT: vpunpcklbw {{.*#+}} xmm6 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2356; CHECK-AVX1-NEXT: vpsraw $8, %xmm6, %xmm62357; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6, %xmm6 # [64,128,128,16,256,64,256,16]2358; CHECK-AVX1-NEXT: vpsrlw $8, %xmm6, %xmm62359; CHECK-AVX1-NEXT: vpackuswb %xmm5, %xmm6, %xmm62360; CHECK-AVX1-NEXT: vpsrlw $7, %xmm4, %xmm42361; CHECK-AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]2362; CHECK-AVX1-NEXT: vpand %xmm5, %xmm4, %xmm42363; CHECK-AVX1-NEXT: vpaddb %xmm4, %xmm6, %xmm42364; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm6 # [13,5,19,34,2,8,2,88,62,62,5,7,97,2,3,60]2365; CHECK-AVX1-NEXT: vpand %xmm3, %xmm6, %xmm62366; CHECK-AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,5,0,34,0,8,0,88,0,62,0,7,0,2,0,60]2367; CHECK-AVX1-NEXT: vpsllw $8, %xmm4, %xmm42368; CHECK-AVX1-NEXT: vpor %xmm4, %xmm6, %xmm42369; CHECK-AVX1-NEXT: vpsubb %xmm4, %xmm0, %xmm42370; CHECK-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02371; CHECK-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]2372; CHECK-AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6, %xmm6 # [0,9,0,0,0,41,0,147,0,129,0,129,0,85,0,141]2373; CHECK-AVX1-NEXT: vpsrlw $8, %xmm6, %xmm62374; CHECK-AVX1-NEXT: vpunpcklbw {{.*#+}} xmm7 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]2375; CHECK-AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm7 # [0,86,0,95,0,147,0,43,0,49,0,127,0,65,0,147]2376; CHECK-AVX1-NEXT: vpsrlw $8, %xmm7, %xmm72377; CHECK-AVX1-NEXT: vpackuswb %xmm6, %xmm7, %xmm62378; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm7 # [0,0,1,0,0,255,0,1,0,1,0,1,1,1,0,1]2379; CHECK-AVX1-NEXT: vpand %xmm3, %xmm7, %xmm72380; CHECK-AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm8 # [0,0,0,0,0,255,0,1,0,1,0,1,0,1,0,1]2381; CHECK-AVX1-NEXT: vpsllw $8, %xmm8, %xmm82382; CHECK-AVX1-NEXT: vpor %xmm7, %xmm8, %xmm72383; CHECK-AVX1-NEXT: vpaddb %xmm7, %xmm6, %xmm62384; CHECK-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm7 = xmm6[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2385; CHECK-AVX1-NEXT: vpsraw $8, %xmm7, %xmm72386; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm7 # [64,256,32,64,256,64,8,4]2387; CHECK-AVX1-NEXT: vpsrlw $8, %xmm7, %xmm72388; CHECK-AVX1-NEXT: vpunpcklbw {{.*#+}} xmm8 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2389; CHECK-AVX1-NEXT: vpsraw $8, %xmm8, %xmm82390; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm8, %xmm8 # [256,8,64,256,16,4,8,8]2391; CHECK-AVX1-NEXT: vpsrlw $8, %xmm8, %xmm82392; CHECK-AVX1-NEXT: vpackuswb %xmm7, %xmm8, %xmm72393; CHECK-AVX1-NEXT: vpsrlw $7, %xmm6, %xmm62394; CHECK-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6, %xmm62395; CHECK-AVX1-NEXT: vpand %xmm5, %xmm6, %xmm52396; CHECK-AVX1-NEXT: vpaddb %xmm5, %xmm7, %xmm52397; CHECK-AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm6 # [3,87,7,6,84,128,127,56,114,1,50,7,2,8,97,117]2398; CHECK-AVX1-NEXT: vpand %xmm3, %xmm6, %xmm32399; CHECK-AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5 # [0,87,0,6,0,128,0,56,0,1,0,7,0,8,0,117]2400; CHECK-AVX1-NEXT: vpsllw $8, %xmm5, %xmm52401; CHECK-AVX1-NEXT: vpor %xmm5, %xmm3, %xmm32402; CHECK-AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm02403; CHECK-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm02404; CHECK-AVX1-NEXT: vpcmpeqb %xmm2, %xmm4, %xmm32405; CHECK-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm02406; CHECK-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm32407; CHECK-AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm32408; CHECK-AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm12409; CHECK-AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm12410; CHECK-AVX1-NEXT: vorps %ymm0, %ymm1, %ymm02411; CHECK-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm12412; CHECK-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm12413; CHECK-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm02414; CHECK-AVX1-NEXT: retq2415;2416; CHECK-AVX2-LABEL: pr51133:2417; CHECK-AVX2: # %bb.0:2418; CHECK-AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm22419; CHECK-AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]2420; CHECK-AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [0,133,0,133,0,103,0,147,0,85,0,129,0,86,0,137,0,9,0,0,0,41,0,147,0,129,0,129,0,85,0,141]2421; CHECK-AVX2-NEXT: vpsrlw $8, %ymm3, %ymm32422; CHECK-AVX2-NEXT: vpunpcklbw {{.*#+}} ymm4 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]2423; CHECK-AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [0,79,0,103,0,27,0,121,0,129,0,129,0,129,0,47,0,86,0,95,0,147,0,43,0,49,0,127,0,65,0,147]2424; CHECK-AVX2-NEXT: vpsrlw $8, %ymm4, %ymm42425; CHECK-AVX2-NEXT: vpackuswb %ymm3, %ymm4, %ymm32426; CHECK-AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm4 # [0,0,0,0,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,255,0,1,0,1,0,1,1,1,0,1]2427; CHECK-AVX2-NEXT: vpbroadcastw {{.*#+}} ymm5 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]2428; CHECK-AVX2-NEXT: vpand %ymm5, %ymm4, %ymm42429; CHECK-AVX2-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm6 # [0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,255,0,1,0,1,0,1,0,1,0,1]2430; CHECK-AVX2-NEXT: vpsllw $8, %ymm6, %ymm62431; CHECK-AVX2-NEXT: vpor %ymm6, %ymm4, %ymm42432; CHECK-AVX2-NEXT: vpaddb %ymm4, %ymm3, %ymm32433; CHECK-AVX2-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]2434; CHECK-AVX2-NEXT: vpsraw $8, %ymm4, %ymm42435; CHECK-AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [8,8,128,64,8,256,256,8,64,256,32,64,256,64,8,4]2436; CHECK-AVX2-NEXT: vpsrlw $8, %ymm4, %ymm42437; CHECK-AVX2-NEXT: vpunpcklbw {{.*#+}} ymm6 = ymm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]2438; CHECK-AVX2-NEXT: vpsraw $8, %ymm6, %ymm62439; CHECK-AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm6, %ymm6 # [64,128,128,16,256,64,256,16,256,8,64,256,16,4,8,8]2440; CHECK-AVX2-NEXT: vpsrlw $8, %ymm6, %ymm62441; CHECK-AVX2-NEXT: vpackuswb %ymm4, %ymm6, %ymm42442; CHECK-AVX2-NEXT: vpsrlw $7, %ymm3, %ymm32443; CHECK-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32444; CHECK-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm32445; CHECK-AVX2-NEXT: vpaddb %ymm3, %ymm4, %ymm32446; CHECK-AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm4 # [13,5,19,34,2,8,2,88,62,62,5,7,97,2,3,60,3,87,7,6,84,128,127,56,114,1,50,7,2,8,97,117]2447; CHECK-AVX2-NEXT: vpand %ymm5, %ymm4, %ymm42448; CHECK-AVX2-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [0,5,0,34,0,8,0,88,0,62,0,7,0,2,0,60,0,87,0,6,0,128,0,56,0,1,0,7,0,8,0,117]2449; CHECK-AVX2-NEXT: vpsllw $8, %ymm3, %ymm32450; CHECK-AVX2-NEXT: vpor %ymm3, %ymm4, %ymm32451; CHECK-AVX2-NEXT: vpsubb %ymm3, %ymm0, %ymm02452; CHECK-AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm02453; CHECK-AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm12454; CHECK-AVX2-NEXT: vpor %ymm0, %ymm1, %ymm02455; CHECK-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm12456; CHECK-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm02457; CHECK-AVX2-NEXT: retq2458;2459; CHECK-AVX512VL-LABEL: pr51133:2460; CHECK-AVX512VL: # %bb.0:2461; CHECK-AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2 # [197,205,27,241,1,1,1,163,223,223,205,183,161,1,171,239,171,103,183,171,61,1,127,183,9,0,41,183,1,1,161,221]2462; CHECK-AVX512VL-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3 # [0,205,0,241,0,1,0,163,0,223,0,183,0,1,0,239,0,103,0,171,0,1,0,183,0,0,0,183,0,1,0,221]2463; CHECK-AVX512VL-NEXT: vpsllw $8, %ymm3, %ymm32464; CHECK-AVX512VL-NEXT: vpternlogd {{.*#+}} ymm3 = ymm3 | (ymm2 & m32bcst)2465; CHECK-AVX512VL-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm22466; CHECK-AVX512VL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]2467; CHECK-AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [128,128,1,1,1,128,1,64,128,1,128,1,128,32,1,1]2468; CHECK-AVX512VL-NEXT: vpsrlw $8, %ymm3, %ymm32469; CHECK-AVX512VL-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]2470; CHECK-AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [1,1,1,128,128,32,128,32,1,1,1,128,64,2,1,32]2471; CHECK-AVX512VL-NEXT: vpsrlw $8, %ymm2, %ymm22472; CHECK-AVX512VL-NEXT: vpackuswb %ymm3, %ymm2, %ymm22473; CHECK-AVX512VL-NEXT: vpminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm32474; CHECK-AVX512VL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm22475; CHECK-AVX512VL-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]2476; CHECK-AVX512VL-NEXT: vpandn %ymm3, %ymm2, %ymm22477; CHECK-AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm02478; CHECK-AVX512VL-NEXT: vpxor %xmm4, %xmm4, %xmm42479; CHECK-AVX512VL-NEXT: vpcmpgtb %ymm4, %ymm0, %ymm02480; CHECK-AVX512VL-NEXT: vpandn %ymm0, %ymm3, %ymm32481; CHECK-AVX512VL-NEXT: vpcmpeqb %ymm4, %ymm1, %ymm02482; CHECK-AVX512VL-NEXT: vpternlogq {{.*#+}} ymm0 = ~ymm0 & (ymm2 | ymm3)2483; CHECK-AVX512VL-NEXT: retq2484 %rem = srem <32 x i8> %x, <i8 13, i8 5, i8 19, i8 34, i8 2, i8 8, i8 2, i8 88, i8 62, i8 62, i8 5, i8 7, i8 97, i8 2, i8 3, i8 60, i8 3, i8 87, i8 7, i8 6, i8 84, i8 -128, i8 127, i8 56, i8 114, i8 1, i8 50, i8 7, i8 2, i8 8, i8 97, i8 117>2485 %cmp = icmp ne <32 x i8> %rem, zeroinitializer2486 %cmp4 = icmp ne <32 x i8> %y, zeroinitializer2487 %cmpres = and <32 x i1> %cmp4, %cmp2488 ret <32 x i1> %cmpres2489}2490