brintos

brintos / llvm-project-archived public Read only

0
0
Text · 50.2 KiB · cbc2b96 Raw
943 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2NOBW6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX512BW7 8;9; udiv by 710;11 12define <2 x i64> @test_div7_2i64(<2 x i64> %a) nounwind {13; SSE2-LABEL: test_div7_2i64:14; SSE2:       # %bb.0:15; SSE2-NEXT:    movq %xmm0, %rcx16; SSE2-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x249249249249249317; SSE2-NEXT:    movq %rcx, %rax18; SSE2-NEXT:    mulq %rsi19; SSE2-NEXT:    subq %rdx, %rcx20; SSE2-NEXT:    shrq %rcx21; SSE2-NEXT:    addq %rdx, %rcx22; SSE2-NEXT:    movq %rcx, %xmm123; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]24; SSE2-NEXT:    movq %xmm0, %rcx25; SSE2-NEXT:    movq %rcx, %rax26; SSE2-NEXT:    mulq %rsi27; SSE2-NEXT:    subq %rdx, %rcx28; SSE2-NEXT:    shrq %rcx29; SSE2-NEXT:    addq %rdx, %rcx30; SSE2-NEXT:    movq %rcx, %xmm031; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]32; SSE2-NEXT:    psrlq $2, %xmm133; SSE2-NEXT:    movdqa %xmm1, %xmm034; SSE2-NEXT:    retq35;36; SSE41-LABEL: test_div7_2i64:37; SSE41:       # %bb.0:38; SSE41-NEXT:    pextrq $1, %xmm0, %rcx39; SSE41-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x249249249249249340; SSE41-NEXT:    movq %rcx, %rax41; SSE41-NEXT:    mulq %rsi42; SSE41-NEXT:    subq %rdx, %rcx43; SSE41-NEXT:    shrq %rcx44; SSE41-NEXT:    addq %rdx, %rcx45; SSE41-NEXT:    movq %rcx, %xmm146; SSE41-NEXT:    movq %xmm0, %rcx47; SSE41-NEXT:    movq %rcx, %rax48; SSE41-NEXT:    mulq %rsi49; SSE41-NEXT:    subq %rdx, %rcx50; SSE41-NEXT:    shrq %rcx51; SSE41-NEXT:    addq %rdx, %rcx52; SSE41-NEXT:    movq %rcx, %xmm053; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]54; SSE41-NEXT:    psrlq $2, %xmm055; SSE41-NEXT:    retq56;57; AVX-LABEL: test_div7_2i64:58; AVX:       # %bb.0:59; AVX-NEXT:    vpextrq $1, %xmm0, %rcx60; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x249249249249249361; AVX-NEXT:    movq %rcx, %rax62; AVX-NEXT:    mulq %rsi63; AVX-NEXT:    subq %rdx, %rcx64; AVX-NEXT:    shrq %rcx65; AVX-NEXT:    addq %rdx, %rcx66; AVX-NEXT:    vmovq %rcx, %xmm167; AVX-NEXT:    vmovq %xmm0, %rcx68; AVX-NEXT:    movq %rcx, %rax69; AVX-NEXT:    mulq %rsi70; AVX-NEXT:    subq %rdx, %rcx71; AVX-NEXT:    shrq %rcx72; AVX-NEXT:    addq %rdx, %rcx73; AVX-NEXT:    vmovq %rcx, %xmm074; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]75; AVX-NEXT:    vpsrlq $2, %xmm0, %xmm076; AVX-NEXT:    retq77  %res = udiv <2 x i64> %a, <i64 7, i64 7>78  ret <2 x i64> %res79}80 81define <4 x i32> @test_div7_4i32(<4 x i32> %a) nounwind {82; SSE2-LABEL: test_div7_4i32:83; SSE2:       # %bb.0:84; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]85; SSE2-NEXT:    movdqa %xmm0, %xmm286; SSE2-NEXT:    pmuludq %xmm1, %xmm287; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]88; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]89; SSE2-NEXT:    pmuludq %xmm1, %xmm390; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]91; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]92; SSE2-NEXT:    psubd %xmm2, %xmm093; SSE2-NEXT:    psrld $1, %xmm094; SSE2-NEXT:    paddd %xmm2, %xmm095; SSE2-NEXT:    psrld $2, %xmm096; SSE2-NEXT:    retq97;98; SSE41-LABEL: test_div7_4i32:99; SSE41:       # %bb.0:100; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]101; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]102; SSE41-NEXT:    pmuludq %xmm2, %xmm1103; SSE41-NEXT:    pmuludq %xmm0, %xmm2104; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]105; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]106; SSE41-NEXT:    psubd %xmm2, %xmm0107; SSE41-NEXT:    psrld $1, %xmm0108; SSE41-NEXT:    paddd %xmm2, %xmm0109; SSE41-NEXT:    psrld $2, %xmm0110; SSE41-NEXT:    retq111;112; AVX1-LABEL: test_div7_4i32:113; AVX1:       # %bb.0:114; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]115; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]116; AVX1-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1117; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2118; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]119; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]120; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0121; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0122; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0123; AVX1-NEXT:    vpsrld $2, %xmm0, %xmm0124; AVX1-NEXT:    retq125;126; AVX2-LABEL: test_div7_4i32:127; AVX2:       # %bb.0:128; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]129; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]130; AVX2-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1131; AVX2-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2132; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]133; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]134; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0135; AVX2-NEXT:    vpsrld $1, %xmm0, %xmm0136; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0137; AVX2-NEXT:    vpsrld $2, %xmm0, %xmm0138; AVX2-NEXT:    retq139  %res = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>140  ret <4 x i32> %res141}142 143define <8 x i16> @test_div7_8i16(<8 x i16> %a) nounwind {144; SSE-LABEL: test_div7_8i16:145; SSE:       # %bb.0:146; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]147; SSE-NEXT:    pmulhuw %xmm0, %xmm1148; SSE-NEXT:    psubw %xmm1, %xmm0149; SSE-NEXT:    psrlw $1, %xmm0150; SSE-NEXT:    paddw %xmm1, %xmm0151; SSE-NEXT:    psrlw $2, %xmm0152; SSE-NEXT:    retq153;154; AVX-LABEL: test_div7_8i16:155; AVX:       # %bb.0:156; AVX-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [9363,9363,9363,9363,9363,9363,9363,9363]157; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0158; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0159; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0160; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm0161; AVX-NEXT:    retq162  %res = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>163  ret <8 x i16> %res164}165 166define <16 x i8> @test_div7_16i8(<16 x i8> %a) nounwind {167; SSE2-LABEL: test_div7_16i8:168; SSE2:       # %bb.0:169; SSE2-NEXT:    pxor %xmm1, %xmm1170; SSE2-NEXT:    movdqa %xmm0, %xmm2171; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]172; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]173; SSE2-NEXT:    pmullw %xmm3, %xmm2174; SSE2-NEXT:    psrlw $8, %xmm2175; SSE2-NEXT:    movdqa %xmm0, %xmm4176; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]177; SSE2-NEXT:    pmullw %xmm3, %xmm4178; SSE2-NEXT:    psrlw $8, %xmm4179; SSE2-NEXT:    packuswb %xmm2, %xmm4180; SSE2-NEXT:    psubb %xmm4, %xmm0181; SSE2-NEXT:    psrlw $1, %xmm0182; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0183; SSE2-NEXT:    paddb %xmm4, %xmm0184; SSE2-NEXT:    psrlw $2, %xmm0185; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0186; SSE2-NEXT:    retq187;188; SSE41-LABEL: test_div7_16i8:189; SSE41:       # %bb.0:190; SSE41-NEXT:    pxor %xmm1, %xmm1191; SSE41-NEXT:    movdqa %xmm0, %xmm2192; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]193; SSE41-NEXT:    pmovsxbw {{.*#+}} xmm1 = [37,37,37,37,37,37,37,37]194; SSE41-NEXT:    pmullw %xmm1, %xmm2195; SSE41-NEXT:    psrlw $8, %xmm2196; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero197; SSE41-NEXT:    pmullw %xmm1, %xmm3198; SSE41-NEXT:    psrlw $8, %xmm3199; SSE41-NEXT:    packuswb %xmm2, %xmm3200; SSE41-NEXT:    psubb %xmm3, %xmm0201; SSE41-NEXT:    psrlw $1, %xmm0202; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0203; SSE41-NEXT:    paddb %xmm3, %xmm0204; SSE41-NEXT:    psrlw $2, %xmm0205; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0206; SSE41-NEXT:    retq207;208; AVX1-LABEL: test_div7_16i8:209; AVX1:       # %bb.0:210; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1211; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]212; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]213; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1214; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1215; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero216; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2217; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2218; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1219; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0220; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0221; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0222; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0223; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm0224; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0225; AVX1-NEXT:    retq226;227; AVX2NOBW-LABEL: test_div7_16i8:228; AVX2NOBW:       # %bb.0:229; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero230; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37]231; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1232; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2233; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1234; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0235; AVX2NOBW-NEXT:    vpsrlw $1, %xmm0, %xmm0236; AVX2NOBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0237; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0238; AVX2NOBW-NEXT:    vpsrlw $2, %xmm0, %xmm0239; AVX2NOBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0240; AVX2NOBW-NEXT:    vzeroupper241; AVX2NOBW-NEXT:    retq242;243; AVX512BW-LABEL: test_div7_16i8:244; AVX512BW:       # %bb.0:245; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero246; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37]247; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1248; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1249; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0250; AVX512BW-NEXT:    vpsrlw $1, %xmm0, %xmm0251; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0252; AVX512BW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0253; AVX512BW-NEXT:    vpsrlw $2, %xmm0, %xmm0254; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0255; AVX512BW-NEXT:    vzeroupper256; AVX512BW-NEXT:    retq257  %res = udiv <16 x i8> %a, <i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7>258  ret <16 x i8> %res259}260 261;262; sdiv by non-splat constant263;264 265define <16 x i8> @test_divconstant_16i8(<16 x i8> %a) nounwind {266; SSE2-LABEL: test_divconstant_16i8:267; SSE2:       # %bb.0:268; SSE2-NEXT:    pxor %xmm1, %xmm1269; SSE2-NEXT:    movdqa %xmm0, %xmm2270; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]271; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [128,256,256,256,256,256,256,256]272; SSE2-NEXT:    psrlw $8, %xmm2273; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [147,0,79,0,171,0,117,0,205,0,57,0,57,0,37,0]274; SSE2-NEXT:    psrlw $8, %xmm2275; SSE2-NEXT:    movdqa %xmm0, %xmm3276; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]277; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [256,256,256,256,256,256,256,128]278; SSE2-NEXT:    psrlw $8, %xmm3279; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]280; SSE2-NEXT:    psrlw $8, %xmm3281; SSE2-NEXT:    packuswb %xmm2, %xmm3282; SSE2-NEXT:    psubb %xmm3, %xmm0283; SSE2-NEXT:    movdqa %xmm0, %xmm2284; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]285; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]286; SSE2-NEXT:    psrlw $8, %xmm2287; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]288; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]289; SSE2-NEXT:    psrlw $8, %xmm0290; SSE2-NEXT:    packuswb %xmm2, %xmm0291; SSE2-NEXT:    paddb %xmm3, %xmm0292; SSE2-NEXT:    movdqa %xmm0, %xmm2293; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]294; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [64,64,32,32,32,128,128,64]295; SSE2-NEXT:    psrlw $8, %xmm2296; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]297; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [64,256,128,32,32,32,64,64]298; SSE2-NEXT:    psrlw $8, %xmm0299; SSE2-NEXT:    packuswb %xmm2, %xmm0300; SSE2-NEXT:    retq301;302; SSE41-LABEL: test_divconstant_16i8:303; SSE41:       # %bb.0:304; SSE41-NEXT:    pxor %xmm1, %xmm1305; SSE41-NEXT:    pxor %xmm2, %xmm2306; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = 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]307; SSE41-NEXT:    movdqa %xmm0, %xmm3308; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]309; SSE41-NEXT:    psllw $7, %xmm3310; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1,2,3,4,5,6,7]311; SSE41-NEXT:    psrlw $8, %xmm3312; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [147,0,79,0,171,0,117,0,205,0,57,0,57,0,37,0]313; SSE41-NEXT:    psrlw $8, %xmm3314; SSE41-NEXT:    pxor %xmm2, %xmm2315; SSE41-NEXT:    punpcklbw {{.*#+}} xmm2 = 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]316; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero317; SSE41-NEXT:    psllw $7, %xmm4318; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm2[0,1,2,3,4,5,6],xmm4[7]319; SSE41-NEXT:    psrlw $8, %xmm4320; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]321; SSE41-NEXT:    psrlw $8, %xmm4322; SSE41-NEXT:    packuswb %xmm3, %xmm4323; SSE41-NEXT:    psubb %xmm4, %xmm0324; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero325; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]326; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]327; SSE41-NEXT:    psrlw $8, %xmm0328; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]329; SSE41-NEXT:    psrlw $8, %xmm2330; SSE41-NEXT:    packuswb %xmm0, %xmm2331; SSE41-NEXT:    paddb %xmm4, %xmm2332; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero333; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]334; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [64,64,32,32,32,128,128,64]335; SSE41-NEXT:    psrlw $8, %xmm2336; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [64,256,128,32,32,32,64,64]337; SSE41-NEXT:    psrlw $8, %xmm0338; SSE41-NEXT:    packuswb %xmm2, %xmm0339; SSE41-NEXT:    retq340;341; AVX1-LABEL: test_divconstant_16i8:342; AVX1:       # %bb.0:343; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1344; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = 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]345; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]346; AVX1-NEXT:    vpsllw $7, %xmm3, %xmm3347; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3,4,5,6,7]348; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2349; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [147,0,79,0,171,0,117,0,205,0,57,0,57,0,37,0]350; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2351; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]352; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero353; AVX1-NEXT:    vpsllw $7, %xmm4, %xmm4354; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6],xmm4[7]355; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3356; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]357; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3358; AVX1-NEXT:    vpackuswb %xmm2, %xmm3, %xmm2359; AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm0360; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]361; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]362; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3363; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero364; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]365; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0366; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0367; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0368; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]369; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [64,64,32,32,32,128,128,64]370; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1371; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero372; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [64,256,128,32,32,32,64,64]373; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0374; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0375; AVX1-NEXT:    retq376;377; AVX2NOBW-LABEL: test_divconstant_16i8:378; AVX2NOBW:       # %bb.0:379; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero380; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [256,256,256,256,256,256,256,128,128,256,256,256,256,256,256,256]381; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1382; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,32,57,205,117,171,79,147,147,79,171,117,205,57,57,37]383; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1384; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2385; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1386; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0387; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero388; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [128,0,0,0,128,0,0,0,0,0,0,128,0,0,0,128]389; AVX2NOBW-NEXT:    vpsrlw $8, %ymm0, %ymm0390; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm2391; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0392; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0393; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero394; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [64,256,128,32,32,32,64,64,64,64,32,32,32,128,128,64]395; AVX2NOBW-NEXT:    vpsrlw $8, %ymm0, %ymm0396; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm1397; AVX2NOBW-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0398; AVX2NOBW-NEXT:    vzeroupper399; AVX2NOBW-NEXT:    retq400;401; AVX512BW-LABEL: test_divconstant_16i8:402; AVX512BW:       # %bb.0:403; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0]404; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero405; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm2, %zmm1406; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,32,57,205,117,171,79,147,147,79,171,117,205,57,57,37]407; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1408; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1409; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0410; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero411; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [128,0,0,0,128,0,0,0,0,0,0,128,0,0,0,128]412; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0413; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0414; AVX512BW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0415; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero416; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [2,0,1,3,3,3,2,2,2,2,3,3,3,1,1,2]417; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0418; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0419; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0420; AVX512BW-NEXT:    vzeroupper421; AVX512BW-NEXT:    retq422  %res = udiv <16 x i8> %a, <i8 7, i8 8, i8 9, i8 10,i8 11, i8 12, i8 13, i8 14, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9,i8 9, i8 7>423  ret <16 x i8> %res424}425 426;427; urem by 7428;429 430define <2 x i64> @test_rem7_2i64(<2 x i64> %a) nounwind {431; SSE2-LABEL: test_rem7_2i64:432; SSE2:       # %bb.0:433; SSE2-NEXT:    movq %xmm0, %rcx434; SSE2-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493435; SSE2-NEXT:    movq %rcx, %rax436; SSE2-NEXT:    mulq %rsi437; SSE2-NEXT:    movq %rcx, %rax438; SSE2-NEXT:    subq %rdx, %rax439; SSE2-NEXT:    shrq %rax440; SSE2-NEXT:    addq %rdx, %rax441; SSE2-NEXT:    shrq $2, %rax442; SSE2-NEXT:    leaq (,%rax,8), %rdx443; SSE2-NEXT:    subq %rdx, %rax444; SSE2-NEXT:    addq %rcx, %rax445; SSE2-NEXT:    movq %rax, %xmm1446; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]447; SSE2-NEXT:    movq %xmm0, %rcx448; SSE2-NEXT:    movq %rcx, %rax449; SSE2-NEXT:    mulq %rsi450; SSE2-NEXT:    movq %rcx, %rax451; SSE2-NEXT:    subq %rdx, %rax452; SSE2-NEXT:    shrq %rax453; SSE2-NEXT:    addq %rdx, %rax454; SSE2-NEXT:    shrq $2, %rax455; SSE2-NEXT:    leaq (,%rax,8), %rdx456; SSE2-NEXT:    subq %rdx, %rax457; SSE2-NEXT:    addq %rcx, %rax458; SSE2-NEXT:    movq %rax, %xmm0459; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]460; SSE2-NEXT:    movdqa %xmm1, %xmm0461; SSE2-NEXT:    retq462;463; SSE41-LABEL: test_rem7_2i64:464; SSE41:       # %bb.0:465; SSE41-NEXT:    pextrq $1, %xmm0, %rcx466; SSE41-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493467; SSE41-NEXT:    movq %rcx, %rax468; SSE41-NEXT:    mulq %rsi469; SSE41-NEXT:    movq %rcx, %rax470; SSE41-NEXT:    subq %rdx, %rax471; SSE41-NEXT:    shrq %rax472; SSE41-NEXT:    addq %rdx, %rax473; SSE41-NEXT:    shrq $2, %rax474; SSE41-NEXT:    leaq (,%rax,8), %rdx475; SSE41-NEXT:    subq %rdx, %rax476; SSE41-NEXT:    addq %rcx, %rax477; SSE41-NEXT:    movq %rax, %xmm1478; SSE41-NEXT:    movq %xmm0, %rcx479; SSE41-NEXT:    movq %rcx, %rax480; SSE41-NEXT:    mulq %rsi481; SSE41-NEXT:    movq %rcx, %rax482; SSE41-NEXT:    subq %rdx, %rax483; SSE41-NEXT:    shrq %rax484; SSE41-NEXT:    addq %rdx, %rax485; SSE41-NEXT:    shrq $2, %rax486; SSE41-NEXT:    leaq (,%rax,8), %rdx487; SSE41-NEXT:    subq %rdx, %rax488; SSE41-NEXT:    addq %rcx, %rax489; SSE41-NEXT:    movq %rax, %xmm0490; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]491; SSE41-NEXT:    retq492;493; AVX-LABEL: test_rem7_2i64:494; AVX:       # %bb.0:495; AVX-NEXT:    vpextrq $1, %xmm0, %rcx496; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493497; AVX-NEXT:    movq %rcx, %rax498; AVX-NEXT:    mulq %rsi499; AVX-NEXT:    movq %rcx, %rax500; AVX-NEXT:    subq %rdx, %rax501; AVX-NEXT:    shrq %rax502; AVX-NEXT:    addq %rdx, %rax503; AVX-NEXT:    shrq $2, %rax504; AVX-NEXT:    leaq (,%rax,8), %rdx505; AVX-NEXT:    subq %rdx, %rax506; AVX-NEXT:    addq %rcx, %rax507; AVX-NEXT:    vmovq %rax, %xmm1508; AVX-NEXT:    vmovq %xmm0, %rcx509; AVX-NEXT:    movq %rcx, %rax510; AVX-NEXT:    mulq %rsi511; AVX-NEXT:    movq %rcx, %rax512; AVX-NEXT:    subq %rdx, %rax513; AVX-NEXT:    shrq %rax514; AVX-NEXT:    addq %rdx, %rax515; AVX-NEXT:    shrq $2, %rax516; AVX-NEXT:    leaq (,%rax,8), %rdx517; AVX-NEXT:    subq %rdx, %rax518; AVX-NEXT:    addq %rcx, %rax519; AVX-NEXT:    vmovq %rax, %xmm0520; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]521; AVX-NEXT:    retq522  %res = urem <2 x i64> %a, <i64 7, i64 7>523  ret <2 x i64> %res524}525 526define <4 x i32> @test_rem7_4i32(<4 x i32> %a) nounwind {527; SSE2-LABEL: test_rem7_4i32:528; SSE2:       # %bb.0:529; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]530; SSE2-NEXT:    movdqa %xmm0, %xmm2531; SSE2-NEXT:    pmuludq %xmm1, %xmm2532; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]533; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]534; SSE2-NEXT:    pmuludq %xmm1, %xmm3535; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]536; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]537; SSE2-NEXT:    movdqa %xmm0, %xmm1538; SSE2-NEXT:    psubd %xmm2, %xmm1539; SSE2-NEXT:    psrld $1, %xmm1540; SSE2-NEXT:    paddd %xmm2, %xmm1541; SSE2-NEXT:    psrld $2, %xmm1542; SSE2-NEXT:    movdqa %xmm1, %xmm2543; SSE2-NEXT:    pslld $3, %xmm2544; SSE2-NEXT:    psubd %xmm2, %xmm1545; SSE2-NEXT:    paddd %xmm1, %xmm0546; SSE2-NEXT:    retq547;548; SSE41-LABEL: test_rem7_4i32:549; SSE41:       # %bb.0:550; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]551; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]552; SSE41-NEXT:    pmuludq %xmm2, %xmm1553; SSE41-NEXT:    pmuludq %xmm0, %xmm2554; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]555; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]556; SSE41-NEXT:    movdqa %xmm0, %xmm1557; SSE41-NEXT:    psubd %xmm2, %xmm1558; SSE41-NEXT:    psrld $1, %xmm1559; SSE41-NEXT:    paddd %xmm2, %xmm1560; SSE41-NEXT:    psrld $2, %xmm1561; SSE41-NEXT:    movdqa %xmm1, %xmm2562; SSE41-NEXT:    pslld $3, %xmm2563; SSE41-NEXT:    psubd %xmm2, %xmm1564; SSE41-NEXT:    paddd %xmm1, %xmm0565; SSE41-NEXT:    retq566;567; AVX1-LABEL: test_rem7_4i32:568; AVX1:       # %bb.0:569; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]570; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]571; AVX1-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1572; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2573; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]574; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]575; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm2576; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2577; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1578; AVX1-NEXT:    vpsrld $2, %xmm1, %xmm1579; AVX1-NEXT:    vpslld $3, %xmm1, %xmm2580; AVX1-NEXT:    vpsubd %xmm2, %xmm1, %xmm1581; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0582; AVX1-NEXT:    retq583;584; AVX2-LABEL: test_rem7_4i32:585; AVX2:       # %bb.0:586; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]587; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]588; AVX2-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1589; AVX2-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2590; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]591; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]592; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm2593; AVX2-NEXT:    vpsrld $1, %xmm2, %xmm2594; AVX2-NEXT:    vpaddd %xmm1, %xmm2, %xmm1595; AVX2-NEXT:    vpsrld $2, %xmm1, %xmm1596; AVX2-NEXT:    vpslld $3, %xmm1, %xmm2597; AVX2-NEXT:    vpsubd %xmm2, %xmm1, %xmm1598; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0599; AVX2-NEXT:    retq600  %res = urem <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>601  ret <4 x i32> %res602}603 604define <8 x i16> @test_rem7_8i16(<8 x i16> %a) nounwind {605; SSE-LABEL: test_rem7_8i16:606; SSE:       # %bb.0:607; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]608; SSE-NEXT:    pmulhuw %xmm0, %xmm1609; SSE-NEXT:    movdqa %xmm0, %xmm2610; SSE-NEXT:    psubw %xmm1, %xmm2611; SSE-NEXT:    psrlw $1, %xmm2612; SSE-NEXT:    paddw %xmm1, %xmm2613; SSE-NEXT:    psrlw $2, %xmm2614; SSE-NEXT:    movdqa %xmm2, %xmm1615; SSE-NEXT:    psllw $3, %xmm1616; SSE-NEXT:    psubw %xmm1, %xmm2617; SSE-NEXT:    paddw %xmm2, %xmm0618; SSE-NEXT:    retq619;620; AVX-LABEL: test_rem7_8i16:621; AVX:       # %bb.0:622; AVX-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [9363,9363,9363,9363,9363,9363,9363,9363]623; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm2624; AVX-NEXT:    vpsrlw $1, %xmm2, %xmm2625; AVX-NEXT:    vpaddw %xmm1, %xmm2, %xmm1626; AVX-NEXT:    vpsrlw $2, %xmm1, %xmm1627; AVX-NEXT:    vpsllw $3, %xmm1, %xmm2628; AVX-NEXT:    vpsubw %xmm2, %xmm1, %xmm1629; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0630; AVX-NEXT:    retq631  %res = urem <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>632  ret <8 x i16> %res633}634 635define <16 x i8> @test_rem7_16i8(<16 x i8> %a) nounwind {636; SSE2-LABEL: test_rem7_16i8:637; SSE2:       # %bb.0:638; SSE2-NEXT:    pxor %xmm1, %xmm1639; SSE2-NEXT:    movdqa %xmm0, %xmm2640; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]641; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]642; SSE2-NEXT:    pmullw %xmm3, %xmm2643; SSE2-NEXT:    psrlw $8, %xmm2644; SSE2-NEXT:    movdqa %xmm0, %xmm4645; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]646; SSE2-NEXT:    pmullw %xmm3, %xmm4647; SSE2-NEXT:    psrlw $8, %xmm4648; SSE2-NEXT:    packuswb %xmm2, %xmm4649; SSE2-NEXT:    movdqa %xmm0, %xmm1650; SSE2-NEXT:    psubb %xmm4, %xmm1651; SSE2-NEXT:    psrlw $1, %xmm1652; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1653; SSE2-NEXT:    paddb %xmm4, %xmm1654; SSE2-NEXT:    movdqa %xmm1, %xmm2655; SSE2-NEXT:    paddw %xmm2, %xmm2656; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2657; SSE2-NEXT:    psrlw $2, %xmm1658; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1659; SSE2-NEXT:    psubb %xmm2, %xmm1660; SSE2-NEXT:    paddb %xmm1, %xmm0661; SSE2-NEXT:    retq662;663; SSE41-LABEL: test_rem7_16i8:664; SSE41:       # %bb.0:665; SSE41-NEXT:    pxor %xmm1, %xmm1666; SSE41-NEXT:    movdqa %xmm0, %xmm2667; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]668; SSE41-NEXT:    pmovsxbw {{.*#+}} xmm1 = [37,37,37,37,37,37,37,37]669; SSE41-NEXT:    pmullw %xmm1, %xmm2670; SSE41-NEXT:    psrlw $8, %xmm2671; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero672; SSE41-NEXT:    pmullw %xmm1, %xmm3673; SSE41-NEXT:    psrlw $8, %xmm3674; SSE41-NEXT:    packuswb %xmm2, %xmm3675; SSE41-NEXT:    movdqa %xmm0, %xmm1676; SSE41-NEXT:    psubb %xmm3, %xmm1677; SSE41-NEXT:    psrlw $1, %xmm1678; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1679; SSE41-NEXT:    paddb %xmm3, %xmm1680; SSE41-NEXT:    movdqa %xmm1, %xmm2681; SSE41-NEXT:    paddw %xmm2, %xmm2682; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2683; SSE41-NEXT:    psrlw $2, %xmm1684; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1685; SSE41-NEXT:    psubb %xmm2, %xmm1686; SSE41-NEXT:    paddb %xmm1, %xmm0687; SSE41-NEXT:    retq688;689; AVX1-LABEL: test_rem7_16i8:690; AVX1:       # %bb.0:691; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1692; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]693; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]694; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1695; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1696; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero697; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2698; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2699; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1700; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm2701; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2702; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2703; AVX1-NEXT:    vpaddb %xmm1, %xmm2, %xmm1704; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm2705; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2706; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm1707; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1708; AVX1-NEXT:    vpsubb %xmm2, %xmm1, %xmm1709; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0710; AVX1-NEXT:    retq711;712; AVX2NOBW-LABEL: test_rem7_16i8:713; AVX2NOBW:       # %bb.0:714; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero715; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37]716; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1717; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2718; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1719; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2720; AVX2NOBW-NEXT:    vpsrlw $1, %xmm2, %xmm2721; AVX2NOBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2722; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1723; AVX2NOBW-NEXT:    vpaddw %xmm1, %xmm1, %xmm2724; AVX2NOBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2725; AVX2NOBW-NEXT:    vpsrlw $2, %xmm1, %xmm1726; AVX2NOBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1727; AVX2NOBW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1728; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0729; AVX2NOBW-NEXT:    vzeroupper730; AVX2NOBW-NEXT:    retq731;732; AVX512BW-LABEL: test_rem7_16i8:733; AVX512BW:       # %bb.0:734; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero735; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37]736; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1737; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1738; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2739; AVX512BW-NEXT:    vpsrlw $1, %xmm2, %xmm2740; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2741; AVX512BW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1742; AVX512BW-NEXT:    vpaddw %xmm1, %xmm1, %xmm2743; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2744; AVX512BW-NEXT:    vpsrlw $2, %xmm1, %xmm1745; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1746; AVX512BW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1747; AVX512BW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0748; AVX512BW-NEXT:    vzeroupper749; AVX512BW-NEXT:    retq750  %res = urem <16 x i8> %a, <i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7>751  ret <16 x i8> %res752}753 754;755; srem by non-splat constant756;757 758define <16 x i8> @test_remconstant_16i8(<16 x i8> %a) nounwind {759; SSE2-LABEL: test_remconstant_16i8:760; SSE2:       # %bb.0:761; SSE2-NEXT:    pxor %xmm1, %xmm1762; SSE2-NEXT:    movdqa %xmm0, %xmm2763; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]764; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [128,256,256,256,256,256,256,256]765; SSE2-NEXT:    psrlw $8, %xmm2766; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [147,0,79,0,171,0,117,0,205,0,57,0,57,0,37,0]767; SSE2-NEXT:    psrlw $8, %xmm2768; SSE2-NEXT:    movdqa %xmm0, %xmm3769; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]770; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [256,256,256,256,256,256,256,128]771; SSE2-NEXT:    psrlw $8, %xmm3772; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]773; SSE2-NEXT:    psrlw $8, %xmm3774; SSE2-NEXT:    packuswb %xmm2, %xmm3775; SSE2-NEXT:    movdqa %xmm0, %xmm2776; SSE2-NEXT:    psubb %xmm3, %xmm2777; SSE2-NEXT:    movdqa %xmm2, %xmm4778; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]779; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]780; SSE2-NEXT:    psrlw $8, %xmm4781; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]782; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]783; SSE2-NEXT:    psrlw $8, %xmm2784; SSE2-NEXT:    packuswb %xmm4, %xmm2785; SSE2-NEXT:    paddb %xmm3, %xmm2786; SSE2-NEXT:    movdqa %xmm2, %xmm3787; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]788; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [64,64,32,32,32,128,128,64]789; SSE2-NEXT:    psrlw $8, %xmm3790; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [14,u,13,u,12,u,11,u,10,u,9,u,9,u,7,u]791; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]792; SSE2-NEXT:    pand %xmm4, %xmm3793; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]794; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [64,256,128,32,32,32,64,64]795; SSE2-NEXT:    psrlw $8, %xmm2796; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [7,u,8,u,9,u,10,u,11,u,12,u,13,u,14,u]797; SSE2-NEXT:    pand %xmm4, %xmm2798; SSE2-NEXT:    packuswb %xmm3, %xmm2799; SSE2-NEXT:    psubb %xmm2, %xmm0800; SSE2-NEXT:    retq801;802; SSE41-LABEL: test_remconstant_16i8:803; SSE41:       # %bb.0:804; SSE41-NEXT:    pxor %xmm1, %xmm1805; SSE41-NEXT:    pxor %xmm2, %xmm2806; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = 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]807; SSE41-NEXT:    movdqa %xmm0, %xmm3808; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]809; SSE41-NEXT:    psllw $7, %xmm3810; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1,2,3,4,5,6,7]811; SSE41-NEXT:    psrlw $8, %xmm3812; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [147,0,79,0,171,0,117,0,205,0,57,0,57,0,37,0]813; SSE41-NEXT:    psrlw $8, %xmm3814; SSE41-NEXT:    pxor %xmm2, %xmm2815; SSE41-NEXT:    punpcklbw {{.*#+}} xmm2 = 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]816; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero817; SSE41-NEXT:    psllw $7, %xmm4818; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm2[0,1,2,3,4,5,6],xmm4[7]819; SSE41-NEXT:    psrlw $8, %xmm4820; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]821; SSE41-NEXT:    psrlw $8, %xmm4822; SSE41-NEXT:    packuswb %xmm3, %xmm4823; SSE41-NEXT:    movdqa %xmm0, %xmm2824; SSE41-NEXT:    psubb %xmm4, %xmm2825; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero826; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]827; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]828; SSE41-NEXT:    psrlw $8, %xmm2829; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]830; SSE41-NEXT:    psrlw $8, %xmm3831; SSE41-NEXT:    packuswb %xmm2, %xmm3832; SSE41-NEXT:    paddb %xmm4, %xmm3833; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero834; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]835; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [64,64,32,32,32,128,128,64]836; SSE41-NEXT:    psrlw $8, %xmm3837; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [64,256,128,32,32,32,64,64]838; SSE41-NEXT:    psrlw $8, %xmm2839; SSE41-NEXT:    packuswb %xmm3, %xmm2840; SSE41-NEXT:    movdqa %xmm2, %xmm1841; SSE41-NEXT:    pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [0,8,0,10,0,12,0,14,0,13,0,11,0,9,0,7]842; SSE41-NEXT:    psllw $8, %xmm1843; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [7,8,9,10,11,12,13,14,14,13,12,11,10,9,9,7]844; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2845; SSE41-NEXT:    por %xmm1, %xmm2846; SSE41-NEXT:    psubb %xmm2, %xmm0847; SSE41-NEXT:    retq848;849; AVX1-LABEL: test_remconstant_16i8:850; AVX1:       # %bb.0:851; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1852; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = 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]853; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]854; AVX1-NEXT:    vpsllw $7, %xmm3, %xmm3855; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3,4,5,6,7]856; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2857; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [147,0,79,0,171,0,117,0,205,0,57,0,57,0,37,0]858; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2859; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]860; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero861; AVX1-NEXT:    vpsllw $7, %xmm4, %xmm4862; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6],xmm4[7]863; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3864; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]865; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3866; AVX1-NEXT:    vpackuswb %xmm2, %xmm3, %xmm2867; AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm3868; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]869; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]870; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4871; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero872; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]873; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3874; AVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3875; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2876; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]877; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [64,64,32,32,32,128,128,64]878; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1879; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero880; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [64,256,128,32,32,32,64,64]881; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2882; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1883; AVX1-NEXT:    vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2 # [0,8,0,10,0,12,0,14,0,13,0,11,0,9,0,7]884; AVX1-NEXT:    vpsllw $8, %xmm2, %xmm2885; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [7,8,9,10,11,12,13,14,14,13,12,11,10,9,9,7]886; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1887; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1888; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0889; AVX1-NEXT:    retq890;891; AVX2NOBW-LABEL: test_remconstant_16i8:892; AVX2NOBW:       # %bb.0:893; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero894; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [256,256,256,256,256,256,256,128,128,256,256,256,256,256,256,256]895; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1896; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,32,57,205,117,171,79,147,147,79,171,117,205,57,57,37]897; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1898; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2899; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1900; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2901; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero902; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [128,0,0,0,128,0,0,0,0,0,0,128,0,0,0,128]903; AVX2NOBW-NEXT:    vpsrlw $8, %ymm2, %ymm2904; AVX2NOBW-NEXT:    vextracti128 $1, %ymm2, %xmm3905; AVX2NOBW-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2906; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1907; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero908; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [64,256,128,32,32,32,64,64,64,64,32,32,32,128,128,64]909; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1910; AVX2NOBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [7,8,9,10,11,12,13,14,14,13,12,11,10,9,9,7]911; AVX2NOBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1912; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2913; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1914; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0915; AVX2NOBW-NEXT:    vzeroupper916; AVX2NOBW-NEXT:    retq917;918; AVX512BW-LABEL: test_remconstant_16i8:919; AVX512BW:       # %bb.0:920; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0]921; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero922; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm2, %zmm1923; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [37,32,57,205,117,171,79,147,147,79,171,117,205,57,57,37]924; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1925; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1926; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2927; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero928; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [128,0,0,0,128,0,0,0,0,0,0,128,0,0,0,128]929; AVX512BW-NEXT:    vpsrlw $8, %ymm2, %ymm2930; AVX512BW-NEXT:    vpmovwb %zmm2, %ymm2931; AVX512BW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1932; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero933; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm2 = [2,0,1,3,3,3,2,2,2,2,3,3,3,1,1,2]934; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1935; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [7,8,9,10,11,12,13,14,14,13,12,11,10,9,9,7]936; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1937; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0938; AVX512BW-NEXT:    vzeroupper939; AVX512BW-NEXT:    retq940  %res = urem <16 x i8> %a, <i8 7, i8 8, i8 9, i8 10,i8 11, i8 12, i8 13, i8 14, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9,i8 9, i8 7>941  ret <16 x i8> %res942}943