538 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X864 5define void @test_udiv7_v2i32(ptr %x, ptr %y) nounwind {6; X64-LABEL: test_udiv7_v2i32:7; X64: # %bb.0:8; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero9; X64-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]10; X64-NEXT: movdqa %xmm0, %xmm211; X64-NEXT: pmuludq %xmm1, %xmm212; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]13; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]14; X64-NEXT: pmuludq %xmm1, %xmm315; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]16; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]17; X64-NEXT: psubd %xmm2, %xmm018; X64-NEXT: psrld $1, %xmm019; X64-NEXT: paddd %xmm2, %xmm020; X64-NEXT: psrld $2, %xmm021; X64-NEXT: movq %xmm0, (%rsi)22; X64-NEXT: retq23;24; X86-LABEL: test_udiv7_v2i32:25; X86: # %bb.0:26; X86-NEXT: movl {{[0-9]+}}(%esp), %eax27; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx28; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero29; X86-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]30; X86-NEXT: movdqa %xmm0, %xmm231; X86-NEXT: pmuludq %xmm1, %xmm232; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]33; X86-NEXT: movdqa %xmm0, %xmm334; X86-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,1,1]35; X86-NEXT: pmuludq %xmm1, %xmm336; X86-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]37; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]38; X86-NEXT: psubd %xmm2, %xmm039; X86-NEXT: psrld $1, %xmm040; X86-NEXT: paddd %xmm2, %xmm041; X86-NEXT: psrld $2, %xmm042; X86-NEXT: movq %xmm0, (%eax)43; X86-NEXT: retl44 %a = load <2 x i32>, ptr %x45 %b = udiv <2 x i32> %a, <i32 7, i32 7>46 store <2 x i32> %b, ptr %y47 ret void48}49 50define void @test_urem7_v2i32(ptr %x, ptr %y) nounwind {51; X64-LABEL: test_urem7_v2i32:52; X64: # %bb.0:53; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero54; X64-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]55; X64-NEXT: movdqa %xmm0, %xmm256; X64-NEXT: pmuludq %xmm1, %xmm257; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]58; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]59; X64-NEXT: pmuludq %xmm1, %xmm360; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]61; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]62; X64-NEXT: movdqa %xmm0, %xmm163; X64-NEXT: psubd %xmm2, %xmm164; X64-NEXT: psrld $1, %xmm165; X64-NEXT: paddd %xmm2, %xmm166; X64-NEXT: psrld $2, %xmm167; X64-NEXT: movdqa %xmm1, %xmm268; X64-NEXT: pslld $3, %xmm269; X64-NEXT: psubd %xmm2, %xmm170; X64-NEXT: paddd %xmm0, %xmm171; X64-NEXT: movq %xmm1, (%rsi)72; X64-NEXT: retq73;74; X86-LABEL: test_urem7_v2i32:75; X86: # %bb.0:76; X86-NEXT: movl {{[0-9]+}}(%esp), %eax77; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx78; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero79; X86-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]80; X86-NEXT: movdqa %xmm0, %xmm281; X86-NEXT: pmuludq %xmm1, %xmm282; X86-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]83; X86-NEXT: movdqa %xmm0, %xmm384; X86-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,1,1]85; X86-NEXT: pmuludq %xmm1, %xmm386; X86-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]87; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]88; X86-NEXT: movdqa %xmm0, %xmm189; X86-NEXT: psubd %xmm2, %xmm190; X86-NEXT: psrld $1, %xmm191; X86-NEXT: paddd %xmm2, %xmm192; X86-NEXT: psrld $2, %xmm193; X86-NEXT: movdqa %xmm1, %xmm294; X86-NEXT: pslld $3, %xmm295; X86-NEXT: psubd %xmm2, %xmm196; X86-NEXT: paddd %xmm0, %xmm197; X86-NEXT: movq %xmm1, (%eax)98; X86-NEXT: retl99 %a = load <2 x i32>, ptr %x100 %b = urem <2 x i32> %a, <i32 7, i32 7>101 store <2 x i32> %b, ptr %y102 ret void103}104 105define void @test_sdiv7_v2i32(ptr %x, ptr %y) nounwind {106; X64-LABEL: test_sdiv7_v2i32:107; X64: # %bb.0:108; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero109; X64-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]110; X64-NEXT: movdqa %xmm0, %xmm2111; X64-NEXT: pmuludq %xmm1, %xmm2112; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]113; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]114; X64-NEXT: pmuludq %xmm1, %xmm3115; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]116; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]117; X64-NEXT: pxor %xmm3, %xmm3118; X64-NEXT: pcmpgtd %xmm0, %xmm3119; X64-NEXT: pand %xmm1, %xmm3120; X64-NEXT: paddd %xmm0, %xmm3121; X64-NEXT: psubd %xmm3, %xmm2122; X64-NEXT: paddd %xmm0, %xmm2123; X64-NEXT: movdqa %xmm2, %xmm0124; X64-NEXT: psrld $31, %xmm0125; X64-NEXT: psrad $2, %xmm2126; X64-NEXT: paddd %xmm0, %xmm2127; X64-NEXT: movq %xmm2, (%rsi)128; X64-NEXT: retq129;130; X86-LABEL: test_sdiv7_v2i32:131; X86: # %bb.0:132; X86-NEXT: movl {{[0-9]+}}(%esp), %eax133; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx134; X86-NEXT: movq {{.*#+}} xmm1 = mem[0],zero135; X86-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]136; X86-NEXT: movdqa %xmm1, %xmm0137; X86-NEXT: pmuludq %xmm2, %xmm0138; X86-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]139; X86-NEXT: movdqa %xmm1, %xmm3140; X86-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,1,1]141; X86-NEXT: pmuludq %xmm2, %xmm3142; X86-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]143; X86-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]144; X86-NEXT: pxor %xmm3, %xmm3145; X86-NEXT: pcmpgtd %xmm1, %xmm3146; X86-NEXT: pand %xmm2, %xmm3147; X86-NEXT: paddd %xmm1, %xmm3148; X86-NEXT: psubd %xmm3, %xmm0149; X86-NEXT: paddd %xmm1, %xmm0150; X86-NEXT: movdqa %xmm0, %xmm1151; X86-NEXT: psrld $31, %xmm1152; X86-NEXT: psrad $2, %xmm0153; X86-NEXT: paddd %xmm1, %xmm0154; X86-NEXT: movq %xmm0, (%eax)155; X86-NEXT: retl156 %a = load <2 x i32>, ptr %x157 %b = sdiv <2 x i32> %a, <i32 7, i32 7>158 store <2 x i32> %b, ptr %y159 ret void160}161 162define void @test_srem7_v2i32(ptr %x, ptr %y) nounwind {163; X64-LABEL: test_srem7_v2i32:164; X64: # %bb.0:165; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero166; X64-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]167; X64-NEXT: movdqa %xmm0, %xmm2168; X64-NEXT: pmuludq %xmm1, %xmm2169; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]170; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]171; X64-NEXT: pmuludq %xmm1, %xmm3172; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]173; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]174; X64-NEXT: pxor %xmm3, %xmm3175; X64-NEXT: pcmpgtd %xmm0, %xmm3176; X64-NEXT: pand %xmm1, %xmm3177; X64-NEXT: paddd %xmm0, %xmm3178; X64-NEXT: psubd %xmm3, %xmm2179; X64-NEXT: paddd %xmm0, %xmm2180; X64-NEXT: movdqa %xmm2, %xmm1181; X64-NEXT: psrld $31, %xmm1182; X64-NEXT: psrad $2, %xmm2183; X64-NEXT: paddd %xmm1, %xmm2184; X64-NEXT: movdqa %xmm2, %xmm1185; X64-NEXT: pslld $3, %xmm1186; X64-NEXT: psubd %xmm1, %xmm2187; X64-NEXT: paddd %xmm0, %xmm2188; X64-NEXT: movq %xmm2, (%rsi)189; X64-NEXT: retq190;191; X86-LABEL: test_srem7_v2i32:192; X86: # %bb.0:193; X86-NEXT: movl {{[0-9]+}}(%esp), %eax194; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx195; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero196; X86-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]197; X86-NEXT: movdqa %xmm0, %xmm1198; X86-NEXT: pmuludq %xmm2, %xmm1199; X86-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]200; X86-NEXT: movdqa %xmm0, %xmm3201; X86-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,1,1]202; X86-NEXT: pmuludq %xmm2, %xmm3203; X86-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]204; X86-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]205; X86-NEXT: pxor %xmm3, %xmm3206; X86-NEXT: pcmpgtd %xmm0, %xmm3207; X86-NEXT: pand %xmm2, %xmm3208; X86-NEXT: paddd %xmm0, %xmm3209; X86-NEXT: psubd %xmm3, %xmm1210; X86-NEXT: paddd %xmm0, %xmm1211; X86-NEXT: movdqa %xmm1, %xmm2212; X86-NEXT: psrld $31, %xmm2213; X86-NEXT: psrad $2, %xmm1214; X86-NEXT: paddd %xmm2, %xmm1215; X86-NEXT: movdqa %xmm1, %xmm2216; X86-NEXT: pslld $3, %xmm2217; X86-NEXT: psubd %xmm2, %xmm1218; X86-NEXT: paddd %xmm0, %xmm1219; X86-NEXT: movq %xmm1, (%eax)220; X86-NEXT: retl221 %a = load <2 x i32>, ptr %x222 %b = srem <2 x i32> %a, <i32 7, i32 7>223 store <2 x i32> %b, ptr %y224 ret void225}226 227define void @test_udiv_pow2_v2i32(ptr %x, ptr %y) nounwind {228; X64-LABEL: test_udiv_pow2_v2i32:229; X64: # %bb.0:230; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero231; X64-NEXT: psrld $3, %xmm0232; X64-NEXT: movq %xmm0, (%rsi)233; X64-NEXT: retq234;235; X86-LABEL: test_udiv_pow2_v2i32:236; X86: # %bb.0:237; X86-NEXT: movl {{[0-9]+}}(%esp), %eax238; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx239; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero240; X86-NEXT: psrld $3, %xmm0241; X86-NEXT: movq %xmm0, (%eax)242; X86-NEXT: retl243 %a = load <2 x i32>, ptr %x244 %b = udiv <2 x i32> %a, <i32 8, i32 8>245 store <2 x i32> %b, ptr %y246 ret void247}248 249define void @test_urem_pow2_v2i32(ptr %x, ptr %y) nounwind {250; X64-LABEL: test_urem_pow2_v2i32:251; X64: # %bb.0:252; X64-NEXT: movabsq $30064771079, %rax # imm = 0x700000007253; X64-NEXT: andq (%rdi), %rax254; X64-NEXT: movq %rax, (%rsi)255; X64-NEXT: retq256;257; X86-LABEL: test_urem_pow2_v2i32:258; X86: # %bb.0:259; X86-NEXT: movl {{[0-9]+}}(%esp), %eax260; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx261; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero262; X86-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0263; X86-NEXT: movlps %xmm0, (%eax)264; X86-NEXT: retl265 %a = load <2 x i32>, ptr %x266 %b = urem <2 x i32> %a, <i32 8, i32 8>267 store <2 x i32> %b, ptr %y268 ret void269}270 271define void @test_sdiv_pow2_v2i32(ptr %x, ptr %y) nounwind {272; X64-LABEL: test_sdiv_pow2_v2i32:273; X64: # %bb.0:274; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero275; X64-NEXT: movdqa %xmm0, %xmm1276; X64-NEXT: psrad $31, %xmm1277; X64-NEXT: psrld $29, %xmm1278; X64-NEXT: paddd %xmm0, %xmm1279; X64-NEXT: psrad $3, %xmm1280; X64-NEXT: movq %xmm1, (%rsi)281; X64-NEXT: retq282;283; X86-LABEL: test_sdiv_pow2_v2i32:284; X86: # %bb.0:285; X86-NEXT: movl {{[0-9]+}}(%esp), %eax286; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx287; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero288; X86-NEXT: movdqa %xmm0, %xmm1289; X86-NEXT: psrad $31, %xmm1290; X86-NEXT: psrld $29, %xmm1291; X86-NEXT: paddd %xmm0, %xmm1292; X86-NEXT: psrad $3, %xmm1293; X86-NEXT: movq %xmm1, (%eax)294; X86-NEXT: retl295 %a = load <2 x i32>, ptr %x296 %b = sdiv <2 x i32> %a, <i32 8, i32 8>297 store <2 x i32> %b, ptr %y298 ret void299}300 301define void @test_srem_pow2_v2i32(ptr %x, ptr %y) nounwind {302; X64-LABEL: test_srem_pow2_v2i32:303; X64: # %bb.0:304; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero305; X64-NEXT: psrld $3, %xmm0306; X64-NEXT: movq %xmm0, (%rsi)307; X64-NEXT: retq308;309; X86-LABEL: test_srem_pow2_v2i32:310; X86: # %bb.0:311; X86-NEXT: movl {{[0-9]+}}(%esp), %eax312; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx313; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero314; X86-NEXT: psrld $3, %xmm0315; X86-NEXT: movq %xmm0, (%eax)316; X86-NEXT: retl317 %a = load <2 x i32>, ptr %x318 %b = udiv <2 x i32> %a, <i32 8, i32 8>319 store <2 x i32> %b, ptr %y320 ret void321}322 323define void @test_udiv_v2i32(ptr %x, ptr %y, ptr %z) nounwind {324; X64-LABEL: test_udiv_v2i32:325; X64: # %bb.0:326; X64-NEXT: movq %rdx, %rcx327; X64-NEXT: movq (%rdi), %rax328; X64-NEXT: movq %rax, %xmm0329; X64-NEXT: movq (%rsi), %rsi330; X64-NEXT: movq %rsi, %xmm1331; X64-NEXT: # kill: def $eax killed $eax killed $rax332; X64-NEXT: xorl %edx, %edx333; X64-NEXT: divl %esi334; X64-NEXT: movd %eax, %xmm2335; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]336; X64-NEXT: movd %xmm0, %eax337; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]338; X64-NEXT: movd %xmm0, %esi339; X64-NEXT: xorl %edx, %edx340; X64-NEXT: divl %esi341; X64-NEXT: movd %eax, %xmm0342; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]343; X64-NEXT: movq %xmm2, (%rcx)344; X64-NEXT: retq345;346; X86-LABEL: test_udiv_v2i32:347; X86: # %bb.0:348; X86-NEXT: pushl %esi349; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx350; X86-NEXT: movl {{[0-9]+}}(%esp), %eax351; X86-NEXT: movl {{[0-9]+}}(%esp), %edx352; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero353; X86-NEXT: movq {{.*#+}} xmm1 = mem[0],zero354; X86-NEXT: movd %xmm0, %eax355; X86-NEXT: movd %xmm1, %esi356; X86-NEXT: xorl %edx, %edx357; X86-NEXT: divl %esi358; X86-NEXT: movd %eax, %xmm2359; X86-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]360; X86-NEXT: movd %xmm0, %eax361; X86-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]362; X86-NEXT: movd %xmm1, %esi363; X86-NEXT: xorl %edx, %edx364; X86-NEXT: divl %esi365; X86-NEXT: movd %eax, %xmm0366; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]367; X86-NEXT: movq %xmm2, (%ecx)368; X86-NEXT: popl %esi369; X86-NEXT: retl370 %a = load <2 x i32>, ptr %x371 %b = load <2 x i32>, ptr %y372 %c = udiv <2 x i32> %a, %b373 store <2 x i32> %c, ptr %z374 ret void375}376 377define void @test_urem_v2i32(ptr %x, ptr %y, ptr %z) nounwind {378; X64-LABEL: test_urem_v2i32:379; X64: # %bb.0:380; X64-NEXT: movq %rdx, %rcx381; X64-NEXT: movq (%rdi), %rax382; X64-NEXT: movq %rax, %xmm0383; X64-NEXT: movq (%rsi), %rsi384; X64-NEXT: movq %rsi, %xmm1385; X64-NEXT: # kill: def $eax killed $eax killed $rax386; X64-NEXT: xorl %edx, %edx387; X64-NEXT: divl %esi388; X64-NEXT: movd %edx, %xmm2389; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]390; X64-NEXT: movd %xmm0, %eax391; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]392; X64-NEXT: movd %xmm0, %esi393; X64-NEXT: xorl %edx, %edx394; X64-NEXT: divl %esi395; X64-NEXT: movd %edx, %xmm0396; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]397; X64-NEXT: movq %xmm2, (%rcx)398; X64-NEXT: retq399;400; X86-LABEL: test_urem_v2i32:401; X86: # %bb.0:402; X86-NEXT: pushl %esi403; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx404; X86-NEXT: movl {{[0-9]+}}(%esp), %eax405; X86-NEXT: movl {{[0-9]+}}(%esp), %edx406; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero407; X86-NEXT: movq {{.*#+}} xmm1 = mem[0],zero408; X86-NEXT: movd %xmm0, %eax409; X86-NEXT: movd %xmm1, %esi410; X86-NEXT: xorl %edx, %edx411; X86-NEXT: divl %esi412; X86-NEXT: movd %edx, %xmm2413; X86-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]414; X86-NEXT: movd %xmm0, %eax415; X86-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]416; X86-NEXT: movd %xmm1, %esi417; X86-NEXT: xorl %edx, %edx418; X86-NEXT: divl %esi419; X86-NEXT: movd %edx, %xmm0420; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]421; X86-NEXT: movq %xmm2, (%ecx)422; X86-NEXT: popl %esi423; X86-NEXT: retl424 %a = load <2 x i32>, ptr %x425 %b = load <2 x i32>, ptr %y426 %c = urem <2 x i32> %a, %b427 store <2 x i32> %c, ptr %z428 ret void429}430 431define void @test_sdiv_v2i32(ptr %x, ptr %y, ptr %z) nounwind {432; X64-LABEL: test_sdiv_v2i32:433; X64: # %bb.0:434; X64-NEXT: movq %rdx, %rcx435; X64-NEXT: movq (%rdi), %rax436; X64-NEXT: movq %rax, %xmm0437; X64-NEXT: movq (%rsi), %rsi438; X64-NEXT: movq %rsi, %xmm1439; X64-NEXT: # kill: def $eax killed $eax killed $rax440; X64-NEXT: cltd441; X64-NEXT: idivl %esi442; X64-NEXT: movd %eax, %xmm2443; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]444; X64-NEXT: movd %xmm0, %eax445; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]446; X64-NEXT: movd %xmm0, %esi447; X64-NEXT: cltd448; X64-NEXT: idivl %esi449; X64-NEXT: movd %eax, %xmm0450; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]451; X64-NEXT: movq %xmm2, (%rcx)452; X64-NEXT: retq453;454; X86-LABEL: test_sdiv_v2i32:455; X86: # %bb.0:456; X86-NEXT: pushl %esi457; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx458; X86-NEXT: movl {{[0-9]+}}(%esp), %eax459; X86-NEXT: movl {{[0-9]+}}(%esp), %edx460; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero461; X86-NEXT: movq {{.*#+}} xmm1 = mem[0],zero462; X86-NEXT: movd %xmm0, %eax463; X86-NEXT: movd %xmm1, %esi464; X86-NEXT: cltd465; X86-NEXT: idivl %esi466; X86-NEXT: movd %eax, %xmm2467; X86-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]468; X86-NEXT: movd %xmm0, %eax469; X86-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]470; X86-NEXT: movd %xmm1, %esi471; X86-NEXT: cltd472; X86-NEXT: idivl %esi473; X86-NEXT: movd %eax, %xmm0474; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]475; X86-NEXT: movq %xmm2, (%ecx)476; X86-NEXT: popl %esi477; X86-NEXT: retl478 %a = load <2 x i32>, ptr %x479 %b = load <2 x i32>, ptr %y480 %c = sdiv <2 x i32> %a, %b481 store <2 x i32> %c, ptr %z482 ret void483}484 485define void @test_srem_v2i32(ptr %x, ptr %y, ptr %z) nounwind {486; X64-LABEL: test_srem_v2i32:487; X64: # %bb.0:488; X64-NEXT: movq %rdx, %rcx489; X64-NEXT: movq (%rdi), %rax490; X64-NEXT: movq %rax, %xmm0491; X64-NEXT: movq (%rsi), %rsi492; X64-NEXT: movq %rsi, %xmm1493; X64-NEXT: # kill: def $eax killed $eax killed $rax494; X64-NEXT: cltd495; X64-NEXT: idivl %esi496; X64-NEXT: movd %eax, %xmm2497; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]498; X64-NEXT: movd %xmm0, %eax499; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]500; X64-NEXT: movd %xmm0, %esi501; X64-NEXT: cltd502; X64-NEXT: idivl %esi503; X64-NEXT: movd %eax, %xmm0504; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]505; X64-NEXT: movq %xmm2, (%rcx)506; X64-NEXT: retq507;508; X86-LABEL: test_srem_v2i32:509; X86: # %bb.0:510; X86-NEXT: pushl %esi511; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx512; X86-NEXT: movl {{[0-9]+}}(%esp), %eax513; X86-NEXT: movl {{[0-9]+}}(%esp), %edx514; X86-NEXT: movq {{.*#+}} xmm0 = mem[0],zero515; X86-NEXT: movq {{.*#+}} xmm1 = mem[0],zero516; X86-NEXT: movd %xmm0, %eax517; X86-NEXT: movd %xmm1, %esi518; X86-NEXT: cltd519; X86-NEXT: idivl %esi520; X86-NEXT: movd %eax, %xmm2521; X86-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]522; X86-NEXT: movd %xmm0, %eax523; X86-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]524; X86-NEXT: movd %xmm1, %esi525; X86-NEXT: cltd526; X86-NEXT: idivl %esi527; X86-NEXT: movd %eax, %xmm0528; X86-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]529; X86-NEXT: movq %xmm2, (%ecx)530; X86-NEXT: popl %esi531; X86-NEXT: retl532 %a = load <2 x i32>, ptr %x533 %b = load <2 x i32>, ptr %y534 %c = sdiv <2 x i32> %a, %b535 store <2 x i32> %c, ptr %z536 ret void537}538