brintos

brintos / llvm-project-archived public Read only

0
0
Text · 31.8 KiB · d459d01 Raw
679 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-prefixes=CHECK-SSE,CHECK-SSE23; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 < %s | FileCheck %s --check-prefixes=CHECK-SSE,CHECK-SSE414; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefixes=CHECK-AVX,CHECK-AVX15; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefixes=CHECK-AVX,CHECK-AVX26; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=CHECK-AVX,CHECK-AVX512VL7 8; Odd divisor9define <4 x i32> @test_srem_odd_25(<4 x i32> %X) nounwind {10; CHECK-SSE2-LABEL: test_srem_odd_25:11; CHECK-SSE2:       # %bb.0:12; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]13; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]14; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm015; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]16; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm217; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]18; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]19; CHECK-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm020; CHECK-SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm021; CHECK-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm022; CHECK-SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm023; CHECK-SSE2-NEXT:    retq24;25; CHECK-SSE41-LABEL: test_srem_odd_25:26; CHECK-SSE41:       # %bb.0:27; CHECK-SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3264175145,3264175145,3264175145,3264175145]28; CHECK-SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm029; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]30; CHECK-SSE41-NEXT:    pminud %xmm0, %xmm131; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm032; CHECK-SSE41-NEXT:    psrld $31, %xmm033; CHECK-SSE41-NEXT:    retq34;35; CHECK-AVX1-LABEL: test_srem_odd_25:36; CHECK-AVX1:       # %bb.0:37; CHECK-AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3264175145,3264175145,3264175145,3264175145]38; CHECK-AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm039; CHECK-AVX1-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm140; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm041; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm042; CHECK-AVX1-NEXT:    retq43;44; CHECK-AVX2-LABEL: test_srem_odd_25:45; CHECK-AVX2:       # %bb.0:46; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]47; CHECK-AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm048; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [85899345,85899345,85899345,85899345]49; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm050; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]51; CHECK-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm152; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm053; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm054; CHECK-AVX2-NEXT:    retq55;56; CHECK-AVX512VL-LABEL: test_srem_odd_25:57; CHECK-AVX512VL:       # %bb.0:58; CHECK-AVX512VL-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm059; CHECK-AVX512VL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm060; CHECK-AVX512VL-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm161; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm062; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm063; CHECK-AVX512VL-NEXT:    retq64  %srem = srem <4 x i32> %X, <i32 25, i32 25, i32 25, i32 25>65  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>66  %ret = zext <4 x i1> %cmp to <4 x i32>67  ret <4 x i32> %ret68}69 70; Even divisors71define <4 x i32> @test_srem_even_100(<4 x i32> %X) nounwind {72; CHECK-SSE2-LABEL: test_srem_even_100:73; CHECK-SSE2:       # %bb.0:74; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]75; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]76; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm077; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]78; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm279; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]80; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]81; CHECK-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm082; CHECK-SSE2-NEXT:    movdqa %xmm0, %xmm183; CHECK-SSE2-NEXT:    psrld $2, %xmm184; CHECK-SSE2-NEXT:    pslld $30, %xmm085; CHECK-SSE2-NEXT:    por %xmm1, %xmm086; CHECK-SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm087; CHECK-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm088; CHECK-SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm089; CHECK-SSE2-NEXT:    retq90;91; CHECK-SSE41-LABEL: test_srem_even_100:92; CHECK-SSE41:       # %bb.0:93; CHECK-SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3264175145,3264175145,3264175145,3264175145]94; CHECK-SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm095; CHECK-SSE41-NEXT:    movdqa %xmm0, %xmm196; CHECK-SSE41-NEXT:    psrld $2, %xmm197; CHECK-SSE41-NEXT:    pslld $30, %xmm098; CHECK-SSE41-NEXT:    por %xmm1, %xmm099; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [42949672,42949672,42949672,42949672]100; CHECK-SSE41-NEXT:    pminud %xmm0, %xmm1101; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0102; CHECK-SSE41-NEXT:    psrld $31, %xmm0103; CHECK-SSE41-NEXT:    retq104;105; CHECK-AVX1-LABEL: test_srem_even_100:106; CHECK-AVX1:       # %bb.0:107; CHECK-AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3264175145,3264175145,3264175145,3264175145]108; CHECK-AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0109; CHECK-AVX1-NEXT:    vpsrld $2, %xmm0, %xmm1110; CHECK-AVX1-NEXT:    vpslld $30, %xmm0, %xmm0111; CHECK-AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0112; CHECK-AVX1-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1113; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0114; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0115; CHECK-AVX1-NEXT:    retq116;117; CHECK-AVX2-LABEL: test_srem_even_100:118; CHECK-AVX2:       # %bb.0:119; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]120; CHECK-AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0121; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [85899344,85899344,85899344,85899344]122; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0123; CHECK-AVX2-NEXT:    vpsrld $2, %xmm0, %xmm1124; CHECK-AVX2-NEXT:    vpslld $30, %xmm0, %xmm0125; CHECK-AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0126; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [42949672,42949672,42949672,42949672]127; CHECK-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm1128; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0129; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0130; CHECK-AVX2-NEXT:    retq131;132; CHECK-AVX512VL-LABEL: test_srem_even_100:133; CHECK-AVX512VL:       # %bb.0:134; CHECK-AVX512VL-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0135; CHECK-AVX512VL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0136; CHECK-AVX512VL-NEXT:    vprord $2, %xmm0, %xmm0137; CHECK-AVX512VL-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1138; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0139; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0140; CHECK-AVX512VL-NEXT:    retq141  %srem = srem <4 x i32> %X, <i32 100, i32 100, i32 100, i32 100>142  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>143  %ret = zext <4 x i1> %cmp to <4 x i32>144  ret <4 x i32> %ret145}146 147; Negative divisors should be negated, and thus this is still splat vectors.148 149; Odd divisor150define <4 x i32> @test_srem_odd_neg25(<4 x i32> %X) nounwind {151; CHECK-SSE2-LABEL: test_srem_odd_neg25:152; CHECK-SSE2:       # %bb.0:153; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]154; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]155; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm0156; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]157; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2158; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]159; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]160; CHECK-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0161; CHECK-SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0162; CHECK-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0163; CHECK-SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0164; CHECK-SSE2-NEXT:    retq165;166; CHECK-SSE41-LABEL: test_srem_odd_neg25:167; CHECK-SSE41:       # %bb.0:168; CHECK-SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3264175145,3264175145,3264175145,3264175145]169; CHECK-SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0170; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]171; CHECK-SSE41-NEXT:    pminud %xmm0, %xmm1172; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0173; CHECK-SSE41-NEXT:    psrld $31, %xmm0174; CHECK-SSE41-NEXT:    retq175;176; CHECK-AVX1-LABEL: test_srem_odd_neg25:177; CHECK-AVX1:       # %bb.0:178; CHECK-AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3264175145,3264175145,3264175145,3264175145]179; CHECK-AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0180; CHECK-AVX1-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1181; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0182; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0183; CHECK-AVX1-NEXT:    retq184;185; CHECK-AVX2-LABEL: test_srem_odd_neg25:186; CHECK-AVX2:       # %bb.0:187; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]188; CHECK-AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0189; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [85899345,85899345,85899345,85899345]190; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0191; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]192; CHECK-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm1193; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0194; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0195; CHECK-AVX2-NEXT:    retq196;197; CHECK-AVX512VL-LABEL: test_srem_odd_neg25:198; CHECK-AVX512VL:       # %bb.0:199; CHECK-AVX512VL-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0200; CHECK-AVX512VL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0201; CHECK-AVX512VL-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1202; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0203; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0204; CHECK-AVX512VL-NEXT:    retq205  %srem = srem <4 x i32> %X, <i32 25, i32 -25, i32 -25, i32 25>206  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>207  %ret = zext <4 x i1> %cmp to <4 x i32>208  ret <4 x i32> %ret209}210 211; Even divisors212define <4 x i32> @test_srem_even_neg100(<4 x i32> %X) nounwind {213; CHECK-SSE2-LABEL: test_srem_even_neg100:214; CHECK-SSE2:       # %bb.0:215; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]216; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]217; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm0218; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]219; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2220; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]221; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]222; CHECK-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0223; CHECK-SSE2-NEXT:    movdqa %xmm0, %xmm1224; CHECK-SSE2-NEXT:    psrld $2, %xmm1225; CHECK-SSE2-NEXT:    pslld $30, %xmm0226; CHECK-SSE2-NEXT:    por %xmm1, %xmm0227; CHECK-SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0228; CHECK-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0229; CHECK-SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0230; CHECK-SSE2-NEXT:    retq231;232; CHECK-SSE41-LABEL: test_srem_even_neg100:233; CHECK-SSE41:       # %bb.0:234; CHECK-SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [3264175145,3264175145,3264175145,3264175145]235; CHECK-SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0236; CHECK-SSE41-NEXT:    movdqa %xmm0, %xmm1237; CHECK-SSE41-NEXT:    psrld $2, %xmm1238; CHECK-SSE41-NEXT:    pslld $30, %xmm0239; CHECK-SSE41-NEXT:    por %xmm1, %xmm0240; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [42949672,42949672,42949672,42949672]241; CHECK-SSE41-NEXT:    pminud %xmm0, %xmm1242; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0243; CHECK-SSE41-NEXT:    psrld $31, %xmm0244; CHECK-SSE41-NEXT:    retq245;246; CHECK-AVX1-LABEL: test_srem_even_neg100:247; CHECK-AVX1:       # %bb.0:248; CHECK-AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [3264175145,3264175145,3264175145,3264175145]249; CHECK-AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0250; CHECK-AVX1-NEXT:    vpsrld $2, %xmm0, %xmm1251; CHECK-AVX1-NEXT:    vpslld $30, %xmm0, %xmm0252; CHECK-AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0253; CHECK-AVX1-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1254; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0255; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0256; CHECK-AVX1-NEXT:    retq257;258; CHECK-AVX2-LABEL: test_srem_even_neg100:259; CHECK-AVX2:       # %bb.0:260; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]261; CHECK-AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0262; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [85899344,85899344,85899344,85899344]263; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0264; CHECK-AVX2-NEXT:    vpsrld $2, %xmm0, %xmm1265; CHECK-AVX2-NEXT:    vpslld $30, %xmm0, %xmm0266; CHECK-AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0267; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [42949672,42949672,42949672,42949672]268; CHECK-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm1269; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0270; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0271; CHECK-AVX2-NEXT:    retq272;273; CHECK-AVX512VL-LABEL: test_srem_even_neg100:274; CHECK-AVX512VL:       # %bb.0:275; CHECK-AVX512VL-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0276; CHECK-AVX512VL-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0277; CHECK-AVX512VL-NEXT:    vprord $2, %xmm0, %xmm0278; CHECK-AVX512VL-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1279; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0280; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0281; CHECK-AVX512VL-NEXT:    retq282  %srem = srem <4 x i32> %X, <i32 -100, i32 100, i32 -100, i32 100>283  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>284  %ret = zext <4 x i1> %cmp to <4 x i32>285  ret <4 x i32> %ret286}287 288;------------------------------------------------------------------------------;289; Comparison constant has undef elements.290;------------------------------------------------------------------------------;291 292define <4 x i32> @test_srem_odd_undef1(<4 x i32> %X) nounwind {293; CHECK-SSE2-LABEL: test_srem_odd_undef1:294; CHECK-SSE2:       # %bb.0:295; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1374389535,1374389535,1374389535,1374389535]296; CHECK-SSE2-NEXT:    movdqa %xmm0, %xmm2297; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2298; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]299; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]300; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm3301; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]302; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]303; CHECK-SSE2-NEXT:    pxor %xmm3, %xmm3304; CHECK-SSE2-NEXT:    pxor %xmm4, %xmm4305; CHECK-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4306; CHECK-SSE2-NEXT:    pand %xmm1, %xmm4307; CHECK-SSE2-NEXT:    psubd %xmm4, %xmm2308; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm1309; CHECK-SSE2-NEXT:    psrld $31, %xmm1310; CHECK-SSE2-NEXT:    psrad $3, %xmm2311; CHECK-SSE2-NEXT:    paddd %xmm1, %xmm2312; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [25,25,25,25]313; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]314; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2315; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]316; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm4317; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]318; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]319; CHECK-SSE2-NEXT:    psubd %xmm2, %xmm0320; CHECK-SSE2-NEXT:    pcmpeqd %xmm3, %xmm0321; CHECK-SSE2-NEXT:    psrld $31, %xmm0322; CHECK-SSE2-NEXT:    retq323;324; CHECK-SSE41-LABEL: test_srem_odd_undef1:325; CHECK-SSE41:       # %bb.0:326; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]327; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]328; CHECK-SSE41-NEXT:    pmuldq %xmm2, %xmm1329; CHECK-SSE41-NEXT:    pmuldq %xmm0, %xmm2330; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]331; CHECK-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]332; CHECK-SSE41-NEXT:    movdqa %xmm2, %xmm1333; CHECK-SSE41-NEXT:    psrld $31, %xmm1334; CHECK-SSE41-NEXT:    psrad $3, %xmm2335; CHECK-SSE41-NEXT:    paddd %xmm1, %xmm2336; CHECK-SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [25,25,25,25]337; CHECK-SSE41-NEXT:    psubd %xmm2, %xmm0338; CHECK-SSE41-NEXT:    pxor %xmm1, %xmm1339; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0340; CHECK-SSE41-NEXT:    psrld $31, %xmm0341; CHECK-SSE41-NEXT:    retq342;343; CHECK-AVX1-LABEL: test_srem_odd_undef1:344; CHECK-AVX1:       # %bb.0:345; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]346; CHECK-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]347; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1348; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2349; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]350; CHECK-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]351; CHECK-AVX1-NEXT:    vpsrld $31, %xmm1, %xmm2352; CHECK-AVX1-NEXT:    vpsrad $3, %xmm1, %xmm1353; CHECK-AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1354; CHECK-AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [25,25,25,25]355; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0356; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1357; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0358; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0359; CHECK-AVX1-NEXT:    retq360;361; CHECK-AVX2-LABEL: test_srem_odd_undef1:362; CHECK-AVX2:       # %bb.0:363; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]364; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]365; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1366; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2367; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]368; CHECK-AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]369; CHECK-AVX2-NEXT:    vpsrld $31, %xmm1, %xmm2370; CHECK-AVX2-NEXT:    vpsrad $3, %xmm1, %xmm1371; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1372; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [25,25,25,25]373; CHECK-AVX2-NEXT:    vpmulld %xmm2, %xmm1, %xmm1374; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0375; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1376; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0377; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0378; CHECK-AVX2-NEXT:    retq379;380; CHECK-AVX512VL-LABEL: test_srem_odd_undef1:381; CHECK-AVX512VL:       # %bb.0:382; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]383; CHECK-AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]384; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1385; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2386; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]387; CHECK-AVX512VL-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]388; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm1, %xmm2389; CHECK-AVX512VL-NEXT:    vpsrad $3, %xmm1, %xmm1390; CHECK-AVX512VL-NEXT:    vpaddd %xmm2, %xmm1, %xmm1391; CHECK-AVX512VL-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1392; CHECK-AVX512VL-NEXT:    vpsubd %xmm1, %xmm0, %xmm0393; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1394; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0395; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0396; CHECK-AVX512VL-NEXT:    retq397  %srem = srem <4 x i32> %X, <i32 25, i32 25, i32 25, i32 25>398  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 undef, i32 0>399  %ret = zext <4 x i1> %cmp to <4 x i32>400  ret <4 x i32> %ret401}402 403define <4 x i32> @test_srem_even_undef1(<4 x i32> %X) nounwind {404; CHECK-SSE2-LABEL: test_srem_even_undef1:405; CHECK-SSE2:       # %bb.0:406; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1374389535,1374389535,1374389535,1374389535]407; CHECK-SSE2-NEXT:    movdqa %xmm0, %xmm2408; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2409; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]410; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]411; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm3412; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]413; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]414; CHECK-SSE2-NEXT:    pxor %xmm3, %xmm3415; CHECK-SSE2-NEXT:    pxor %xmm4, %xmm4416; CHECK-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4417; CHECK-SSE2-NEXT:    pand %xmm1, %xmm4418; CHECK-SSE2-NEXT:    psubd %xmm4, %xmm2419; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm1420; CHECK-SSE2-NEXT:    psrld $31, %xmm1421; CHECK-SSE2-NEXT:    psrad $5, %xmm2422; CHECK-SSE2-NEXT:    paddd %xmm1, %xmm2423; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [100,100,100,100]424; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]425; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2426; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]427; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm4428; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]429; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]430; CHECK-SSE2-NEXT:    psubd %xmm2, %xmm0431; CHECK-SSE2-NEXT:    pcmpeqd %xmm3, %xmm0432; CHECK-SSE2-NEXT:    psrld $31, %xmm0433; CHECK-SSE2-NEXT:    retq434;435; CHECK-SSE41-LABEL: test_srem_even_undef1:436; CHECK-SSE41:       # %bb.0:437; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]438; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]439; CHECK-SSE41-NEXT:    pmuldq %xmm2, %xmm1440; CHECK-SSE41-NEXT:    pmuldq %xmm0, %xmm2441; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]442; CHECK-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]443; CHECK-SSE41-NEXT:    movdqa %xmm2, %xmm1444; CHECK-SSE41-NEXT:    psrld $31, %xmm1445; CHECK-SSE41-NEXT:    psrad $5, %xmm2446; CHECK-SSE41-NEXT:    paddd %xmm1, %xmm2447; CHECK-SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [100,100,100,100]448; CHECK-SSE41-NEXT:    psubd %xmm2, %xmm0449; CHECK-SSE41-NEXT:    pxor %xmm1, %xmm1450; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0451; CHECK-SSE41-NEXT:    psrld $31, %xmm0452; CHECK-SSE41-NEXT:    retq453;454; CHECK-AVX1-LABEL: test_srem_even_undef1:455; CHECK-AVX1:       # %bb.0:456; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]457; CHECK-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]458; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1459; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2460; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]461; CHECK-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]462; CHECK-AVX1-NEXT:    vpsrld $31, %xmm1, %xmm2463; CHECK-AVX1-NEXT:    vpsrad $5, %xmm1, %xmm1464; CHECK-AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1465; CHECK-AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [100,100,100,100]466; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0467; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1468; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0469; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0470; CHECK-AVX1-NEXT:    retq471;472; CHECK-AVX2-LABEL: test_srem_even_undef1:473; CHECK-AVX2:       # %bb.0:474; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]475; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]476; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1477; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2478; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]479; CHECK-AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]480; CHECK-AVX2-NEXT:    vpsrld $31, %xmm1, %xmm2481; CHECK-AVX2-NEXT:    vpsrad $5, %xmm1, %xmm1482; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1483; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [100,100,100,100]484; CHECK-AVX2-NEXT:    vpmulld %xmm2, %xmm1, %xmm1485; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0486; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1487; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0488; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0489; CHECK-AVX2-NEXT:    retq490;491; CHECK-AVX512VL-LABEL: test_srem_even_undef1:492; CHECK-AVX512VL:       # %bb.0:493; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]494; CHECK-AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]495; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1496; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2497; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]498; CHECK-AVX512VL-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]499; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm1, %xmm2500; CHECK-AVX512VL-NEXT:    vpsrad $5, %xmm1, %xmm1501; CHECK-AVX512VL-NEXT:    vpaddd %xmm2, %xmm1, %xmm1502; CHECK-AVX512VL-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1503; CHECK-AVX512VL-NEXT:    vpsubd %xmm1, %xmm0, %xmm0504; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1505; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0506; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0507; CHECK-AVX512VL-NEXT:    retq508  %srem = srem <4 x i32> %X, <i32 100, i32 100, i32 100, i32 100>509  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 undef, i32 0>510  %ret = zext <4 x i1> %cmp to <4 x i32>511  ret <4 x i32> %ret512}513 514;------------------------------------------------------------------------------;515; Negative tests516;------------------------------------------------------------------------------;517 518define <4 x i32> @test_srem_one_eq(<4 x i32> %X) nounwind {519; CHECK-SSE-LABEL: test_srem_one_eq:520; CHECK-SSE:       # %bb.0:521; CHECK-SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,1,1,1]522; CHECK-SSE-NEXT:    retq523;524; CHECK-AVX-LABEL: test_srem_one_eq:525; CHECK-AVX:       # %bb.0:526; CHECK-AVX-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1,1,1,1]527; CHECK-AVX-NEXT:    retq528  %srem = srem <4 x i32> %X, <i32 1, i32 1, i32 1, i32 1>529  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>530  %ret = zext <4 x i1> %cmp to <4 x i32>531  ret <4 x i32> %ret532}533define <4 x i32> @test_srem_one_ne(<4 x i32> %X) nounwind {534; CHECK-SSE-LABEL: test_srem_one_ne:535; CHECK-SSE:       # %bb.0:536; CHECK-SSE-NEXT:    xorps %xmm0, %xmm0537; CHECK-SSE-NEXT:    retq538;539; CHECK-AVX-LABEL: test_srem_one_ne:540; CHECK-AVX:       # %bb.0:541; CHECK-AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0542; CHECK-AVX-NEXT:    retq543  %srem = srem <4 x i32> %X, <i32 1, i32 1, i32 1, i32 1>544  %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>545  %ret = zext <4 x i1> %cmp to <4 x i32>546  ret <4 x i32> %ret547}548 549; We can lower remainder of division by powers of two much better elsewhere.550define <4 x i32> @test_srem_pow2(<4 x i32> %X) nounwind {551; CHECK-SSE-LABEL: test_srem_pow2:552; CHECK-SSE:       # %bb.0:553; CHECK-SSE-NEXT:    movdqa %xmm0, %xmm1554; CHECK-SSE-NEXT:    psrad $31, %xmm1555; CHECK-SSE-NEXT:    psrld $28, %xmm1556; CHECK-SSE-NEXT:    paddd %xmm0, %xmm1557; CHECK-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1558; CHECK-SSE-NEXT:    psubd %xmm1, %xmm0559; CHECK-SSE-NEXT:    pxor %xmm1, %xmm1560; CHECK-SSE-NEXT:    pcmpeqd %xmm1, %xmm0561; CHECK-SSE-NEXT:    psrld $31, %xmm0562; CHECK-SSE-NEXT:    retq563;564; CHECK-AVX1-LABEL: test_srem_pow2:565; CHECK-AVX1:       # %bb.0:566; CHECK-AVX1-NEXT:    vpsrad $31, %xmm0, %xmm1567; CHECK-AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1568; CHECK-AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1569; CHECK-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1570; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0571; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1572; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0573; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0574; CHECK-AVX1-NEXT:    retq575;576; CHECK-AVX2-LABEL: test_srem_pow2:577; CHECK-AVX2:       # %bb.0:578; CHECK-AVX2-NEXT:    vpsrad $31, %xmm0, %xmm1579; CHECK-AVX2-NEXT:    vpsrld $28, %xmm1, %xmm1580; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1581; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [4294967280,4294967280,4294967280,4294967280]582; CHECK-AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1583; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0584; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1585; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0586; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0587; CHECK-AVX2-NEXT:    retq588;589; CHECK-AVX512VL-LABEL: test_srem_pow2:590; CHECK-AVX512VL:       # %bb.0:591; CHECK-AVX512VL-NEXT:    vpsrad $31, %xmm0, %xmm1592; CHECK-AVX512VL-NEXT:    vpsrld $28, %xmm1, %xmm1593; CHECK-AVX512VL-NEXT:    vpaddd %xmm1, %xmm0, %xmm1594; CHECK-AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1595; CHECK-AVX512VL-NEXT:    vpsubd %xmm1, %xmm0, %xmm0596; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1597; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0598; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0599; CHECK-AVX512VL-NEXT:    retq600  %srem = srem <4 x i32> %X, <i32 16, i32 16, i32 16, i32 16>601  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>602  %ret = zext <4 x i1> %cmp to <4 x i32>603  ret <4 x i32> %ret604}605 606; We could lower remainder of division by INT_MIN much better elsewhere.607define <4 x i32> @test_srem_int_min(<4 x i32> %X) nounwind {608; CHECK-SSE-LABEL: test_srem_int_min:609; CHECK-SSE:       # %bb.0:610; CHECK-SSE-NEXT:    movdqa %xmm0, %xmm1611; CHECK-SSE-NEXT:    psrad $31, %xmm1612; CHECK-SSE-NEXT:    psrld $1, %xmm1613; CHECK-SSE-NEXT:    paddd %xmm0, %xmm1614; CHECK-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1615; CHECK-SSE-NEXT:    paddd %xmm1, %xmm0616; CHECK-SSE-NEXT:    pxor %xmm1, %xmm1617; CHECK-SSE-NEXT:    pcmpeqd %xmm1, %xmm0618; CHECK-SSE-NEXT:    psrld $31, %xmm0619; CHECK-SSE-NEXT:    retq620;621; CHECK-AVX1-LABEL: test_srem_int_min:622; CHECK-AVX1:       # %bb.0:623; CHECK-AVX1-NEXT:    vpsrad $31, %xmm0, %xmm1624; CHECK-AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1625; CHECK-AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1626; CHECK-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1627; CHECK-AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0628; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1629; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0630; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0631; CHECK-AVX1-NEXT:    retq632;633; CHECK-AVX2-LABEL: test_srem_int_min:634; CHECK-AVX2:       # %bb.0:635; CHECK-AVX2-NEXT:    vpsrad $31, %xmm0, %xmm1636; CHECK-AVX2-NEXT:    vpsrld $1, %xmm1, %xmm1637; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1638; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]639; CHECK-AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1640; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0641; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1642; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0643; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0644; CHECK-AVX2-NEXT:    retq645;646; CHECK-AVX512VL-LABEL: test_srem_int_min:647; CHECK-AVX512VL:       # %bb.0:648; CHECK-AVX512VL-NEXT:    vpsrad $31, %xmm0, %xmm1649; CHECK-AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1650; CHECK-AVX512VL-NEXT:    vpaddd %xmm1, %xmm0, %xmm1651; CHECK-AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1652; CHECK-AVX512VL-NEXT:    vpaddd %xmm1, %xmm0, %xmm0653; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1654; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0655; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0656; CHECK-AVX512VL-NEXT:    retq657  %srem = srem <4 x i32> %X, <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>658  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>659  %ret = zext <4 x i1> %cmp to <4 x i32>660  ret <4 x i32> %ret661}662 663; We could lower remainder of division by all-ones much better elsewhere.664define <4 x i32> @test_srem_allones(<4 x i32> %X) nounwind {665; CHECK-SSE-LABEL: test_srem_allones:666; CHECK-SSE:       # %bb.0:667; CHECK-SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,1,1,1]668; CHECK-SSE-NEXT:    retq669;670; CHECK-AVX-LABEL: test_srem_allones:671; CHECK-AVX:       # %bb.0:672; CHECK-AVX-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1,1,1,1]673; CHECK-AVX-NEXT:    retq674  %srem = srem <4 x i32> %X, <i32 4294967295, i32 4294967295, i32 4294967295, i32 4294967295>675  %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>676  %ret = zext <4 x i1> %cmp to <4 x i32>677  ret <4 x i32> %ret678}679