751 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2 --check-prefix=AVX2NOBW4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX2 --check-prefix=AVX512BW5 6;7; sdiv by 78;9 10define <4 x i64> @test_div7_4i64(<4 x i64> %a) nounwind {11; AVX1-LABEL: test_div7_4i64:12; AVX1: # %bb.0:13; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm114; AVX1-NEXT: vpextrq $1, %xmm1, %rax15; AVX1-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x492492492492492516; AVX1-NEXT: imulq %rcx17; AVX1-NEXT: movq %rdx, %rax18; AVX1-NEXT: shrq $63, %rax19; AVX1-NEXT: sarq %rdx20; AVX1-NEXT: addq %rax, %rdx21; AVX1-NEXT: vmovq %rdx, %xmm222; AVX1-NEXT: vmovq %xmm1, %rax23; AVX1-NEXT: imulq %rcx24; AVX1-NEXT: movq %rdx, %rax25; AVX1-NEXT: shrq $63, %rax26; AVX1-NEXT: sarq %rdx27; AVX1-NEXT: addq %rax, %rdx28; AVX1-NEXT: vmovq %rdx, %xmm129; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]30; AVX1-NEXT: vpextrq $1, %xmm0, %rax31; AVX1-NEXT: imulq %rcx32; AVX1-NEXT: movq %rdx, %rax33; AVX1-NEXT: shrq $63, %rax34; AVX1-NEXT: sarq %rdx35; AVX1-NEXT: addq %rax, %rdx36; AVX1-NEXT: vmovq %rdx, %xmm237; AVX1-NEXT: vmovq %xmm0, %rax38; AVX1-NEXT: imulq %rcx39; AVX1-NEXT: movq %rdx, %rax40; AVX1-NEXT: shrq $63, %rax41; AVX1-NEXT: sarq %rdx42; AVX1-NEXT: addq %rax, %rdx43; AVX1-NEXT: vmovq %rdx, %xmm044; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]45; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm046; AVX1-NEXT: retq47;48; AVX2-LABEL: test_div7_4i64:49; AVX2: # %bb.0:50; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm151; AVX2-NEXT: vpextrq $1, %xmm1, %rax52; AVX2-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x492492492492492553; AVX2-NEXT: imulq %rcx54; AVX2-NEXT: movq %rdx, %rax55; AVX2-NEXT: shrq $63, %rax56; AVX2-NEXT: sarq %rdx57; AVX2-NEXT: addq %rax, %rdx58; AVX2-NEXT: vmovq %rdx, %xmm259; AVX2-NEXT: vmovq %xmm1, %rax60; AVX2-NEXT: imulq %rcx61; AVX2-NEXT: movq %rdx, %rax62; AVX2-NEXT: shrq $63, %rax63; AVX2-NEXT: sarq %rdx64; AVX2-NEXT: addq %rax, %rdx65; AVX2-NEXT: vmovq %rdx, %xmm166; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]67; AVX2-NEXT: vpextrq $1, %xmm0, %rax68; AVX2-NEXT: imulq %rcx69; AVX2-NEXT: movq %rdx, %rax70; AVX2-NEXT: shrq $63, %rax71; AVX2-NEXT: sarq %rdx72; AVX2-NEXT: addq %rax, %rdx73; AVX2-NEXT: vmovq %rdx, %xmm274; AVX2-NEXT: vmovq %xmm0, %rax75; AVX2-NEXT: imulq %rcx76; AVX2-NEXT: movq %rdx, %rax77; AVX2-NEXT: shrq $63, %rax78; AVX2-NEXT: sarq %rdx79; AVX2-NEXT: addq %rax, %rdx80; AVX2-NEXT: vmovq %rdx, %xmm081; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]82; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm083; AVX2-NEXT: retq84 %res = sdiv <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>85 ret <4 x i64> %res86}87 88define <8 x i32> @test_div7_8i32(<8 x i32> %a) nounwind {89; AVX1-LABEL: test_div7_8i32:90; AVX1: # %bb.0:91; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm192; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]93; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]94; AVX1-NEXT: vpmuldq %xmm3, %xmm2, %xmm295; AVX1-NEXT: vpmuldq %xmm3, %xmm1, %xmm496; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]97; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3],xmm4[4,5],xmm2[6,7]98; AVX1-NEXT: vpaddd %xmm1, %xmm2, %xmm199; AVX1-NEXT: vpsrld $31, %xmm1, %xmm2100; AVX1-NEXT: vpsrad $2, %xmm1, %xmm1101; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1102; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]103; AVX1-NEXT: vpmuldq %xmm3, %xmm2, %xmm2104; AVX1-NEXT: vpmuldq %xmm3, %xmm0, %xmm3105; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]106; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]107; AVX1-NEXT: vpaddd %xmm0, %xmm2, %xmm0108; AVX1-NEXT: vpsrld $31, %xmm0, %xmm2109; AVX1-NEXT: vpsrad $2, %xmm0, %xmm0110; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0111; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0112; AVX1-NEXT: retq113;114; AVX2-LABEL: test_div7_8i32:115; AVX2: # %bb.0:116; AVX2-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]117; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027]118; AVX2-NEXT: vpmuldq %ymm2, %ymm1, %ymm1119; AVX2-NEXT: vpmuldq %ymm2, %ymm0, %ymm2120; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]121; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]122; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0123; AVX2-NEXT: vpsrld $31, %ymm0, %ymm1124; AVX2-NEXT: vpsrad $2, %ymm0, %ymm0125; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0126; AVX2-NEXT: retq127 %res = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>128 ret <8 x i32> %res129}130 131define <16 x i16> @test_div7_16i16(<16 x i16> %a) nounwind {132; AVX1-LABEL: test_div7_16i16:133; AVX1: # %bb.0:134; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1135; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]136; AVX1-NEXT: vpmulhw %xmm2, %xmm1, %xmm1137; AVX1-NEXT: vpsrlw $15, %xmm1, %xmm3138; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1139; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm1140; AVX1-NEXT: vpmulhw %xmm2, %xmm0, %xmm0141; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm2142; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0143; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0144; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0145; AVX1-NEXT: retq146;147; AVX2-LABEL: test_div7_16i16:148; AVX2: # %bb.0:149; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725]150; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm1151; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0152; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0153; AVX2-NEXT: retq154 %res = sdiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>155 ret <16 x i16> %res156}157 158define <32 x i8> @test_div7_32i8(<32 x i8> %a) nounwind {159; AVX1-LABEL: test_div7_32i8:160; AVX1: # %bb.0:161; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1162; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2163; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]164; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]165; AVX1-NEXT: vpmulhw %xmm4, %xmm3, %xmm3166; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3167; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm5 = 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]168; AVX1-NEXT: vpmulhw %xmm4, %xmm5, %xmm5169; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5170; AVX1-NEXT: vpackuswb %xmm3, %xmm5, %xmm3171; AVX1-NEXT: vpaddb %xmm1, %xmm3, %xmm1172; AVX1-NEXT: vpsrlw $2, %xmm1, %xmm1173; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]174; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1175; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]176; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1177; AVX1-NEXT: vpsubb %xmm5, %xmm1, %xmm1178; AVX1-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm6179; AVX1-NEXT: vpsubb %xmm6, %xmm1, %xmm1180; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]181; AVX1-NEXT: vpmulhw %xmm4, %xmm6, %xmm6182; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm6183; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm7 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]184; AVX1-NEXT: vpmulhw %xmm4, %xmm7, %xmm4185; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4186; AVX1-NEXT: vpackuswb %xmm6, %xmm4, %xmm4187; AVX1-NEXT: vpaddb %xmm0, %xmm4, %xmm0188; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm0189; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0190; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm0191; AVX1-NEXT: vpsubb %xmm5, %xmm0, %xmm0192; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2193; AVX1-NEXT: vpsubb %xmm2, %xmm0, %xmm0194; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0195; AVX1-NEXT: retq196;197; AVX2NOBW-LABEL: test_div7_32i8:198; AVX2NOBW: # %bb.0:199; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1200; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]201; AVX2NOBW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]202; AVX2NOBW-NEXT: vpmulhw %ymm3, %ymm2, %ymm2203; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2204; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm4 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]205; AVX2NOBW-NEXT: vpmulhw %ymm3, %ymm4, %ymm3206; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3207; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm3, %ymm2208; AVX2NOBW-NEXT: vpaddb %ymm0, %ymm2, %ymm0209; AVX2NOBW-NEXT: vpsrlw $2, %ymm0, %ymm0210; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0211; AVX2NOBW-NEXT: vpbroadcastb {{.*#+}} ymm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]212; AVX2NOBW-NEXT: vpxor %ymm2, %ymm0, %ymm0213; AVX2NOBW-NEXT: vpsubb %ymm2, %ymm0, %ymm0214; AVX2NOBW-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm1215; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm0216; AVX2NOBW-NEXT: retq217;218; AVX512BW-LABEL: test_div7_32i8:219; AVX512BW: # %bb.0:220; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm1221; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]222; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1223; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1224; AVX512BW-NEXT: vpaddb %ymm0, %ymm1, %ymm0225; AVX512BW-NEXT: vpsrlw $2, %ymm0, %ymm0226; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0227; AVX512BW-NEXT: vpbroadcastb {{.*#+}} ymm1 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]228; AVX512BW-NEXT: vpxor %ymm1, %ymm0, %ymm0229; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0230; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1231; AVX512BW-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm1232; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0233; AVX512BW-NEXT: retq234 %res = sdiv <32 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, 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>235 ret <32 x i8> %res236}237 238;239; sdiv by non-splat constant240;241 242define <32 x i8> @test_divconstant_32i8(<32 x i8> %a) nounwind {243; AVX1-LABEL: test_divconstant_32i8:244; AVX1: # %bb.0:245; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2246; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1247; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]248; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,147,0,79,0,43,0,187,0,103,0,57,0,129,0,147]249; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3250; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]251; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [0,187,0,49,0,103,0,27,0,57,0,121,0,129,0,137]252; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2253; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2254; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3255; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4256; AVX1-NEXT: vpaddb %xmm4, %xmm2, %xmm2257; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]258; AVX1-NEXT: vpsraw $8, %xmm4, %xmm4259; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [32,64,128,32,64,128,64,64]260; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4261; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]262; AVX1-NEXT: vpsraw $8, %xmm2, %xmm2263; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [16,64,32,128,64,32,32,32]264; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2265; AVX1-NEXT: vpackuswb %xmm4, %xmm2, %xmm2266; AVX1-NEXT: vpcmpgtb %xmm2, %xmm1, %xmm4267; AVX1-NEXT: vpsubb %xmm4, %xmm2, %xmm2268; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = 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]269; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,137,0,129,0,121,0,57,0,27,0,103,0,49,0,187]270; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4271; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = 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]272; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147]273; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0274; AVX1-NEXT: vpackuswb %xmm4, %xmm0, %xmm0275; AVX1-NEXT: vpaddb %xmm3, %xmm0, %xmm0276; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]277; AVX1-NEXT: vpsraw $8, %xmm3, %xmm3278; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [32,32,32,64,128,32,64,16]279; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3280; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]281; AVX1-NEXT: vpsraw $8, %xmm0, %xmm0282; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [64,64,128,64,32,128,64,32]283; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0284; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0285; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1286; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0287; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0288; AVX1-NEXT: retq289;290; AVX2NOBW-LABEL: test_divconstant_32i8:291; AVX2NOBW: # %bb.0:292; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1293; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]294; AVX2NOBW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [0,137,0,129,0,121,0,57,0,27,0,103,0,49,0,187,0,147,0,79,0,43,0,187,0,103,0,57,0,129,0,147]295; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2296; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]297; AVX2NOBW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147,0,187,0,49,0,103,0,27,0,57,0,121,0,129,0,137]298; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3299; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm3, %ymm2300; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0301; AVX2NOBW-NEXT: vpaddb %ymm0, %ymm2, %ymm0302; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]303; AVX2NOBW-NEXT: vpsraw $8, %ymm2, %ymm2304; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [32,32,32,64,128,32,64,16,32,64,128,32,64,128,64,64]305; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2306; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]307; AVX2NOBW-NEXT: vpsraw $8, %ymm0, %ymm0308; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [64,64,128,64,32,128,64,32,16,64,32,128,64,32,32,32]309; AVX2NOBW-NEXT: vpsrlw $8, %ymm0, %ymm0310; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm0, %ymm0311; AVX2NOBW-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm1312; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm0313; AVX2NOBW-NEXT: retq314;315; AVX512BW-LABEL: test_divconstant_32i8:316; AVX512BW: # %bb.0:317; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1318; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0319; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 # [65427,65409,57,103,65467,43,79,65427,65417,65409,121,57,27,103,49,65467,65467,49,103,27,57,121,65409,65417,65427,79,43,65467,103,57,65409,65427]320; AVX512BW-NEXT: vpsrlw $8, %zmm0, %zmm0321; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0322; AVX512BW-NEXT: vpaddb %ymm1, %ymm0, %ymm0323; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0324; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0325; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0326; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1327; AVX512BW-NEXT: vpcmpgtb %ymm0, %ymm1, %ymm1328; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0329; AVX512BW-NEXT: retq330 %res = sdiv <32 x i8> %a, <i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 22, i8 21, i8 20, i8 19, i8 18, i8 17, i8 16, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7>331 ret <32 x i8> %res332}333 334;335; srem by 7336;337 338define <4 x i64> @test_rem7_4i64(<4 x i64> %a) nounwind {339; AVX1-LABEL: test_rem7_4i64:340; AVX1: # %bb.0:341; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1342; AVX1-NEXT: vpextrq $1, %xmm1, %rcx343; AVX1-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925344; AVX1-NEXT: movq %rcx, %rax345; AVX1-NEXT: imulq %rsi346; AVX1-NEXT: movq %rdx, %rax347; AVX1-NEXT: shrq $63, %rax348; AVX1-NEXT: sarq %rdx349; AVX1-NEXT: addq %rax, %rdx350; AVX1-NEXT: leaq (,%rdx,8), %rax351; AVX1-NEXT: subq %rax, %rdx352; AVX1-NEXT: addq %rcx, %rdx353; AVX1-NEXT: vmovq %rdx, %xmm2354; AVX1-NEXT: vmovq %xmm1, %rcx355; AVX1-NEXT: movq %rcx, %rax356; AVX1-NEXT: imulq %rsi357; AVX1-NEXT: movq %rdx, %rax358; AVX1-NEXT: shrq $63, %rax359; AVX1-NEXT: sarq %rdx360; AVX1-NEXT: addq %rax, %rdx361; AVX1-NEXT: leaq (,%rdx,8), %rax362; AVX1-NEXT: subq %rax, %rdx363; AVX1-NEXT: addq %rcx, %rdx364; AVX1-NEXT: vmovq %rdx, %xmm1365; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]366; AVX1-NEXT: vpextrq $1, %xmm0, %rcx367; AVX1-NEXT: movq %rcx, %rax368; AVX1-NEXT: imulq %rsi369; AVX1-NEXT: movq %rdx, %rax370; AVX1-NEXT: shrq $63, %rax371; AVX1-NEXT: sarq %rdx372; AVX1-NEXT: addq %rax, %rdx373; AVX1-NEXT: leaq (,%rdx,8), %rax374; AVX1-NEXT: subq %rax, %rdx375; AVX1-NEXT: addq %rcx, %rdx376; AVX1-NEXT: vmovq %rdx, %xmm2377; AVX1-NEXT: vmovq %xmm0, %rcx378; AVX1-NEXT: movq %rcx, %rax379; AVX1-NEXT: imulq %rsi380; AVX1-NEXT: movq %rdx, %rax381; AVX1-NEXT: shrq $63, %rax382; AVX1-NEXT: sarq %rdx383; AVX1-NEXT: addq %rax, %rdx384; AVX1-NEXT: leaq (,%rdx,8), %rax385; AVX1-NEXT: subq %rax, %rdx386; AVX1-NEXT: addq %rcx, %rdx387; AVX1-NEXT: vmovq %rdx, %xmm0388; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]389; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0390; AVX1-NEXT: retq391;392; AVX2-LABEL: test_rem7_4i64:393; AVX2: # %bb.0:394; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1395; AVX2-NEXT: vpextrq $1, %xmm1, %rcx396; AVX2-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925397; AVX2-NEXT: movq %rcx, %rax398; AVX2-NEXT: imulq %rsi399; AVX2-NEXT: movq %rdx, %rax400; AVX2-NEXT: shrq $63, %rax401; AVX2-NEXT: sarq %rdx402; AVX2-NEXT: addq %rax, %rdx403; AVX2-NEXT: leaq (,%rdx,8), %rax404; AVX2-NEXT: subq %rax, %rdx405; AVX2-NEXT: addq %rcx, %rdx406; AVX2-NEXT: vmovq %rdx, %xmm2407; AVX2-NEXT: vmovq %xmm1, %rcx408; AVX2-NEXT: movq %rcx, %rax409; AVX2-NEXT: imulq %rsi410; AVX2-NEXT: movq %rdx, %rax411; AVX2-NEXT: shrq $63, %rax412; AVX2-NEXT: sarq %rdx413; AVX2-NEXT: addq %rax, %rdx414; AVX2-NEXT: leaq (,%rdx,8), %rax415; AVX2-NEXT: subq %rax, %rdx416; AVX2-NEXT: addq %rcx, %rdx417; AVX2-NEXT: vmovq %rdx, %xmm1418; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]419; AVX2-NEXT: vpextrq $1, %xmm0, %rcx420; AVX2-NEXT: movq %rcx, %rax421; AVX2-NEXT: imulq %rsi422; AVX2-NEXT: movq %rdx, %rax423; AVX2-NEXT: shrq $63, %rax424; AVX2-NEXT: sarq %rdx425; AVX2-NEXT: addq %rax, %rdx426; AVX2-NEXT: leaq (,%rdx,8), %rax427; AVX2-NEXT: subq %rax, %rdx428; AVX2-NEXT: addq %rcx, %rdx429; AVX2-NEXT: vmovq %rdx, %xmm2430; AVX2-NEXT: vmovq %xmm0, %rcx431; AVX2-NEXT: movq %rcx, %rax432; AVX2-NEXT: imulq %rsi433; AVX2-NEXT: movq %rdx, %rax434; AVX2-NEXT: shrq $63, %rax435; AVX2-NEXT: sarq %rdx436; AVX2-NEXT: addq %rax, %rdx437; AVX2-NEXT: leaq (,%rdx,8), %rax438; AVX2-NEXT: subq %rax, %rdx439; AVX2-NEXT: addq %rcx, %rdx440; AVX2-NEXT: vmovq %rdx, %xmm0441; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]442; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0443; AVX2-NEXT: retq444 %res = srem <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>445 ret <4 x i64> %res446}447 448define <8 x i32> @test_rem7_8i32(<8 x i32> %a) nounwind {449; AVX1-LABEL: test_rem7_8i32:450; AVX1: # %bb.0:451; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1452; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]453; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]454; AVX1-NEXT: vpmuldq %xmm3, %xmm2, %xmm2455; AVX1-NEXT: vpmuldq %xmm3, %xmm1, %xmm4456; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]457; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3],xmm4[4,5],xmm2[6,7]458; AVX1-NEXT: vpaddd %xmm1, %xmm2, %xmm2459; AVX1-NEXT: vpsrld $31, %xmm2, %xmm4460; AVX1-NEXT: vpsrad $2, %xmm2, %xmm2461; AVX1-NEXT: vpaddd %xmm4, %xmm2, %xmm2462; AVX1-NEXT: vpslld $3, %xmm2, %xmm4463; AVX1-NEXT: vpsubd %xmm4, %xmm2, %xmm2464; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1465; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]466; AVX1-NEXT: vpmuldq %xmm3, %xmm2, %xmm2467; AVX1-NEXT: vpmuldq %xmm3, %xmm0, %xmm3468; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]469; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]470; AVX1-NEXT: vpaddd %xmm0, %xmm2, %xmm2471; AVX1-NEXT: vpsrld $31, %xmm2, %xmm3472; AVX1-NEXT: vpsrad $2, %xmm2, %xmm2473; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2474; AVX1-NEXT: vpslld $3, %xmm2, %xmm3475; AVX1-NEXT: vpsubd %xmm3, %xmm2, %xmm2476; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0477; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0478; AVX1-NEXT: retq479;480; AVX2-LABEL: test_rem7_8i32:481; AVX2: # %bb.0:482; AVX2-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]483; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027]484; AVX2-NEXT: vpmuldq %ymm2, %ymm1, %ymm1485; AVX2-NEXT: vpmuldq %ymm2, %ymm0, %ymm2486; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]487; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]488; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm1489; AVX2-NEXT: vpsrld $31, %ymm1, %ymm2490; AVX2-NEXT: vpsrad $2, %ymm1, %ymm1491; AVX2-NEXT: vpaddd %ymm2, %ymm1, %ymm1492; AVX2-NEXT: vpslld $3, %ymm1, %ymm2493; AVX2-NEXT: vpsubd %ymm2, %ymm1, %ymm1494; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0495; AVX2-NEXT: retq496 %res = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>497 ret <8 x i32> %res498}499 500define <16 x i16> @test_rem7_16i16(<16 x i16> %a) nounwind {501; AVX1-LABEL: test_rem7_16i16:502; AVX1: # %bb.0:503; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1504; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]505; AVX1-NEXT: vpmulhw %xmm2, %xmm1, %xmm3506; AVX1-NEXT: vpsrlw $15, %xmm3, %xmm4507; AVX1-NEXT: vpsraw $1, %xmm3, %xmm3508; AVX1-NEXT: vpaddw %xmm4, %xmm3, %xmm3509; AVX1-NEXT: vpsllw $3, %xmm3, %xmm4510; AVX1-NEXT: vpsubw %xmm4, %xmm3, %xmm3511; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm1512; AVX1-NEXT: vpmulhw %xmm2, %xmm0, %xmm2513; AVX1-NEXT: vpsrlw $15, %xmm2, %xmm3514; AVX1-NEXT: vpsraw $1, %xmm2, %xmm2515; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm2516; AVX1-NEXT: vpsllw $3, %xmm2, %xmm3517; AVX1-NEXT: vpsubw %xmm3, %xmm2, %xmm2518; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0519; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0520; AVX1-NEXT: retq521;522; AVX2-LABEL: test_rem7_16i16:523; AVX2: # %bb.0:524; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725,18725]525; AVX2-NEXT: vpsrlw $15, %ymm1, %ymm2526; AVX2-NEXT: vpsraw $1, %ymm1, %ymm1527; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm1528; AVX2-NEXT: vpsllw $3, %ymm1, %ymm2529; AVX2-NEXT: vpsubw %ymm2, %ymm1, %ymm1530; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0531; AVX2-NEXT: retq532 %res = srem <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>533 ret <16 x i16> %res534}535 536define <32 x i8> @test_rem7_32i8(<32 x i8> %a) nounwind {537; AVX1-LABEL: test_rem7_32i8:538; AVX1: # %bb.0:539; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2540; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1541; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]542; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]543; AVX1-NEXT: vpmulhw %xmm4, %xmm3, %xmm3544; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3545; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm5 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]546; AVX1-NEXT: vpmulhw %xmm4, %xmm5, %xmm5547; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5548; AVX1-NEXT: vpackuswb %xmm3, %xmm5, %xmm3549; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm3550; AVX1-NEXT: vpsrlw $2, %xmm3, %xmm3551; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]552; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3553; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]554; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3555; AVX1-NEXT: vpsubb %xmm6, %xmm3, %xmm3556; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm7557; AVX1-NEXT: vpsubb %xmm7, %xmm3, %xmm3558; AVX1-NEXT: vpsllw $3, %xmm3, %xmm7559; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]560; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm7561; AVX1-NEXT: vpsubb %xmm7, %xmm3, %xmm3562; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm2563; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]564; AVX1-NEXT: vpmulhw %xmm4, %xmm3, %xmm3565; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3566; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm7 = 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]567; AVX1-NEXT: vpmulhw %xmm4, %xmm7, %xmm4568; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4569; AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm3570; AVX1-NEXT: vpaddb %xmm0, %xmm3, %xmm3571; AVX1-NEXT: vpsrlw $2, %xmm3, %xmm3572; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3573; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3574; AVX1-NEXT: vpsubb %xmm6, %xmm3, %xmm3575; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm1576; AVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1577; AVX1-NEXT: vpsllw $3, %xmm1, %xmm3578; AVX1-NEXT: vpand %xmm3, %xmm8, %xmm3579; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm1580; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0581; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0582; AVX1-NEXT: retq583;584; AVX2NOBW-LABEL: test_rem7_32i8:585; AVX2NOBW: # %bb.0:586; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1587; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]588; AVX2NOBW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147,0,147]589; AVX2NOBW-NEXT: vpmulhw %ymm3, %ymm2, %ymm2590; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2591; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm4 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]592; AVX2NOBW-NEXT: vpmulhw %ymm3, %ymm4, %ymm3593; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3594; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm3, %ymm2595; AVX2NOBW-NEXT: vpaddb %ymm0, %ymm2, %ymm2596; AVX2NOBW-NEXT: vpsrlw $2, %ymm2, %ymm2597; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2598; AVX2NOBW-NEXT: vpbroadcastb {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]599; AVX2NOBW-NEXT: vpxor %ymm3, %ymm2, %ymm2600; AVX2NOBW-NEXT: vpsubb %ymm3, %ymm2, %ymm2601; AVX2NOBW-NEXT: vpcmpgtb %ymm2, %ymm1, %ymm1602; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm2, %ymm1603; AVX2NOBW-NEXT: vpsllw $3, %ymm1, %ymm2604; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2605; AVX2NOBW-NEXT: vpsubb %ymm2, %ymm1, %ymm1606; AVX2NOBW-NEXT: vpaddb %ymm1, %ymm0, %ymm0607; AVX2NOBW-NEXT: retq608;609; AVX512BW-LABEL: test_rem7_32i8:610; AVX512BW: # %bb.0:611; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm1612; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]613; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1614; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1615; AVX512BW-NEXT: vpaddb %ymm0, %ymm1, %ymm1616; AVX512BW-NEXT: vpsrlw $2, %ymm1, %ymm1617; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1618; AVX512BW-NEXT: vpbroadcastb {{.*#+}} ymm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]619; AVX512BW-NEXT: vpxor %ymm2, %ymm1, %ymm1620; AVX512BW-NEXT: vpsubb %ymm2, %ymm1, %ymm1621; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2622; AVX512BW-NEXT: vpcmpgtb %ymm1, %ymm2, %ymm2623; AVX512BW-NEXT: vpsubb %ymm2, %ymm1, %ymm1624; AVX512BW-NEXT: vpsllw $3, %ymm1, %ymm2625; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2626; AVX512BW-NEXT: vpsubb %ymm2, %ymm1, %ymm1627; AVX512BW-NEXT: vpaddb %ymm1, %ymm0, %ymm0628; AVX512BW-NEXT: retq629 %res = srem <32 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, 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>630 ret <32 x i8> %res631}632 633;634; srem by non-splat constant635;636 637define <32 x i8> @test_remconstant_32i8(<32 x i8> %a) nounwind {638; AVX1-LABEL: test_remconstant_32i8:639; AVX1: # %bb.0:640; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2641; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1642; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]643; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,147,0,79,0,43,0,187,0,103,0,57,0,129,0,147]644; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3645; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]646; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,187,0,49,0,103,0,27,0,57,0,121,0,129,0,137]647; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4648; AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm3649; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm4650; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5651; AVX1-NEXT: vpaddb %xmm5, %xmm3, %xmm3652; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]653; AVX1-NEXT: vpsraw $8, %xmm5, %xmm5654; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5 # [32,64,128,32,64,128,64,64]655; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5656; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]657; AVX1-NEXT: vpsraw $8, %xmm3, %xmm3658; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [16,64,32,128,64,32,32,32]659; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3660; AVX1-NEXT: vpackuswb %xmm5, %xmm3, %xmm3661; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm5662; AVX1-NEXT: vpsubb %xmm5, %xmm3, %xmm3663; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm5 # [22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]664; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]665; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5666; AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,21,0,19,0,17,0,15,0,13,0,11,0,9,0,7]667; AVX1-NEXT: vpsllw $8, %xmm3, %xmm3668; AVX1-NEXT: vpor %xmm3, %xmm5, %xmm3669; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm2670; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = 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]671; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [0,137,0,129,0,121,0,57,0,27,0,103,0,49,0,187]672; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3673; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm5 = 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]674; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147]675; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5676; AVX1-NEXT: vpackuswb %xmm3, %xmm5, %xmm3677; AVX1-NEXT: vpaddb %xmm4, %xmm3, %xmm3678; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]679; AVX1-NEXT: vpsraw $8, %xmm4, %xmm4680; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [32,32,32,64,128,32,64,16]681; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4682; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]683; AVX1-NEXT: vpsraw $8, %xmm3, %xmm3684; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [64,64,128,64,32,128,64,32]685; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3686; AVX1-NEXT: vpackuswb %xmm4, %xmm3, %xmm3687; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm1688; AVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1689; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm3 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]690; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3691; AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22]692; AVX1-NEXT: vpsllw $8, %xmm1, %xmm1693; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1694; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0695; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0696; AVX1-NEXT: retq697;698; AVX2NOBW-LABEL: test_remconstant_32i8:699; AVX2NOBW: # %bb.0:700; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1701; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]702; AVX2NOBW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [0,137,0,129,0,121,0,57,0,27,0,103,0,49,0,187,0,147,0,79,0,43,0,187,0,103,0,57,0,129,0,147]703; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2704; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]705; AVX2NOBW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [0,147,0,129,0,57,0,103,0,187,0,43,0,79,0,147,0,187,0,49,0,103,0,27,0,57,0,121,0,129,0,137]706; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3707; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm3, %ymm2708; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3709; AVX2NOBW-NEXT: vpaddb %ymm3, %ymm2, %ymm2710; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]711; AVX2NOBW-NEXT: vpsraw $8, %ymm3, %ymm3712; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [32,32,32,64,128,32,64,16,32,64,128,32,64,128,64,64]713; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3714; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]715; AVX2NOBW-NEXT: vpsraw $8, %ymm2, %ymm2716; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [64,64,128,64,32,128,64,32,16,64,32,128,64,32,32,32]717; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2718; AVX2NOBW-NEXT: vpackuswb %ymm3, %ymm2, %ymm2719; AVX2NOBW-NEXT: vpcmpgtb %ymm2, %ymm1, %ymm1720; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm2, %ymm1721; AVX2NOBW-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2 # [0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22,0,21,0,19,0,17,0,15,0,13,0,11,0,9,0,7]722; AVX2NOBW-NEXT: vpsllw $8, %ymm2, %ymm2723; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]724; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1725; AVX2NOBW-NEXT: vpor %ymm2, %ymm1, %ymm1726; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm0727; AVX2NOBW-NEXT: retq728;729; AVX512BW-LABEL: test_remconstant_32i8:730; AVX512BW: # %bb.0:731; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1732; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm2733; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [65427,65409,57,103,65467,43,79,65427,65417,65409,121,57,27,103,49,65467,65467,49,103,27,57,121,65409,65417,65427,79,43,65467,103,57,65409,65427]734; AVX512BW-NEXT: vpsrlw $8, %zmm2, %zmm2735; AVX512BW-NEXT: vpmovwb %zmm2, %ymm2736; AVX512BW-NEXT: vpaddb %ymm1, %ymm2, %ymm1737; AVX512BW-NEXT: vpmovsxbw %ymm1, %zmm1738; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1739; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1740; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2741; AVX512BW-NEXT: vpcmpgtb %ymm1, %ymm2, %ymm2742; AVX512BW-NEXT: vpsubb %ymm2, %ymm1, %ymm1743; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero744; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]745; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1746; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0747; AVX512BW-NEXT: retq748 %res = srem <32 x i8> %a, <i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 22, i8 21, i8 20, i8 19, i8 18, i8 17, i8 16, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7>749 ret <32 x i8> %res750}751