1212 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; sdiv 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, %rax16; SSE2-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x492492492492492517; SSE2-NEXT: imulq %rcx18; SSE2-NEXT: movq %rdx, %rax19; SSE2-NEXT: shrq $63, %rax20; SSE2-NEXT: sarq %rdx21; SSE2-NEXT: addq %rax, %rdx22; SSE2-NEXT: movq %rdx, %xmm123; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]24; SSE2-NEXT: movq %xmm0, %rax25; SSE2-NEXT: imulq %rcx26; SSE2-NEXT: movq %rdx, %rax27; SSE2-NEXT: shrq $63, %rax28; SSE2-NEXT: sarq %rdx29; SSE2-NEXT: addq %rax, %rdx30; SSE2-NEXT: movq %rdx, %xmm031; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]32; SSE2-NEXT: movdqa %xmm1, %xmm033; SSE2-NEXT: retq34;35; SSE41-LABEL: test_div7_2i64:36; SSE41: # %bb.0:37; SSE41-NEXT: pextrq $1, %xmm0, %rax38; SSE41-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x492492492492492539; SSE41-NEXT: imulq %rcx40; SSE41-NEXT: movq %rdx, %rax41; SSE41-NEXT: shrq $63, %rax42; SSE41-NEXT: sarq %rdx43; SSE41-NEXT: addq %rax, %rdx44; SSE41-NEXT: movq %rdx, %xmm145; SSE41-NEXT: movq %xmm0, %rax46; SSE41-NEXT: imulq %rcx47; SSE41-NEXT: movq %rdx, %rax48; SSE41-NEXT: shrq $63, %rax49; SSE41-NEXT: sarq %rdx50; SSE41-NEXT: addq %rax, %rdx51; SSE41-NEXT: movq %rdx, %xmm052; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]53; SSE41-NEXT: retq54;55; AVX-LABEL: test_div7_2i64:56; AVX: # %bb.0:57; AVX-NEXT: vpextrq $1, %xmm0, %rax58; AVX-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x492492492492492559; AVX-NEXT: imulq %rcx60; AVX-NEXT: movq %rdx, %rax61; AVX-NEXT: shrq $63, %rax62; AVX-NEXT: sarq %rdx63; AVX-NEXT: addq %rax, %rdx64; AVX-NEXT: vmovq %rdx, %xmm165; AVX-NEXT: vmovq %xmm0, %rax66; AVX-NEXT: imulq %rcx67; AVX-NEXT: movq %rdx, %rax68; AVX-NEXT: shrq $63, %rax69; AVX-NEXT: sarq %rdx70; AVX-NEXT: addq %rax, %rdx71; AVX-NEXT: vmovq %rdx, %xmm072; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]73; AVX-NEXT: retq74 %res = sdiv <2 x i64> %a, <i64 7, i64 7>75 ret <2 x i64> %res76}77 78define <4 x i32> @test_div7_4i32(<4 x i32> %a) nounwind {79; SSE2-LABEL: test_div7_4i32:80; SSE2: # %bb.0:81; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]82; SSE2-NEXT: movdqa %xmm0, %xmm283; SSE2-NEXT: pmuludq %xmm1, %xmm284; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]85; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]86; SSE2-NEXT: pmuludq %xmm1, %xmm387; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]88; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]89; SSE2-NEXT: pxor %xmm3, %xmm390; SSE2-NEXT: pcmpgtd %xmm0, %xmm391; SSE2-NEXT: pand %xmm1, %xmm392; SSE2-NEXT: paddd %xmm0, %xmm393; SSE2-NEXT: psubd %xmm3, %xmm294; SSE2-NEXT: paddd %xmm2, %xmm095; SSE2-NEXT: movdqa %xmm0, %xmm196; SSE2-NEXT: psrld $31, %xmm197; SSE2-NEXT: psrad $2, %xmm098; SSE2-NEXT: paddd %xmm1, %xmm099; SSE2-NEXT: retq100;101; SSE41-LABEL: test_div7_4i32:102; SSE41: # %bb.0:103; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]104; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]105; SSE41-NEXT: pmuldq %xmm2, %xmm1106; SSE41-NEXT: pmuldq %xmm0, %xmm2107; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]108; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]109; SSE41-NEXT: paddd %xmm2, %xmm0110; SSE41-NEXT: movdqa %xmm0, %xmm1111; SSE41-NEXT: psrld $31, %xmm1112; SSE41-NEXT: psrad $2, %xmm0113; SSE41-NEXT: paddd %xmm1, %xmm0114; SSE41-NEXT: retq115;116; AVX1-LABEL: test_div7_4i32:117; AVX1: # %bb.0:118; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]119; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]120; AVX1-NEXT: vpmuldq %xmm2, %xmm1, %xmm1121; AVX1-NEXT: vpmuldq %xmm2, %xmm0, %xmm2122; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]123; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]124; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm0125; AVX1-NEXT: vpsrld $31, %xmm0, %xmm1126; AVX1-NEXT: vpsrad $2, %xmm0, %xmm0127; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0128; AVX1-NEXT: retq129;130; AVX2-LABEL: test_div7_4i32:131; AVX2: # %bb.0:132; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]133; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]134; AVX2-NEXT: vpmuldq %xmm2, %xmm1, %xmm1135; AVX2-NEXT: vpmuldq %xmm2, %xmm0, %xmm2136; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]137; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]138; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm0139; AVX2-NEXT: vpsrld $31, %xmm0, %xmm1140; AVX2-NEXT: vpsrad $2, %xmm0, %xmm0141; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0142; AVX2-NEXT: retq143 %res = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>144 ret <4 x i32> %res145}146 147define <8 x i16> @test_div7_8i16(<8 x i16> %a) nounwind {148; SSE-LABEL: test_div7_8i16:149; SSE: # %bb.0:150; SSE-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [18725,18725,18725,18725,18725,18725,18725,18725]151; SSE-NEXT: movdqa %xmm0, %xmm1152; SSE-NEXT: psrlw $15, %xmm1153; SSE-NEXT: psraw $1, %xmm0154; SSE-NEXT: paddw %xmm1, %xmm0155; SSE-NEXT: retq156;157; AVX-LABEL: test_div7_8i16:158; AVX: # %bb.0:159; AVX-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [18725,18725,18725,18725,18725,18725,18725,18725]160; AVX-NEXT: vpsrlw $15, %xmm0, %xmm1161; AVX-NEXT: vpsraw $1, %xmm0, %xmm0162; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0163; AVX-NEXT: retq164 %res = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>165 ret <8 x i16> %res166}167 168define <16 x i8> @test_div7_16i8(<16 x i8> %a) nounwind {169; SSE-LABEL: test_div7_16i8:170; SSE: # %bb.0:171; SSE-NEXT: pxor %xmm1, %xmm1172; SSE-NEXT: pxor %xmm2, %xmm2173; SSE-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]174; SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]175; SSE-NEXT: pmulhw %xmm3, %xmm2176; SSE-NEXT: psrlw $8, %xmm2177; SSE-NEXT: pxor %xmm4, %xmm4178; SSE-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]179; SSE-NEXT: pmulhw %xmm3, %xmm4180; SSE-NEXT: psrlw $8, %xmm4181; SSE-NEXT: packuswb %xmm2, %xmm4182; SSE-NEXT: paddb %xmm4, %xmm0183; SSE-NEXT: psrlw $2, %xmm0184; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0185; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]186; SSE-NEXT: pxor %xmm2, %xmm0187; SSE-NEXT: psubb %xmm2, %xmm0188; SSE-NEXT: pcmpgtb %xmm0, %xmm1189; SSE-NEXT: psubb %xmm1, %xmm0190; SSE-NEXT: retq191;192; AVX1-LABEL: test_div7_16i8:193; AVX1: # %bb.0:194; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1195; 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]196; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]197; AVX1-NEXT: vpmulhw %xmm3, %xmm2, %xmm2198; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2199; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = 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]200; AVX1-NEXT: vpmulhw %xmm3, %xmm4, %xmm3201; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3202; AVX1-NEXT: vpackuswb %xmm2, %xmm3, %xmm2203; AVX1-NEXT: vpaddb %xmm0, %xmm2, %xmm0204; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm0205; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0206; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]207; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0208; AVX1-NEXT: vpsubb %xmm2, %xmm0, %xmm0209; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1210; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0211; AVX1-NEXT: retq212;213; AVX2NOBW-LABEL: test_div7_16i8:214; AVX2NOBW: # %bb.0:215; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm1216; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]217; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1218; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2219; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1220; AVX2NOBW-NEXT: vpaddb %xmm0, %xmm1, %xmm0221; AVX2NOBW-NEXT: vpsrlw $2, %xmm0, %xmm0222; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0223; AVX2NOBW-NEXT: vpbroadcastb {{.*#+}} xmm1 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]224; AVX2NOBW-NEXT: vpxor %xmm1, %xmm0, %xmm0225; AVX2NOBW-NEXT: vpsubb %xmm1, %xmm0, %xmm0226; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1227; AVX2NOBW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1228; AVX2NOBW-NEXT: vpsubb %xmm1, %xmm0, %xmm0229; AVX2NOBW-NEXT: vzeroupper230; AVX2NOBW-NEXT: retq231;232; AVX512BW-LABEL: test_div7_16i8:233; AVX512BW: # %bb.0:234; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm1235; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]236; AVX512BW-NEXT: vpsrlw $8, %ymm1, %ymm1237; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1238; AVX512BW-NEXT: vpaddb %xmm0, %xmm1, %xmm0239; AVX512BW-NEXT: vpsrlw $2, %xmm0, %xmm0240; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0241; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm1 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]242; AVX512BW-NEXT: vpxor %xmm1, %xmm0, %xmm0243; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0244; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1245; AVX512BW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1246; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0247; AVX512BW-NEXT: vzeroupper248; AVX512BW-NEXT: retq249 %res = sdiv <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>250 ret <16 x i8> %res251}252 253;254; sdiv by non-splat constant255;256 257define <16 x i8> @test_divconstant_16i8(<16 x i8> %a) nounwind {258; SSE-LABEL: test_divconstant_16i8:259; SSE: # %bb.0:260; SSE-NEXT: pxor %xmm1, %xmm1261; SSE-NEXT: pxor %xmm2, %xmm2262; SSE-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]263; SSE-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,147,0,79,0,43,0,187,0,103,0,57,0,57,0,147]264; SSE-NEXT: psrlw $8, %xmm2265; SSE-NEXT: pxor %xmm3, %xmm3266; SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]267; SSE-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147]268; SSE-NEXT: psrlw $8, %xmm3269; SSE-NEXT: packuswb %xmm2, %xmm3270; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0271; SSE-NEXT: paddb %xmm3, %xmm0272; SSE-NEXT: movdqa %xmm0, %xmm2273; SSE-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]274; SSE-NEXT: psraw $8, %xmm2275; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [32,64,128,32,64,128,128,64]276; SSE-NEXT: psrlw $8, %xmm2277; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]278; SSE-NEXT: psraw $8, %xmm0279; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [64,64,128,64,32,128,64,32]280; SSE-NEXT: psrlw $8, %xmm0281; SSE-NEXT: packuswb %xmm2, %xmm0282; SSE-NEXT: pcmpgtb %xmm0, %xmm1283; SSE-NEXT: psubb %xmm1, %xmm0284; SSE-NEXT: retq285;286; AVX1-LABEL: test_divconstant_16i8:287; AVX1: # %bb.0:288; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1289; 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]290; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [0,147,0,79,0,43,0,187,0,103,0,57,0,57,0,147]291; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2292; 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]293; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147]294; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3295; AVX1-NEXT: vpackuswb %xmm2, %xmm3, %xmm2296; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0297; AVX1-NEXT: vpaddb %xmm0, %xmm2, %xmm0298; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]299; AVX1-NEXT: vpsraw $8, %xmm2, %xmm2300; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [32,64,128,32,64,128,128,64]301; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2302; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]303; AVX1-NEXT: vpsraw $8, %xmm0, %xmm0304; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [64,64,128,64,32,128,64,32]305; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0306; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0307; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1308; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0309; AVX1-NEXT: retq310;311; AVX2NOBW-LABEL: test_divconstant_16i8:312; AVX2NOBW: # %bb.0:313; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm1314; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [65427,65409,57,103,65467,43,79,65427,65427,79,43,65467,103,57,57,65427]315; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1316; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2317; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1318; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0319; AVX2NOBW-NEXT: vpaddb %xmm0, %xmm1, %xmm0320; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm0321; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [64,64,128,64,32,128,64,32,32,64,128,32,64,128,128,64]322; AVX2NOBW-NEXT: vpsrlw $8, %ymm0, %ymm0323; AVX2NOBW-NEXT: vextracti128 $1, %ymm0, %xmm1324; AVX2NOBW-NEXT: vpackuswb %xmm1, %xmm0, %xmm0325; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1326; AVX2NOBW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1327; AVX2NOBW-NEXT: vpsubb %xmm1, %xmm0, %xmm0328; AVX2NOBW-NEXT: vzeroupper329; AVX2NOBW-NEXT: retq330;331; AVX512BW-LABEL: test_divconstant_16i8:332; AVX512BW: # %bb.0:333; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [2,2,1,2,3,1,2,3,3,2,1,3,2,1,1,2]334; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm2335; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [65427,65409,57,103,65467,43,79,65427,65427,79,43,65467,103,57,57,65427]336; AVX512BW-NEXT: vpsrlw $8, %ymm2, %ymm2337; AVX512BW-NEXT: vpmovwb %zmm2, %ymm2338; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0339; AVX512BW-NEXT: vpaddb %xmm0, %xmm2, %xmm0340; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm0341; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0342; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0343; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1344; AVX512BW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1345; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0346; AVX512BW-NEXT: vzeroupper347; AVX512BW-NEXT: retq348 %res = sdiv <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>349 ret <16 x i8> %res350}351 352;353; srem by 7354;355 356define <2 x i64> @test_rem7_2i64(<2 x i64> %a) nounwind {357; SSE2-LABEL: test_rem7_2i64:358; SSE2: # %bb.0:359; SSE2-NEXT: movq %xmm0, %rcx360; SSE2-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925361; SSE2-NEXT: movq %rcx, %rax362; SSE2-NEXT: imulq %rsi363; SSE2-NEXT: movq %rdx, %rax364; SSE2-NEXT: shrq $63, %rax365; SSE2-NEXT: sarq %rdx366; SSE2-NEXT: addq %rax, %rdx367; SSE2-NEXT: leaq (,%rdx,8), %rax368; SSE2-NEXT: subq %rax, %rdx369; SSE2-NEXT: addq %rcx, %rdx370; SSE2-NEXT: movq %rdx, %xmm1371; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]372; SSE2-NEXT: movq %xmm0, %rcx373; SSE2-NEXT: movq %rcx, %rax374; SSE2-NEXT: imulq %rsi375; SSE2-NEXT: movq %rdx, %rax376; SSE2-NEXT: shrq $63, %rax377; SSE2-NEXT: sarq %rdx378; SSE2-NEXT: addq %rax, %rdx379; SSE2-NEXT: leaq (,%rdx,8), %rax380; SSE2-NEXT: subq %rax, %rdx381; SSE2-NEXT: addq %rcx, %rdx382; SSE2-NEXT: movq %rdx, %xmm0383; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]384; SSE2-NEXT: movdqa %xmm1, %xmm0385; SSE2-NEXT: retq386;387; SSE41-LABEL: test_rem7_2i64:388; SSE41: # %bb.0:389; SSE41-NEXT: pextrq $1, %xmm0, %rcx390; SSE41-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925391; SSE41-NEXT: movq %rcx, %rax392; SSE41-NEXT: imulq %rsi393; SSE41-NEXT: movq %rdx, %rax394; SSE41-NEXT: shrq $63, %rax395; SSE41-NEXT: sarq %rdx396; SSE41-NEXT: addq %rax, %rdx397; SSE41-NEXT: leaq (,%rdx,8), %rax398; SSE41-NEXT: subq %rax, %rdx399; SSE41-NEXT: addq %rcx, %rdx400; SSE41-NEXT: movq %rdx, %xmm1401; SSE41-NEXT: movq %xmm0, %rcx402; SSE41-NEXT: movq %rcx, %rax403; SSE41-NEXT: imulq %rsi404; SSE41-NEXT: movq %rdx, %rax405; SSE41-NEXT: shrq $63, %rax406; SSE41-NEXT: sarq %rdx407; SSE41-NEXT: addq %rax, %rdx408; SSE41-NEXT: leaq (,%rdx,8), %rax409; SSE41-NEXT: subq %rax, %rdx410; SSE41-NEXT: addq %rcx, %rdx411; SSE41-NEXT: movq %rdx, %xmm0412; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]413; SSE41-NEXT: retq414;415; AVX-LABEL: test_rem7_2i64:416; AVX: # %bb.0:417; AVX-NEXT: vpextrq $1, %xmm0, %rcx418; AVX-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925419; AVX-NEXT: movq %rcx, %rax420; AVX-NEXT: imulq %rsi421; AVX-NEXT: movq %rdx, %rax422; AVX-NEXT: shrq $63, %rax423; AVX-NEXT: sarq %rdx424; AVX-NEXT: addq %rax, %rdx425; AVX-NEXT: leaq (,%rdx,8), %rax426; AVX-NEXT: subq %rax, %rdx427; AVX-NEXT: addq %rcx, %rdx428; AVX-NEXT: vmovq %rdx, %xmm1429; AVX-NEXT: vmovq %xmm0, %rcx430; AVX-NEXT: movq %rcx, %rax431; AVX-NEXT: imulq %rsi432; AVX-NEXT: movq %rdx, %rax433; AVX-NEXT: shrq $63, %rax434; AVX-NEXT: sarq %rdx435; AVX-NEXT: addq %rax, %rdx436; AVX-NEXT: leaq (,%rdx,8), %rax437; AVX-NEXT: subq %rax, %rdx438; AVX-NEXT: addq %rcx, %rdx439; AVX-NEXT: vmovq %rdx, %xmm0440; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]441; AVX-NEXT: retq442 %res = srem <2 x i64> %a, <i64 7, i64 7>443 ret <2 x i64> %res444}445 446define <4 x i32> @test_rem7_4i32(<4 x i32> %a) nounwind {447; SSE2-LABEL: test_rem7_4i32:448; SSE2: # %bb.0:449; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]450; SSE2-NEXT: movdqa %xmm0, %xmm2451; SSE2-NEXT: pmuludq %xmm1, %xmm2452; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]453; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]454; SSE2-NEXT: pmuludq %xmm1, %xmm3455; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]456; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]457; SSE2-NEXT: pxor %xmm3, %xmm3458; SSE2-NEXT: pcmpgtd %xmm0, %xmm3459; SSE2-NEXT: pand %xmm1, %xmm3460; SSE2-NEXT: paddd %xmm0, %xmm3461; SSE2-NEXT: psubd %xmm3, %xmm2462; SSE2-NEXT: paddd %xmm0, %xmm2463; SSE2-NEXT: movdqa %xmm2, %xmm1464; SSE2-NEXT: psrld $31, %xmm1465; SSE2-NEXT: psrad $2, %xmm2466; SSE2-NEXT: paddd %xmm1, %xmm2467; SSE2-NEXT: movdqa %xmm2, %xmm1468; SSE2-NEXT: pslld $3, %xmm1469; SSE2-NEXT: psubd %xmm1, %xmm2470; SSE2-NEXT: paddd %xmm2, %xmm0471; SSE2-NEXT: retq472;473; SSE41-LABEL: test_rem7_4i32:474; SSE41: # %bb.0:475; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]476; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]477; SSE41-NEXT: pmuldq %xmm2, %xmm1478; SSE41-NEXT: pmuldq %xmm0, %xmm2479; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]480; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]481; SSE41-NEXT: paddd %xmm0, %xmm2482; SSE41-NEXT: movdqa %xmm2, %xmm1483; SSE41-NEXT: psrld $31, %xmm1484; SSE41-NEXT: psrad $2, %xmm2485; SSE41-NEXT: paddd %xmm1, %xmm2486; SSE41-NEXT: movdqa %xmm2, %xmm1487; SSE41-NEXT: pslld $3, %xmm1488; SSE41-NEXT: psubd %xmm1, %xmm2489; SSE41-NEXT: paddd %xmm2, %xmm0490; SSE41-NEXT: retq491;492; AVX1-LABEL: test_rem7_4i32:493; AVX1: # %bb.0:494; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]495; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]496; AVX1-NEXT: vpmuldq %xmm2, %xmm1, %xmm1497; AVX1-NEXT: vpmuldq %xmm2, %xmm0, %xmm2498; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]499; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]500; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm1501; AVX1-NEXT: vpsrld $31, %xmm1, %xmm2502; AVX1-NEXT: vpsrad $2, %xmm1, %xmm1503; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1504; AVX1-NEXT: vpslld $3, %xmm1, %xmm2505; AVX1-NEXT: vpsubd %xmm2, %xmm1, %xmm1506; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0507; AVX1-NEXT: retq508;509; AVX2-LABEL: test_rem7_4i32:510; AVX2: # %bb.0:511; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]512; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]513; AVX2-NEXT: vpmuldq %xmm2, %xmm1, %xmm1514; AVX2-NEXT: vpmuldq %xmm2, %xmm0, %xmm2515; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]516; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]517; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm1518; AVX2-NEXT: vpsrld $31, %xmm1, %xmm2519; AVX2-NEXT: vpsrad $2, %xmm1, %xmm1520; AVX2-NEXT: vpaddd %xmm2, %xmm1, %xmm1521; AVX2-NEXT: vpslld $3, %xmm1, %xmm2522; AVX2-NEXT: vpsubd %xmm2, %xmm1, %xmm1523; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0524; AVX2-NEXT: retq525 %res = srem <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>526 ret <4 x i32> %res527}528 529define <8 x i16> @test_rem7_8i16(<8 x i16> %a) nounwind {530; SSE-LABEL: test_rem7_8i16:531; SSE: # %bb.0:532; SSE-NEXT: movdqa {{.*#+}} xmm1 = [18725,18725,18725,18725,18725,18725,18725,18725]533; SSE-NEXT: pmulhw %xmm0, %xmm1534; SSE-NEXT: movdqa %xmm1, %xmm2535; SSE-NEXT: psrlw $15, %xmm2536; SSE-NEXT: psraw $1, %xmm1537; SSE-NEXT: paddw %xmm2, %xmm1538; SSE-NEXT: movdqa %xmm1, %xmm2539; SSE-NEXT: psllw $3, %xmm2540; SSE-NEXT: psubw %xmm2, %xmm1541; SSE-NEXT: paddw %xmm1, %xmm0542; SSE-NEXT: retq543;544; AVX-LABEL: test_rem7_8i16:545; AVX: # %bb.0:546; AVX-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [18725,18725,18725,18725,18725,18725,18725,18725]547; AVX-NEXT: vpsrlw $15, %xmm1, %xmm2548; AVX-NEXT: vpsraw $1, %xmm1, %xmm1549; AVX-NEXT: vpaddw %xmm2, %xmm1, %xmm1550; AVX-NEXT: vpsllw $3, %xmm1, %xmm2551; AVX-NEXT: vpsubw %xmm2, %xmm1, %xmm1552; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0553; AVX-NEXT: retq554 %res = srem <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>555 ret <8 x i16> %res556}557 558define <16 x i8> @test_rem7_16i8(<16 x i8> %a) nounwind {559; SSE-LABEL: test_rem7_16i8:560; SSE: # %bb.0:561; SSE-NEXT: pxor %xmm1, %xmm1562; SSE-NEXT: pxor %xmm2, %xmm2563; SSE-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]564; SSE-NEXT: movdqa {{.*#+}} xmm3 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]565; SSE-NEXT: pmulhw %xmm3, %xmm2566; SSE-NEXT: psrlw $8, %xmm2567; SSE-NEXT: pxor %xmm4, %xmm4568; SSE-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]569; SSE-NEXT: pmulhw %xmm3, %xmm4570; SSE-NEXT: psrlw $8, %xmm4571; SSE-NEXT: packuswb %xmm2, %xmm4572; SSE-NEXT: paddb %xmm0, %xmm4573; SSE-NEXT: psrlw $2, %xmm4574; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4575; SSE-NEXT: movdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]576; SSE-NEXT: pxor %xmm2, %xmm4577; SSE-NEXT: psubb %xmm2, %xmm4578; SSE-NEXT: pcmpgtb %xmm4, %xmm1579; SSE-NEXT: psubb %xmm1, %xmm4580; SSE-NEXT: movdqa %xmm4, %xmm1581; SSE-NEXT: psllw $3, %xmm1582; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1583; SSE-NEXT: psubb %xmm1, %xmm4584; SSE-NEXT: paddb %xmm4, %xmm0585; SSE-NEXT: retq586;587; AVX1-LABEL: test_rem7_16i8:588; AVX1: # %bb.0:589; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1590; 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]591; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]592; AVX1-NEXT: vpmulhw %xmm3, %xmm2, %xmm2593; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2594; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = 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]595; AVX1-NEXT: vpmulhw %xmm3, %xmm4, %xmm3596; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3597; AVX1-NEXT: vpackuswb %xmm2, %xmm3, %xmm2598; AVX1-NEXT: vpaddb %xmm0, %xmm2, %xmm2599; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm2600; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2601; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]602; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2603; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm2604; AVX1-NEXT: vpcmpgtb %xmm2, %xmm1, %xmm1605; AVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1606; AVX1-NEXT: vpsllw $3, %xmm1, %xmm2607; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2608; AVX1-NEXT: vpsubb %xmm2, %xmm1, %xmm1609; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0610; AVX1-NEXT: retq611;612; AVX2NOBW-LABEL: test_rem7_16i8:613; AVX2NOBW: # %bb.0:614; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm1615; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]616; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1617; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2618; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1619; AVX2NOBW-NEXT: vpaddb %xmm0, %xmm1, %xmm1620; AVX2NOBW-NEXT: vpsrlw $2, %xmm1, %xmm1621; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1622; AVX2NOBW-NEXT: vpbroadcastb {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]623; AVX2NOBW-NEXT: vpxor %xmm2, %xmm1, %xmm1624; AVX2NOBW-NEXT: vpsubb %xmm2, %xmm1, %xmm1625; AVX2NOBW-NEXT: vpxor %xmm2, %xmm2, %xmm2626; AVX2NOBW-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm2627; AVX2NOBW-NEXT: vpsubb %xmm2, %xmm1, %xmm1628; AVX2NOBW-NEXT: vpsllw $3, %xmm1, %xmm2629; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2630; AVX2NOBW-NEXT: vpsubb %xmm2, %xmm1, %xmm1631; AVX2NOBW-NEXT: vpaddb %xmm1, %xmm0, %xmm0632; AVX2NOBW-NEXT: vzeroupper633; AVX2NOBW-NEXT: retq634;635; AVX512BW-LABEL: test_rem7_16i8:636; AVX512BW: # %bb.0:637; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm1638; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]639; AVX512BW-NEXT: vpsrlw $8, %ymm1, %ymm1640; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1641; AVX512BW-NEXT: vpaddb %xmm0, %xmm1, %xmm1642; AVX512BW-NEXT: vpsrlw $2, %xmm1, %xmm1643; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1644; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]645; AVX512BW-NEXT: vpxor %xmm2, %xmm1, %xmm1646; AVX512BW-NEXT: vpsubb %xmm2, %xmm1, %xmm1647; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2648; AVX512BW-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm2649; AVX512BW-NEXT: vpsubb %xmm2, %xmm1, %xmm1650; AVX512BW-NEXT: vpsllw $3, %xmm1, %xmm2651; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2652; AVX512BW-NEXT: vpsubb %xmm2, %xmm1, %xmm1653; AVX512BW-NEXT: vpaddb %xmm1, %xmm0, %xmm0654; AVX512BW-NEXT: vzeroupper655; AVX512BW-NEXT: retq656 %res = srem <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>657 ret <16 x i8> %res658}659 660;661; srem by non-splat constant662;663 664define <16 x i8> @test_remconstant_16i8(<16 x i8> %a) nounwind {665; SSE2-LABEL: test_remconstant_16i8:666; SSE2: # %bb.0:667; SSE2-NEXT: pxor %xmm2, %xmm2668; SSE2-NEXT: pxor %xmm1, %xmm1669; 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]670; SSE2-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [0,147,0,79,0,43,0,187,0,103,0,57,0,57,0,147]671; SSE2-NEXT: psrlw $8, %xmm1672; SSE2-NEXT: pxor %xmm3, %xmm3673; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]674; SSE2-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147]675; SSE2-NEXT: psrlw $8, %xmm3676; SSE2-NEXT: packuswb %xmm1, %xmm3677; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,0,0,255,0,0,255,255,0,0,255,0,0,0,255]678; SSE2-NEXT: pand %xmm0, %xmm1679; SSE2-NEXT: paddb %xmm3, %xmm1680; SSE2-NEXT: movdqa %xmm1, %xmm3681; 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]682; SSE2-NEXT: psraw $8, %xmm3683; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [32,64,128,32,64,128,128,64]684; SSE2-NEXT: psrlw $8, %xmm3685; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]686; SSE2-NEXT: psraw $8, %xmm1687; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [64,64,128,64,32,128,64,32]688; SSE2-NEXT: psrlw $8, %xmm1689; SSE2-NEXT: packuswb %xmm3, %xmm1690; SSE2-NEXT: pcmpgtb %xmm1, %xmm2691; SSE2-NEXT: psubb %xmm2, %xmm1692; SSE2-NEXT: movdqa %xmm1, %xmm2693; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]694; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [14,u,13,u,12,u,11,u,10,u,9,u,9,u,7,u]695; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]696; SSE2-NEXT: pand %xmm3, %xmm2697; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]698; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [7,u,8,u,9,u,10,u,11,u,12,u,13,u,14,u]699; SSE2-NEXT: pand %xmm3, %xmm1700; SSE2-NEXT: packuswb %xmm2, %xmm1701; SSE2-NEXT: psubb %xmm1, %xmm0702; SSE2-NEXT: retq703;704; SSE41-LABEL: test_remconstant_16i8:705; SSE41: # %bb.0:706; SSE41-NEXT: pxor %xmm1, %xmm1707; SSE41-NEXT: pxor %xmm2, %xmm2708; 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]709; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,147,0,79,0,43,0,187,0,103,0,57,0,57,0,147]710; SSE41-NEXT: psrlw $8, %xmm2711; SSE41-NEXT: pxor %xmm3, %xmm3712; SSE41-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]713; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147]714; SSE41-NEXT: psrlw $8, %xmm3715; SSE41-NEXT: packuswb %xmm2, %xmm3716; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,0,0,255,0,0,255,255,0,0,255,0,0,0,255]717; SSE41-NEXT: pand %xmm0, %xmm2718; SSE41-NEXT: paddb %xmm3, %xmm2719; SSE41-NEXT: movdqa %xmm2, %xmm3720; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]721; SSE41-NEXT: psraw $8, %xmm3722; SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [32,64,128,32,64,128,128,64]723; SSE41-NEXT: psrlw $8, %xmm3724; SSE41-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]725; SSE41-NEXT: psraw $8, %xmm2726; SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [64,64,128,64,32,128,64,32]727; SSE41-NEXT: psrlw $8, %xmm2728; SSE41-NEXT: packuswb %xmm3, %xmm2729; SSE41-NEXT: pcmpgtb %xmm2, %xmm1730; SSE41-NEXT: psubb %xmm1, %xmm2731; SSE41-NEXT: movdqa %xmm2, %xmm1732; 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]733; SSE41-NEXT: psllw $8, %xmm1734; 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]735; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2736; SSE41-NEXT: por %xmm1, %xmm2737; SSE41-NEXT: psubb %xmm2, %xmm0738; SSE41-NEXT: retq739;740; AVX1-LABEL: test_remconstant_16i8:741; AVX1: # %bb.0:742; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1743; 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]744; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [0,147,0,79,0,43,0,187,0,103,0,57,0,57,0,147]745; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2746; 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]747; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147]748; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3749; AVX1-NEXT: vpackuswb %xmm2, %xmm3, %xmm2750; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3751; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm2752; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]753; AVX1-NEXT: vpsraw $8, %xmm3, %xmm3754; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [32,64,128,32,64,128,128,64]755; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3756; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]757; AVX1-NEXT: vpsraw $8, %xmm2, %xmm2758; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [64,64,128,64,32,128,64,32]759; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2760; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2761; AVX1-NEXT: vpcmpgtb %xmm2, %xmm1, %xmm1762; AVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1763; 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]764; AVX1-NEXT: vpsllw $8, %xmm2, %xmm2765; 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]766; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1767; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1768; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0769; AVX1-NEXT: retq770;771; AVX2NOBW-LABEL: test_remconstant_16i8:772; AVX2NOBW: # %bb.0:773; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm1774; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [65427,65409,57,103,65467,43,79,65427,65427,79,43,65467,103,57,57,65427]775; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1776; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2777; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1778; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2779; AVX2NOBW-NEXT: vpaddb %xmm2, %xmm1, %xmm1780; AVX2NOBW-NEXT: vpmovsxbw %xmm1, %ymm1781; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [64,64,128,64,32,128,64,32,32,64,128,32,64,128,128,64]782; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1783; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2784; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1785; AVX2NOBW-NEXT: vpxor %xmm2, %xmm2, %xmm2786; AVX2NOBW-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm2787; AVX2NOBW-NEXT: vpsubb %xmm2, %xmm1, %xmm1788; 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],zero789; 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]790; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1791; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2792; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1793; AVX2NOBW-NEXT: vpsubb %xmm1, %xmm0, %xmm0794; AVX2NOBW-NEXT: vzeroupper795; AVX2NOBW-NEXT: retq796;797; AVX512BW-LABEL: test_remconstant_16i8:798; AVX512BW: # %bb.0:799; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [2,2,1,2,3,1,2,3,3,2,1,3,2,1,1,2]800; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm2801; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [65427,65409,57,103,65467,43,79,65427,65427,79,43,65467,103,57,57,65427]802; AVX512BW-NEXT: vpsrlw $8, %ymm2, %ymm2803; AVX512BW-NEXT: vpmovwb %zmm2, %ymm2804; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3805; AVX512BW-NEXT: vpaddb %xmm3, %xmm2, %xmm2806; AVX512BW-NEXT: vpmovsxbw %xmm2, %ymm2807; AVX512BW-NEXT: vpsravw %zmm1, %zmm2, %zmm1808; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1809; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2810; AVX512BW-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm2811; AVX512BW-NEXT: vpsubb %xmm2, %xmm1, %xmm1812; 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],zero813; 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]814; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1815; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0816; AVX512BW-NEXT: vzeroupper817; AVX512BW-NEXT: retq818 %res = srem <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>819 ret <16 x i8> %res820}821 822; This test is just to show what an scalarized v16i8 division looks like.823define <16 x i8> @test_rem_variable_16i8(<16 x i8> %a, <16 x i8> %b) nounwind {824; SSE2-LABEL: test_rem_variable_16i8:825; SSE2: # %bb.0:826; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)827; SSE2-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp)828; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax829; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)830; SSE2-NEXT: movsbl %ah, %eax831; SSE2-NEXT: movd %eax, %xmm0832; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax833; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)834; SSE2-NEXT: movsbl %ah, %eax835; SSE2-NEXT: movd %eax, %xmm1836; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = 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]837; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax838; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)839; SSE2-NEXT: movsbl %ah, %eax840; SSE2-NEXT: movd %eax, %xmm0841; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax842; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)843; SSE2-NEXT: movsbl %ah, %eax844; SSE2-NEXT: movd %eax, %xmm2845; SSE2-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]846; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]847; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax848; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)849; SSE2-NEXT: movsbl %ah, %eax850; SSE2-NEXT: movd %eax, %xmm0851; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax852; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)853; SSE2-NEXT: movsbl %ah, %eax854; SSE2-NEXT: movd %eax, %xmm3855; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]856; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax857; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)858; SSE2-NEXT: movsbl %ah, %eax859; SSE2-NEXT: movd %eax, %xmm0860; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax861; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)862; SSE2-NEXT: movsbl %ah, %eax863; SSE2-NEXT: movd %eax, %xmm1864; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = 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]865; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]866; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]867; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax868; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)869; SSE2-NEXT: movsbl %ah, %eax870; SSE2-NEXT: movd %eax, %xmm0871; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax872; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)873; SSE2-NEXT: movsbl %ah, %eax874; SSE2-NEXT: movd %eax, %xmm2875; SSE2-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]876; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax877; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)878; SSE2-NEXT: movsbl %ah, %eax879; SSE2-NEXT: movd %eax, %xmm0880; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax881; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)882; SSE2-NEXT: movsbl %ah, %eax883; SSE2-NEXT: movd %eax, %xmm3884; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]885; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]886; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax887; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)888; SSE2-NEXT: movsbl %ah, %eax889; SSE2-NEXT: movd %eax, %xmm0890; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax891; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)892; SSE2-NEXT: movsbl %ah, %eax893; SSE2-NEXT: movd %eax, %xmm2894; SSE2-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]895; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax896; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)897; SSE2-NEXT: movsbl %ah, %eax898; SSE2-NEXT: movd %eax, %xmm4899; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax900; SSE2-NEXT: idivb -{{[0-9]+}}(%rsp)901; SSE2-NEXT: movsbl %ah, %eax902; SSE2-NEXT: movd %eax, %xmm0903; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]904; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]905; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]906; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]907; SSE2-NEXT: retq908;909; SSE41-LABEL: test_rem_variable_16i8:910; SSE41: # %bb.0:911; SSE41-NEXT: pextrb $1, %xmm1, %ecx912; SSE41-NEXT: pextrb $1, %xmm0, %eax913; SSE41-NEXT: cbtw914; SSE41-NEXT: idivb %cl915; SSE41-NEXT: movsbl %ah, %ecx916; SSE41-NEXT: movd %xmm1, %edx917; SSE41-NEXT: movd %xmm0, %eax918; SSE41-NEXT: cbtw919; SSE41-NEXT: idivb %dl920; SSE41-NEXT: movsbl %ah, %eax921; SSE41-NEXT: movd %eax, %xmm2922; SSE41-NEXT: pinsrb $1, %ecx, %xmm2923; SSE41-NEXT: pextrb $2, %xmm1, %ecx924; SSE41-NEXT: pextrb $2, %xmm0, %eax925; SSE41-NEXT: cbtw926; SSE41-NEXT: idivb %cl927; SSE41-NEXT: movsbl %ah, %eax928; SSE41-NEXT: pinsrb $2, %eax, %xmm2929; SSE41-NEXT: pextrb $3, %xmm1, %ecx930; SSE41-NEXT: pextrb $3, %xmm0, %eax931; SSE41-NEXT: cbtw932; SSE41-NEXT: idivb %cl933; SSE41-NEXT: movsbl %ah, %eax934; SSE41-NEXT: pinsrb $3, %eax, %xmm2935; SSE41-NEXT: pextrb $4, %xmm1, %ecx936; SSE41-NEXT: pextrb $4, %xmm0, %eax937; SSE41-NEXT: cbtw938; SSE41-NEXT: idivb %cl939; SSE41-NEXT: movsbl %ah, %eax940; SSE41-NEXT: pinsrb $4, %eax, %xmm2941; SSE41-NEXT: pextrb $5, %xmm1, %ecx942; SSE41-NEXT: pextrb $5, %xmm0, %eax943; SSE41-NEXT: cbtw944; SSE41-NEXT: idivb %cl945; SSE41-NEXT: movsbl %ah, %eax946; SSE41-NEXT: pinsrb $5, %eax, %xmm2947; SSE41-NEXT: pextrb $6, %xmm1, %ecx948; SSE41-NEXT: pextrb $6, %xmm0, %eax949; SSE41-NEXT: cbtw950; SSE41-NEXT: idivb %cl951; SSE41-NEXT: movsbl %ah, %eax952; SSE41-NEXT: pinsrb $6, %eax, %xmm2953; SSE41-NEXT: pextrb $7, %xmm1, %ecx954; SSE41-NEXT: pextrb $7, %xmm0, %eax955; SSE41-NEXT: cbtw956; SSE41-NEXT: idivb %cl957; SSE41-NEXT: movsbl %ah, %eax958; SSE41-NEXT: pinsrb $7, %eax, %xmm2959; SSE41-NEXT: pextrb $8, %xmm1, %ecx960; SSE41-NEXT: pextrb $8, %xmm0, %eax961; SSE41-NEXT: cbtw962; SSE41-NEXT: idivb %cl963; SSE41-NEXT: movsbl %ah, %eax964; SSE41-NEXT: pinsrb $8, %eax, %xmm2965; SSE41-NEXT: pextrb $9, %xmm1, %ecx966; SSE41-NEXT: pextrb $9, %xmm0, %eax967; SSE41-NEXT: cbtw968; SSE41-NEXT: idivb %cl969; SSE41-NEXT: movsbl %ah, %eax970; SSE41-NEXT: pinsrb $9, %eax, %xmm2971; SSE41-NEXT: pextrb $10, %xmm1, %ecx972; SSE41-NEXT: pextrb $10, %xmm0, %eax973; SSE41-NEXT: cbtw974; SSE41-NEXT: idivb %cl975; SSE41-NEXT: movsbl %ah, %eax976; SSE41-NEXT: pinsrb $10, %eax, %xmm2977; SSE41-NEXT: pextrb $11, %xmm1, %ecx978; SSE41-NEXT: pextrb $11, %xmm0, %eax979; SSE41-NEXT: cbtw980; SSE41-NEXT: idivb %cl981; SSE41-NEXT: movsbl %ah, %eax982; SSE41-NEXT: pinsrb $11, %eax, %xmm2983; SSE41-NEXT: pextrb $12, %xmm1, %ecx984; SSE41-NEXT: pextrb $12, %xmm0, %eax985; SSE41-NEXT: cbtw986; SSE41-NEXT: idivb %cl987; SSE41-NEXT: movsbl %ah, %eax988; SSE41-NEXT: pinsrb $12, %eax, %xmm2989; SSE41-NEXT: pextrb $13, %xmm1, %ecx990; SSE41-NEXT: pextrb $13, %xmm0, %eax991; SSE41-NEXT: cbtw992; SSE41-NEXT: idivb %cl993; SSE41-NEXT: movsbl %ah, %eax994; SSE41-NEXT: pinsrb $13, %eax, %xmm2995; SSE41-NEXT: pextrb $14, %xmm1, %ecx996; SSE41-NEXT: pextrb $14, %xmm0, %eax997; SSE41-NEXT: cbtw998; SSE41-NEXT: idivb %cl999; SSE41-NEXT: movsbl %ah, %eax1000; SSE41-NEXT: pinsrb $14, %eax, %xmm21001; SSE41-NEXT: pextrb $15, %xmm1, %ecx1002; SSE41-NEXT: pextrb $15, %xmm0, %eax1003; SSE41-NEXT: cbtw1004; SSE41-NEXT: idivb %cl1005; SSE41-NEXT: movsbl %ah, %eax1006; SSE41-NEXT: pinsrb $15, %eax, %xmm21007; SSE41-NEXT: movdqa %xmm2, %xmm01008; SSE41-NEXT: retq1009;1010; AVX-LABEL: test_rem_variable_16i8:1011; AVX: # %bb.0:1012; AVX-NEXT: vpextrb $1, %xmm1, %ecx1013; AVX-NEXT: vpextrb $1, %xmm0, %eax1014; AVX-NEXT: cbtw1015; AVX-NEXT: idivb %cl1016; AVX-NEXT: movsbl %ah, %ecx1017; AVX-NEXT: vmovd %xmm1, %edx1018; AVX-NEXT: vmovd %xmm0, %eax1019; AVX-NEXT: cbtw1020; AVX-NEXT: idivb %dl1021; AVX-NEXT: movsbl %ah, %eax1022; AVX-NEXT: vmovd %eax, %xmm21023; AVX-NEXT: vpinsrb $1, %ecx, %xmm2, %xmm21024; AVX-NEXT: vpextrb $2, %xmm1, %ecx1025; AVX-NEXT: vpextrb $2, %xmm0, %eax1026; AVX-NEXT: cbtw1027; AVX-NEXT: idivb %cl1028; AVX-NEXT: movsbl %ah, %eax1029; AVX-NEXT: vpinsrb $2, %eax, %xmm2, %xmm21030; AVX-NEXT: vpextrb $3, %xmm1, %ecx1031; AVX-NEXT: vpextrb $3, %xmm0, %eax1032; AVX-NEXT: cbtw1033; AVX-NEXT: idivb %cl1034; AVX-NEXT: movsbl %ah, %eax1035; AVX-NEXT: vpinsrb $3, %eax, %xmm2, %xmm21036; AVX-NEXT: vpextrb $4, %xmm1, %ecx1037; AVX-NEXT: vpextrb $4, %xmm0, %eax1038; AVX-NEXT: cbtw1039; AVX-NEXT: idivb %cl1040; AVX-NEXT: movsbl %ah, %eax1041; AVX-NEXT: vpinsrb $4, %eax, %xmm2, %xmm21042; AVX-NEXT: vpextrb $5, %xmm1, %ecx1043; AVX-NEXT: vpextrb $5, %xmm0, %eax1044; AVX-NEXT: cbtw1045; AVX-NEXT: idivb %cl1046; AVX-NEXT: movsbl %ah, %eax1047; AVX-NEXT: vpinsrb $5, %eax, %xmm2, %xmm21048; AVX-NEXT: vpextrb $6, %xmm1, %ecx1049; AVX-NEXT: vpextrb $6, %xmm0, %eax1050; AVX-NEXT: cbtw1051; AVX-NEXT: idivb %cl1052; AVX-NEXT: movsbl %ah, %eax1053; AVX-NEXT: vpinsrb $6, %eax, %xmm2, %xmm21054; AVX-NEXT: vpextrb $7, %xmm1, %ecx1055; AVX-NEXT: vpextrb $7, %xmm0, %eax1056; AVX-NEXT: cbtw1057; AVX-NEXT: idivb %cl1058; AVX-NEXT: movsbl %ah, %eax1059; AVX-NEXT: vpinsrb $7, %eax, %xmm2, %xmm21060; AVX-NEXT: vpextrb $8, %xmm1, %ecx1061; AVX-NEXT: vpextrb $8, %xmm0, %eax1062; AVX-NEXT: cbtw1063; AVX-NEXT: idivb %cl1064; AVX-NEXT: movsbl %ah, %eax1065; AVX-NEXT: vpinsrb $8, %eax, %xmm2, %xmm21066; AVX-NEXT: vpextrb $9, %xmm1, %ecx1067; AVX-NEXT: vpextrb $9, %xmm0, %eax1068; AVX-NEXT: cbtw1069; AVX-NEXT: idivb %cl1070; AVX-NEXT: movsbl %ah, %eax1071; AVX-NEXT: vpinsrb $9, %eax, %xmm2, %xmm21072; AVX-NEXT: vpextrb $10, %xmm1, %ecx1073; AVX-NEXT: vpextrb $10, %xmm0, %eax1074; AVX-NEXT: cbtw1075; AVX-NEXT: idivb %cl1076; AVX-NEXT: movsbl %ah, %eax1077; AVX-NEXT: vpinsrb $10, %eax, %xmm2, %xmm21078; AVX-NEXT: vpextrb $11, %xmm1, %ecx1079; AVX-NEXT: vpextrb $11, %xmm0, %eax1080; AVX-NEXT: cbtw1081; AVX-NEXT: idivb %cl1082; AVX-NEXT: movsbl %ah, %eax1083; AVX-NEXT: vpinsrb $11, %eax, %xmm2, %xmm21084; AVX-NEXT: vpextrb $12, %xmm1, %ecx1085; AVX-NEXT: vpextrb $12, %xmm0, %eax1086; AVX-NEXT: cbtw1087; AVX-NEXT: idivb %cl1088; AVX-NEXT: movsbl %ah, %eax1089; AVX-NEXT: vpinsrb $12, %eax, %xmm2, %xmm21090; AVX-NEXT: vpextrb $13, %xmm1, %ecx1091; AVX-NEXT: vpextrb $13, %xmm0, %eax1092; AVX-NEXT: cbtw1093; AVX-NEXT: idivb %cl1094; AVX-NEXT: movsbl %ah, %eax1095; AVX-NEXT: vpinsrb $13, %eax, %xmm2, %xmm21096; AVX-NEXT: vpextrb $14, %xmm1, %ecx1097; AVX-NEXT: vpextrb $14, %xmm0, %eax1098; AVX-NEXT: cbtw1099; AVX-NEXT: idivb %cl1100; AVX-NEXT: movsbl %ah, %eax1101; AVX-NEXT: vpinsrb $14, %eax, %xmm2, %xmm21102; AVX-NEXT: vpextrb $15, %xmm1, %ecx1103; AVX-NEXT: vpextrb $15, %xmm0, %eax1104; AVX-NEXT: cbtw1105; AVX-NEXT: idivb %cl1106; AVX-NEXT: movsbl %ah, %eax1107; AVX-NEXT: vpinsrb $15, %eax, %xmm2, %xmm01108; AVX-NEXT: retq1109 %res = srem <16 x i8> %a, %b1110 ret <16 x i8> %res1111}1112 1113define <16 x i8> @PR143238(<16 x i8> %a0) {1114; SSE-LABEL: PR143238:1115; SSE: # %bb.0:1116; SSE-NEXT: pxor %xmm1, %xmm11117; SSE-NEXT: pxor %xmm2, %xmm21118; SSE-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]1119; SSE-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,103,0,187,0,43,0,79,0,147,0,137,0,129,0,121]1120; SSE-NEXT: psrlw $8, %xmm21121; SSE-NEXT: pxor %xmm3, %xmm31122; SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]1123; SSE-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,129,0,86,0,129,0,103,0,43,0,147,0,129,0,57]1124; SSE-NEXT: psrlw $8, %xmm31125; SSE-NEXT: packuswb %xmm2, %xmm31126; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01127; SSE-NEXT: paddb %xmm3, %xmm01128; SSE-NEXT: movdqa %xmm0, %xmm21129; SSE-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]1130; SSE-NEXT: psraw $8, %xmm21131; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [64,32,128,64,32,32,32,32]1132; SSE-NEXT: psrlw $8, %xmm21133; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1134; SSE-NEXT: psraw $8, %xmm01135; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,256,128,128,256,64,64,128]1136; SSE-NEXT: psrlw $8, %xmm01137; SSE-NEXT: packuswb %xmm2, %xmm01138; SSE-NEXT: pcmpgtb %xmm0, %xmm11139; SSE-NEXT: psubb %xmm1, %xmm01140; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01141; SSE-NEXT: retq1142;1143; AVX1-LABEL: PR143238:1144; AVX1: # %bb.0:1145; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11146; 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]1147; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [0,103,0,187,0,43,0,79,0,147,0,137,0,129,0,121]1148; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21149; 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]1150; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,129,0,86,0,129,0,103,0,43,0,147,0,129,0,57]1151; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm31152; AVX1-NEXT: vpackuswb %xmm2, %xmm3, %xmm21153; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01154; AVX1-NEXT: vpaddb %xmm0, %xmm2, %xmm01155; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1156; AVX1-NEXT: vpsraw $8, %xmm2, %xmm21157; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [64,32,128,64,32,32,32,32]1158; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21159; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1160; AVX1-NEXT: vpsraw $8, %xmm0, %xmm01161; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,256,128,128,256,64,64,128]1162; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01163; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01164; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm11165; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm01166; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01167; AVX1-NEXT: retq1168;1169; AVX2NOBW-LABEL: PR143238:1170; AVX2NOBW: # %bb.0:1171; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm11172; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [65409,86,65409,103,43,65427,65409,57,103,65467,43,79,65427,65417,65409,121]1173; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm11174; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm21175; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm11176; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01177; AVX2NOBW-NEXT: vpaddb %xmm0, %xmm1, %xmm01178; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm01179; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,256,128,128,256,64,64,128,64,32,128,64,32,32,32,32]1180; AVX2NOBW-NEXT: vpsrlw $8, %ymm0, %ymm01181; AVX2NOBW-NEXT: vextracti128 $1, %ymm0, %xmm11182; AVX2NOBW-NEXT: vpackuswb %xmm1, %xmm0, %xmm01183; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm11184; AVX2NOBW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm11185; AVX2NOBW-NEXT: vpsubb %xmm1, %xmm0, %xmm01186; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01187; AVX2NOBW-NEXT: vzeroupper1188; AVX2NOBW-NEXT: retq1189;1190; AVX512BW-LABEL: PR143238:1191; AVX512BW: # %bb.0:1192; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [0,0,1,1,0,2,2,1,2,3,1,2,3,3,3,3]1193; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm21194; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [65409,86,65409,103,43,65427,65409,57,103,65467,43,79,65427,65417,65409,121]1195; AVX512BW-NEXT: vpsrlw $8, %ymm2, %ymm21196; AVX512BW-NEXT: vpmovwb %zmm2, %ymm21197; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01198; AVX512BW-NEXT: vpaddb %xmm0, %xmm2, %xmm01199; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm01200; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm01201; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01202; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm11203; AVX512BW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm11204; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm01205; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01206; AVX512BW-NEXT: vzeroupper1207; AVX512BW-NEXT: retq1208 %sdiv = sdiv <16 x i8> %a0, <i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17>1209 %mask = and <16 x i8> %sdiv, splat (i8 1)1210 ret <16 x i8> %mask1211}1212