3211 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-prefixes=CHECK,SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX2ORLATER,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,AVX,AVX2ORLATER,AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=CHECK,AVX,AVX2ORLATER,AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefixes=CHECK,AVX,XOP9 10; fold (sdiv x, 1) -> x11define i32 @combine_sdiv_by_one(i32 %x) {12; CHECK-LABEL: combine_sdiv_by_one:13; CHECK: # %bb.0:14; CHECK-NEXT: movl %edi, %eax15; CHECK-NEXT: retq16 %1 = sdiv i32 %x, 117 ret i32 %118}19 20define <4 x i32> @combine_vec_sdiv_by_one(<4 x i32> %x) {21; CHECK-LABEL: combine_vec_sdiv_by_one:22; CHECK: # %bb.0:23; CHECK-NEXT: retq24 %1 = sdiv <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>25 ret <4 x i32> %126}27 28; fold (sdiv x, -1) -> 0 - x29define i32 @combine_sdiv_by_negone(i32 %x) {30; CHECK-LABEL: combine_sdiv_by_negone:31; CHECK: # %bb.0:32; CHECK-NEXT: movl %edi, %eax33; CHECK-NEXT: negl %eax34; CHECK-NEXT: retq35 %1 = sdiv i32 %x, -136 ret i32 %137}38 39define <4 x i32> @combine_vec_sdiv_by_negone(<4 x i32> %x) {40; SSE-LABEL: combine_vec_sdiv_by_negone:41; SSE: # %bb.0:42; SSE-NEXT: pxor %xmm1, %xmm143; SSE-NEXT: psubd %xmm0, %xmm144; SSE-NEXT: movdqa %xmm1, %xmm045; SSE-NEXT: retq46;47; AVX-LABEL: combine_vec_sdiv_by_negone:48; AVX: # %bb.0:49; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm150; AVX-NEXT: vpsubd %xmm0, %xmm1, %xmm051; AVX-NEXT: retq52 %1 = sdiv <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>53 ret <4 x i32> %154}55 56; fold (sdiv x, INT_MIN) -> select((icmp eq x, INT_MIN), 1, 0)57define i32 @combine_sdiv_by_minsigned(i32 %x) {58; CHECK-LABEL: combine_sdiv_by_minsigned:59; CHECK: # %bb.0:60; CHECK-NEXT: xorl %eax, %eax61; CHECK-NEXT: negl %edi62; CHECK-NEXT: seto %al63; CHECK-NEXT: retq64 %1 = sdiv i32 %x, -214748364865 ret i32 %166}67 68define <4 x i32> @combine_vec_sdiv_by_minsigned(<4 x i32> %x) {69; SSE-LABEL: combine_vec_sdiv_by_minsigned:70; SSE: # %bb.0:71; SSE-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm072; SSE-NEXT: psrld $31, %xmm073; SSE-NEXT: retq74;75; AVX1-LABEL: combine_vec_sdiv_by_minsigned:76; AVX1: # %bb.0:77; AVX1-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm078; AVX1-NEXT: vpsrld $31, %xmm0, %xmm079; AVX1-NEXT: retq80;81; AVX2-LABEL: combine_vec_sdiv_by_minsigned:82; AVX2: # %bb.0:83; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]84; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm085; AVX2-NEXT: vpsrld $31, %xmm0, %xmm086; AVX2-NEXT: retq87;88; AVX512F-LABEL: combine_vec_sdiv_by_minsigned:89; AVX512F: # %bb.0:90; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]91; AVX512F-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm092; AVX512F-NEXT: vpsrld $31, %xmm0, %xmm093; AVX512F-NEXT: retq94;95; AVX512BW-LABEL: combine_vec_sdiv_by_minsigned:96; AVX512BW: # %bb.0:97; AVX512BW-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k198; AVX512BW-NEXT: vpbroadcastd {{.*#+}} xmm0 {%k1} {z} = [1,1,1,1]99; AVX512BW-NEXT: retq100;101; XOP-LABEL: combine_vec_sdiv_by_minsigned:102; XOP: # %bb.0:103; XOP-NEXT: vpcomeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0104; XOP-NEXT: vpsrld $31, %xmm0, %xmm0105; XOP-NEXT: retq106 %1 = sdiv <4 x i32> %x, <i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 -2147483648>107 ret <4 x i32> %1108}109 110; fold (sdiv 0, x) -> 0111define i32 @combine_sdiv_zero(i32 %x) {112; CHECK-LABEL: combine_sdiv_zero:113; CHECK: # %bb.0:114; CHECK-NEXT: xorl %eax, %eax115; CHECK-NEXT: retq116 %1 = sdiv i32 0, %x117 ret i32 %1118}119 120define <4 x i32> @combine_vec_sdiv_zero(<4 x i32> %x) {121; SSE-LABEL: combine_vec_sdiv_zero:122; SSE: # %bb.0:123; SSE-NEXT: xorps %xmm0, %xmm0124; SSE-NEXT: retq125;126; AVX-LABEL: combine_vec_sdiv_zero:127; AVX: # %bb.0:128; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0129; AVX-NEXT: retq130 %1 = sdiv <4 x i32> zeroinitializer, %x131 ret <4 x i32> %1132}133 134; fold (sdiv x, x) -> 1135define i32 @combine_sdiv_dupe(i32 %x) {136; CHECK-LABEL: combine_sdiv_dupe:137; CHECK: # %bb.0:138; CHECK-NEXT: movl $1, %eax139; CHECK-NEXT: retq140 %1 = sdiv i32 %x, %x141 ret i32 %1142}143 144define <4 x i32> @combine_vec_sdiv_dupe(<4 x i32> %x) {145; SSE-LABEL: combine_vec_sdiv_dupe:146; SSE: # %bb.0:147; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,1,1,1]148; SSE-NEXT: retq149;150; AVX-LABEL: combine_vec_sdiv_dupe:151; AVX: # %bb.0:152; AVX-NEXT: vbroadcastss {{.*#+}} xmm0 = [1,1,1,1]153; AVX-NEXT: retq154 %1 = sdiv <4 x i32> %x, %x155 ret <4 x i32> %1156}157 158; fold (sdiv x, y) -> (udiv x, y) iff x and y are positive159define <4 x i32> @combine_vec_sdiv_by_pos0(<4 x i32> %x) {160; SSE-LABEL: combine_vec_sdiv_by_pos0:161; SSE: # %bb.0:162; SSE-NEXT: psrld $2, %xmm0163; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0164; SSE-NEXT: retq165;166; AVX1-LABEL: combine_vec_sdiv_by_pos0:167; AVX1: # %bb.0:168; AVX1-NEXT: vpsrld $2, %xmm0, %xmm0169; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0170; AVX1-NEXT: retq171;172; AVX2-LABEL: combine_vec_sdiv_by_pos0:173; AVX2: # %bb.0:174; AVX2-NEXT: vpsrld $2, %xmm0, %xmm0175; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [63,63,63,63]176; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0177; AVX2-NEXT: retq178;179; AVX512F-LABEL: combine_vec_sdiv_by_pos0:180; AVX512F: # %bb.0:181; AVX512F-NEXT: vpsrld $2, %xmm0, %xmm0182; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm1 = [63,63,63,63]183; AVX512F-NEXT: vpand %xmm1, %xmm0, %xmm0184; AVX512F-NEXT: retq185;186; AVX512BW-LABEL: combine_vec_sdiv_by_pos0:187; AVX512BW: # %bb.0:188; AVX512BW-NEXT: vpsrld $2, %xmm0, %xmm0189; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0190; AVX512BW-NEXT: retq191;192; XOP-LABEL: combine_vec_sdiv_by_pos0:193; XOP: # %bb.0:194; XOP-NEXT: vpsrld $2, %xmm0, %xmm0195; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0196; XOP-NEXT: retq197 %1 = and <4 x i32> %x, <i32 255, i32 255, i32 255, i32 255>198 %2 = sdiv <4 x i32> %1, <i32 4, i32 4, i32 4, i32 4>199 ret <4 x i32> %2200}201 202define <4 x i32> @combine_vec_sdiv_by_pos1(<4 x i32> %x) {203; SSE2-LABEL: combine_vec_sdiv_by_pos1:204; SSE2: # %bb.0:205; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0206; SSE2-NEXT: movdqa %xmm0, %xmm1207; SSE2-NEXT: psrld $4, %xmm1208; SSE2-NEXT: movdqa %xmm0, %xmm2209; SSE2-NEXT: psrld $3, %xmm2210; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]211; SSE2-NEXT: movdqa %xmm0, %xmm1212; SSE2-NEXT: psrld $2, %xmm1213; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]214; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]215; SSE2-NEXT: retq216;217; SSE41-LABEL: combine_vec_sdiv_by_pos1:218; SSE41: # %bb.0:219; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0220; SSE41-NEXT: movdqa %xmm0, %xmm1221; SSE41-NEXT: psrld $4, %xmm1222; SSE41-NEXT: movdqa %xmm0, %xmm2223; SSE41-NEXT: psrld $2, %xmm2224; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]225; SSE41-NEXT: movdqa %xmm0, %xmm1226; SSE41-NEXT: psrld $3, %xmm1227; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]228; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]229; SSE41-NEXT: retq230;231; AVX1-LABEL: combine_vec_sdiv_by_pos1:232; AVX1: # %bb.0:233; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0234; AVX1-NEXT: vpsrld $4, %xmm0, %xmm1235; AVX1-NEXT: vpsrld $2, %xmm0, %xmm2236; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]237; AVX1-NEXT: vpsrld $3, %xmm0, %xmm2238; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]239; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]240; AVX1-NEXT: retq241;242; AVX2-LABEL: combine_vec_sdiv_by_pos1:243; AVX2: # %bb.0:244; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0245; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0246; AVX2-NEXT: retq247;248; AVX512F-LABEL: combine_vec_sdiv_by_pos1:249; AVX512F: # %bb.0:250; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0251; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0252; AVX512F-NEXT: retq253;254; AVX512BW-LABEL: combine_vec_sdiv_by_pos1:255; AVX512BW: # %bb.0:256; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0257; AVX512BW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0258; AVX512BW-NEXT: retq259;260; XOP-LABEL: combine_vec_sdiv_by_pos1:261; XOP: # %bb.0:262; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0263; XOP-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0264; XOP-NEXT: retq265 %1 = and <4 x i32> %x, <i32 255, i32 255, i32 255, i32 255>266 %2 = sdiv <4 x i32> %1, <i32 1, i32 4, i32 8, i32 16>267 ret <4 x i32> %2268}269 270; fold (sdiv x, (1 << c)) -> x >>u c271define <4 x i32> @combine_vec_sdiv_by_pow2a(<4 x i32> %x) {272; SSE-LABEL: combine_vec_sdiv_by_pow2a:273; SSE: # %bb.0:274; SSE-NEXT: movdqa %xmm0, %xmm1275; SSE-NEXT: psrad $31, %xmm1276; SSE-NEXT: psrld $30, %xmm1277; SSE-NEXT: paddd %xmm1, %xmm0278; SSE-NEXT: psrad $2, %xmm0279; SSE-NEXT: retq280;281; AVX-LABEL: combine_vec_sdiv_by_pow2a:282; AVX: # %bb.0:283; AVX-NEXT: vpsrad $31, %xmm0, %xmm1284; AVX-NEXT: vpsrld $30, %xmm1, %xmm1285; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0286; AVX-NEXT: vpsrad $2, %xmm0, %xmm0287; AVX-NEXT: retq288 %1 = sdiv <4 x i32> %x, <i32 4, i32 4, i32 4, i32 4>289 ret <4 x i32> %1290}291 292define <4 x i32> @combine_vec_sdiv_by_pow2a_neg(<4 x i32> %x) {293; SSE-LABEL: combine_vec_sdiv_by_pow2a_neg:294; SSE: # %bb.0:295; SSE-NEXT: movdqa %xmm0, %xmm1296; SSE-NEXT: psrad $31, %xmm1297; SSE-NEXT: psrld $30, %xmm1298; SSE-NEXT: paddd %xmm0, %xmm1299; SSE-NEXT: psrad $2, %xmm1300; SSE-NEXT: pxor %xmm0, %xmm0301; SSE-NEXT: psubd %xmm1, %xmm0302; SSE-NEXT: retq303;304; AVX-LABEL: combine_vec_sdiv_by_pow2a_neg:305; AVX: # %bb.0:306; AVX-NEXT: vpsrad $31, %xmm0, %xmm1307; AVX-NEXT: vpsrld $30, %xmm1, %xmm1308; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0309; AVX-NEXT: vpsrad $2, %xmm0, %xmm0310; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1311; AVX-NEXT: vpsubd %xmm0, %xmm1, %xmm0312; AVX-NEXT: retq313 %1 = sdiv <4 x i32> %x, <i32 -4, i32 -4, i32 -4, i32 -4>314 ret <4 x i32> %1315}316 317define <16 x i8> @combine_vec_sdiv_by_pow2b_v16i8(<16 x i8> %x) {318; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v16i8:319; SSE2: # %bb.0:320; SSE2-NEXT: pxor %xmm1, %xmm1321; SSE2-NEXT: pxor %xmm2, %xmm2322; SSE2-NEXT: pcmpgtb %xmm0, %xmm2323; SSE2-NEXT: movdqa %xmm2, %xmm3324; 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]325; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [256,4,2,16,8,32,64,2]326; SSE2-NEXT: pmullw %xmm4, %xmm3327; SSE2-NEXT: psrlw $8, %xmm3328; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]329; SSE2-NEXT: pmullw %xmm4, %xmm2330; SSE2-NEXT: psrlw $8, %xmm2331; SSE2-NEXT: packuswb %xmm3, %xmm2332; SSE2-NEXT: paddb %xmm0, %xmm2333; SSE2-NEXT: movdqa %xmm2, %xmm1334; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = 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]335; SSE2-NEXT: psraw $8, %xmm1336; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [256,64,128,16,32,8,4,128]337; SSE2-NEXT: pmullw %xmm3, %xmm1338; SSE2-NEXT: psrlw $8, %xmm1339; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]340; SSE2-NEXT: psraw $8, %xmm2341; SSE2-NEXT: pmullw %xmm3, %xmm2342; SSE2-NEXT: psrlw $8, %xmm2343; SSE2-NEXT: packuswb %xmm1, %xmm2344; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]345; SSE2-NEXT: pand %xmm1, %xmm2346; SSE2-NEXT: pandn %xmm0, %xmm1347; SSE2-NEXT: por %xmm2, %xmm1348; SSE2-NEXT: movdqa %xmm1, %xmm0349; SSE2-NEXT: retq350;351; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v16i8:352; SSE41: # %bb.0:353; SSE41-NEXT: movdqa %xmm0, %xmm1354; SSE41-NEXT: pxor %xmm0, %xmm0355; SSE41-NEXT: pxor %xmm3, %xmm3356; SSE41-NEXT: pcmpgtb %xmm1, %xmm3357; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero358; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]359; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [256,4,2,16,8,32,64,2]360; SSE41-NEXT: pmullw %xmm0, %xmm3361; SSE41-NEXT: psrlw $8, %xmm3362; SSE41-NEXT: pmullw %xmm0, %xmm2363; SSE41-NEXT: psrlw $8, %xmm2364; SSE41-NEXT: packuswb %xmm3, %xmm2365; SSE41-NEXT: paddb %xmm1, %xmm2366; SSE41-NEXT: movdqa %xmm2, %xmm0367; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]368; SSE41-NEXT: psraw $8, %xmm0369; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [256,64,128,16,32,8,4,128]370; SSE41-NEXT: pmullw %xmm3, %xmm0371; SSE41-NEXT: psrlw $8, %xmm0372; SSE41-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]373; SSE41-NEXT: psraw $8, %xmm2374; SSE41-NEXT: pmullw %xmm3, %xmm2375; SSE41-NEXT: psrlw $8, %xmm2376; SSE41-NEXT: packuswb %xmm0, %xmm2377; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]378; SSE41-NEXT: pblendvb %xmm0, %xmm2, %xmm1379; SSE41-NEXT: movdqa %xmm1, %xmm0380; SSE41-NEXT: retq381;382; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v16i8:383; AVX1: # %bb.0:384; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1385; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm2386; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]387; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [256,4,2,16,8,32,64,2]388; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1389; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1390; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero391; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2392; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2393; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm1394; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm1395; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]396; AVX1-NEXT: vpsraw $8, %xmm2, %xmm2397; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [256,64,128,16,32,8,4,128]398; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2399; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2400; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]401; AVX1-NEXT: vpsraw $8, %xmm1, %xmm1402; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1403; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1404; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1405; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm2 = [18446744073709551360,18446744073709551360]406; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0407; AVX1-NEXT: retq408;409; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v16i8:410; AVX2: # %bb.0:411; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1412; AVX2-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1413; AVX2-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],zero414; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [256,4,2,16,8,32,64,2,256,4,2,16,8,32,64,2]415; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm1416; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2417; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1418; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm1419; AVX2-NEXT: vpmovsxbw %xmm1, %ymm1420; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [256,64,128,16,32,8,4,128,256,64,128,16,32,8,4,128]421; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm1422; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2423; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1424; AVX2-NEXT: vpmovsxwq {{.*#+}} xmm2 = [18446744073709551360,18446744073709551360]425; AVX2-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0426; AVX2-NEXT: vzeroupper427; AVX2-NEXT: retq428;429; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v16i8:430; AVX512F: # %bb.0:431; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1432; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1433; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero434; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1435; AVX512F-NEXT: vpmovdb %zmm1, %xmm1436; AVX512F-NEXT: vpaddb %xmm1, %xmm0, %xmm1437; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1438; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1439; AVX512F-NEXT: vpmovdb %zmm1, %xmm1440; AVX512F-NEXT: vpmovsxwq {{.*#+}} xmm2 = [18446744073709551360,18446744073709551360]441; AVX512F-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0442; AVX512F-NEXT: vzeroupper443; AVX512F-NEXT: retq444;445; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v16i8:446; AVX512BW: # %bb.0:447; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1448; AVX512BW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1449; 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],zero450; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1451; AVX512BW-NEXT: vpmovwb %ymm1, %xmm1452; AVX512BW-NEXT: vpaddb %xmm1, %xmm0, %xmm1453; AVX512BW-NEXT: vpmovsxbw %xmm1, %ymm1454; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1455; AVX512BW-NEXT: vpmovwb %ymm1, %xmm1456; AVX512BW-NEXT: movw $257, %ax # imm = 0x101457; AVX512BW-NEXT: kmovd %eax, %k1458; AVX512BW-NEXT: vmovdqu8 %xmm0, %xmm1 {%k1}459; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0460; AVX512BW-NEXT: vzeroupper461; AVX512BW-NEXT: retq462;463; XOP-LABEL: combine_vec_sdiv_by_pow2b_v16i8:464; XOP: # %bb.0:465; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1466; XOP-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm1467; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1468; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm1469; XOP-NEXT: vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1470; XOP-NEXT: vpmovsxwq {{.*#+}} xmm2 = [18446744073709551360,18446744073709551360]471; XOP-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0472; XOP-NEXT: retq473 %1 = sdiv <16 x i8> %x, <i8 1, i8 4, i8 2, i8 16, i8 8, i8 32, i8 64, i8 2, i8 1, i8 4, i8 2, i8 16, i8 8, i8 32, i8 64, i8 2>474 ret <16 x i8> %1475}476 477define <8 x i16> @combine_vec_sdiv_by_pow2b_v8i16(<8 x i16> %x) {478; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v8i16:479; SSE2: # %bb.0:480; SSE2-NEXT: movdqa %xmm0, %xmm1481; SSE2-NEXT: psraw $15, %xmm1482; SSE2-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [u,4,2,16,8,32,64,2]483; SSE2-NEXT: paddw %xmm0, %xmm1484; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,0,65535,0,0,65535]485; SSE2-NEXT: movdqa %xmm1, %xmm3486; SSE2-NEXT: pand %xmm2, %xmm3487; SSE2-NEXT: psraw $4, %xmm1488; SSE2-NEXT: pandn %xmm1, %xmm2489; SSE2-NEXT: por %xmm3, %xmm2490; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,0,65535,65535,0,65535,0,65535]491; SSE2-NEXT: movdqa %xmm2, %xmm3492; SSE2-NEXT: pand %xmm1, %xmm3493; SSE2-NEXT: psraw $2, %xmm2494; SSE2-NEXT: pandn %xmm2, %xmm1495; SSE2-NEXT: por %xmm3, %xmm1496; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,0,65535,0,0,65535,0]497; SSE2-NEXT: movdqa %xmm1, %xmm3498; SSE2-NEXT: pand %xmm2, %xmm3499; SSE2-NEXT: psraw $1, %xmm1500; SSE2-NEXT: pandn %xmm1, %xmm2501; SSE2-NEXT: por %xmm3, %xmm2502; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]503; SSE2-NEXT: pand %xmm1, %xmm2504; SSE2-NEXT: pandn %xmm0, %xmm1505; SSE2-NEXT: por %xmm2, %xmm1506; SSE2-NEXT: movdqa %xmm1, %xmm0507; SSE2-NEXT: retq508;509; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v8i16:510; SSE41: # %bb.0:511; SSE41-NEXT: movdqa %xmm0, %xmm1512; SSE41-NEXT: psraw $15, %xmm1513; SSE41-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [u,4,2,16,8,32,64,2]514; SSE41-NEXT: paddw %xmm0, %xmm1515; SSE41-NEXT: movdqa %xmm1, %xmm2516; SSE41-NEXT: psraw $1, %xmm2517; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [u,16384,u,4096,8192,2048,1024,u]518; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2],xmm1[3,4,5,6],xmm2[7]519; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]520; SSE41-NEXT: retq521;522; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v8i16:523; AVX1: # %bb.0:524; AVX1-NEXT: vpsraw $15, %xmm0, %xmm1525; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [u,4,2,16,8,32,64,2]526; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1527; AVX1-NEXT: vpsraw $1, %xmm1, %xmm2528; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [u,16384,u,4096,8192,2048,1024,u]529; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2],xmm1[3,4,5,6],xmm2[7]530; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]531; AVX1-NEXT: retq532;533; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v8i16:534; AVX2: # %bb.0:535; AVX2-NEXT: vpsraw $15, %xmm0, %xmm1536; AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [u,4,2,16,8,32,64,2]537; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1538; AVX2-NEXT: vpsraw $1, %xmm1, %xmm2539; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [u,16384,u,4096,8192,2048,1024,u]540; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2],xmm1[3,4,5,6],xmm2[7]541; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]542; AVX2-NEXT: retq543;544; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v8i16:545; AVX512F: # %bb.0:546; AVX512F-NEXT: vpsraw $15, %xmm0, %xmm1547; AVX512F-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [u,4,2,16,8,32,64,2]548; AVX512F-NEXT: vpaddw %xmm1, %xmm0, %xmm1549; AVX512F-NEXT: vpmovsxwd %xmm1, %ymm1550; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1551; AVX512F-NEXT: vpmovdw %zmm1, %ymm1552; AVX512F-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]553; AVX512F-NEXT: vzeroupper554; AVX512F-NEXT: retq555;556; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v8i16:557; AVX512BW: # %bb.0:558; AVX512BW-NEXT: vpsraw $15, %xmm0, %xmm1559; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1560; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm1561; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1562; AVX512BW-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]563; AVX512BW-NEXT: retq564;565; XOP-LABEL: combine_vec_sdiv_by_pow2b_v8i16:566; XOP: # %bb.0:567; XOP-NEXT: vpsraw $15, %xmm0, %xmm1568; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1569; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm1570; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1571; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]572; XOP-NEXT: retq573 %1 = sdiv <8 x i16> %x, <i16 1, i16 4, i16 2, i16 16, i16 8, i16 32, i16 64, i16 2>574 ret <8 x i16> %1575}576 577define <16 x i16> @combine_vec_sdiv_by_pow2b_v16i16(<16 x i16> %x) {578; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v16i16:579; SSE2: # %bb.0:580; SSE2-NEXT: movdqa %xmm0, %xmm3581; SSE2-NEXT: psraw $15, %xmm0582; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [u,4,2,16,8,32,64,2]583; SSE2-NEXT: pmulhuw %xmm7, %xmm0584; SSE2-NEXT: paddw %xmm3, %xmm0585; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,65535,0,65535,0,0,65535]586; SSE2-NEXT: movdqa %xmm0, %xmm2587; SSE2-NEXT: pand %xmm4, %xmm2588; SSE2-NEXT: psraw $4, %xmm0589; SSE2-NEXT: movdqa %xmm4, %xmm6590; SSE2-NEXT: pandn %xmm0, %xmm6591; SSE2-NEXT: por %xmm2, %xmm6592; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [65535,0,65535,65535,0,65535,0,65535]593; SSE2-NEXT: movdqa %xmm6, %xmm0594; SSE2-NEXT: pand %xmm5, %xmm0595; SSE2-NEXT: psraw $2, %xmm6596; SSE2-NEXT: movdqa %xmm5, %xmm2597; SSE2-NEXT: pandn %xmm6, %xmm2598; SSE2-NEXT: por %xmm0, %xmm2599; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [65535,65535,0,65535,0,0,65535,0]600; SSE2-NEXT: movdqa %xmm2, %xmm0601; SSE2-NEXT: pand %xmm6, %xmm0602; SSE2-NEXT: psraw $1, %xmm2603; SSE2-NEXT: movdqa %xmm6, %xmm8604; SSE2-NEXT: pandn %xmm2, %xmm8605; SSE2-NEXT: por %xmm0, %xmm8606; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [0,65535,65535,65535,65535,65535,65535,65535]607; SSE2-NEXT: pand %xmm2, %xmm8608; SSE2-NEXT: movdqa %xmm2, %xmm0609; SSE2-NEXT: pandn %xmm3, %xmm0610; SSE2-NEXT: por %xmm8, %xmm0611; SSE2-NEXT: movdqa %xmm1, %xmm3612; SSE2-NEXT: psraw $15, %xmm3613; SSE2-NEXT: pmulhuw %xmm7, %xmm3614; SSE2-NEXT: paddw %xmm1, %xmm3615; SSE2-NEXT: movdqa %xmm3, %xmm7616; SSE2-NEXT: pand %xmm4, %xmm7617; SSE2-NEXT: psraw $4, %xmm3618; SSE2-NEXT: pandn %xmm3, %xmm4619; SSE2-NEXT: por %xmm7, %xmm4620; SSE2-NEXT: movdqa %xmm4, %xmm3621; SSE2-NEXT: pand %xmm5, %xmm3622; SSE2-NEXT: psraw $2, %xmm4623; SSE2-NEXT: pandn %xmm4, %xmm5624; SSE2-NEXT: por %xmm3, %xmm5625; SSE2-NEXT: movdqa %xmm5, %xmm3626; SSE2-NEXT: pand %xmm6, %xmm3627; SSE2-NEXT: psraw $1, %xmm5628; SSE2-NEXT: pandn %xmm5, %xmm6629; SSE2-NEXT: por %xmm3, %xmm6630; SSE2-NEXT: pand %xmm2, %xmm6631; SSE2-NEXT: pandn %xmm1, %xmm2632; SSE2-NEXT: por %xmm6, %xmm2633; SSE2-NEXT: movdqa %xmm2, %xmm1634; SSE2-NEXT: retq635;636; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v16i16:637; SSE41: # %bb.0:638; SSE41-NEXT: movdqa %xmm0, %xmm2639; SSE41-NEXT: psraw $15, %xmm2640; SSE41-NEXT: pmovsxbw {{.*#+}} xmm3 = [0,4,2,16,8,32,64,2]641; SSE41-NEXT: pmulhuw %xmm3, %xmm2642; SSE41-NEXT: paddw %xmm0, %xmm2643; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [u,16384,32768,4096,8192,2048,1024,32768]644; SSE41-NEXT: movdqa %xmm2, %xmm5645; SSE41-NEXT: pmulhw %xmm4, %xmm5646; SSE41-NEXT: psraw $1, %xmm2647; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm5[0,1],xmm2[2],xmm5[3,4,5,6],xmm2[7]648; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3,4,5,6,7]649; SSE41-NEXT: movdqa %xmm1, %xmm2650; SSE41-NEXT: psraw $15, %xmm2651; SSE41-NEXT: pmulhuw %xmm3, %xmm2652; SSE41-NEXT: paddw %xmm1, %xmm2653; SSE41-NEXT: pmulhw %xmm2, %xmm4654; SSE41-NEXT: psraw $1, %xmm2655; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2],xmm4[3,4,5,6],xmm2[7]656; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]657; SSE41-NEXT: retq658;659; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v16i16:660; AVX1: # %bb.0:661; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1662; AVX1-NEXT: vpsraw $15, %xmm1, %xmm2663; AVX1-NEXT: vpmovsxbw {{.*#+}} xmm3 = [0,4,2,16,8,32,64,2]664; AVX1-NEXT: vpmulhuw %xmm3, %xmm2, %xmm2665; AVX1-NEXT: vpaddw %xmm2, %xmm1, %xmm1666; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [u,16384,32768,4096,8192,2048,1024,32768]667; AVX1-NEXT: vpmulhw %xmm2, %xmm1, %xmm4668; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1669; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm4[0,1],xmm1[2],xmm4[3,4,5,6],xmm1[7]670; AVX1-NEXT: vpsraw $15, %xmm0, %xmm4671; AVX1-NEXT: vpmulhuw %xmm3, %xmm4, %xmm3672; AVX1-NEXT: vpaddw %xmm3, %xmm0, %xmm3673; AVX1-NEXT: vpmulhw %xmm2, %xmm3, %xmm2674; AVX1-NEXT: vpsraw $1, %xmm3, %xmm3675; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2],xmm2[3,4,5,6],xmm3[7]676; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1677; AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm2 = [0,65535,65535,65535,65535,65535,65535,65535,0,65535,65535,65535,65535,65535,65535,65535]678; AVX1-NEXT: # ymm2 = mem[0,1,0,1]679; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1680; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm0681; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm0682; AVX1-NEXT: retq683;684; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v16i16:685; AVX2: # %bb.0:686; AVX2-NEXT: vpsraw $15, %ymm0, %ymm1687; AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [u,4,2,16,8,32,64,2,u,4,2,16,8,32,64,2]688; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm1689; AVX2-NEXT: vpsraw $1, %ymm1, %ymm2690; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [u,16384,u,4096,8192,2048,1024,u,u,16384,u,4096,8192,2048,1024,u]691; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0,1],ymm2[2],ymm1[3,4,5,6],ymm2[7],ymm1[8,9],ymm2[10],ymm1[11,12,13,14],ymm2[15]692; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]693; AVX2-NEXT: retq694;695; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v16i16:696; AVX512F: # %bb.0:697; AVX512F-NEXT: vpsraw $15, %ymm0, %ymm1698; AVX512F-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [u,4,2,16,8,32,64,2,u,4,2,16,8,32,64,2]699; AVX512F-NEXT: vpaddw %ymm1, %ymm0, %ymm1700; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1701; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1702; AVX512F-NEXT: vpmovdw %zmm1, %ymm1703; AVX512F-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]704; AVX512F-NEXT: retq705;706; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v16i16:707; AVX512BW: # %bb.0:708; AVX512BW-NEXT: vpsraw $15, %ymm0, %ymm1709; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1710; AVX512BW-NEXT: vpaddw %ymm1, %ymm0, %ymm1711; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1712; AVX512BW-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]713; AVX512BW-NEXT: retq714;715; XOP-LABEL: combine_vec_sdiv_by_pow2b_v16i16:716; XOP: # %bb.0:717; XOP-NEXT: vextractf128 $1, %ymm0, %xmm1718; XOP-NEXT: vpsraw $15, %xmm1, %xmm2719; XOP-NEXT: vpmovsxbw {{.*#+}} xmm3 = [0,65522,65521,65524,65523,65525,65526,65521]720; XOP-NEXT: vpshlw %xmm3, %xmm2, %xmm2721; XOP-NEXT: vpaddw %xmm2, %xmm1, %xmm1722; XOP-NEXT: vpmovsxbw {{.*#+}} xmm2 = [0,65534,65535,65532,65533,65531,65530,65535]723; XOP-NEXT: vpshaw %xmm2, %xmm1, %xmm1724; XOP-NEXT: vpsraw $15, %xmm0, %xmm4725; XOP-NEXT: vpshlw %xmm3, %xmm4, %xmm3726; XOP-NEXT: vpaddw %xmm3, %xmm0, %xmm3727; XOP-NEXT: vpshaw %xmm2, %xmm3, %xmm2728; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1729; XOP-NEXT: vbroadcastf128 {{.*#+}} ymm2 = [0,65535,65535,65535,65535,65535,65535,65535,0,65535,65535,65535,65535,65535,65535,65535]730; XOP-NEXT: # ymm2 = mem[0,1,0,1]731; XOP-NEXT: vpcmov %ymm2, %ymm0, %ymm1, %ymm0732; XOP-NEXT: retq733 %1 = sdiv <16 x i16> %x, <i16 1, i16 4, i16 2, i16 16, i16 8, i16 32, i16 64, i16 2, i16 1, i16 4, i16 2, i16 16, i16 8, i16 32, i16 64, i16 2>734 ret <16 x i16> %1735}736 737define <32 x i16> @combine_vec_sdiv_by_pow2b_v32i16(<32 x i16> %x) {738; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v32i16:739; SSE2: # %bb.0:740; SSE2-NEXT: movdqa %xmm1, %xmm5741; SSE2-NEXT: movdqa %xmm0, %xmm1742; SSE2-NEXT: psraw $15, %xmm0743; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [u,4,2,16,8,32,64,2]744; SSE2-NEXT: pmulhuw %xmm9, %xmm0745; SSE2-NEXT: paddw %xmm1, %xmm0746; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [65535,65535,65535,0,65535,0,0,65535]747; SSE2-NEXT: movdqa %xmm0, %xmm4748; SSE2-NEXT: pand %xmm6, %xmm4749; SSE2-NEXT: psraw $4, %xmm0750; SSE2-NEXT: movdqa %xmm6, %xmm8751; SSE2-NEXT: pandn %xmm0, %xmm8752; SSE2-NEXT: por %xmm4, %xmm8753; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [65535,0,65535,65535,0,65535,0,65535]754; SSE2-NEXT: movdqa %xmm8, %xmm0755; SSE2-NEXT: pand %xmm7, %xmm0756; SSE2-NEXT: psraw $2, %xmm8757; SSE2-NEXT: movdqa %xmm7, %xmm4758; SSE2-NEXT: pandn %xmm8, %xmm4759; SSE2-NEXT: por %xmm0, %xmm4760; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535,0,65535,0,0,65535,0]761; SSE2-NEXT: movdqa %xmm4, %xmm0762; SSE2-NEXT: pand %xmm8, %xmm0763; SSE2-NEXT: psraw $1, %xmm4764; SSE2-NEXT: movdqa %xmm8, %xmm10765; SSE2-NEXT: pandn %xmm4, %xmm10766; SSE2-NEXT: por %xmm0, %xmm10767; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [0,65535,65535,65535,65535,65535,65535,65535]768; SSE2-NEXT: pand %xmm4, %xmm10769; SSE2-NEXT: movdqa %xmm4, %xmm0770; SSE2-NEXT: pandn %xmm1, %xmm0771; SSE2-NEXT: por %xmm10, %xmm0772; SSE2-NEXT: movdqa %xmm5, %xmm1773; SSE2-NEXT: psraw $15, %xmm1774; SSE2-NEXT: pmulhuw %xmm9, %xmm1775; SSE2-NEXT: paddw %xmm5, %xmm1776; SSE2-NEXT: movdqa %xmm1, %xmm10777; SSE2-NEXT: pand %xmm6, %xmm10778; SSE2-NEXT: psraw $4, %xmm1779; SSE2-NEXT: movdqa %xmm6, %xmm11780; SSE2-NEXT: pandn %xmm1, %xmm11781; SSE2-NEXT: por %xmm10, %xmm11782; SSE2-NEXT: movdqa %xmm11, %xmm1783; SSE2-NEXT: pand %xmm7, %xmm1784; SSE2-NEXT: psraw $2, %xmm11785; SSE2-NEXT: movdqa %xmm7, %xmm10786; SSE2-NEXT: pandn %xmm11, %xmm10787; SSE2-NEXT: por %xmm1, %xmm10788; SSE2-NEXT: movdqa %xmm10, %xmm1789; SSE2-NEXT: pand %xmm8, %xmm1790; SSE2-NEXT: psraw $1, %xmm10791; SSE2-NEXT: movdqa %xmm8, %xmm11792; SSE2-NEXT: pandn %xmm10, %xmm11793; SSE2-NEXT: por %xmm1, %xmm11794; SSE2-NEXT: pand %xmm4, %xmm11795; SSE2-NEXT: movdqa %xmm4, %xmm1796; SSE2-NEXT: pandn %xmm5, %xmm1797; SSE2-NEXT: por %xmm11, %xmm1798; SSE2-NEXT: movdqa %xmm2, %xmm5799; SSE2-NEXT: psraw $15, %xmm5800; SSE2-NEXT: pmulhuw %xmm9, %xmm5801; SSE2-NEXT: paddw %xmm2, %xmm5802; SSE2-NEXT: movdqa %xmm5, %xmm10803; SSE2-NEXT: pand %xmm6, %xmm10804; SSE2-NEXT: psraw $4, %xmm5805; SSE2-NEXT: movdqa %xmm6, %xmm11806; SSE2-NEXT: pandn %xmm5, %xmm11807; SSE2-NEXT: por %xmm10, %xmm11808; SSE2-NEXT: movdqa %xmm11, %xmm5809; SSE2-NEXT: pand %xmm7, %xmm5810; SSE2-NEXT: psraw $2, %xmm11811; SSE2-NEXT: movdqa %xmm7, %xmm10812; SSE2-NEXT: pandn %xmm11, %xmm10813; SSE2-NEXT: por %xmm5, %xmm10814; SSE2-NEXT: movdqa %xmm10, %xmm5815; SSE2-NEXT: pand %xmm8, %xmm5816; SSE2-NEXT: psraw $1, %xmm10817; SSE2-NEXT: movdqa %xmm8, %xmm11818; SSE2-NEXT: pandn %xmm10, %xmm11819; SSE2-NEXT: por %xmm5, %xmm11820; SSE2-NEXT: pand %xmm4, %xmm11821; SSE2-NEXT: movdqa %xmm4, %xmm5822; SSE2-NEXT: pandn %xmm2, %xmm5823; SSE2-NEXT: por %xmm11, %xmm5824; SSE2-NEXT: movdqa %xmm3, %xmm2825; SSE2-NEXT: psraw $15, %xmm2826; SSE2-NEXT: pmulhuw %xmm9, %xmm2827; SSE2-NEXT: paddw %xmm3, %xmm2828; SSE2-NEXT: movdqa %xmm2, %xmm9829; SSE2-NEXT: pand %xmm6, %xmm9830; SSE2-NEXT: psraw $4, %xmm2831; SSE2-NEXT: pandn %xmm2, %xmm6832; SSE2-NEXT: por %xmm9, %xmm6833; SSE2-NEXT: movdqa %xmm6, %xmm2834; SSE2-NEXT: pand %xmm7, %xmm2835; SSE2-NEXT: psraw $2, %xmm6836; SSE2-NEXT: pandn %xmm6, %xmm7837; SSE2-NEXT: por %xmm2, %xmm7838; SSE2-NEXT: movdqa %xmm7, %xmm2839; SSE2-NEXT: pand %xmm8, %xmm2840; SSE2-NEXT: psraw $1, %xmm7841; SSE2-NEXT: pandn %xmm7, %xmm8842; SSE2-NEXT: por %xmm2, %xmm8843; SSE2-NEXT: pand %xmm4, %xmm8844; SSE2-NEXT: pandn %xmm3, %xmm4845; SSE2-NEXT: por %xmm8, %xmm4846; SSE2-NEXT: movdqa %xmm5, %xmm2847; SSE2-NEXT: movdqa %xmm4, %xmm3848; SSE2-NEXT: retq849;850; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v32i16:851; SSE41: # %bb.0:852; SSE41-NEXT: movdqa %xmm0, %xmm6853; SSE41-NEXT: psraw $15, %xmm6854; SSE41-NEXT: pmovsxbw {{.*#+}} xmm5 = [0,4,2,16,8,32,64,2]855; SSE41-NEXT: pmulhuw %xmm5, %xmm6856; SSE41-NEXT: paddw %xmm0, %xmm6857; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [u,16384,32768,4096,8192,2048,1024,32768]858; SSE41-NEXT: movdqa %xmm6, %xmm7859; SSE41-NEXT: pmulhw %xmm4, %xmm7860; SSE41-NEXT: psraw $1, %xmm6861; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm7[0,1],xmm6[2],xmm7[3,4,5,6],xmm6[7]862; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm6[1,2,3,4,5,6,7]863; SSE41-NEXT: movdqa %xmm1, %xmm6864; SSE41-NEXT: psraw $15, %xmm6865; SSE41-NEXT: pmulhuw %xmm5, %xmm6866; SSE41-NEXT: paddw %xmm1, %xmm6867; SSE41-NEXT: movdqa %xmm6, %xmm7868; SSE41-NEXT: pmulhw %xmm4, %xmm7869; SSE41-NEXT: psraw $1, %xmm6870; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm7[0,1],xmm6[2],xmm7[3,4,5,6],xmm6[7]871; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm6[1,2,3,4,5,6,7]872; SSE41-NEXT: movdqa %xmm2, %xmm6873; SSE41-NEXT: psraw $15, %xmm6874; SSE41-NEXT: pmulhuw %xmm5, %xmm6875; SSE41-NEXT: paddw %xmm2, %xmm6876; SSE41-NEXT: movdqa %xmm6, %xmm7877; SSE41-NEXT: pmulhw %xmm4, %xmm7878; SSE41-NEXT: psraw $1, %xmm6879; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm7[0,1],xmm6[2],xmm7[3,4,5,6],xmm6[7]880; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm6[1,2,3,4,5,6,7]881; SSE41-NEXT: movdqa %xmm3, %xmm6882; SSE41-NEXT: psraw $15, %xmm6883; SSE41-NEXT: pmulhuw %xmm5, %xmm6884; SSE41-NEXT: paddw %xmm3, %xmm6885; SSE41-NEXT: pmulhw %xmm6, %xmm4886; SSE41-NEXT: psraw $1, %xmm6887; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm4[0,1],xmm6[2],xmm4[3,4,5,6],xmm6[7]888; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm6[1,2,3,4,5,6,7]889; SSE41-NEXT: retq890;891; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v32i16:892; AVX1: # %bb.0:893; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2894; AVX1-NEXT: vpsraw $15, %xmm2, %xmm3895; AVX1-NEXT: vpmovsxbw {{.*#+}} xmm4 = [0,4,2,16,8,32,64,2]896; AVX1-NEXT: vpmulhuw %xmm4, %xmm3, %xmm3897; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm2898; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [u,16384,32768,4096,8192,2048,1024,32768]899; AVX1-NEXT: vpmulhw %xmm3, %xmm2, %xmm5900; AVX1-NEXT: vpsraw $1, %xmm2, %xmm2901; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm5[0,1],xmm2[2],xmm5[3,4,5,6],xmm2[7]902; AVX1-NEXT: vpsraw $15, %xmm0, %xmm5903; AVX1-NEXT: vpmulhuw %xmm4, %xmm5, %xmm5904; AVX1-NEXT: vpaddw %xmm5, %xmm0, %xmm5905; AVX1-NEXT: vpmulhw %xmm3, %xmm5, %xmm6906; AVX1-NEXT: vpsraw $1, %xmm5, %xmm5907; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2],xmm6[3,4,5,6],xmm5[7]908; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm5, %ymm2909; AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm5 = [0,65535,65535,65535,65535,65535,65535,65535,0,65535,65535,65535,65535,65535,65535,65535]910; AVX1-NEXT: # ymm5 = mem[0,1,0,1]911; AVX1-NEXT: vandps %ymm5, %ymm2, %ymm2912; AVX1-NEXT: vandnps %ymm0, %ymm5, %ymm0913; AVX1-NEXT: vorps %ymm0, %ymm2, %ymm0914; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2915; AVX1-NEXT: vpsraw $15, %xmm2, %xmm6916; AVX1-NEXT: vpmulhuw %xmm4, %xmm6, %xmm6917; AVX1-NEXT: vpaddw %xmm6, %xmm2, %xmm2918; AVX1-NEXT: vpmulhw %xmm3, %xmm2, %xmm6919; AVX1-NEXT: vpsraw $1, %xmm2, %xmm2920; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm6[0,1],xmm2[2],xmm6[3,4,5,6],xmm2[7]921; AVX1-NEXT: vpsraw $15, %xmm1, %xmm6922; AVX1-NEXT: vpmulhuw %xmm4, %xmm6, %xmm4923; AVX1-NEXT: vpaddw %xmm4, %xmm1, %xmm4924; AVX1-NEXT: vpmulhw %xmm3, %xmm4, %xmm3925; AVX1-NEXT: vpsraw $1, %xmm4, %xmm4926; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2],xmm3[3,4,5,6],xmm4[7]927; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2928; AVX1-NEXT: vandps %ymm5, %ymm2, %ymm2929; AVX1-NEXT: vandnps %ymm1, %ymm5, %ymm1930; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1931; AVX1-NEXT: retq932;933; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v32i16:934; AVX2: # %bb.0:935; AVX2-NEXT: vpsraw $15, %ymm0, %ymm2936; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,4,2,16,8,32,64,2,0,4,2,16,8,32,64,2]937; AVX2-NEXT: # ymm3 = mem[0,1,0,1]938; AVX2-NEXT: vpmulhuw %ymm3, %ymm2, %ymm2939; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm2940; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,16384,32768,4096,8192,2048,1024,32768,0,16384,32768,4096,8192,2048,1024,32768]941; AVX2-NEXT: # ymm4 = mem[0,1,0,1]942; AVX2-NEXT: vpmulhw %ymm4, %ymm2, %ymm5943; AVX2-NEXT: vpsraw $1, %ymm2, %ymm2944; AVX2-NEXT: vpblendw {{.*#+}} ymm2 = ymm5[0,1],ymm2[2],ymm5[3,4,5,6],ymm2[7],ymm5[8,9],ymm2[10],ymm5[11,12,13,14],ymm2[15]945; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3,4,5,6,7],ymm0[8],ymm2[9,10,11,12,13,14,15]946; AVX2-NEXT: vpsraw $15, %ymm1, %ymm2947; AVX2-NEXT: vpmulhuw %ymm3, %ymm2, %ymm2948; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm2949; AVX2-NEXT: vpmulhw %ymm4, %ymm2, %ymm3950; AVX2-NEXT: vpsraw $1, %ymm2, %ymm2951; AVX2-NEXT: vpblendw {{.*#+}} ymm2 = ymm3[0,1],ymm2[2],ymm3[3,4,5,6],ymm2[7],ymm3[8,9],ymm2[10],ymm3[11,12,13,14],ymm2[15]952; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3,4,5,6,7],ymm1[8],ymm2[9,10,11,12,13,14,15]953; AVX2-NEXT: retq954;955; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v32i16:956; AVX512F: # %bb.0:957; AVX512F-NEXT: vpsraw $15, %ymm0, %ymm1958; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [0,4,2,16,8,32,64,2,0,4,2,16,8,32,64,2]959; AVX512F-NEXT: # ymm2 = mem[0,1,0,1]960; AVX512F-NEXT: vpmulhuw %ymm2, %ymm1, %ymm1961; AVX512F-NEXT: vpaddw %ymm1, %ymm0, %ymm1962; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1963; AVX512F-NEXT: vbroadcasti64x4 {{.*#+}} zmm3 = [0,2,1,4,3,5,6,1,0,2,1,4,3,5,6,1]964; AVX512F-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3]965; AVX512F-NEXT: vpsravd %zmm3, %zmm1, %zmm1966; AVX512F-NEXT: vpmovdw %zmm1, %ymm1967; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm4968; AVX512F-NEXT: vpsraw $15, %ymm4, %ymm5969; AVX512F-NEXT: vpmulhuw %ymm2, %ymm5, %ymm2970; AVX512F-NEXT: vpaddw %ymm2, %ymm4, %ymm2971; AVX512F-NEXT: vpmovsxwd %ymm2, %zmm2972; AVX512F-NEXT: vpsravd %zmm3, %zmm2, %zmm2973; AVX512F-NEXT: vpmovdw %zmm2, %ymm2974; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm1, %zmm1975; AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} zmm2 = [0,65535,65535,65535,65535,65535,65535,65535,0,65535,65535,65535,65535,65535,65535,65535,0,65535,65535,65535,65535,65535,65535,65535,0,65535,65535,65535,65535,65535,65535,65535]976; AVX512F-NEXT: # zmm2 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]977; AVX512F-NEXT: vpternlogq {{.*#+}} zmm0 = zmm0 ^ (zmm2 & (zmm0 ^ zmm1))978; AVX512F-NEXT: retq979;980; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v32i16:981; AVX512BW: # %bb.0:982; AVX512BW-NEXT: vpsraw $15, %zmm0, %zmm1983; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1984; AVX512BW-NEXT: vpaddw %zmm1, %zmm0, %zmm1985; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1986; AVX512BW-NEXT: movl $16843009, %eax # imm = 0x1010101987; AVX512BW-NEXT: kmovd %eax, %k1988; AVX512BW-NEXT: vmovdqu16 %zmm0, %zmm1 {%k1}989; AVX512BW-NEXT: vmovdqa64 %zmm1, %zmm0990; AVX512BW-NEXT: retq991;992; XOP-LABEL: combine_vec_sdiv_by_pow2b_v32i16:993; XOP: # %bb.0:994; XOP-NEXT: vextractf128 $1, %ymm0, %xmm2995; XOP-NEXT: vpsraw $15, %xmm2, %xmm3996; XOP-NEXT: vpmovsxbw {{.*#+}} xmm4 = [0,65522,65521,65524,65523,65525,65526,65521]997; XOP-NEXT: vpshlw %xmm4, %xmm3, %xmm3998; XOP-NEXT: vpaddw %xmm3, %xmm2, %xmm2999; XOP-NEXT: vpmovsxbw {{.*#+}} xmm3 = [0,65534,65535,65532,65533,65531,65530,65535]1000; XOP-NEXT: vpshaw %xmm3, %xmm2, %xmm21001; XOP-NEXT: vpsraw $15, %xmm0, %xmm51002; XOP-NEXT: vpshlw %xmm4, %xmm5, %xmm51003; XOP-NEXT: vpaddw %xmm5, %xmm0, %xmm51004; XOP-NEXT: vpshaw %xmm3, %xmm5, %xmm51005; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm5, %ymm21006; XOP-NEXT: vbroadcastf128 {{.*#+}} ymm5 = [0,65535,65535,65535,65535,65535,65535,65535,0,65535,65535,65535,65535,65535,65535,65535]1007; XOP-NEXT: # ymm5 = mem[0,1,0,1]1008; XOP-NEXT: vpcmov %ymm5, %ymm0, %ymm2, %ymm01009; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21010; XOP-NEXT: vpsraw $15, %xmm2, %xmm61011; XOP-NEXT: vpshlw %xmm4, %xmm6, %xmm61012; XOP-NEXT: vpaddw %xmm6, %xmm2, %xmm21013; XOP-NEXT: vpshaw %xmm3, %xmm2, %xmm21014; XOP-NEXT: vpsraw $15, %xmm1, %xmm61015; XOP-NEXT: vpshlw %xmm4, %xmm6, %xmm41016; XOP-NEXT: vpaddw %xmm4, %xmm1, %xmm41017; XOP-NEXT: vpshaw %xmm3, %xmm4, %xmm31018; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21019; XOP-NEXT: vpcmov %ymm5, %ymm1, %ymm2, %ymm11020; XOP-NEXT: retq1021 %1 = sdiv <32 x i16> %x, <i16 1, i16 4, i16 2, i16 16, i16 8, i16 32, i16 64, i16 2, i16 1, i16 4, i16 2, i16 16, i16 8, i16 32, i16 64, i16 2, i16 1, i16 4, i16 2, i16 16, i16 8, i16 32, i16 64, i16 2, i16 1, i16 4, i16 2, i16 16, i16 8, i16 32, i16 64, i16 2>1022 ret <32 x i16> %11023}1024 1025define <4 x i32> @combine_vec_sdiv_by_pow2b_v4i32(<4 x i32> %x) {1026; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v4i32:1027; SSE2: # %bb.0:1028; SSE2-NEXT: movdqa %xmm0, %xmm11029; SSE2-NEXT: psrad $31, %xmm11030; SSE2-NEXT: movdqa %xmm1, %xmm21031; SSE2-NEXT: psrld $28, %xmm21032; SSE2-NEXT: movdqa %xmm1, %xmm31033; SSE2-NEXT: psrld $29, %xmm31034; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]1035; SSE2-NEXT: psrld $30, %xmm11036; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,3]1037; SSE2-NEXT: paddd %xmm0, %xmm11038; SSE2-NEXT: movdqa %xmm1, %xmm21039; SSE2-NEXT: psrad $4, %xmm21040; SSE2-NEXT: movdqa %xmm1, %xmm31041; SSE2-NEXT: psrad $3, %xmm31042; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]1043; SSE2-NEXT: psrad $2, %xmm11044; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,3]1045; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]1046; SSE2-NEXT: movaps %xmm1, %xmm01047; SSE2-NEXT: retq1048;1049; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v4i32:1050; SSE41: # %bb.0:1051; SSE41-NEXT: movdqa %xmm0, %xmm11052; SSE41-NEXT: psrad $31, %xmm11053; SSE41-NEXT: movdqa %xmm1, %xmm21054; SSE41-NEXT: psrld $28, %xmm21055; SSE41-NEXT: movdqa %xmm1, %xmm31056; SSE41-NEXT: psrld $30, %xmm31057; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]1058; SSE41-NEXT: psrld $29, %xmm11059; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]1060; SSE41-NEXT: paddd %xmm0, %xmm11061; SSE41-NEXT: movdqa %xmm1, %xmm21062; SSE41-NEXT: psrad $4, %xmm21063; SSE41-NEXT: movdqa %xmm1, %xmm31064; SSE41-NEXT: psrad $2, %xmm31065; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]1066; SSE41-NEXT: psrad $3, %xmm11067; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]1068; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]1069; SSE41-NEXT: retq1070;1071; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v4i32:1072; AVX1: # %bb.0:1073; AVX1-NEXT: vpsrad $31, %xmm0, %xmm11074; AVX1-NEXT: vpsrld $28, %xmm1, %xmm21075; AVX1-NEXT: vpsrld $30, %xmm1, %xmm31076; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1077; AVX1-NEXT: vpsrld $29, %xmm1, %xmm11078; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]1079; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm11080; AVX1-NEXT: vpsrad $4, %xmm1, %xmm21081; AVX1-NEXT: vpsrad $2, %xmm1, %xmm31082; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1083; AVX1-NEXT: vpsrad $3, %xmm1, %xmm11084; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]1085; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]1086; AVX1-NEXT: retq1087;1088; AVX2ORLATER-LABEL: combine_vec_sdiv_by_pow2b_v4i32:1089; AVX2ORLATER: # %bb.0:1090; AVX2ORLATER-NEXT: vpsrad $31, %xmm0, %xmm11091; AVX2ORLATER-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11092; AVX2ORLATER-NEXT: vpaddd %xmm1, %xmm0, %xmm11093; AVX2ORLATER-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11094; AVX2ORLATER-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]1095; AVX2ORLATER-NEXT: retq1096;1097; XOP-LABEL: combine_vec_sdiv_by_pow2b_v4i32:1098; XOP: # %bb.0:1099; XOP-NEXT: vpsrad $31, %xmm0, %xmm11100; XOP-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11101; XOP-NEXT: vpaddd %xmm1, %xmm0, %xmm11102; XOP-NEXT: vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11103; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]1104; XOP-NEXT: retq1105 %1 = sdiv <4 x i32> %x, <i32 1, i32 4, i32 8, i32 16>1106 ret <4 x i32> %11107}1108 1109define <8 x i32> @combine_vec_sdiv_by_pow2b_v8i32(<8 x i32> %x) {1110; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v8i32:1111; SSE2: # %bb.0:1112; SSE2-NEXT: movdqa %xmm0, %xmm21113; SSE2-NEXT: psrad $31, %xmm01114; SSE2-NEXT: movdqa %xmm0, %xmm31115; SSE2-NEXT: psrld $28, %xmm31116; SSE2-NEXT: movdqa %xmm0, %xmm41117; SSE2-NEXT: psrld $29, %xmm41118; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm3[1]1119; SSE2-NEXT: psrld $30, %xmm01120; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm4[0,3]1121; SSE2-NEXT: paddd %xmm2, %xmm01122; SSE2-NEXT: movdqa %xmm0, %xmm31123; SSE2-NEXT: psrad $4, %xmm31124; SSE2-NEXT: movdqa %xmm0, %xmm41125; SSE2-NEXT: psrad $3, %xmm41126; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm3[1]1127; SSE2-NEXT: psrad $2, %xmm01128; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm4[0,3]1129; SSE2-NEXT: movss {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]1130; SSE2-NEXT: movdqa %xmm1, %xmm21131; SSE2-NEXT: psrad $31, %xmm21132; SSE2-NEXT: movdqa %xmm2, %xmm31133; SSE2-NEXT: psrld $28, %xmm31134; SSE2-NEXT: movdqa %xmm2, %xmm41135; SSE2-NEXT: psrld $29, %xmm41136; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm3[1]1137; SSE2-NEXT: psrld $30, %xmm21138; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0,3]1139; SSE2-NEXT: paddd %xmm1, %xmm21140; SSE2-NEXT: movdqa %xmm2, %xmm31141; SSE2-NEXT: psrad $4, %xmm31142; SSE2-NEXT: movdqa %xmm2, %xmm41143; SSE2-NEXT: psrad $3, %xmm41144; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm3[1]1145; SSE2-NEXT: psrad $2, %xmm21146; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0,3]1147; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1148; SSE2-NEXT: movaps %xmm2, %xmm11149; SSE2-NEXT: retq1150;1151; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v8i32:1152; SSE41: # %bb.0:1153; SSE41-NEXT: movdqa %xmm0, %xmm21154; SSE41-NEXT: psrad $31, %xmm21155; SSE41-NEXT: movdqa %xmm2, %xmm31156; SSE41-NEXT: psrld $28, %xmm31157; SSE41-NEXT: movdqa %xmm2, %xmm41158; SSE41-NEXT: psrld $30, %xmm41159; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]1160; SSE41-NEXT: psrld $29, %xmm21161; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]1162; SSE41-NEXT: paddd %xmm0, %xmm21163; SSE41-NEXT: movdqa %xmm2, %xmm31164; SSE41-NEXT: psrad $4, %xmm31165; SSE41-NEXT: movdqa %xmm2, %xmm41166; SSE41-NEXT: psrad $2, %xmm41167; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]1168; SSE41-NEXT: psrad $3, %xmm21169; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]1170; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]1171; SSE41-NEXT: movdqa %xmm1, %xmm21172; SSE41-NEXT: psrad $31, %xmm21173; SSE41-NEXT: movdqa %xmm2, %xmm31174; SSE41-NEXT: psrld $28, %xmm31175; SSE41-NEXT: movdqa %xmm2, %xmm41176; SSE41-NEXT: psrld $30, %xmm41177; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]1178; SSE41-NEXT: psrld $29, %xmm21179; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]1180; SSE41-NEXT: paddd %xmm1, %xmm21181; SSE41-NEXT: movdqa %xmm2, %xmm31182; SSE41-NEXT: psrad $4, %xmm31183; SSE41-NEXT: movdqa %xmm2, %xmm41184; SSE41-NEXT: psrad $2, %xmm41185; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm3[4,5,6,7]1186; SSE41-NEXT: psrad $3, %xmm21187; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]1188; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]1189; SSE41-NEXT: retq1190;1191; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v8i32:1192; AVX1: # %bb.0:1193; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11194; AVX1-NEXT: vpsrad $31, %xmm1, %xmm21195; AVX1-NEXT: vpsrld $28, %xmm2, %xmm31196; AVX1-NEXT: vpsrld $30, %xmm2, %xmm41197; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]1198; AVX1-NEXT: vpsrld $29, %xmm2, %xmm21199; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1200; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm11201; AVX1-NEXT: vpsrad $4, %xmm1, %xmm21202; AVX1-NEXT: vpsrad $2, %xmm1, %xmm31203; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1204; AVX1-NEXT: vpsrad $3, %xmm1, %xmm11205; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]1206; AVX1-NEXT: vpsrad $31, %xmm0, %xmm21207; AVX1-NEXT: vpsrld $28, %xmm2, %xmm31208; AVX1-NEXT: vpsrld $30, %xmm2, %xmm41209; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]1210; AVX1-NEXT: vpsrld $29, %xmm2, %xmm21211; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1212; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm21213; AVX1-NEXT: vpsrad $4, %xmm2, %xmm31214; AVX1-NEXT: vpsrad $2, %xmm2, %xmm41215; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]1216; AVX1-NEXT: vpsrad $3, %xmm2, %xmm21217; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1218; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11219; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]1220; AVX1-NEXT: retq1221;1222; AVX2ORLATER-LABEL: combine_vec_sdiv_by_pow2b_v8i32:1223; AVX2ORLATER: # %bb.0:1224; AVX2ORLATER-NEXT: vpsrad $31, %ymm0, %ymm11225; AVX2ORLATER-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11226; AVX2ORLATER-NEXT: vpaddd %ymm1, %ymm0, %ymm11227; AVX2ORLATER-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11228; AVX2ORLATER-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]1229; AVX2ORLATER-NEXT: retq1230;1231; XOP-LABEL: combine_vec_sdiv_by_pow2b_v8i32:1232; XOP: # %bb.0:1233; XOP-NEXT: vextractf128 $1, %ymm0, %xmm11234; XOP-NEXT: vpsrad $31, %xmm1, %xmm21235; XOP-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,4294967266,4294967267,4294967268]1236; XOP-NEXT: vpshld %xmm3, %xmm2, %xmm21237; XOP-NEXT: vpaddd %xmm2, %xmm1, %xmm11238; XOP-NEXT: vpmovsxbd {{.*#+}} xmm2 = [0,4294967294,4294967293,4294967292]1239; XOP-NEXT: vpshad %xmm2, %xmm1, %xmm11240; XOP-NEXT: vpsrad $31, %xmm0, %xmm41241; XOP-NEXT: vpshld %xmm3, %xmm4, %xmm31242; XOP-NEXT: vpaddd %xmm3, %xmm0, %xmm31243; XOP-NEXT: vpshad %xmm2, %xmm3, %xmm21244; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11245; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]1246; XOP-NEXT: retq1247 %1 = sdiv <8 x i32> %x, <i32 1, i32 4, i32 8, i32 16, i32 1, i32 4, i32 8, i32 16>1248 ret <8 x i32> %11249}1250 1251define <16 x i32> @combine_vec_sdiv_by_pow2b_v16i32(<16 x i32> %x) {1252; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v16i32:1253; SSE2: # %bb.0:1254; SSE2-NEXT: movdqa %xmm1, %xmm41255; SSE2-NEXT: movdqa %xmm0, %xmm11256; SSE2-NEXT: psrad $31, %xmm01257; SSE2-NEXT: movdqa %xmm0, %xmm51258; SSE2-NEXT: psrld $28, %xmm51259; SSE2-NEXT: movdqa %xmm0, %xmm61260; SSE2-NEXT: psrld $29, %xmm61261; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm5[1]1262; SSE2-NEXT: psrld $30, %xmm01263; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm6[0,3]1264; SSE2-NEXT: paddd %xmm1, %xmm01265; SSE2-NEXT: movdqa %xmm0, %xmm51266; SSE2-NEXT: psrad $4, %xmm51267; SSE2-NEXT: movdqa %xmm0, %xmm61268; SSE2-NEXT: psrad $3, %xmm61269; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm5[1]1270; SSE2-NEXT: psrad $2, %xmm01271; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm6[0,3]1272; SSE2-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]1273; SSE2-NEXT: movdqa %xmm4, %xmm11274; SSE2-NEXT: psrad $31, %xmm11275; SSE2-NEXT: movdqa %xmm1, %xmm51276; SSE2-NEXT: psrld $28, %xmm51277; SSE2-NEXT: movdqa %xmm1, %xmm61278; SSE2-NEXT: psrld $29, %xmm61279; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm5[1]1280; SSE2-NEXT: psrld $30, %xmm11281; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm6[0,3]1282; SSE2-NEXT: paddd %xmm4, %xmm11283; SSE2-NEXT: movdqa %xmm1, %xmm51284; SSE2-NEXT: psrad $4, %xmm51285; SSE2-NEXT: movdqa %xmm1, %xmm61286; SSE2-NEXT: psrad $3, %xmm61287; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm5[1]1288; SSE2-NEXT: psrad $2, %xmm11289; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm6[0,3]1290; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm4[0],xmm1[1,2,3]1291; SSE2-NEXT: movdqa %xmm2, %xmm41292; SSE2-NEXT: psrad $31, %xmm41293; SSE2-NEXT: movdqa %xmm4, %xmm51294; SSE2-NEXT: psrld $28, %xmm51295; SSE2-NEXT: movdqa %xmm4, %xmm61296; SSE2-NEXT: psrld $29, %xmm61297; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm5[1]1298; SSE2-NEXT: psrld $30, %xmm41299; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,1],xmm6[0,3]1300; SSE2-NEXT: paddd %xmm2, %xmm41301; SSE2-NEXT: movdqa %xmm4, %xmm51302; SSE2-NEXT: psrad $4, %xmm51303; SSE2-NEXT: movdqa %xmm4, %xmm61304; SSE2-NEXT: psrad $3, %xmm61305; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm5[1]1306; SSE2-NEXT: psrad $2, %xmm41307; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,1],xmm6[0,3]1308; SSE2-NEXT: movss {{.*#+}} xmm4 = xmm2[0],xmm4[1,2,3]1309; SSE2-NEXT: movdqa %xmm3, %xmm51310; SSE2-NEXT: psrad $31, %xmm51311; SSE2-NEXT: movdqa %xmm5, %xmm21312; SSE2-NEXT: psrld $28, %xmm21313; SSE2-NEXT: movdqa %xmm5, %xmm61314; SSE2-NEXT: psrld $29, %xmm61315; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm2[1]1316; SSE2-NEXT: psrld $30, %xmm51317; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,1],xmm6[0,3]1318; SSE2-NEXT: paddd %xmm3, %xmm51319; SSE2-NEXT: movdqa %xmm5, %xmm21320; SSE2-NEXT: psrad $4, %xmm21321; SSE2-NEXT: movdqa %xmm5, %xmm61322; SSE2-NEXT: psrad $3, %xmm61323; SSE2-NEXT: punpckhqdq {{.*#+}} xmm6 = xmm6[1],xmm2[1]1324; SSE2-NEXT: psrad $2, %xmm51325; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,1],xmm6[0,3]1326; SSE2-NEXT: movss {{.*#+}} xmm5 = xmm3[0],xmm5[1,2,3]1327; SSE2-NEXT: movaps %xmm4, %xmm21328; SSE2-NEXT: movaps %xmm5, %xmm31329; SSE2-NEXT: retq1330;1331; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v16i32:1332; SSE41: # %bb.0:1333; SSE41-NEXT: movdqa %xmm0, %xmm41334; SSE41-NEXT: psrad $31, %xmm41335; SSE41-NEXT: movdqa %xmm4, %xmm51336; SSE41-NEXT: psrld $28, %xmm51337; SSE41-NEXT: movdqa %xmm4, %xmm61338; SSE41-NEXT: psrld $30, %xmm61339; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1340; SSE41-NEXT: psrld $29, %xmm41341; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1342; SSE41-NEXT: paddd %xmm0, %xmm41343; SSE41-NEXT: movdqa %xmm4, %xmm51344; SSE41-NEXT: psrad $4, %xmm51345; SSE41-NEXT: movdqa %xmm4, %xmm61346; SSE41-NEXT: psrad $2, %xmm61347; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1348; SSE41-NEXT: psrad $3, %xmm41349; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1350; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3,4,5,6,7]1351; SSE41-NEXT: movdqa %xmm1, %xmm41352; SSE41-NEXT: psrad $31, %xmm41353; SSE41-NEXT: movdqa %xmm4, %xmm51354; SSE41-NEXT: psrld $28, %xmm51355; SSE41-NEXT: movdqa %xmm4, %xmm61356; SSE41-NEXT: psrld $30, %xmm61357; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1358; SSE41-NEXT: psrld $29, %xmm41359; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1360; SSE41-NEXT: paddd %xmm1, %xmm41361; SSE41-NEXT: movdqa %xmm4, %xmm51362; SSE41-NEXT: psrad $4, %xmm51363; SSE41-NEXT: movdqa %xmm4, %xmm61364; SSE41-NEXT: psrad $2, %xmm61365; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1366; SSE41-NEXT: psrad $3, %xmm41367; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1368; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm4[2,3,4,5,6,7]1369; SSE41-NEXT: movdqa %xmm2, %xmm41370; SSE41-NEXT: psrad $31, %xmm41371; SSE41-NEXT: movdqa %xmm4, %xmm51372; SSE41-NEXT: psrld $28, %xmm51373; SSE41-NEXT: movdqa %xmm4, %xmm61374; SSE41-NEXT: psrld $30, %xmm61375; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1376; SSE41-NEXT: psrld $29, %xmm41377; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1378; SSE41-NEXT: paddd %xmm2, %xmm41379; SSE41-NEXT: movdqa %xmm4, %xmm51380; SSE41-NEXT: psrad $4, %xmm51381; SSE41-NEXT: movdqa %xmm4, %xmm61382; SSE41-NEXT: psrad $2, %xmm61383; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1384; SSE41-NEXT: psrad $3, %xmm41385; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1386; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3,4,5,6,7]1387; SSE41-NEXT: movdqa %xmm3, %xmm41388; SSE41-NEXT: psrad $31, %xmm41389; SSE41-NEXT: movdqa %xmm4, %xmm51390; SSE41-NEXT: psrld $28, %xmm51391; SSE41-NEXT: movdqa %xmm4, %xmm61392; SSE41-NEXT: psrld $30, %xmm61393; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1394; SSE41-NEXT: psrld $29, %xmm41395; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1396; SSE41-NEXT: paddd %xmm3, %xmm41397; SSE41-NEXT: movdqa %xmm4, %xmm51398; SSE41-NEXT: psrad $4, %xmm51399; SSE41-NEXT: movdqa %xmm4, %xmm61400; SSE41-NEXT: psrad $2, %xmm61401; SSE41-NEXT: pblendw {{.*#+}} xmm6 = xmm6[0,1,2,3],xmm5[4,5,6,7]1402; SSE41-NEXT: psrad $3, %xmm41403; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm6[2,3],xmm4[4,5],xmm6[6,7]1404; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3,4,5,6,7]1405; SSE41-NEXT: retq1406;1407; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v16i32:1408; AVX1: # %bb.0:1409; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21410; AVX1-NEXT: vpsrad $31, %xmm2, %xmm31411; AVX1-NEXT: vpsrld $28, %xmm3, %xmm41412; AVX1-NEXT: vpsrld $30, %xmm3, %xmm51413; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]1414; AVX1-NEXT: vpsrld $29, %xmm3, %xmm31415; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]1416; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm21417; AVX1-NEXT: vpsrad $4, %xmm2, %xmm31418; AVX1-NEXT: vpsrad $2, %xmm2, %xmm41419; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]1420; AVX1-NEXT: vpsrad $3, %xmm2, %xmm21421; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1422; AVX1-NEXT: vpsrad $31, %xmm0, %xmm31423; AVX1-NEXT: vpsrld $28, %xmm3, %xmm41424; AVX1-NEXT: vpsrld $30, %xmm3, %xmm51425; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]1426; AVX1-NEXT: vpsrld $29, %xmm3, %xmm31427; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]1428; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm31429; AVX1-NEXT: vpsrad $4, %xmm3, %xmm41430; AVX1-NEXT: vpsrad $2, %xmm3, %xmm51431; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]1432; AVX1-NEXT: vpsrad $3, %xmm3, %xmm31433; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]1434; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21435; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3],ymm0[4],ymm2[5,6,7]1436; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21437; AVX1-NEXT: vpsrad $31, %xmm2, %xmm31438; AVX1-NEXT: vpsrld $28, %xmm3, %xmm41439; AVX1-NEXT: vpsrld $30, %xmm3, %xmm51440; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]1441; AVX1-NEXT: vpsrld $29, %xmm3, %xmm31442; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]1443; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm21444; AVX1-NEXT: vpsrad $4, %xmm2, %xmm31445; AVX1-NEXT: vpsrad $2, %xmm2, %xmm41446; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]1447; AVX1-NEXT: vpsrad $3, %xmm2, %xmm21448; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1449; AVX1-NEXT: vpsrad $31, %xmm1, %xmm31450; AVX1-NEXT: vpsrld $28, %xmm3, %xmm41451; AVX1-NEXT: vpsrld $30, %xmm3, %xmm51452; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]1453; AVX1-NEXT: vpsrld $29, %xmm3, %xmm31454; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]1455; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm31456; AVX1-NEXT: vpsrad $4, %xmm3, %xmm41457; AVX1-NEXT: vpsrad $2, %xmm3, %xmm51458; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]1459; AVX1-NEXT: vpsrad $3, %xmm3, %xmm31460; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]1461; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21462; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3],ymm1[4],ymm2[5,6,7]1463; AVX1-NEXT: retq1464;1465; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v16i32:1466; AVX2: # %bb.0:1467; AVX2-NEXT: vpsrad $31, %ymm0, %ymm21468; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,30,29,28,0,30,29,28]1469; AVX2-NEXT: # ymm3 = mem[0,1,0,1]1470; AVX2-NEXT: vpsrlvd %ymm3, %ymm2, %ymm21471; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm21472; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [0,2,3,4,0,2,3,4]1473; AVX2-NEXT: # ymm4 = mem[0,1,0,1]1474; AVX2-NEXT: vpsravd %ymm4, %ymm2, %ymm21475; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3],ymm0[4],ymm2[5,6,7]1476; AVX2-NEXT: vpsrad $31, %ymm1, %ymm21477; AVX2-NEXT: vpsrlvd %ymm3, %ymm2, %ymm21478; AVX2-NEXT: vpaddd %ymm2, %ymm1, %ymm21479; AVX2-NEXT: vpsravd %ymm4, %ymm2, %ymm21480; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3],ymm1[4],ymm2[5,6,7]1481; AVX2-NEXT: retq1482;1483; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v16i32:1484; AVX512F: # %bb.0:1485; AVX512F-NEXT: vpsrad $31, %zmm0, %zmm11486; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11487; AVX512F-NEXT: vpaddd %zmm1, %zmm0, %zmm11488; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11489; AVX512F-NEXT: movw $4369, %ax # imm = 0x11111490; AVX512F-NEXT: kmovw %eax, %k11491; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}1492; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm01493; AVX512F-NEXT: retq1494;1495; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v16i32:1496; AVX512BW: # %bb.0:1497; AVX512BW-NEXT: vpsrad $31, %zmm0, %zmm11498; AVX512BW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11499; AVX512BW-NEXT: vpaddd %zmm1, %zmm0, %zmm11500; AVX512BW-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11501; AVX512BW-NEXT: movw $4369, %ax # imm = 0x11111502; AVX512BW-NEXT: kmovd %eax, %k11503; AVX512BW-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}1504; AVX512BW-NEXT: vmovdqa64 %zmm1, %zmm01505; AVX512BW-NEXT: retq1506;1507; XOP-LABEL: combine_vec_sdiv_by_pow2b_v16i32:1508; XOP: # %bb.0:1509; XOP-NEXT: vextractf128 $1, %ymm0, %xmm21510; XOP-NEXT: vpsrad $31, %xmm2, %xmm31511; XOP-NEXT: vpmovsxbd {{.*#+}} xmm4 = [0,4294967266,4294967267,4294967268]1512; XOP-NEXT: vpshld %xmm4, %xmm3, %xmm31513; XOP-NEXT: vpaddd %xmm3, %xmm2, %xmm21514; XOP-NEXT: vpmovsxbd {{.*#+}} xmm3 = [0,4294967294,4294967293,4294967292]1515; XOP-NEXT: vpshad %xmm3, %xmm2, %xmm21516; XOP-NEXT: vpsrad $31, %xmm0, %xmm51517; XOP-NEXT: vpshld %xmm4, %xmm5, %xmm51518; XOP-NEXT: vpaddd %xmm5, %xmm0, %xmm51519; XOP-NEXT: vpshad %xmm3, %xmm5, %xmm51520; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm5, %ymm21521; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3],ymm0[4],ymm2[5,6,7]1522; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21523; XOP-NEXT: vpsrad $31, %xmm2, %xmm51524; XOP-NEXT: vpshld %xmm4, %xmm5, %xmm51525; XOP-NEXT: vpaddd %xmm5, %xmm2, %xmm21526; XOP-NEXT: vpshad %xmm3, %xmm2, %xmm21527; XOP-NEXT: vpsrad $31, %xmm1, %xmm51528; XOP-NEXT: vpshld %xmm4, %xmm5, %xmm41529; XOP-NEXT: vpaddd %xmm4, %xmm1, %xmm41530; XOP-NEXT: vpshad %xmm3, %xmm4, %xmm31531; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21532; XOP-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3],ymm1[4],ymm2[5,6,7]1533; XOP-NEXT: retq1534 %1 = sdiv <16 x i32> %x, <i32 1, i32 4, i32 8, i32 16, i32 1, i32 4, i32 8, i32 16, i32 1, i32 4, i32 8, i32 16, i32 1, i32 4, i32 8, i32 16>1535 ret <16 x i32> %11536}1537 1538define <2 x i64> @combine_vec_sdiv_by_pow2b_v2i64(<2 x i64> %x) {1539; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v2i64:1540; SSE2: # %bb.0:1541; SSE2-NEXT: movdqa %xmm0, %xmm11542; SSE2-NEXT: psrad $31, %xmm11543; SSE2-NEXT: psrlq $62, %xmm11544; SSE2-NEXT: paddq %xmm0, %xmm11545; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]1546; SSE2-NEXT: psrad $2, %xmm21547; SSE2-NEXT: psrlq $2, %xmm11548; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1549; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1550; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1551; SSE2-NEXT: retq1552;1553; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v2i64:1554; SSE41: # %bb.0:1555; SSE41-NEXT: movdqa %xmm0, %xmm11556; SSE41-NEXT: psrad $31, %xmm11557; SSE41-NEXT: psrlq $62, %xmm11558; SSE41-NEXT: paddq %xmm0, %xmm11559; SSE41-NEXT: movdqa %xmm1, %xmm21560; SSE41-NEXT: psrad $2, %xmm21561; SSE41-NEXT: psrlq $2, %xmm11562; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]1563; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1564; SSE41-NEXT: retq1565;1566; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v2i64:1567; AVX1: # %bb.0:1568; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11569; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm11570; AVX1-NEXT: vpsrlq $62, %xmm1, %xmm11571; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm11572; AVX1-NEXT: vpsrad $2, %xmm1, %xmm21573; AVX1-NEXT: vpsrlq $2, %xmm1, %xmm11574; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]1575; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1576; AVX1-NEXT: retq1577;1578; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v2i64:1579; AVX2: # %bb.0:1580; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11581; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm11582; AVX2-NEXT: vpsrlq $62, %xmm1, %xmm11583; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm11584; AVX2-NEXT: vpsrad $2, %xmm1, %xmm21585; AVX2-NEXT: vpsrlq $2, %xmm1, %xmm11586; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]1587; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1588; AVX2-NEXT: retq1589;1590; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v2i64:1591; AVX512F: # %bb.0:1592; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01593; AVX512F-NEXT: vpsraq $63, %zmm0, %zmm11594; AVX512F-NEXT: vpsrlq $62, %xmm1, %xmm11595; AVX512F-NEXT: vpaddq %xmm1, %xmm0, %xmm11596; AVX512F-NEXT: vpsraq $2, %zmm1, %zmm11597; AVX512F-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1598; AVX512F-NEXT: vzeroupper1599; AVX512F-NEXT: retq1600;1601; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v2i64:1602; AVX512BW: # %bb.0:1603; AVX512BW-NEXT: vpsraq $63, %xmm0, %xmm11604; AVX512BW-NEXT: vpsrlq $62, %xmm1, %xmm11605; AVX512BW-NEXT: vpaddq %xmm1, %xmm0, %xmm11606; AVX512BW-NEXT: vpsraq $2, %xmm1, %xmm11607; AVX512BW-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1608; AVX512BW-NEXT: retq1609;1610; XOP-LABEL: combine_vec_sdiv_by_pow2b_v2i64:1611; XOP: # %bb.0:1612; XOP-NEXT: vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11613; XOP-NEXT: vpsrlq $62, %xmm1, %xmm11614; XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm11615; XOP-NEXT: vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11616; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1617; XOP-NEXT: retq1618 %1 = sdiv <2 x i64> %x, <i64 1, i64 4>1619 ret <2 x i64> %11620}1621 1622define <4 x i64> @combine_vec_sdiv_by_pow2b_v4i64(<4 x i64> %x) {1623; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v4i64:1624; SSE2: # %bb.0:1625; SSE2-NEXT: movdqa %xmm0, %xmm21626; SSE2-NEXT: psrad $31, %xmm21627; SSE2-NEXT: psrlq $62, %xmm21628; SSE2-NEXT: paddq %xmm0, %xmm21629; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3]1630; SSE2-NEXT: psrad $2, %xmm31631; SSE2-NEXT: psrlq $2, %xmm21632; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]1633; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]1634; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]1635; SSE2-NEXT: movdqa %xmm1, %xmm21636; SSE2-NEXT: psrad $31, %xmm21637; SSE2-NEXT: movdqa %xmm2, %xmm31638; SSE2-NEXT: psrlq $61, %xmm31639; SSE2-NEXT: psrlq $60, %xmm21640; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm3[0],xmm2[1]1641; SSE2-NEXT: paddq %xmm2, %xmm11642; SSE2-NEXT: movdqa %xmm1, %xmm21643; SSE2-NEXT: psrlq $3, %xmm21644; SSE2-NEXT: psrlq $4, %xmm11645; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]1646; SSE2-NEXT: movapd {{.*#+}} xmm2 = [1152921504606846976,576460752303423488]1647; SSE2-NEXT: xorpd %xmm2, %xmm11648; SSE2-NEXT: psubq %xmm2, %xmm11649; SSE2-NEXT: retq1650;1651; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v4i64:1652; SSE41: # %bb.0:1653; SSE41-NEXT: movdqa %xmm0, %xmm21654; SSE41-NEXT: psrad $31, %xmm21655; SSE41-NEXT: psrlq $62, %xmm21656; SSE41-NEXT: paddq %xmm0, %xmm21657; SSE41-NEXT: movdqa %xmm2, %xmm31658; SSE41-NEXT: psrad $2, %xmm31659; SSE41-NEXT: psrlq $2, %xmm21660; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1661; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1662; SSE41-NEXT: movdqa %xmm1, %xmm21663; SSE41-NEXT: psrad $31, %xmm21664; SSE41-NEXT: movdqa %xmm2, %xmm31665; SSE41-NEXT: psrlq $60, %xmm31666; SSE41-NEXT: psrlq $61, %xmm21667; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]1668; SSE41-NEXT: paddq %xmm2, %xmm11669; SSE41-NEXT: movdqa %xmm1, %xmm21670; SSE41-NEXT: psrlq $4, %xmm21671; SSE41-NEXT: psrlq $3, %xmm11672; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]1673; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [1152921504606846976,576460752303423488]1674; SSE41-NEXT: pxor %xmm2, %xmm11675; SSE41-NEXT: psubq %xmm2, %xmm11676; SSE41-NEXT: retq1677;1678; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v4i64:1679; AVX1: # %bb.0:1680; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11681; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21682; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm31683; AVX1-NEXT: vpsrlq $60, %xmm3, %xmm41684; AVX1-NEXT: vpsrlq $61, %xmm3, %xmm31685; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm4[4,5,6,7]1686; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm11687; AVX1-NEXT: vpsrlq $4, %xmm1, %xmm31688; AVX1-NEXT: vpsrlq $3, %xmm1, %xmm11689; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]1690; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1152921504606846976,576460752303423488]1691; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm11692; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm11693; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm21694; AVX1-NEXT: vpsrlq $62, %xmm2, %xmm21695; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm21696; AVX1-NEXT: vpsrad $2, %xmm2, %xmm31697; AVX1-NEXT: vpsrlq $2, %xmm2, %xmm21698; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]1699; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11700; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]1701; AVX1-NEXT: retq1702;1703; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v4i64:1704; AVX2: # %bb.0:1705; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11706; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm11707; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11708; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm11709; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11710; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [u,2305843009213693952,1152921504606846976,576460752303423488]1711; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm11712; AVX2-NEXT: vpsubq %ymm2, %ymm1, %ymm11713; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]1714; AVX2-NEXT: retq1715;1716; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v4i64:1717; AVX512F: # %bb.0:1718; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01719; AVX512F-NEXT: vpmovsxbq {{.*#+}} ymm1 = [0,2,3,4]1720; AVX512F-NEXT: vpsraq $63, %zmm0, %zmm21721; AVX512F-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm21722; AVX512F-NEXT: vpaddq %ymm2, %ymm0, %ymm21723; AVX512F-NEXT: vpsravq %zmm1, %zmm2, %zmm11724; AVX512F-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]1725; AVX512F-NEXT: retq1726;1727; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v4i64:1728; AVX512BW: # %bb.0:1729; AVX512BW-NEXT: vpsraq $63, %ymm0, %ymm11730; AVX512BW-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11731; AVX512BW-NEXT: vpaddq %ymm1, %ymm0, %ymm11732; AVX512BW-NEXT: vpsravq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11733; AVX512BW-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]1734; AVX512BW-NEXT: retq1735;1736; XOP-LABEL: combine_vec_sdiv_by_pow2b_v4i64:1737; XOP: # %bb.0:1738; XOP-NEXT: vpmovsxbq {{.*#+}} xmm1 = [18446744073709551553,18446744073709551553]1739; XOP-NEXT: vpshaq %xmm1, %xmm0, %xmm21740; XOP-NEXT: vpsrlq $62, %xmm2, %xmm21741; XOP-NEXT: vpaddq %xmm2, %xmm0, %xmm21742; XOP-NEXT: vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21743; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31744; XOP-NEXT: vpshaq %xmm1, %xmm3, %xmm11745; XOP-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11746; XOP-NEXT: vpaddq %xmm1, %xmm3, %xmm11747; XOP-NEXT: vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11748; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11749; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]1750; XOP-NEXT: retq1751 %1 = sdiv <4 x i64> %x, <i64 1, i64 4, i64 8, i64 16>1752 ret <4 x i64> %11753}1754 1755define <8 x i64> @combine_vec_sdiv_by_pow2b_v8i64(<8 x i64> %x) {1756; SSE2-LABEL: combine_vec_sdiv_by_pow2b_v8i64:1757; SSE2: # %bb.0:1758; SSE2-NEXT: movdqa %xmm0, %xmm41759; SSE2-NEXT: psrad $31, %xmm41760; SSE2-NEXT: psrlq $62, %xmm41761; SSE2-NEXT: paddq %xmm0, %xmm41762; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]1763; SSE2-NEXT: psrad $2, %xmm51764; SSE2-NEXT: psrlq $2, %xmm41765; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]1766; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]1767; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm4[2,3]1768; SSE2-NEXT: movdqa %xmm2, %xmm41769; SSE2-NEXT: psrad $31, %xmm41770; SSE2-NEXT: psrlq $62, %xmm41771; SSE2-NEXT: paddq %xmm2, %xmm41772; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]1773; SSE2-NEXT: psrad $2, %xmm51774; SSE2-NEXT: psrlq $2, %xmm41775; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]1776; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]1777; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3]1778; SSE2-NEXT: movdqa %xmm1, %xmm41779; SSE2-NEXT: psrad $31, %xmm41780; SSE2-NEXT: movdqa %xmm4, %xmm51781; SSE2-NEXT: psrlq $61, %xmm51782; SSE2-NEXT: psrlq $60, %xmm41783; SSE2-NEXT: movsd {{.*#+}} xmm4 = xmm5[0],xmm4[1]1784; SSE2-NEXT: paddq %xmm4, %xmm11785; SSE2-NEXT: movdqa %xmm1, %xmm41786; SSE2-NEXT: psrlq $3, %xmm41787; SSE2-NEXT: psrlq $4, %xmm11788; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm4[0],xmm1[1]1789; SSE2-NEXT: movapd {{.*#+}} xmm4 = [1152921504606846976,576460752303423488]1790; SSE2-NEXT: xorpd %xmm4, %xmm11791; SSE2-NEXT: psubq %xmm4, %xmm11792; SSE2-NEXT: movdqa %xmm3, %xmm51793; SSE2-NEXT: psrad $31, %xmm51794; SSE2-NEXT: movdqa %xmm5, %xmm61795; SSE2-NEXT: psrlq $61, %xmm61796; SSE2-NEXT: psrlq $60, %xmm51797; SSE2-NEXT: movsd {{.*#+}} xmm5 = xmm6[0],xmm5[1]1798; SSE2-NEXT: paddq %xmm5, %xmm31799; SSE2-NEXT: movdqa %xmm3, %xmm51800; SSE2-NEXT: psrlq $3, %xmm51801; SSE2-NEXT: psrlq $4, %xmm31802; SSE2-NEXT: movsd {{.*#+}} xmm3 = xmm5[0],xmm3[1]1803; SSE2-NEXT: xorpd %xmm4, %xmm31804; SSE2-NEXT: psubq %xmm4, %xmm31805; SSE2-NEXT: retq1806;1807; SSE41-LABEL: combine_vec_sdiv_by_pow2b_v8i64:1808; SSE41: # %bb.0:1809; SSE41-NEXT: movdqa %xmm0, %xmm41810; SSE41-NEXT: psrad $31, %xmm41811; SSE41-NEXT: psrlq $62, %xmm41812; SSE41-NEXT: paddq %xmm0, %xmm41813; SSE41-NEXT: movdqa %xmm4, %xmm51814; SSE41-NEXT: psrad $2, %xmm51815; SSE41-NEXT: psrlq $2, %xmm41816; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]1817; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]1818; SSE41-NEXT: movdqa %xmm2, %xmm41819; SSE41-NEXT: psrad $31, %xmm41820; SSE41-NEXT: psrlq $62, %xmm41821; SSE41-NEXT: paddq %xmm2, %xmm41822; SSE41-NEXT: movdqa %xmm4, %xmm51823; SSE41-NEXT: psrad $2, %xmm51824; SSE41-NEXT: psrlq $2, %xmm41825; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]1826; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm4[4,5,6,7]1827; SSE41-NEXT: movdqa %xmm1, %xmm41828; SSE41-NEXT: psrad $31, %xmm41829; SSE41-NEXT: movdqa %xmm4, %xmm51830; SSE41-NEXT: psrlq $60, %xmm51831; SSE41-NEXT: psrlq $61, %xmm41832; SSE41-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm5[4,5,6,7]1833; SSE41-NEXT: paddq %xmm4, %xmm11834; SSE41-NEXT: movdqa %xmm1, %xmm41835; SSE41-NEXT: psrlq $4, %xmm41836; SSE41-NEXT: psrlq $3, %xmm11837; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm4[4,5,6,7]1838; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [1152921504606846976,576460752303423488]1839; SSE41-NEXT: pxor %xmm4, %xmm11840; SSE41-NEXT: psubq %xmm4, %xmm11841; SSE41-NEXT: movdqa %xmm3, %xmm51842; SSE41-NEXT: psrad $31, %xmm51843; SSE41-NEXT: movdqa %xmm5, %xmm61844; SSE41-NEXT: psrlq $60, %xmm61845; SSE41-NEXT: psrlq $61, %xmm51846; SSE41-NEXT: pblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm6[4,5,6,7]1847; SSE41-NEXT: paddq %xmm5, %xmm31848; SSE41-NEXT: movdqa %xmm3, %xmm51849; SSE41-NEXT: psrlq $4, %xmm51850; SSE41-NEXT: psrlq $3, %xmm31851; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm5[4,5,6,7]1852; SSE41-NEXT: pxor %xmm4, %xmm31853; SSE41-NEXT: psubq %xmm4, %xmm31854; SSE41-NEXT: retq1855;1856; AVX1-LABEL: combine_vec_sdiv_by_pow2b_v8i64:1857; AVX1: # %bb.0:1858; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31859; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21860; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm41861; AVX1-NEXT: vpsrlq $60, %xmm4, %xmm51862; AVX1-NEXT: vpsrlq $61, %xmm4, %xmm41863; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm5[4,5,6,7]1864; AVX1-NEXT: vpaddq %xmm4, %xmm3, %xmm31865; AVX1-NEXT: vpsrlq $4, %xmm3, %xmm41866; AVX1-NEXT: vpsrlq $3, %xmm3, %xmm31867; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm4[4,5,6,7]1868; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [1152921504606846976,576460752303423488]1869; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm31870; AVX1-NEXT: vpsubq %xmm4, %xmm3, %xmm31871; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm51872; AVX1-NEXT: vpsrlq $62, %xmm5, %xmm51873; AVX1-NEXT: vpaddq %xmm5, %xmm0, %xmm51874; AVX1-NEXT: vpsrad $2, %xmm5, %xmm61875; AVX1-NEXT: vpsrlq $2, %xmm5, %xmm51876; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7]1877; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm31878; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm3[2,3,4,5,6,7]1879; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31880; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm51881; AVX1-NEXT: vpsrlq $60, %xmm5, %xmm61882; AVX1-NEXT: vpsrlq $61, %xmm5, %xmm51883; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm6[4,5,6,7]1884; AVX1-NEXT: vpaddq %xmm5, %xmm3, %xmm31885; AVX1-NEXT: vpsrlq $4, %xmm3, %xmm51886; AVX1-NEXT: vpsrlq $3, %xmm3, %xmm31887; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm5[4,5,6,7]1888; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm31889; AVX1-NEXT: vpsubq %xmm4, %xmm3, %xmm31890; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm21891; AVX1-NEXT: vpsrlq $62, %xmm2, %xmm21892; AVX1-NEXT: vpaddq %xmm2, %xmm1, %xmm21893; AVX1-NEXT: vpsrad $2, %xmm2, %xmm41894; AVX1-NEXT: vpsrlq $2, %xmm2, %xmm21895; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]1896; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm21897; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm2[2,3,4,5,6,7]1898; AVX1-NEXT: retq1899;1900; AVX2-LABEL: combine_vec_sdiv_by_pow2b_v8i64:1901; AVX2: # %bb.0:1902; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21903; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm31904; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm4 = [0,62,61,60]1905; AVX2-NEXT: vpsrlvq %ymm4, %ymm3, %ymm31906; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm31907; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm5 = [0,2,3,4]1908; AVX2-NEXT: vpsrlvq %ymm5, %ymm3, %ymm31909; AVX2-NEXT: vmovdqa {{.*#+}} ymm6 = [u,2305843009213693952,1152921504606846976,576460752303423488]1910; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm31911; AVX2-NEXT: vpsubq %ymm6, %ymm3, %ymm31912; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm3[2,3,4,5,6,7]1913; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm21914; AVX2-NEXT: vpsrlvq %ymm4, %ymm2, %ymm21915; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm21916; AVX2-NEXT: vpsrlvq %ymm5, %ymm2, %ymm21917; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm21918; AVX2-NEXT: vpsubq %ymm6, %ymm2, %ymm21919; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1],ymm2[2,3,4,5,6,7]1920; AVX2-NEXT: retq1921;1922; AVX512F-LABEL: combine_vec_sdiv_by_pow2b_v8i64:1923; AVX512F: # %bb.0:1924; AVX512F-NEXT: vpsraq $63, %zmm0, %zmm11925; AVX512F-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11926; AVX512F-NEXT: vpaddq %zmm1, %zmm0, %zmm11927; AVX512F-NEXT: vpsravq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11928; AVX512F-NEXT: movb $17, %al1929; AVX512F-NEXT: kmovw %eax, %k11930; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}1931; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm01932; AVX512F-NEXT: retq1933;1934; AVX512BW-LABEL: combine_vec_sdiv_by_pow2b_v8i64:1935; AVX512BW: # %bb.0:1936; AVX512BW-NEXT: vpsraq $63, %zmm0, %zmm11937; AVX512BW-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11938; AVX512BW-NEXT: vpaddq %zmm1, %zmm0, %zmm11939; AVX512BW-NEXT: vpsravq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm11940; AVX512BW-NEXT: movb $17, %al1941; AVX512BW-NEXT: kmovd %eax, %k11942; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}1943; AVX512BW-NEXT: vmovdqa64 %zmm1, %zmm01944; AVX512BW-NEXT: retq1945;1946; XOP-LABEL: combine_vec_sdiv_by_pow2b_v8i64:1947; XOP: # %bb.0:1948; XOP-NEXT: vextractf128 $1, %ymm0, %xmm21949; XOP-NEXT: vpmovsxbq {{.*#+}} xmm3 = [18446744073709551553,18446744073709551553]1950; XOP-NEXT: vpshaq %xmm3, %xmm2, %xmm41951; XOP-NEXT: vpmovsxbq {{.*#+}} xmm5 = [18446744073709551555,18446744073709551556]1952; XOP-NEXT: vpshlq %xmm5, %xmm4, %xmm41953; XOP-NEXT: vpaddq %xmm4, %xmm2, %xmm21954; XOP-NEXT: vpmovsxbq {{.*#+}} xmm4 = [18446744073709551613,18446744073709551612]1955; XOP-NEXT: vpshaq %xmm4, %xmm2, %xmm21956; XOP-NEXT: vpshaq %xmm3, %xmm0, %xmm61957; XOP-NEXT: vpsrlq $62, %xmm6, %xmm61958; XOP-NEXT: vpaddq %xmm6, %xmm0, %xmm61959; XOP-NEXT: vpmovsxbq {{.*#+}} xmm7 = [18446744073709551614,18446744073709551614]1960; XOP-NEXT: vpshaq %xmm7, %xmm6, %xmm61961; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm6, %ymm21962; XOP-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm2[2,3,4,5,6,7]1963; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21964; XOP-NEXT: vpshaq %xmm3, %xmm2, %xmm61965; XOP-NEXT: vpshlq %xmm5, %xmm6, %xmm51966; XOP-NEXT: vpaddq %xmm5, %xmm2, %xmm21967; XOP-NEXT: vpshaq %xmm4, %xmm2, %xmm21968; XOP-NEXT: vpshaq %xmm3, %xmm1, %xmm31969; XOP-NEXT: vpsrlq $62, %xmm3, %xmm31970; XOP-NEXT: vpaddq %xmm3, %xmm1, %xmm31971; XOP-NEXT: vpshaq %xmm7, %xmm3, %xmm31972; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21973; XOP-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1],ymm2[2,3,4,5,6,7]1974; XOP-NEXT: retq1975 %1 = sdiv <8 x i64> %x, <i64 1, i64 4, i64 8, i64 16, i64 1, i64 4, i64 8, i64 16>1976 ret <8 x i64> %11977}1978 1979define <4 x i32> @combine_vec_sdiv_by_pow2b_PosAndNeg(<4 x i32> %x) {1980; SSE2-LABEL: combine_vec_sdiv_by_pow2b_PosAndNeg:1981; SSE2: # %bb.0:1982; SSE2-NEXT: movdqa %xmm0, %xmm11983; SSE2-NEXT: psrad $31, %xmm11984; SSE2-NEXT: movdqa %xmm1, %xmm21985; SSE2-NEXT: psrld $28, %xmm21986; SSE2-NEXT: movdqa %xmm1, %xmm31987; SSE2-NEXT: psrld $29, %xmm31988; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]1989; SSE2-NEXT: psrld $30, %xmm11990; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,3]1991; SSE2-NEXT: paddd %xmm0, %xmm11992; SSE2-NEXT: movdqa %xmm1, %xmm21993; SSE2-NEXT: psrad $4, %xmm21994; SSE2-NEXT: movdqa %xmm1, %xmm31995; SSE2-NEXT: psrad $3, %xmm31996; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]1997; SSE2-NEXT: psrad $2, %xmm11998; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,3]1999; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]2000; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,2,3]2001; SSE2-NEXT: pxor %xmm2, %xmm22002; SSE2-NEXT: psubd %xmm1, %xmm22003; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,2,3]2004; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]2005; SSE2-NEXT: retq2006;2007; SSE41-LABEL: combine_vec_sdiv_by_pow2b_PosAndNeg:2008; SSE41: # %bb.0:2009; SSE41-NEXT: movdqa %xmm0, %xmm12010; SSE41-NEXT: psrad $31, %xmm12011; SSE41-NEXT: movdqa %xmm1, %xmm22012; SSE41-NEXT: psrld $28, %xmm22013; SSE41-NEXT: movdqa %xmm1, %xmm32014; SSE41-NEXT: psrld $30, %xmm32015; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]2016; SSE41-NEXT: psrld $29, %xmm12017; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]2018; SSE41-NEXT: paddd %xmm0, %xmm12019; SSE41-NEXT: movdqa %xmm1, %xmm22020; SSE41-NEXT: psrad $4, %xmm22021; SSE41-NEXT: movdqa %xmm1, %xmm32022; SSE41-NEXT: psrad $2, %xmm32023; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]2024; SSE41-NEXT: pxor %xmm2, %xmm22025; SSE41-NEXT: psubd %xmm3, %xmm22026; SSE41-NEXT: psrad $3, %xmm12027; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]2028; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]2029; SSE41-NEXT: retq2030;2031; AVX1-LABEL: combine_vec_sdiv_by_pow2b_PosAndNeg:2032; AVX1: # %bb.0:2033; AVX1-NEXT: vpsrad $31, %xmm0, %xmm12034; AVX1-NEXT: vpsrld $28, %xmm1, %xmm22035; AVX1-NEXT: vpsrld $30, %xmm1, %xmm32036; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]2037; AVX1-NEXT: vpsrld $29, %xmm1, %xmm12038; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]2039; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm12040; AVX1-NEXT: vpsrad $4, %xmm1, %xmm22041; AVX1-NEXT: vpsrad $2, %xmm1, %xmm32042; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]2043; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm32044; AVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm22045; AVX1-NEXT: vpsrad $3, %xmm1, %xmm12046; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]2047; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]2048; AVX1-NEXT: retq2049;2050; AVX2ORLATER-LABEL: combine_vec_sdiv_by_pow2b_PosAndNeg:2051; AVX2ORLATER: # %bb.0:2052; AVX2ORLATER-NEXT: vpsrad $31, %xmm0, %xmm12053; AVX2ORLATER-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12054; AVX2ORLATER-NEXT: vpaddd %xmm1, %xmm0, %xmm12055; AVX2ORLATER-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12056; AVX2ORLATER-NEXT: vpxor %xmm2, %xmm2, %xmm22057; AVX2ORLATER-NEXT: vpsubd %xmm1, %xmm2, %xmm22058; AVX2ORLATER-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]2059; AVX2ORLATER-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]2060; AVX2ORLATER-NEXT: retq2061;2062; XOP-LABEL: combine_vec_sdiv_by_pow2b_PosAndNeg:2063; XOP: # %bb.0:2064; XOP-NEXT: vpsrad $31, %xmm0, %xmm12065; XOP-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12066; XOP-NEXT: vpaddd %xmm1, %xmm0, %xmm12067; XOP-NEXT: vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12068; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm22069; XOP-NEXT: vpsubd %xmm1, %xmm2, %xmm22070; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]2071; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]2072; XOP-NEXT: retq2073 %1 = sdiv <4 x i32> %x, <i32 1, i32 -4, i32 8, i32 -16>2074 ret <4 x i32> %12075}2076 2077define <4 x i32> @combine_vec_sdiv_by_pow2b_undef1(<4 x i32> %x) {2078; CHECK-LABEL: combine_vec_sdiv_by_pow2b_undef1:2079; CHECK: # %bb.0:2080; CHECK-NEXT: retq2081 %1 = sdiv <4 x i32> %x, <i32 undef, i32 -4, i32 undef, i32 -16>2082 ret <4 x i32> %12083}2084 2085define <4 x i32> @combine_vec_sdiv_by_pow2b_undef2(<4 x i32> %x) {2086; CHECK-LABEL: combine_vec_sdiv_by_pow2b_undef2:2087; CHECK: # %bb.0:2088; CHECK-NEXT: retq2089 %1 = sdiv <4 x i32> %x, <i32 undef, i32 4, i32 undef, i32 16>2090 ret <4 x i32> %12091}2092 2093define <4 x i32> @combine_vec_sdiv_by_pow2b_undef3(<4 x i32> %x) {2094; CHECK-LABEL: combine_vec_sdiv_by_pow2b_undef3:2095; CHECK: # %bb.0:2096; CHECK-NEXT: retq2097 %1 = sdiv <4 x i32> %x, <i32 undef, i32 -4, i32 undef, i32 16>2098 ret <4 x i32> %12099}2100 2101; PR371192102define <16 x i8> @non_splat_minus_one_divisor_0(<16 x i8> %A) {2103; SSE-LABEL: non_splat_minus_one_divisor_0:2104; SSE: # %bb.0:2105; SSE-NEXT: movdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,0,0,0]2106; SSE-NEXT: pxor %xmm1, %xmm02107; SSE-NEXT: psubb %xmm1, %xmm02108; SSE-NEXT: retq2109;2110; AVX1-LABEL: non_splat_minus_one_divisor_0:2111; AVX1: # %bb.0:2112; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,0,0,0]2113; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm02114; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm02115; AVX1-NEXT: retq2116;2117; AVX2-LABEL: non_splat_minus_one_divisor_0:2118; AVX2: # %bb.0:2119; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,0,0,0]2120; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm02121; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm02122; AVX2-NEXT: retq2123;2124; AVX512F-LABEL: non_splat_minus_one_divisor_0:2125; AVX512F: # %bb.0:2126; AVX512F-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,0,0,0]2127; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm02128; AVX512F-NEXT: vpsubb %xmm1, %xmm0, %xmm02129; AVX512F-NEXT: retq2130;2131; AVX512BW-LABEL: non_splat_minus_one_divisor_0:2132; AVX512BW: # %bb.0:2133; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm12134; AVX512BW-NEXT: movw $443, %ax # imm = 0x1BB2135; AVX512BW-NEXT: kmovd %eax, %k12136; AVX512BW-NEXT: vpsubb %xmm0, %xmm1, %xmm0 {%k1}2137; AVX512BW-NEXT: retq2138;2139; XOP-LABEL: non_splat_minus_one_divisor_0:2140; XOP: # %bb.0:2141; XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,0,0,0]2142; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm02143; XOP-NEXT: vpsubb %xmm1, %xmm0, %xmm02144; XOP-NEXT: retq2145 %div = sdiv <16 x i8> %A, <i8 -1, i8 -1, i8 1, i8 -1, i8 -1, i8 -1, i8 1, i8 -1, i8 -1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>2146 ret <16 x i8> %div2147}2148 2149define <16 x i8> @non_splat_minus_one_divisor_1(<16 x i8> %A) {2150; SSE2-LABEL: non_splat_minus_one_divisor_1:2151; SSE2: # %bb.0:2152; SSE2-NEXT: pxor %xmm1, %xmm12153; SSE2-NEXT: pxor %xmm2, %xmm22154; SSE2-NEXT: pcmpgtb %xmm0, %xmm22155; SSE2-NEXT: movdqa %xmm2, %xmm32156; 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]2157; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [256,2,2,2,2,128,2,128]2158; SSE2-NEXT: psrlw $8, %xmm32159; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]2160; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [256,256,2,256,256,256,2,256]2161; SSE2-NEXT: psrlw $8, %xmm22162; SSE2-NEXT: packuswb %xmm3, %xmm22163; SSE2-NEXT: paddb %xmm0, %xmm22164; SSE2-NEXT: movdqa %xmm2, %xmm12165; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = 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]2166; SSE2-NEXT: psraw $8, %xmm12167; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [u,128,128,128,128,2,128,2]2168; SSE2-NEXT: psrlw $8, %xmm12169; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2170; SSE2-NEXT: psraw $8, %xmm22171; SSE2-NEXT: psllw $7, %xmm22172; SSE2-NEXT: psrlw $8, %xmm22173; SSE2-NEXT: packuswb %xmm1, %xmm22174; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [0,0,255,0,0,0,255,0,0,255,255,255,255,255,255,255]2175; SSE2-NEXT: pand %xmm1, %xmm22176; SSE2-NEXT: pandn %xmm0, %xmm12177; SSE2-NEXT: por %xmm2, %xmm12178; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,0,255,255,255,0,255,255,0,0,0,0,255,0,255]2179; SSE2-NEXT: pxor %xmm0, %xmm12180; SSE2-NEXT: psubb %xmm0, %xmm12181; SSE2-NEXT: movdqa %xmm1, %xmm02182; SSE2-NEXT: retq2183;2184; SSE41-LABEL: non_splat_minus_one_divisor_1:2185; SSE41: # %bb.0:2186; SSE41-NEXT: movdqa %xmm0, %xmm12187; SSE41-NEXT: pxor %xmm0, %xmm02188; SSE41-NEXT: pxor %xmm3, %xmm32189; SSE41-NEXT: pcmpgtb %xmm1, %xmm32190; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]2191; SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [256,2,2,2,2,128,2,128]2192; SSE41-NEXT: psrlw $8, %xmm32193; SSE41-NEXT: pmovsxbw %xmm1, %xmm02194; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero2195; SSE41-NEXT: paddw %xmm2, %xmm22196; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2],xmm0[3,4,5],xmm2[6],xmm0[7]2197; SSE41-NEXT: psrlw $8, %xmm22198; SSE41-NEXT: packuswb %xmm3, %xmm22199; SSE41-NEXT: paddb %xmm1, %xmm22200; SSE41-NEXT: movdqa %xmm2, %xmm02201; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]2202; SSE41-NEXT: psraw $8, %xmm02203; SSE41-NEXT: movdqa %xmm0, %xmm32204; SSE41-NEXT: psllw $7, %xmm32205; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3,4],xmm0[5],xmm3[6],xmm0[7]2206; SSE41-NEXT: psrlw $8, %xmm32207; SSE41-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2208; SSE41-NEXT: psraw $8, %xmm22209; SSE41-NEXT: psllw $7, %xmm22210; SSE41-NEXT: psrlw $8, %xmm22211; SSE41-NEXT: packuswb %xmm3, %xmm22212; SSE41-NEXT: movaps {{.*#+}} xmm0 = [0,0,255,0,0,0,255,0,0,255,255,255,255,255,255,255]2213; SSE41-NEXT: pblendvb %xmm0, %xmm2, %xmm12214; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [255,255,0,255,255,255,0,255,255,0,0,0,0,255,0,255]2215; SSE41-NEXT: pxor %xmm0, %xmm12216; SSE41-NEXT: psubb %xmm0, %xmm12217; SSE41-NEXT: movdqa %xmm1, %xmm02218; SSE41-NEXT: retq2219;2220; AVX1-LABEL: non_splat_minus_one_divisor_1:2221; AVX1: # %bb.0:2222; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12223; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm22224; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]2225; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [256,2,2,2,2,128,2,128]2226; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm12227; AVX1-NEXT: vpmovsxbw %xmm0, %xmm22228; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2229; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm32230; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2],xmm2[3,4,5],xmm3[6],xmm2[7]2231; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm22232; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm12233; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm12234; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2235; AVX1-NEXT: vpsraw $8, %xmm2, %xmm22236; AVX1-NEXT: vpsllw $7, %xmm2, %xmm32237; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3,4],xmm2[5],xmm3[6],xmm2[7]2238; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm22239; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2240; AVX1-NEXT: vpsraw $8, %xmm1, %xmm12241; AVX1-NEXT: vpsllw $7, %xmm1, %xmm12242; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm12243; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm12244; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,0,255,0,0,0,255,0,0,255,255,255,255,255,255,255]2245; AVX1-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm02246; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,255,0,255]2247; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm02248; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm02249; AVX1-NEXT: retq2250;2251; AVX2-LABEL: non_splat_minus_one_divisor_1:2252; AVX2: # %bb.0:2253; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm12254; AVX2-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm12255; AVX2-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],zero2256; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [256,256,2,256,256,256,2,256,256,2,2,2,2,128,2,128]2257; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm12258; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22259; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm12260; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm12261; AVX2-NEXT: vpmovsxbw %xmm1, %ymm12262; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [256,256,128,256,256,256,128,256,256,128,128,128,128,2,128,2]2263; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm12264; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22265; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm12266; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,0,255,0,0,0,255,0,0,255,255,255,255,255,255,255]2267; AVX2-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm02268; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,255,0,255]2269; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm02270; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm02271; AVX2-NEXT: vzeroupper2272; AVX2-NEXT: retq2273;2274; AVX512F-LABEL: non_splat_minus_one_divisor_1:2275; AVX512F: # %bb.0:2276; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm12277; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm12278; AVX512F-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero2279; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm12280; AVX512F-NEXT: vpmovdb %zmm1, %xmm12281; AVX512F-NEXT: vpaddb %xmm1, %xmm0, %xmm12282; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm12283; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm12284; AVX512F-NEXT: vpmovdb %zmm1, %xmm12285; AVX512F-NEXT: vmovdqa {{.*#+}} xmm2 = [0,0,255,0,0,0,255,0,0,255,255,255,255,255,255,255]2286; AVX512F-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm02287; AVX512F-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,255,0,255]2288; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm02289; AVX512F-NEXT: vpsubb %xmm1, %xmm0, %xmm02290; AVX512F-NEXT: vzeroupper2291; AVX512F-NEXT: retq2292;2293; AVX512BW-LABEL: non_splat_minus_one_divisor_1:2294; AVX512BW: # %bb.0:2295; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm12296; AVX512BW-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm22297; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero2298; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22299; AVX512BW-NEXT: vpmovwb %ymm2, %xmm22300; AVX512BW-NEXT: vpaddb %xmm2, %xmm0, %xmm22301; AVX512BW-NEXT: vpmovsxbw %xmm2, %ymm22302; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm22303; AVX512BW-NEXT: vpmovwb %ymm2, %xmm22304; AVX512BW-NEXT: movw $443, %ax # imm = 0x1BB2305; AVX512BW-NEXT: kmovd %eax, %k12306; AVX512BW-NEXT: vmovdqu8 %xmm0, %xmm2 {%k1}2307; AVX512BW-NEXT: vpsubb %xmm2, %xmm1, %xmm02308; AVX512BW-NEXT: movw $24132, %ax # imm = 0x5E442309; AVX512BW-NEXT: kmovd %eax, %k12310; AVX512BW-NEXT: vmovdqu8 %xmm2, %xmm0 {%k1}2311; AVX512BW-NEXT: vzeroupper2312; AVX512BW-NEXT: retq2313;2314; XOP-LABEL: non_splat_minus_one_divisor_1:2315; XOP: # %bb.0:2316; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm12317; XOP-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm12318; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12319; XOP-NEXT: vpaddb %xmm1, %xmm0, %xmm12320; XOP-NEXT: vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12321; XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [0,0,255,0,0,0,255,0,0,255,255,255,255,255,255,255]2322; XOP-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm02323; XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,0,255,255,255,0,255,255,0,0,0,0,255,0,255]2324; XOP-NEXT: vpxor %xmm1, %xmm0, %xmm02325; XOP-NEXT: vpsubb %xmm1, %xmm0, %xmm02326; XOP-NEXT: retq2327 %div = sdiv <16 x i8> %A, <i8 -1, i8 -1, i8 2, i8 -1, i8 -1, i8 -1, i8 2, i8 -1, i8 -1, i8 2, i8 2, i8 2, i8 2, i8 -128, i8 2, i8 -128>2328 ret <16 x i8> %div2329}2330 2331define <4 x i32> @non_splat_minus_one_divisor_2(<4 x i32> %A) {2332; SSE2-LABEL: non_splat_minus_one_divisor_2:2333; SSE2: # %bb.0:2334; SSE2-NEXT: movdqa %xmm0, %xmm12335; SSE2-NEXT: psrld $31, %xmm12336; SSE2-NEXT: paddd %xmm0, %xmm12337; SSE2-NEXT: psrad $1, %xmm12338; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]2339; SSE2-NEXT: pxor %xmm0, %xmm02340; SSE2-NEXT: psubd %xmm1, %xmm02341; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm1[1,2]2342; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]2343; SSE2-NEXT: retq2344;2345; SSE41-LABEL: non_splat_minus_one_divisor_2:2346; SSE41: # %bb.0:2347; SSE41-NEXT: movdqa %xmm0, %xmm12348; SSE41-NEXT: psrld $31, %xmm12349; SSE41-NEXT: paddd %xmm0, %xmm12350; SSE41-NEXT: psrad $1, %xmm12351; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]2352; SSE41-NEXT: pxor %xmm1, %xmm12353; SSE41-NEXT: psubd %xmm0, %xmm12354; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7]2355; SSE41-NEXT: retq2356;2357; AVX1-LABEL: non_splat_minus_one_divisor_2:2358; AVX1: # %bb.0:2359; AVX1-NEXT: vpsrld $31, %xmm0, %xmm12360; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm12361; AVX1-NEXT: vpsrad $1, %xmm1, %xmm12362; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]2363; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12364; AVX1-NEXT: vpsubd %xmm0, %xmm1, %xmm12365; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7]2366; AVX1-NEXT: retq2367;2368; AVX2ORLATER-LABEL: non_splat_minus_one_divisor_2:2369; AVX2ORLATER: # %bb.0:2370; AVX2ORLATER-NEXT: vpsrld $31, %xmm0, %xmm12371; AVX2ORLATER-NEXT: vpaddd %xmm1, %xmm0, %xmm12372; AVX2ORLATER-NEXT: vpsrad $1, %xmm1, %xmm12373; AVX2ORLATER-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]2374; AVX2ORLATER-NEXT: vpxor %xmm1, %xmm1, %xmm12375; AVX2ORLATER-NEXT: vpsubd %xmm0, %xmm1, %xmm12376; AVX2ORLATER-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]2377; AVX2ORLATER-NEXT: retq2378;2379; XOP-LABEL: non_splat_minus_one_divisor_2:2380; XOP: # %bb.0:2381; XOP-NEXT: vpsrld $31, %xmm0, %xmm12382; XOP-NEXT: vpaddd %xmm1, %xmm0, %xmm12383; XOP-NEXT: vpsrad $1, %xmm1, %xmm12384; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]2385; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm12386; XOP-NEXT: vpsubd %xmm0, %xmm1, %xmm12387; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7]2388; XOP-NEXT: retq2389 %div = sdiv <4 x i32> %A, <i32 -1, i32 1, i32 2, i32 -2>2390 ret <4 x i32> %div2391}2392 2393define <8 x i16> @combine_vec_sdiv_nonuniform(<8 x i16> %x) {2394; SSE-LABEL: combine_vec_sdiv_nonuniform:2395; SSE: # %bb.0:2396; SSE-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [21846,21846,21846,21846,2979,2979,2979,2979]2397; SSE-NEXT: movdqa %xmm0, %xmm12398; SSE-NEXT: psrlw $15, %xmm12399; SSE-NEXT: paddw %xmm1, %xmm02400; SSE-NEXT: retq2401;2402; AVX-LABEL: combine_vec_sdiv_nonuniform:2403; AVX: # %bb.0:2404; AVX-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [21846,21846,21846,21846,2979,2979,2979,2979]2405; AVX-NEXT: vpsrlw $15, %xmm0, %xmm12406; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm02407; AVX-NEXT: retq2408 %1 = sdiv <8 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 22, i16 22, i16 22, i16 22>2409 ret <8 x i16> %12410}2411 2412define <8 x i16> @combine_vec_sdiv_nonuniform2(<8 x i16> %x) {2413; SSE2-LABEL: combine_vec_sdiv_nonuniform2:2414; SSE2: # %bb.0:2415; SSE2-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [10923,10923,10923,10923,5243,5243,5243,5243]2416; SSE2-NEXT: movdqa %xmm0, %xmm12417; SSE2-NEXT: psraw $2, %xmm12418; SSE2-NEXT: movdqa %xmm0, %xmm22419; SSE2-NEXT: psraw $1, %xmm22420; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]2421; SSE2-NEXT: psrlw $15, %xmm02422; SSE2-NEXT: paddw %xmm2, %xmm02423; SSE2-NEXT: retq2424;2425; SSE41-LABEL: combine_vec_sdiv_nonuniform2:2426; SSE41: # %bb.0:2427; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [10923,10923,10923,10923,5243,5243,5243,5243]2428; SSE41-NEXT: movdqa %xmm0, %xmm12429; SSE41-NEXT: psraw $1, %xmm12430; SSE41-NEXT: movdqa %xmm0, %xmm22431; SSE41-NEXT: psraw $2, %xmm22432; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]2433; SSE41-NEXT: psrlw $15, %xmm02434; SSE41-NEXT: paddw %xmm2, %xmm02435; SSE41-NEXT: retq2436;2437; AVX1-LABEL: combine_vec_sdiv_nonuniform2:2438; AVX1: # %bb.0:2439; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [10923,10923,10923,10923,5243,5243,5243,5243]2440; AVX1-NEXT: vpsraw $1, %xmm0, %xmm12441; AVX1-NEXT: vpsraw $2, %xmm0, %xmm22442; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]2443; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm02444; AVX1-NEXT: vpaddw %xmm0, %xmm1, %xmm02445; AVX1-NEXT: retq2446;2447; AVX2-LABEL: combine_vec_sdiv_nonuniform2:2448; AVX2: # %bb.0:2449; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [10923,10923,10923,10923,5243,5243,5243,5243]2450; AVX2-NEXT: vpsraw $1, %xmm0, %xmm12451; AVX2-NEXT: vpsraw $2, %xmm0, %xmm22452; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3]2453; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm02454; AVX2-NEXT: vpaddw %xmm0, %xmm1, %xmm02455; AVX2-NEXT: retq2456;2457; AVX512F-LABEL: combine_vec_sdiv_nonuniform2:2458; AVX512F: # %bb.0:2459; AVX512F-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [10923,10923,10923,10923,5243,5243,5243,5243]2460; AVX512F-NEXT: vpsraw $1, %xmm0, %xmm12461; AVX512F-NEXT: vpsraw $2, %xmm0, %xmm22462; AVX512F-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3]2463; AVX512F-NEXT: vpsrlw $15, %xmm0, %xmm02464; AVX512F-NEXT: vpaddw %xmm0, %xmm1, %xmm02465; AVX512F-NEXT: retq2466;2467; AVX512BW-LABEL: combine_vec_sdiv_nonuniform2:2468; AVX512BW: # %bb.0:2469; AVX512BW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [10923,10923,10923,10923,5243,5243,5243,5243]2470; AVX512BW-NEXT: vpsrlw $15, %xmm0, %xmm12471; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02472; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm02473; AVX512BW-NEXT: retq2474;2475; XOP-LABEL: combine_vec_sdiv_nonuniform2:2476; XOP: # %bb.0:2477; XOP-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [10923,10923,10923,10923,5243,5243,5243,5243]2478; XOP-NEXT: vpsrlw $15, %xmm0, %xmm12479; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02480; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm02481; XOP-NEXT: retq2482 %1 = sdiv <8 x i16> %x, <i16 24, i16 24, i16 24, i16 24, i16 25, i16 25, i16 25, i16 25>2483 ret <8 x i16> %12484}2485 2486define <8 x i16> @combine_vec_sdiv_nonuniform3(<8 x i16> %x) {2487; SSE2-LABEL: combine_vec_sdiv_nonuniform3:2488; SSE2: # %bb.0:2489; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [45591,45591,45591,45591,32833,32833,32833,32833]2490; SSE2-NEXT: pmulhw %xmm0, %xmm12491; SSE2-NEXT: paddw %xmm1, %xmm02492; SSE2-NEXT: movdqa %xmm0, %xmm12493; SSE2-NEXT: psraw $4, %xmm12494; SSE2-NEXT: movdqa %xmm0, %xmm22495; SSE2-NEXT: psraw $8, %xmm22496; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]2497; SSE2-NEXT: psrlw $15, %xmm02498; SSE2-NEXT: paddw %xmm2, %xmm02499; SSE2-NEXT: retq2500;2501; SSE41-LABEL: combine_vec_sdiv_nonuniform3:2502; SSE41: # %bb.0:2503; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [45591,45591,45591,45591,32833,32833,32833,32833]2504; SSE41-NEXT: pmulhw %xmm0, %xmm12505; SSE41-NEXT: paddw %xmm1, %xmm02506; SSE41-NEXT: movdqa %xmm0, %xmm12507; SSE41-NEXT: psraw $8, %xmm12508; SSE41-NEXT: movdqa %xmm0, %xmm22509; SSE41-NEXT: psraw $4, %xmm22510; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]2511; SSE41-NEXT: psrlw $15, %xmm02512; SSE41-NEXT: paddw %xmm2, %xmm02513; SSE41-NEXT: retq2514;2515; AVX1-LABEL: combine_vec_sdiv_nonuniform3:2516; AVX1: # %bb.0:2517; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [45591,45591,45591,45591,32833,32833,32833,32833]2518; AVX1-NEXT: vpaddw %xmm0, %xmm1, %xmm02519; AVX1-NEXT: vpsraw $8, %xmm0, %xmm12520; AVX1-NEXT: vpsraw $4, %xmm0, %xmm22521; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]2522; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm02523; AVX1-NEXT: vpaddw %xmm0, %xmm1, %xmm02524; AVX1-NEXT: retq2525;2526; AVX2-LABEL: combine_vec_sdiv_nonuniform3:2527; AVX2: # %bb.0:2528; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [45591,45591,45591,45591,32833,32833,32833,32833]2529; AVX2-NEXT: vpaddw %xmm0, %xmm1, %xmm02530; AVX2-NEXT: vpsraw $8, %xmm0, %xmm12531; AVX2-NEXT: vpsraw $4, %xmm0, %xmm22532; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3]2533; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm02534; AVX2-NEXT: vpaddw %xmm0, %xmm1, %xmm02535; AVX2-NEXT: retq2536;2537; AVX512F-LABEL: combine_vec_sdiv_nonuniform3:2538; AVX512F: # %bb.0:2539; AVX512F-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [45591,45591,45591,45591,32833,32833,32833,32833]2540; AVX512F-NEXT: vpaddw %xmm0, %xmm1, %xmm02541; AVX512F-NEXT: vpsraw $8, %xmm0, %xmm12542; AVX512F-NEXT: vpsraw $4, %xmm0, %xmm22543; AVX512F-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3]2544; AVX512F-NEXT: vpsrlw $15, %xmm0, %xmm02545; AVX512F-NEXT: vpaddw %xmm0, %xmm1, %xmm02546; AVX512F-NEXT: retq2547;2548; AVX512BW-LABEL: combine_vec_sdiv_nonuniform3:2549; AVX512BW: # %bb.0:2550; AVX512BW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [45591,45591,45591,45591,32833,32833,32833,32833]2551; AVX512BW-NEXT: vpaddw %xmm0, %xmm1, %xmm02552; AVX512BW-NEXT: vpsrlw $15, %xmm0, %xmm12553; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02554; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm02555; AVX512BW-NEXT: retq2556;2557; XOP-LABEL: combine_vec_sdiv_nonuniform3:2558; XOP: # %bb.0:2559; XOP-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [45591,45591,45591,45591,32833,32833,32833,32833]2560; XOP-NEXT: vpaddw %xmm0, %xmm1, %xmm02561; XOP-NEXT: vpsrlw $15, %xmm0, %xmm12562; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02563; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm02564; XOP-NEXT: retq2565 %1 = sdiv <8 x i16> %x, <i16 23, i16 23, i16 23, i16 23, i16 511, i16 511, i16 511, i16 511>2566 ret <8 x i16> %12567}2568 2569define <8 x i16> @combine_vec_sdiv_nonuniform4(<8 x i16> %x) {2570; SSE2-LABEL: combine_vec_sdiv_nonuniform4:2571; SSE2: # %bb.0:2572; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [19945,19945,19945,19945,32639,32639,32639,32639]2573; SSE2-NEXT: pmulhw %xmm0, %xmm12574; SSE2-NEXT: psubw %xmm0, %xmm12575; SSE2-NEXT: movdqa %xmm1, %xmm02576; SSE2-NEXT: psraw $4, %xmm02577; SSE2-NEXT: movdqa %xmm1, %xmm22578; SSE2-NEXT: psraw $8, %xmm22579; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]2580; SSE2-NEXT: psrlw $15, %xmm12581; SSE2-NEXT: paddw %xmm2, %xmm12582; SSE2-NEXT: movdqa %xmm1, %xmm02583; SSE2-NEXT: retq2584;2585; SSE41-LABEL: combine_vec_sdiv_nonuniform4:2586; SSE41: # %bb.0:2587; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [19945,19945,19945,19945,32639,32639,32639,32639]2588; SSE41-NEXT: pmulhw %xmm0, %xmm12589; SSE41-NEXT: psubw %xmm0, %xmm12590; SSE41-NEXT: movdqa %xmm1, %xmm02591; SSE41-NEXT: psraw $8, %xmm02592; SSE41-NEXT: movdqa %xmm1, %xmm22593; SSE41-NEXT: psraw $4, %xmm22594; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm0[4,5,6,7]2595; SSE41-NEXT: psrlw $15, %xmm12596; SSE41-NEXT: paddw %xmm2, %xmm12597; SSE41-NEXT: movdqa %xmm1, %xmm02598; SSE41-NEXT: retq2599;2600; AVX1-LABEL: combine_vec_sdiv_nonuniform4:2601; AVX1: # %bb.0:2602; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [19945,19945,19945,19945,32639,32639,32639,32639]2603; AVX1-NEXT: vpsubw %xmm0, %xmm1, %xmm02604; AVX1-NEXT: vpsraw $8, %xmm0, %xmm12605; AVX1-NEXT: vpsraw $4, %xmm0, %xmm22606; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]2607; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm02608; AVX1-NEXT: vpaddw %xmm0, %xmm1, %xmm02609; AVX1-NEXT: retq2610;2611; AVX2-LABEL: combine_vec_sdiv_nonuniform4:2612; AVX2: # %bb.0:2613; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [19945,19945,19945,19945,32639,32639,32639,32639]2614; AVX2-NEXT: vpsubw %xmm0, %xmm1, %xmm02615; AVX2-NEXT: vpsraw $8, %xmm0, %xmm12616; AVX2-NEXT: vpsraw $4, %xmm0, %xmm22617; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3]2618; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm02619; AVX2-NEXT: vpaddw %xmm0, %xmm1, %xmm02620; AVX2-NEXT: retq2621;2622; AVX512F-LABEL: combine_vec_sdiv_nonuniform4:2623; AVX512F: # %bb.0:2624; AVX512F-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [19945,19945,19945,19945,32639,32639,32639,32639]2625; AVX512F-NEXT: vpsubw %xmm0, %xmm1, %xmm02626; AVX512F-NEXT: vpsraw $8, %xmm0, %xmm12627; AVX512F-NEXT: vpsraw $4, %xmm0, %xmm22628; AVX512F-NEXT: vpblendd {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3]2629; AVX512F-NEXT: vpsrlw $15, %xmm0, %xmm02630; AVX512F-NEXT: vpaddw %xmm0, %xmm1, %xmm02631; AVX512F-NEXT: retq2632;2633; AVX512BW-LABEL: combine_vec_sdiv_nonuniform4:2634; AVX512BW: # %bb.0:2635; AVX512BW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [19945,19945,19945,19945,32639,32639,32639,32639]2636; AVX512BW-NEXT: vpsubw %xmm0, %xmm1, %xmm02637; AVX512BW-NEXT: vpsrlw $15, %xmm0, %xmm12638; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02639; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm02640; AVX512BW-NEXT: retq2641;2642; XOP-LABEL: combine_vec_sdiv_nonuniform4:2643; XOP: # %bb.0:2644; XOP-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [19945,19945,19945,19945,32639,32639,32639,32639]2645; XOP-NEXT: vpsubw %xmm0, %xmm1, %xmm02646; XOP-NEXT: vpsrlw $15, %xmm0, %xmm12647; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02648; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm02649; XOP-NEXT: retq2650 %1 = sdiv <8 x i16> %x, <i16 -23, i16 -23, i16 -23, i16 -23, i16 -510, i16 -510, i16 -510, i16 -510>2651 ret <8 x i16> %12652}2653 2654define <8 x i16> @combine_vec_sdiv_nonuniform5(<8 x i16> %x) {2655; SSE2-LABEL: combine_vec_sdiv_nonuniform5:2656; SSE2: # %bb.0:2657; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [32639,54613,19945,21846,2979,5243,32897,32833]2658; SSE2-NEXT: pmulhw %xmm0, %xmm12659; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [0,65535,65535,65535,65535,65535,65535,0]2660; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [65535,0,65535,0,0,0,1,1]2661; SSE2-NEXT: paddw %xmm1, %xmm02662; SSE2-NEXT: pand %xmm2, %xmm12663; SSE2-NEXT: movdqa %xmm0, %xmm32664; SSE2-NEXT: psraw $8, %xmm32665; SSE2-NEXT: pandn %xmm3, %xmm22666; SSE2-NEXT: por %xmm1, %xmm22667; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,0,65535,65535,65535,0,65535]2668; SSE2-NEXT: pand %xmm1, %xmm22669; SSE2-NEXT: movdqa %xmm0, %xmm32670; SSE2-NEXT: psraw $4, %xmm32671; SSE2-NEXT: pandn %xmm3, %xmm12672; SSE2-NEXT: por %xmm2, %xmm12673; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,65535,65535,0,65535]2674; SSE2-NEXT: movdqa %xmm1, %xmm32675; SSE2-NEXT: pand %xmm2, %xmm32676; SSE2-NEXT: psraw $2, %xmm12677; SSE2-NEXT: pandn %xmm1, %xmm22678; SSE2-NEXT: por %xmm3, %xmm22679; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535,65535,0,0,65535]2680; SSE2-NEXT: movdqa %xmm2, %xmm32681; SSE2-NEXT: pand %xmm1, %xmm32682; SSE2-NEXT: psraw $1, %xmm22683; SSE2-NEXT: pandn %xmm2, %xmm12684; SSE2-NEXT: por %xmm3, %xmm12685; SSE2-NEXT: psrlw $15, %xmm02686; SSE2-NEXT: paddw %xmm1, %xmm02687; SSE2-NEXT: retq2688;2689; SSE41-LABEL: combine_vec_sdiv_nonuniform5:2690; SSE41: # %bb.0:2691; SSE41-NEXT: pmovsxbw {{.*#+}} xmm1 = [65535,0,65535,0,0,0,1,1]2692; SSE41-NEXT: pmullw %xmm0, %xmm12693; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [32639,54613,19945,21846,2979,5243,32897,32833]2694; SSE41-NEXT: paddw %xmm0, %xmm12695; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [256,16384,4096,u,u,u,512,256]2696; SSE41-NEXT: pmulhw %xmm1, %xmm22697; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2],xmm0[3,4],xmm2[5,6,7]2698; SSE41-NEXT: psraw $1, %xmm02699; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3,4],xmm0[5],xmm2[6,7]2700; SSE41-NEXT: psrlw $15, %xmm12701; SSE41-NEXT: paddw %xmm1, %xmm02702; SSE41-NEXT: retq2703;2704; AVX1-LABEL: combine_vec_sdiv_nonuniform5:2705; AVX1: # %bb.0:2706; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,0,65535,0,0,0,1,1]2707; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32639,54613,19945,21846,2979,5243,32897,32833]2708; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm12709; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2 # [256,16384,4096,u,u,u,512,256]2710; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2],xmm0[3,4],xmm2[5,6,7]2711; AVX1-NEXT: vpsraw $1, %xmm0, %xmm02712; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3,4],xmm0[5],xmm2[6,7]2713; AVX1-NEXT: vpsrlw $15, %xmm1, %xmm12714; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm02715; AVX1-NEXT: retq2716;2717; AVX2-LABEL: combine_vec_sdiv_nonuniform5:2718; AVX2: # %bb.0:2719; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,0,65535,0,0,0,1,1]2720; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32639,54613,19945,21846,2979,5243,32897,32833]2721; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm12722; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2 # [256,16384,4096,u,u,u,512,256]2723; AVX2-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2],xmm0[3,4],xmm2[5,6,7]2724; AVX2-NEXT: vpsraw $1, %xmm0, %xmm02725; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3,4],xmm0[5],xmm2[6,7]2726; AVX2-NEXT: vpsrlw $15, %xmm1, %xmm12727; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm02728; AVX2-NEXT: retq2729;2730; AVX512F-LABEL: combine_vec_sdiv_nonuniform5:2731; AVX512F: # %bb.0:2732; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,0,65535,0,0,0,1,1]2733; AVX512F-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32639,54613,19945,21846,2979,5243,32897,32833]2734; AVX512F-NEXT: vpaddw %xmm1, %xmm0, %xmm02735; AVX512F-NEXT: vpsrlw $15, %xmm0, %xmm12736; AVX512F-NEXT: vpmovsxwd %xmm0, %ymm02737; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02738; AVX512F-NEXT: vpmovdw %zmm0, %ymm02739; AVX512F-NEXT: vpaddw %xmm1, %xmm0, %xmm02740; AVX512F-NEXT: vzeroupper2741; AVX512F-NEXT: retq2742;2743; AVX512BW-LABEL: combine_vec_sdiv_nonuniform5:2744; AVX512BW: # %bb.0:2745; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,0,65535,0,0,0,1,1]2746; AVX512BW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32639,54613,19945,21846,2979,5243,32897,32833]2747; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm02748; AVX512BW-NEXT: vpsrlw $15, %xmm0, %xmm12749; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02750; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm02751; AVX512BW-NEXT: retq2752;2753; XOP-LABEL: combine_vec_sdiv_nonuniform5:2754; XOP: # %bb.0:2755; XOP-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [32639,54613,19945,21846,2979,5243,32897,32833]2756; XOP-NEXT: vpmacsww %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02757; XOP-NEXT: vpsrlw $15, %xmm0, %xmm12758; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02759; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm02760; XOP-NEXT: retq2761 %1 = sdiv <8 x i16> %x, <i16 -510, i16 -24, i16 -23, i16 3, i16 22, i16 25, i16 255, i16 511>2762 ret <8 x i16> %12763}2764 2765define <8 x i16> @combine_vec_sdiv_nonuniform6(<8 x i16> %x) {2766; SSE2-LABEL: combine_vec_sdiv_nonuniform6:2767; SSE2: # %bb.0:2768; SSE2-NEXT: movdqa %xmm0, %xmm12769; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [65535,65535,65535,65535,1,1,1,0]2770; SSE2-NEXT: pmullw %xmm1, %xmm02771; SSE2-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32767,32767,32703,0,0,32897,32769,16385]2772; SSE2-NEXT: paddw %xmm1, %xmm02773; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,0,0,0,65535,65535]2774; SSE2-NEXT: movdqa %xmm0, %xmm32775; SSE2-NEXT: psraw $8, %xmm32776; SSE2-NEXT: pand %xmm2, %xmm32777; SSE2-NEXT: pandn %xmm0, %xmm22778; SSE2-NEXT: por %xmm3, %xmm22779; SSE2-NEXT: movdqa %xmm2, %xmm32780; SSE2-NEXT: psraw $6, %xmm32781; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [0,65535,65535,65535,65535,0,65535,65535]2782; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [0,65535,65535,65535,65535,0,65535,0]2783; SSE2-NEXT: pand %xmm5, %xmm22784; SSE2-NEXT: psraw $12, %xmm12785; SSE2-NEXT: pandn %xmm1, %xmm52786; SSE2-NEXT: por %xmm2, %xmm52787; SSE2-NEXT: pand %xmm4, %xmm52788; SSE2-NEXT: pandn %xmm3, %xmm42789; SSE2-NEXT: por %xmm5, %xmm42790; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535,65535,0,65535,0]2791; SSE2-NEXT: movdqa %xmm4, %xmm22792; SSE2-NEXT: pand %xmm1, %xmm22793; SSE2-NEXT: psraw $1, %xmm42794; SSE2-NEXT: pandn %xmm4, %xmm12795; SSE2-NEXT: por %xmm2, %xmm12796; SSE2-NEXT: psrlw $15, %xmm02797; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02798; SSE2-NEXT: paddw %xmm1, %xmm02799; SSE2-NEXT: retq2800;2801; SSE41-LABEL: combine_vec_sdiv_nonuniform6:2802; SSE41: # %bb.0:2803; SSE41-NEXT: pmovsxbw {{.*#+}} xmm1 = [65535,65535,65535,65535,1,1,1,0]2804; SSE41-NEXT: pmullw %xmm0, %xmm12805; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [32767,32767,32703,0,0,32897,32769,16385]2806; SSE41-NEXT: paddw %xmm1, %xmm02807; SSE41-NEXT: movdqa %xmm0, %xmm22808; SSE41-NEXT: psrlw $15, %xmm22809; SSE41-NEXT: pxor %xmm3, %xmm32810; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1,2],xmm3[3,4],xmm2[5,6,7]2811; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [4,256,256,u,u,512,256,8]2812; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3,4],xmm0[5,6,7]2813; SSE41-NEXT: paddw %xmm3, %xmm02814; SSE41-NEXT: retq2815;2816; AVX1-LABEL: combine_vec_sdiv_nonuniform6:2817; AVX1: # %bb.0:2818; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,65535,65535,65535,1,1,1,0]2819; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32767,32767,32703,0,0,32897,32769,16385]2820; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm02821; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm22822; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm32823; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[3,4],xmm2[5,6,7]2824; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [4,256,256,u,u,512,256,8]2825; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3,4],xmm0[5,6,7]2826; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm02827; AVX1-NEXT: retq2828;2829; AVX2-LABEL: combine_vec_sdiv_nonuniform6:2830; AVX2: # %bb.0:2831; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,65535,65535,65535,1,1,1,0]2832; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32767,32767,32703,0,0,32897,32769,16385]2833; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm02834; AVX2-NEXT: vpsrlw $15, %xmm0, %xmm22835; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm32836; AVX2-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2],xmm3[3,4],xmm2[5,6,7]2837; AVX2-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [4,256,256,u,u,512,256,8]2838; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3,4],xmm0[5,6,7]2839; AVX2-NEXT: vpaddw %xmm2, %xmm0, %xmm02840; AVX2-NEXT: retq2841;2842; AVX512F-LABEL: combine_vec_sdiv_nonuniform6:2843; AVX512F: # %bb.0:2844; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,65535,65535,65535,1,1,1,0]2845; AVX512F-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32767,32767,32703,0,0,32897,32769,16385]2846; AVX512F-NEXT: vpaddw %xmm1, %xmm0, %xmm02847; AVX512F-NEXT: vpsrlw $15, %xmm0, %xmm12848; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm22849; AVX512F-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[3,4],xmm1[5,6,7]2850; AVX512F-NEXT: vpmovsxwd %xmm0, %ymm02851; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02852; AVX512F-NEXT: vpmovdw %zmm0, %ymm02853; AVX512F-NEXT: vpaddw %xmm1, %xmm0, %xmm02854; AVX512F-NEXT: vzeroupper2855; AVX512F-NEXT: retq2856;2857; AVX512BW-LABEL: combine_vec_sdiv_nonuniform6:2858; AVX512BW: # %bb.0:2859; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [65535,65535,65535,65535,1,1,1,0]2860; AVX512BW-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32767,32767,32703,0,0,32897,32769,16385]2861; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm02862; AVX512BW-NEXT: vpsrlw $15, %xmm0, %xmm12863; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm22864; AVX512BW-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[3,4],xmm1[5,6,7]2865; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02866; AVX512BW-NEXT: vpaddw %xmm1, %xmm0, %xmm02867; AVX512BW-NEXT: retq2868;2869; XOP-LABEL: combine_vec_sdiv_nonuniform6:2870; XOP: # %bb.0:2871; XOP-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [32767,32767,32703,0,0,32897,32769,16385]2872; XOP-NEXT: vpmacsww %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02873; XOP-NEXT: vpsrlw $15, %xmm0, %xmm12874; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm22875; XOP-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[3,4],xmm1[5,6,7]2876; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02877; XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm02878; XOP-NEXT: retq2879 %1 = sdiv <8 x i16> %x, <i16 -32768, i16 -512, i16 -511, i16 -1, i16 1, i16 255, i16 512, i16 32767>2880 ret <8 x i16> %12881}2882 2883define <8 x i16> @combine_vec_sdiv_nonuniform7(<8 x i16> %x) {2884; SSE2-LABEL: combine_vec_sdiv_nonuniform7:2885; SSE2: # %bb.0:2886; SSE2-NEXT: pxor %xmm1, %xmm12887; SSE2-NEXT: psubw %xmm0, %xmm12888; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]2889; SSE2-NEXT: retq2890;2891; SSE41-LABEL: combine_vec_sdiv_nonuniform7:2892; SSE41: # %bb.0:2893; SSE41-NEXT: pxor %xmm1, %xmm12894; SSE41-NEXT: psubw %xmm0, %xmm12895; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]2896; SSE41-NEXT: retq2897;2898; AVX1-LABEL: combine_vec_sdiv_nonuniform7:2899; AVX1: # %bb.0:2900; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12901; AVX1-NEXT: vpsubw %xmm0, %xmm1, %xmm12902; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]2903; AVX1-NEXT: retq2904;2905; AVX2ORLATER-LABEL: combine_vec_sdiv_nonuniform7:2906; AVX2ORLATER: # %bb.0:2907; AVX2ORLATER-NEXT: vpxor %xmm1, %xmm1, %xmm12908; AVX2ORLATER-NEXT: vpsubw %xmm0, %xmm1, %xmm12909; AVX2ORLATER-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]2910; AVX2ORLATER-NEXT: retq2911;2912; XOP-LABEL: combine_vec_sdiv_nonuniform7:2913; XOP: # %bb.0:2914; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm12915; XOP-NEXT: vpsubw %xmm0, %xmm1, %xmm12916; XOP-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]2917; XOP-NEXT: retq2918 %1 = sdiv <8 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 1, i16 1, i16 1, i16 1>2919 ret <8 x i16> %12920}2921 2922define <16 x i8> @pr38658(<16 x i8> %x) {2923; SSE2-LABEL: pr38658:2924; SSE2: # %bb.0:2925; SSE2-NEXT: pxor %xmm1, %xmm12926; SSE2-NEXT: movdqa %xmm0, %xmm22927; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]2928; SSE2-NEXT: pxor %xmm3, %xmm32929; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]2930; SSE2-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147]2931; SSE2-NEXT: psrlw $8, %xmm32932; SSE2-NEXT: packuswb %xmm3, %xmm12933; SSE2-NEXT: paddb %xmm1, %xmm02934; SSE2-NEXT: movdqa %xmm0, %xmm12935; 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]2936; SSE2-NEXT: psraw $8, %xmm12937; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [256,256,256,256,256,256,256,64]2938; SSE2-NEXT: psrlw $8, %xmm12939; SSE2-NEXT: packuswb %xmm1, %xmm22940; SSE2-NEXT: psrlw $7, %xmm02941; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02942; SSE2-NEXT: paddb %xmm2, %xmm02943; SSE2-NEXT: retq2944;2945; SSE41-LABEL: pr38658:2946; SSE41: # %bb.0:2947; SSE41-NEXT: pxor %xmm1, %xmm12948; SSE41-NEXT: pxor %xmm2, %xmm22949; 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]2950; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147]2951; SSE41-NEXT: psrlw $8, %xmm22952; SSE41-NEXT: packuswb %xmm2, %xmm12953; SSE41-NEXT: paddb %xmm0, %xmm12954; SSE41-NEXT: movdqa %xmm1, %xmm22955; SSE41-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]2956; SSE41-NEXT: psraw $8, %xmm22957; SSE41-NEXT: movdqa %xmm2, %xmm32958; SSE41-NEXT: psllw $6, %xmm32959; SSE41-NEXT: psllw $8, %xmm22960; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,5,6],xmm3[7]2961; SSE41-NEXT: psrlw $8, %xmm22962; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2963; SSE41-NEXT: packuswb %xmm2, %xmm02964; SSE41-NEXT: psrlw $7, %xmm12965; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12966; SSE41-NEXT: paddb %xmm0, %xmm12967; SSE41-NEXT: movdqa %xmm1, %xmm02968; SSE41-NEXT: retq2969;2970; AVX1-LABEL: pr38658:2971; AVX1: # %bb.0:2972; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12973; 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]2974; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147]2975; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm22976; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm12977; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm12978; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]2979; AVX1-NEXT: vpsraw $8, %xmm2, %xmm22980; AVX1-NEXT: vpsllw $6, %xmm2, %xmm32981; AVX1-NEXT: vpsllw $8, %xmm2, %xmm22982; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,5,6],xmm3[7]2983; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm22984; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2985; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm02986; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm12987; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12988; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm02989; AVX1-NEXT: retq2990;2991; AVX2-LABEL: pr38658:2992; AVX2: # %bb.0:2993; AVX2-NEXT: vpmovsxbw %xmm0, %ymm12994; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65427]2995; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm12996; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22997; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm12998; AVX2-NEXT: vpaddb %xmm0, %xmm1, %xmm02999; AVX2-NEXT: vpmovsxbw %xmm0, %ymm13000; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,64]3001; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm13002; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm23003; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm13004; AVX2-NEXT: vpsrlw $7, %xmm0, %xmm03005; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03006; AVX2-NEXT: vpaddb %xmm0, %xmm1, %xmm03007; AVX2-NEXT: vzeroupper3008; AVX2-NEXT: retq3009;3010; AVX512F-LABEL: pr38658:3011; AVX512F: # %bb.0:3012; AVX512F-NEXT: vpmovsxbw %xmm0, %ymm13013; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65427]3014; AVX512F-NEXT: vpsrlw $8, %ymm1, %ymm13015; AVX512F-NEXT: vpmovzxwd {{.*#+}} 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],zero3016; AVX512F-NEXT: vpmovdb %zmm1, %xmm13017; AVX512F-NEXT: vpaddb %xmm0, %xmm1, %xmm03018; AVX512F-NEXT: vpsrlw $7, %xmm0, %xmm13019; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm13020; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm03021; AVX512F-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm03022; AVX512F-NEXT: vpmovdb %zmm0, %xmm03023; AVX512F-NEXT: vpaddb %xmm1, %xmm0, %xmm03024; AVX512F-NEXT: vzeroupper3025; AVX512F-NEXT: retq3026;3027; AVX512BW-LABEL: pr38658:3028; AVX512BW: # %bb.0:3029; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm13030; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65427]3031; AVX512BW-NEXT: vpsrlw $8, %ymm1, %ymm13032; AVX512BW-NEXT: vpmovwb %ymm1, %xmm13033; AVX512BW-NEXT: vpaddb %xmm0, %xmm1, %xmm03034; AVX512BW-NEXT: vpsrlw $7, %xmm0, %xmm13035; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm13036; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm03037; AVX512BW-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03038; AVX512BW-NEXT: vpmovwb %ymm0, %xmm03039; AVX512BW-NEXT: vpaddb %xmm1, %xmm0, %xmm03040; AVX512BW-NEXT: vzeroupper3041; AVX512BW-NEXT: retq3042;3043; XOP-LABEL: pr38658:3044; XOP: # %bb.0:3045; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm13046; XOP-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]3047; XOP-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,147]3048; XOP-NEXT: vpperm {{.*#+}} xmm1 = xmm1[1,3,5,7,9,11,13,15],xmm2[1,3,5,7,9,11,13,15]3049; XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm03050; XOP-NEXT: vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm13051; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03052; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03053; XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm03054; XOP-NEXT: retq3055 %1 = sdiv <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 7>3056 ret <16 x i8> %13057}3058 3059define i1 @bool_sdiv(i1 %x, i1 %y) {3060; CHECK-LABEL: bool_sdiv:3061; CHECK: # %bb.0:3062; CHECK-NEXT: movl %edi, %eax3063; CHECK-NEXT: # kill: def $al killed $al killed $eax3064; CHECK-NEXT: retq3065 %r = sdiv i1 %x, %y3066 ret i1 %r3067}3068 3069define <4 x i1> @boolvec_sdiv(<4 x i1> %x, <4 x i1> %y) {3070; CHECK-LABEL: boolvec_sdiv:3071; CHECK: # %bb.0:3072; CHECK-NEXT: retq3073 %r = sdiv <4 x i1> %x, %y3074 ret <4 x i1> %r3075}3076 3077define i32 @combine_sdiv_two(i32 %x) {3078; CHECK-LABEL: combine_sdiv_two:3079; CHECK: # %bb.0:3080; CHECK-NEXT: movl %edi, %eax3081; CHECK-NEXT: shrl $31, %eax3082; CHECK-NEXT: addl %edi, %eax3083; CHECK-NEXT: sarl %eax3084; CHECK-NEXT: retq3085 %1 = sdiv i32 %x, 23086 ret i32 %13087}3088 3089define i32 @combine_sdiv_negtwo(i32 %x) {3090; CHECK-LABEL: combine_sdiv_negtwo:3091; CHECK: # %bb.0:3092; CHECK-NEXT: movl %edi, %eax3093; CHECK-NEXT: shrl $31, %eax3094; CHECK-NEXT: addl %edi, %eax3095; CHECK-NEXT: sarl %eax3096; CHECK-NEXT: negl %eax3097; CHECK-NEXT: retq3098 %1 = sdiv i32 %x, -23099 ret i32 %13100}3101 3102define i8 @combine_i8_sdiv_pow2(i8 %x) {3103; CHECK-LABEL: combine_i8_sdiv_pow2:3104; CHECK: # %bb.0:3105; CHECK-NEXT: movl %edi, %eax3106; CHECK-NEXT: sarb $7, %al3107; CHECK-NEXT: shrb $4, %al3108; CHECK-NEXT: addb %dil, %al3109; CHECK-NEXT: sarb $4, %al3110; CHECK-NEXT: retq3111 %1 = sdiv i8 %x, 163112 ret i8 %13113}3114 3115define i8 @combine_i8_sdiv_negpow2(i8 %x) {3116; CHECK-LABEL: combine_i8_sdiv_negpow2:3117; CHECK: # %bb.0:3118; CHECK-NEXT: movl %edi, %eax3119; CHECK-NEXT: sarb $7, %al3120; CHECK-NEXT: shrb $2, %al3121; CHECK-NEXT: addb %dil, %al3122; CHECK-NEXT: sarb $6, %al3123; CHECK-NEXT: negb %al3124; CHECK-NEXT: retq3125 %1 = sdiv i8 %x, -643126 ret i8 %13127}3128 3129define i16 @combine_i16_sdiv_pow2(i16 %x) {3130; CHECK-LABEL: combine_i16_sdiv_pow2:3131; CHECK: # %bb.0:3132; CHECK-NEXT: # kill: def $edi killed $edi def $rdi3133; CHECK-NEXT: leal 15(%rdi), %eax3134; CHECK-NEXT: testw %di, %di3135; CHECK-NEXT: cmovnsl %edi, %eax3136; CHECK-NEXT: cwtl3137; CHECK-NEXT: shrl $4, %eax3138; CHECK-NEXT: # kill: def $ax killed $ax killed $eax3139; CHECK-NEXT: retq3140 %1 = sdiv i16 %x, 163141 ret i16 %13142}3143 3144define i16 @combine_i16_sdiv_negpow2(i16 %x) {3145; CHECK-LABEL: combine_i16_sdiv_negpow2:3146; CHECK: # %bb.0:3147; CHECK-NEXT: # kill: def $edi killed $edi def $rdi3148; CHECK-NEXT: leal 255(%rdi), %eax3149; CHECK-NEXT: testw %di, %di3150; CHECK-NEXT: cmovnsl %edi, %eax3151; CHECK-NEXT: cwtl3152; CHECK-NEXT: sarl $8, %eax3153; CHECK-NEXT: negl %eax3154; CHECK-NEXT: # kill: def $ax killed $ax killed $eax3155; CHECK-NEXT: retq3156 %1 = sdiv i16 %x, -2563157 ret i16 %13158}3159 3160define i32 @combine_i32_sdiv_pow2(i32 %x) {3161; CHECK-LABEL: combine_i32_sdiv_pow2:3162; CHECK: # %bb.0:3163; CHECK-NEXT: # kill: def $edi killed $edi def $rdi3164; CHECK-NEXT: leal 15(%rdi), %eax3165; CHECK-NEXT: testl %edi, %edi3166; CHECK-NEXT: cmovnsl %edi, %eax3167; CHECK-NEXT: sarl $4, %eax3168; CHECK-NEXT: retq3169 %1 = sdiv i32 %x, 163170 ret i32 %13171}3172 3173define i32 @combine_i32_sdiv_negpow2(i32 %x) {3174; CHECK-LABEL: combine_i32_sdiv_negpow2:3175; CHECK: # %bb.0:3176; CHECK-NEXT: # kill: def $edi killed $edi def $rdi3177; CHECK-NEXT: leal 255(%rdi), %eax3178; CHECK-NEXT: testl %edi, %edi3179; CHECK-NEXT: cmovnsl %edi, %eax3180; CHECK-NEXT: sarl $8, %eax3181; CHECK-NEXT: negl %eax3182; CHECK-NEXT: retq3183 %1 = sdiv i32 %x, -2563184 ret i32 %13185}3186 3187define i64 @combine_i64_sdiv_pow2(i64 %x) {3188; CHECK-LABEL: combine_i64_sdiv_pow2:3189; CHECK: # %bb.0:3190; CHECK-NEXT: leaq 15(%rdi), %rax3191; CHECK-NEXT: testq %rdi, %rdi3192; CHECK-NEXT: cmovnsq %rdi, %rax3193; CHECK-NEXT: sarq $4, %rax3194; CHECK-NEXT: retq3195 %1 = sdiv i64 %x, 163196 ret i64 %13197}3198 3199define i64 @combine_i64_sdiv_negpow2(i64 %x) {3200; CHECK-LABEL: combine_i64_sdiv_negpow2:3201; CHECK: # %bb.0:3202; CHECK-NEXT: leaq 255(%rdi), %rax3203; CHECK-NEXT: testq %rdi, %rdi3204; CHECK-NEXT: cmovnsq %rdi, %rax3205; CHECK-NEXT: sarq $8, %rax3206; CHECK-NEXT: negq %rax3207; CHECK-NEXT: retq3208 %1 = sdiv i64 %x, -2563209 ret i64 %13210}3211