708 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X864 5declare i4 @llvm.sdiv.fix.i4 (i4, i4, i32)6declare i15 @llvm.sdiv.fix.i15 (i15, i15, i32)7declare i16 @llvm.sdiv.fix.i16 (i16, i16, i32)8declare i18 @llvm.sdiv.fix.i18 (i18, i18, i32)9declare i64 @llvm.sdiv.fix.i64 (i64, i64, i32)10declare <4 x i32> @llvm.sdiv.fix.v4i32(<4 x i32>, <4 x i32>, i32)11 12define i16 @func(i16 %x, i16 %y) nounwind {13; X64-LABEL: func:14; X64: # %bb.0:15; X64-NEXT: movswl %si, %esi16; X64-NEXT: movswl %di, %ecx17; X64-NEXT: shll $7, %ecx18; X64-NEXT: movl %ecx, %eax19; X64-NEXT: cltd20; X64-NEXT: idivl %esi21; X64-NEXT: # kill: def $eax killed $eax def $rax22; X64-NEXT: leal -1(%rax), %edi23; X64-NEXT: testl %esi, %esi24; X64-NEXT: sets %sil25; X64-NEXT: testl %ecx, %ecx26; X64-NEXT: sets %cl27; X64-NEXT: xorb %sil, %cl28; X64-NEXT: testl %edx, %edx29; X64-NEXT: setne %dl30; X64-NEXT: testb %cl, %dl31; X64-NEXT: cmovnel %edi, %eax32; X64-NEXT: # kill: def $ax killed $ax killed $rax33; X64-NEXT: retq34;35; X86-LABEL: func:36; X86: # %bb.0:37; X86-NEXT: pushl %ebx38; X86-NEXT: pushl %edi39; X86-NEXT: pushl %esi40; X86-NEXT: movswl {{[0-9]+}}(%esp), %esi41; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx42; X86-NEXT: shll $7, %ecx43; X86-NEXT: movl %ecx, %eax44; X86-NEXT: cltd45; X86-NEXT: idivl %esi46; X86-NEXT: leal -1(%eax), %edi47; X86-NEXT: testl %esi, %esi48; X86-NEXT: sets %bl49; X86-NEXT: testl %ecx, %ecx50; X86-NEXT: sets %cl51; X86-NEXT: xorb %bl, %cl52; X86-NEXT: testl %edx, %edx53; X86-NEXT: setne %dl54; X86-NEXT: testb %cl, %dl55; X86-NEXT: cmovnel %edi, %eax56; X86-NEXT: # kill: def $ax killed $ax killed $eax57; X86-NEXT: popl %esi58; X86-NEXT: popl %edi59; X86-NEXT: popl %ebx60; X86-NEXT: retl61 %tmp = call i16 @llvm.sdiv.fix.i16(i16 %x, i16 %y, i32 7)62 ret i16 %tmp63}64 65define i16 @func2(i8 %x, i8 %y) nounwind {66; X64-LABEL: func2:67; X64: # %bb.0:68; X64-NEXT: movsbl %sil, %esi69; X64-NEXT: movsbl %dil, %ecx70; X64-NEXT: shll $14, %ecx71; X64-NEXT: movl %ecx, %eax72; X64-NEXT: cltd73; X64-NEXT: idivl %esi74; X64-NEXT: # kill: def $eax killed $eax def $rax75; X64-NEXT: leal -1(%rax), %edi76; X64-NEXT: testl %esi, %esi77; X64-NEXT: sets %sil78; X64-NEXT: testl %ecx, %ecx79; X64-NEXT: sets %cl80; X64-NEXT: xorb %sil, %cl81; X64-NEXT: testl %edx, %edx82; X64-NEXT: setne %dl83; X64-NEXT: testb %cl, %dl84; X64-NEXT: cmovel %eax, %edi85; X64-NEXT: addl %edi, %edi86; X64-NEXT: movswl %di, %eax87; X64-NEXT: shrl %eax88; X64-NEXT: # kill: def $ax killed $ax killed $eax89; X64-NEXT: retq90;91; X86-LABEL: func2:92; X86: # %bb.0:93; X86-NEXT: pushl %ebx94; X86-NEXT: pushl %edi95; X86-NEXT: pushl %esi96; X86-NEXT: movsbl {{[0-9]+}}(%esp), %edi97; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx98; X86-NEXT: shll $14, %ecx99; X86-NEXT: movl %ecx, %eax100; X86-NEXT: cltd101; X86-NEXT: idivl %edi102; X86-NEXT: leal -1(%eax), %esi103; X86-NEXT: testl %edi, %edi104; X86-NEXT: sets %bl105; X86-NEXT: testl %ecx, %ecx106; X86-NEXT: sets %cl107; X86-NEXT: xorb %bl, %cl108; X86-NEXT: testl %edx, %edx109; X86-NEXT: setne %dl110; X86-NEXT: testb %cl, %dl111; X86-NEXT: cmovel %eax, %esi112; X86-NEXT: addl %esi, %esi113; X86-NEXT: movswl %si, %eax114; X86-NEXT: shrl %eax115; X86-NEXT: # kill: def $ax killed $ax killed $eax116; X86-NEXT: popl %esi117; X86-NEXT: popl %edi118; X86-NEXT: popl %ebx119; X86-NEXT: retl120 %x2 = sext i8 %x to i15121 %y2 = sext i8 %y to i15122 %tmp = call i15 @llvm.sdiv.fix.i15(i15 %x2, i15 %y2, i32 14)123 %tmp2 = sext i15 %tmp to i16124 ret i16 %tmp2125}126 127define i16 @func3(i15 %x, i8 %y) nounwind {128; X64-LABEL: func3:129; X64: # %bb.0:130; X64-NEXT: shll $8, %esi131; X64-NEXT: movswl %si, %ecx132; X64-NEXT: addl %edi, %edi133; X64-NEXT: shrl $4, %ecx134; X64-NEXT: movl %edi, %eax135; X64-NEXT: cwtd136; X64-NEXT: idivw %cx137; X64-NEXT: # kill: def $ax killed $ax def $rax138; X64-NEXT: leal -1(%rax), %esi139; X64-NEXT: testw %di, %di140; X64-NEXT: sets %dil141; X64-NEXT: testw %cx, %cx142; X64-NEXT: sets %cl143; X64-NEXT: xorb %dil, %cl144; X64-NEXT: testw %dx, %dx145; X64-NEXT: setne %dl146; X64-NEXT: testb %cl, %dl147; X64-NEXT: cmovel %eax, %esi148; X64-NEXT: addl %esi, %esi149; X64-NEXT: movswl %si, %eax150; X64-NEXT: shrl %eax151; X64-NEXT: # kill: def $ax killed $ax killed $eax152; X64-NEXT: retq153;154; X86-LABEL: func3:155; X86: # %bb.0:156; X86-NEXT: pushl %edi157; X86-NEXT: pushl %esi158; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx159; X86-NEXT: movl {{[0-9]+}}(%esp), %eax160; X86-NEXT: shll $8, %eax161; X86-NEXT: movswl %ax, %esi162; X86-NEXT: addl %ecx, %ecx163; X86-NEXT: shrl $4, %esi164; X86-NEXT: movl %ecx, %eax165; X86-NEXT: cwtd166; X86-NEXT: idivw %si167; X86-NEXT: # kill: def $ax killed $ax def $eax168; X86-NEXT: leal -1(%eax), %edi169; X86-NEXT: testw %cx, %cx170; X86-NEXT: sets %cl171; X86-NEXT: testw %si, %si172; X86-NEXT: sets %ch173; X86-NEXT: xorb %cl, %ch174; X86-NEXT: testw %dx, %dx175; X86-NEXT: setne %cl176; X86-NEXT: testb %ch, %cl177; X86-NEXT: cmovel %eax, %edi178; X86-NEXT: addl %edi, %edi179; X86-NEXT: movswl %di, %eax180; X86-NEXT: shrl %eax181; X86-NEXT: # kill: def $ax killed $ax killed $eax182; X86-NEXT: popl %esi183; X86-NEXT: popl %edi184; X86-NEXT: retl185 %y2 = sext i8 %y to i15186 %y3 = shl i15 %y2, 7187 %tmp = call i15 @llvm.sdiv.fix.i15(i15 %x, i15 %y3, i32 4)188 %tmp2 = sext i15 %tmp to i16189 ret i16 %tmp2190}191 192define i4 @func4(i4 %x, i4 %y) nounwind {193; X64-LABEL: func4:194; X64: # %bb.0:195; X64-NEXT: shlb $4, %sil196; X64-NEXT: sarb $4, %sil197; X64-NEXT: shlb $4, %dil198; X64-NEXT: sarb $4, %dil199; X64-NEXT: shlb $2, %dil200; X64-NEXT: movsbl %dil, %ecx201; X64-NEXT: movl %ecx, %eax202; X64-NEXT: idivb %sil203; X64-NEXT: movsbl %ah, %edx204; X64-NEXT: movzbl %al, %edi205; X64-NEXT: leal -1(%rdi), %eax206; X64-NEXT: movzbl %al, %eax207; X64-NEXT: testb %sil, %sil208; X64-NEXT: sets %sil209; X64-NEXT: testb %cl, %cl210; X64-NEXT: sets %cl211; X64-NEXT: xorb %sil, %cl212; X64-NEXT: testb %dl, %dl213; X64-NEXT: setne %dl214; X64-NEXT: testb %cl, %dl215; X64-NEXT: cmovel %edi, %eax216; X64-NEXT: # kill: def $al killed $al killed $eax217; X64-NEXT: retq218;219; X86-LABEL: func4:220; X86: # %bb.0:221; X86-NEXT: pushl %ebx222; X86-NEXT: pushl %esi223; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx224; X86-NEXT: shlb $4, %cl225; X86-NEXT: sarb $4, %cl226; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx227; X86-NEXT: shlb $4, %dl228; X86-NEXT: sarb $4, %dl229; X86-NEXT: shlb $2, %dl230; X86-NEXT: movsbl %dl, %eax231; X86-NEXT: idivb %cl232; X86-NEXT: movsbl %ah, %ebx233; X86-NEXT: movzbl %al, %esi234; X86-NEXT: decb %al235; X86-NEXT: movzbl %al, %eax236; X86-NEXT: testb %cl, %cl237; X86-NEXT: sets %cl238; X86-NEXT: testb %dl, %dl239; X86-NEXT: sets %dl240; X86-NEXT: xorb %cl, %dl241; X86-NEXT: testb %bl, %bl242; X86-NEXT: setne %cl243; X86-NEXT: testb %dl, %cl244; X86-NEXT: cmovel %esi, %eax245; X86-NEXT: # kill: def $al killed $al killed $eax246; X86-NEXT: popl %esi247; X86-NEXT: popl %ebx248; X86-NEXT: retl249 %tmp = call i4 @llvm.sdiv.fix.i4(i4 %x, i4 %y, i32 2)250 ret i4 %tmp251}252 253define i64 @func5(i64 %x, i64 %y) nounwind {254; X64-LABEL: func5:255; X64: # %bb.0:256; X64-NEXT: pushq %rbp257; X64-NEXT: pushq %r15258; X64-NEXT: pushq %r14259; X64-NEXT: pushq %r13260; X64-NEXT: pushq %r12261; X64-NEXT: pushq %rbx262; X64-NEXT: pushq %rax263; X64-NEXT: movq %rsi, %rbx264; X64-NEXT: movq %rdi, %r14265; X64-NEXT: movq %rdi, %r15266; X64-NEXT: sarq $63, %r15267; X64-NEXT: shldq $31, %rdi, %r15268; X64-NEXT: shlq $31, %r14269; X64-NEXT: movq %rsi, %r12270; X64-NEXT: sarq $63, %r12271; X64-NEXT: movq %r14, %rdi272; X64-NEXT: movq %r15, %rsi273; X64-NEXT: movq %rbx, %rdx274; X64-NEXT: movq %r12, %rcx275; X64-NEXT: callq __divti3@PLT276; X64-NEXT: movq %rax, (%rsp) # 8-byte Spill277; X64-NEXT: leaq -1(%rax), %rbp278; X64-NEXT: testq %r15, %r15279; X64-NEXT: sets %al280; X64-NEXT: testq %r12, %r12281; X64-NEXT: sets %r13b282; X64-NEXT: xorb %al, %r13b283; X64-NEXT: movq %r14, %rdi284; X64-NEXT: movq %r15, %rsi285; X64-NEXT: movq %rbx, %rdx286; X64-NEXT: movq %r12, %rcx287; X64-NEXT: callq __modti3@PLT288; X64-NEXT: orq %rax, %rdx289; X64-NEXT: setne %al290; X64-NEXT: testb %r13b, %al291; X64-NEXT: cmoveq (%rsp), %rbp # 8-byte Folded Reload292; X64-NEXT: movq %rbp, %rax293; X64-NEXT: addq $8, %rsp294; X64-NEXT: popq %rbx295; X64-NEXT: popq %r12296; X64-NEXT: popq %r13297; X64-NEXT: popq %r14298; X64-NEXT: popq %r15299; X64-NEXT: popq %rbp300; X64-NEXT: retq301;302; X86-LABEL: func5:303; X86: # %bb.0:304; X86-NEXT: pushl %ebp305; X86-NEXT: movl %esp, %ebp306; X86-NEXT: pushl %ebx307; X86-NEXT: pushl %edi308; X86-NEXT: pushl %esi309; X86-NEXT: andl $-16, %esp310; X86-NEXT: subl $112, %esp311; X86-NEXT: movl 8(%ebp), %ecx312; X86-NEXT: movl 12(%ebp), %edi313; X86-NEXT: movl 16(%ebp), %eax314; X86-NEXT: movl 20(%ebp), %edx315; X86-NEXT: movl %edx, %ebx316; X86-NEXT: sarl $31, %ebx317; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)318; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)319; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)320; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)321; X86-NEXT: movl %edi, %esi322; X86-NEXT: sarl $31, %esi323; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)324; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill325; X86-NEXT: leal {{[0-9]+}}(%esp), %eax326; X86-NEXT: movl %eax, (%esp)327; X86-NEXT: shldl $31, %edi, %esi328; X86-NEXT: shldl $31, %ecx, %edi329; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)330; X86-NEXT: shll $31, %ecx331; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill332; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)333; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)334; X86-NEXT: calll __divti3335; X86-NEXT: subl $4, %esp336; X86-NEXT: movl 20(%ebp), %eax337; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)338; X86-NEXT: movl 16(%ebp), %eax339; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)340; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)341; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)342; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload343; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)344; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)345; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload346; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)347; X86-NEXT: leal {{[0-9]+}}(%esp), %eax348; X86-NEXT: movl %eax, (%esp)349; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)350; X86-NEXT: movl {{[0-9]+}}(%esp), %esi351; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill352; X86-NEXT: movl {{[0-9]+}}(%esp), %edi353; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill354; X86-NEXT: subl $1, %esi355; X86-NEXT: sbbl $0, %edi356; X86-NEXT: testl %ebx, %ebx357; X86-NEXT: sets %al358; X86-NEXT: testl %ecx, %ecx359; X86-NEXT: sets %bl360; X86-NEXT: xorb %al, %bl361; X86-NEXT: calll __modti3362; X86-NEXT: subl $4, %esp363; X86-NEXT: movl {{[0-9]+}}(%esp), %eax364; X86-NEXT: orl {{[0-9]+}}(%esp), %eax365; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx366; X86-NEXT: orl {{[0-9]+}}(%esp), %ecx367; X86-NEXT: orl %eax, %ecx368; X86-NEXT: setne %al369; X86-NEXT: testb %bl, %al370; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload371; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload372; X86-NEXT: movl %esi, %eax373; X86-NEXT: movl %edi, %edx374; X86-NEXT: leal -12(%ebp), %esp375; X86-NEXT: popl %esi376; X86-NEXT: popl %edi377; X86-NEXT: popl %ebx378; X86-NEXT: popl %ebp379; X86-NEXT: retl380 %tmp = call i64 @llvm.sdiv.fix.i64(i64 %x, i64 %y, i32 31)381 ret i64 %tmp382}383 384define i18 @func6(i16 %x, i16 %y) nounwind {385; X64-LABEL: func6:386; X64: # %bb.0:387; X64-NEXT: movswl %di, %ecx388; X64-NEXT: movswl %si, %esi389; X64-NEXT: shll $7, %ecx390; X64-NEXT: movl %ecx, %eax391; X64-NEXT: cltd392; X64-NEXT: idivl %esi393; X64-NEXT: # kill: def $eax killed $eax def $rax394; X64-NEXT: leal -1(%rax), %edi395; X64-NEXT: testl %esi, %esi396; X64-NEXT: sets %sil397; X64-NEXT: testl %ecx, %ecx398; X64-NEXT: sets %cl399; X64-NEXT: xorb %sil, %cl400; X64-NEXT: testl %edx, %edx401; X64-NEXT: setne %dl402; X64-NEXT: testb %cl, %dl403; X64-NEXT: cmovnel %edi, %eax404; X64-NEXT: # kill: def $eax killed $eax killed $rax405; X64-NEXT: retq406;407; X86-LABEL: func6:408; X86: # %bb.0:409; X86-NEXT: pushl %ebx410; X86-NEXT: pushl %edi411; X86-NEXT: pushl %esi412; X86-NEXT: movswl {{[0-9]+}}(%esp), %esi413; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx414; X86-NEXT: shll $7, %ecx415; X86-NEXT: movl %ecx, %eax416; X86-NEXT: cltd417; X86-NEXT: idivl %esi418; X86-NEXT: leal -1(%eax), %edi419; X86-NEXT: testl %esi, %esi420; X86-NEXT: sets %bl421; X86-NEXT: testl %ecx, %ecx422; X86-NEXT: sets %cl423; X86-NEXT: xorb %bl, %cl424; X86-NEXT: testl %edx, %edx425; X86-NEXT: setne %dl426; X86-NEXT: testb %cl, %dl427; X86-NEXT: cmovnel %edi, %eax428; X86-NEXT: popl %esi429; X86-NEXT: popl %edi430; X86-NEXT: popl %ebx431; X86-NEXT: retl432 %x2 = sext i16 %x to i18433 %y2 = sext i16 %y to i18434 %tmp = call i18 @llvm.sdiv.fix.i18(i18 %x2, i18 %y2, i32 7)435 ret i18 %tmp436}437 438define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {439; X64-LABEL: vec:440; X64: # %bb.0:441; X64-NEXT: pxor %xmm2, %xmm2442; X64-NEXT: pcmpgtd %xmm1, %xmm2443; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]444; X64-NEXT: movdqa %xmm1, %xmm3445; X64-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]446; X64-NEXT: movq %xmm3, %rcx447; X64-NEXT: pxor %xmm5, %xmm5448; X64-NEXT: pcmpgtd %xmm0, %xmm5449; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]450; X64-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]451; X64-NEXT: psllq $31, %xmm0452; X64-NEXT: movq %xmm0, %rax453; X64-NEXT: cqto454; X64-NEXT: idivq %rcx455; X64-NEXT: movq %rax, %rsi456; X64-NEXT: movq %rdx, %r8457; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]458; X64-NEXT: movq %xmm3, %rcx459; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]460; X64-NEXT: movq %xmm3, %rax461; X64-NEXT: cqto462; X64-NEXT: idivq %rcx463; X64-NEXT: movq %rax, %rdi464; X64-NEXT: movq %rdx, %r10465; X64-NEXT: pxor %xmm3, %xmm3466; X64-NEXT: pcmpgtd %xmm4, %xmm3467; X64-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]468; X64-NEXT: movq %xmm4, %rcx469; X64-NEXT: pxor %xmm5, %xmm5470; X64-NEXT: pcmpgtd %xmm1, %xmm5471; X64-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]472; X64-NEXT: psllq $31, %xmm1473; X64-NEXT: movq %xmm1, %rax474; X64-NEXT: cqto475; X64-NEXT: idivq %rcx476; X64-NEXT: movq %rax, %rcx477; X64-NEXT: movq %rdx, %r9478; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]479; X64-NEXT: movq %xmm4, %r11480; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]481; X64-NEXT: movq %xmm4, %rax482; X64-NEXT: cqto483; X64-NEXT: idivq %r11484; X64-NEXT: movq %r8, %xmm5485; X64-NEXT: movq %r10, %xmm6486; X64-NEXT: pxor %xmm4, %xmm4487; X64-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]488; X64-NEXT: pcmpeqd %xmm4, %xmm5489; X64-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,0,3,2]490; X64-NEXT: pand %xmm5, %xmm6491; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,1,1]492; X64-NEXT: pxor %xmm5, %xmm5493; X64-NEXT: pcmpgtd %xmm2, %xmm5494; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]495; X64-NEXT: pxor %xmm2, %xmm2496; X64-NEXT: pcmpgtd %xmm0, %xmm2497; X64-NEXT: movq %rsi, %xmm0498; X64-NEXT: pxor %xmm5, %xmm2499; X64-NEXT: movq %rdi, %xmm5500; X64-NEXT: pandn %xmm2, %xmm6501; X64-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]502; X64-NEXT: movdqa %xmm6, %xmm5503; X64-NEXT: pandn %xmm0, %xmm5504; X64-NEXT: pcmpeqd %xmm2, %xmm2505; X64-NEXT: paddq %xmm2, %xmm0506; X64-NEXT: pand %xmm6, %xmm0507; X64-NEXT: por %xmm5, %xmm0508; X64-NEXT: movq %r9, %xmm5509; X64-NEXT: movq %rdx, %xmm6510; X64-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]511; X64-NEXT: pcmpeqd %xmm4, %xmm5512; X64-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,0,3,2]513; X64-NEXT: pand %xmm5, %xmm6514; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,0,1,1]515; X64-NEXT: pxor %xmm5, %xmm5516; X64-NEXT: pcmpgtd %xmm3, %xmm5517; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]518; X64-NEXT: pcmpgtd %xmm1, %xmm4519; X64-NEXT: pxor %xmm5, %xmm4520; X64-NEXT: pandn %xmm4, %xmm6521; X64-NEXT: movq %rcx, %xmm1522; X64-NEXT: movq %rax, %xmm3523; X64-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]524; X64-NEXT: movdqa %xmm6, %xmm3525; X64-NEXT: pandn %xmm1, %xmm3526; X64-NEXT: paddq %xmm2, %xmm1527; X64-NEXT: pand %xmm6, %xmm1528; X64-NEXT: por %xmm3, %xmm1529; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]530; X64-NEXT: retq531;532; X86-LABEL: vec:533; X86: # %bb.0:534; X86-NEXT: pushl %ebp535; X86-NEXT: pushl %ebx536; X86-NEXT: pushl %edi537; X86-NEXT: pushl %esi538; X86-NEXT: subl $60, %esp539; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx540; X86-NEXT: movl {{[0-9]+}}(%esp), %edi541; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx542; X86-NEXT: movl {{[0-9]+}}(%esp), %esi543; X86-NEXT: movl %esi, %ebp544; X86-NEXT: sarl $31, %ebp545; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill546; X86-NEXT: movl %ecx, %edx547; X86-NEXT: shll $31, %edx548; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill549; X86-NEXT: movl %ecx, %eax550; X86-NEXT: shrl $31, %eax551; X86-NEXT: shldl $31, %ecx, %eax552; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill553; X86-NEXT: pushl %ebp554; X86-NEXT: pushl %esi555; X86-NEXT: pushl %eax556; X86-NEXT: pushl %edx557; X86-NEXT: calll __divdi3558; X86-NEXT: addl $16, %esp559; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill560; X86-NEXT: movl %edi, %eax561; X86-NEXT: sarl $31, %eax562; X86-NEXT: movl %ebx, %ebp563; X86-NEXT: shll $31, %ebp564; X86-NEXT: movl %ebx, %ecx565; X86-NEXT: shrl $31, %ecx566; X86-NEXT: shldl $31, %ebx, %ecx567; X86-NEXT: pushl %eax568; X86-NEXT: movl %eax, %esi569; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill570; X86-NEXT: pushl %edi571; X86-NEXT: pushl %ecx572; X86-NEXT: movl %ecx, %ebx573; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill574; X86-NEXT: pushl %ebp575; X86-NEXT: calll __moddi3576; X86-NEXT: addl $16, %esp577; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill578; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill579; X86-NEXT: pushl %esi580; X86-NEXT: pushl %edi581; X86-NEXT: pushl %ebx582; X86-NEXT: pushl %ebp583; X86-NEXT: calll __divdi3584; X86-NEXT: addl $16, %esp585; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill586; X86-NEXT: movl {{[0-9]+}}(%esp), %eax587; X86-NEXT: movl %eax, %ecx588; X86-NEXT: sarl $31, %ecx589; X86-NEXT: movl {{[0-9]+}}(%esp), %edx590; X86-NEXT: movl %edx, %ebx591; X86-NEXT: shll $31, %ebx592; X86-NEXT: movl %edx, %edi593; X86-NEXT: shrl $31, %edi594; X86-NEXT: shldl $31, %edx, %edi595; X86-NEXT: pushl %ecx596; X86-NEXT: movl %ecx, %ebp597; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill598; X86-NEXT: pushl %eax599; X86-NEXT: movl %eax, %esi600; X86-NEXT: pushl %edi601; X86-NEXT: pushl %ebx602; X86-NEXT: calll __moddi3603; X86-NEXT: addl $16, %esp604; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill605; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill606; X86-NEXT: pushl %ebp607; X86-NEXT: pushl %esi608; X86-NEXT: pushl %edi609; X86-NEXT: pushl %ebx610; X86-NEXT: calll __divdi3611; X86-NEXT: addl $16, %esp612; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill613; X86-NEXT: movl {{[0-9]+}}(%esp), %eax614; X86-NEXT: movl %eax, %ebx615; X86-NEXT: sarl $31, %ebx616; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx617; X86-NEXT: movl %ecx, %esi618; X86-NEXT: shll $31, %esi619; X86-NEXT: movl %ecx, %ebp620; X86-NEXT: shrl $31, %ebp621; X86-NEXT: shldl $31, %ecx, %ebp622; X86-NEXT: pushl %ebx623; X86-NEXT: pushl %eax624; X86-NEXT: pushl %ebp625; X86-NEXT: pushl %esi626; X86-NEXT: calll __moddi3627; X86-NEXT: addl $16, %esp628; X86-NEXT: movl %eax, (%esp) # 4-byte Spill629; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill630; X86-NEXT: pushl %ebx631; X86-NEXT: pushl {{[0-9]+}}(%esp)632; X86-NEXT: pushl %ebp633; X86-NEXT: pushl %esi634; X86-NEXT: calll __divdi3635; X86-NEXT: addl $16, %esp636; X86-NEXT: testl %ebp, %ebp637; X86-NEXT: sets %cl638; X86-NEXT: testl %ebx, %ebx639; X86-NEXT: sets %dl640; X86-NEXT: xorb %cl, %dl641; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload642; X86-NEXT: orl (%esp), %ecx # 4-byte Folded Reload643; X86-NEXT: setne %cl644; X86-NEXT: testb %dl, %cl645; X86-NEXT: leal -1(%eax), %ecx646; X86-NEXT: cmovel %eax, %ecx647; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill648; X86-NEXT: testl %edi, %edi649; X86-NEXT: sets %al650; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload651; X86-NEXT: sets %cl652; X86-NEXT: xorb %al, %cl653; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload654; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload655; X86-NEXT: setne %al656; X86-NEXT: testb %cl, %al657; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload658; X86-NEXT: leal -1(%eax), %ecx659; X86-NEXT: cmovel %eax, %ecx660; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill661; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload662; X86-NEXT: sets %al663; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload664; X86-NEXT: sets %cl665; X86-NEXT: xorb %al, %cl666; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload667; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload668; X86-NEXT: setne %al669; X86-NEXT: testb %cl, %al670; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload671; X86-NEXT: leal -1(%eax), %ebp672; X86-NEXT: cmovel %eax, %ebp673; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload674; X86-NEXT: testl %edx, %edx675; X86-NEXT: sets %al676; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload677; X86-NEXT: testl %ecx, %ecx678; X86-NEXT: sets %bl679; X86-NEXT: xorb %al, %bl680; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload681; X86-NEXT: leal -1(%edi), %esi682; X86-NEXT: pushl %ecx683; X86-NEXT: pushl {{[0-9]+}}(%esp)684; X86-NEXT: pushl %edx685; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload686; X86-NEXT: calll __moddi3687; X86-NEXT: addl $16, %esp688; X86-NEXT: orl %eax, %edx689; X86-NEXT: setne %al690; X86-NEXT: testb %bl, %al691; X86-NEXT: cmovel %edi, %esi692; X86-NEXT: movl {{[0-9]+}}(%esp), %eax693; X86-NEXT: movl %esi, 12(%eax)694; X86-NEXT: movl %ebp, 8(%eax)695; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload696; X86-NEXT: movl %ecx, 4(%eax)697; X86-NEXT: movl (%esp), %ecx # 4-byte Reload698; X86-NEXT: movl %ecx, (%eax)699; X86-NEXT: addl $60, %esp700; X86-NEXT: popl %esi701; X86-NEXT: popl %edi702; X86-NEXT: popl %ebx703; X86-NEXT: popl %ebp704; X86-NEXT: retl $4705 %tmp = call <4 x i32> @llvm.sdiv.fix.v4i32(<4 x i32> %x, <4 x i32> %y, i32 31)706 ret <4 x i32> %tmp707}708