347 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.udiv.fix.i4 (i4, i4, i32)6declare i15 @llvm.udiv.fix.i15 (i15, i15, i32)7declare i16 @llvm.udiv.fix.i16 (i16, i16, i32)8declare i18 @llvm.udiv.fix.i18 (i18, i18, i32)9declare i64 @llvm.udiv.fix.i64 (i64, i64, i32)10declare <4 x i32> @llvm.udiv.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: movzwl %si, %ecx16; X64-NEXT: movzwl %di, %eax17; X64-NEXT: shll $7, %eax18; X64-NEXT: xorl %edx, %edx19; X64-NEXT: divl %ecx20; X64-NEXT: # kill: def $ax killed $ax killed $eax21; X64-NEXT: retq22;23; X86-LABEL: func:24; X86: # %bb.0:25; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx26; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax27; X86-NEXT: shll $7, %eax28; X86-NEXT: xorl %edx, %edx29; X86-NEXT: divl %ecx30; X86-NEXT: # kill: def $ax killed $ax killed $eax31; X86-NEXT: retl32 %tmp = call i16 @llvm.udiv.fix.i16(i16 %x, i16 %y, i32 7)33 ret i16 %tmp34}35 36define i16 @func2(i8 %x, i8 %y) nounwind {37; X64-LABEL: func2:38; X64: # %bb.0:39; X64-NEXT: movsbl %dil, %eax40; X64-NEXT: andl $32767, %eax # imm = 0x7FFF41; X64-NEXT: movsbl %sil, %ecx42; X64-NEXT: andl $32767, %ecx # imm = 0x7FFF43; X64-NEXT: shll $14, %eax44; X64-NEXT: xorl %edx, %edx45; X64-NEXT: divl %ecx46; X64-NEXT: addl %eax, %eax47; X64-NEXT: cwtl48; X64-NEXT: shrl %eax49; X64-NEXT: # kill: def $ax killed $ax killed $eax50; X64-NEXT: retq51;52; X86-LABEL: func2:53; X86: # %bb.0:54; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx55; X86-NEXT: andl $32767, %ecx # imm = 0x7FFF56; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax57; X86-NEXT: andl $32767, %eax # imm = 0x7FFF58; X86-NEXT: shll $14, %eax59; X86-NEXT: xorl %edx, %edx60; X86-NEXT: divl %ecx61; X86-NEXT: addl %eax, %eax62; X86-NEXT: cwtl63; X86-NEXT: shrl %eax64; X86-NEXT: # kill: def $ax killed $ax killed $eax65; X86-NEXT: retl66 %x2 = sext i8 %x to i1567 %y2 = sext i8 %y to i1568 %tmp = call i15 @llvm.udiv.fix.i15(i15 %x2, i15 %y2, i32 14)69 %tmp2 = sext i15 %tmp to i1670 ret i16 %tmp271}72 73define i16 @func3(i15 %x, i8 %y) nounwind {74; X64-LABEL: func3:75; X64: # %bb.0:76; X64-NEXT: # kill: def $edi killed $edi def $rdi77; X64-NEXT: leal (%rdi,%rdi), %eax78; X64-NEXT: movzbl %sil, %ecx79; X64-NEXT: shll $4, %ecx80; X64-NEXT: # kill: def $ax killed $ax killed $eax81; X64-NEXT: xorl %edx, %edx82; X64-NEXT: divw %cx83; X64-NEXT: # kill: def $ax killed $ax def $eax84; X64-NEXT: addl %eax, %eax85; X64-NEXT: cwtl86; X64-NEXT: shrl %eax87; X64-NEXT: # kill: def $ax killed $ax killed $eax88; X64-NEXT: retq89;90; X86-LABEL: func3:91; X86: # %bb.0:92; X86-NEXT: movl {{[0-9]+}}(%esp), %eax93; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx94; X86-NEXT: addl %eax, %eax95; X86-NEXT: movzbl %cl, %ecx96; X86-NEXT: shll $4, %ecx97; X86-NEXT: # kill: def $ax killed $ax killed $eax98; X86-NEXT: xorl %edx, %edx99; X86-NEXT: divw %cx100; X86-NEXT: # kill: def $ax killed $ax def $eax101; X86-NEXT: addl %eax, %eax102; X86-NEXT: cwtl103; X86-NEXT: shrl %eax104; X86-NEXT: # kill: def $ax killed $ax killed $eax105; X86-NEXT: retl106 %y2 = sext i8 %y to i15107 %y3 = shl i15 %y2, 7108 %tmp = call i15 @llvm.udiv.fix.i15(i15 %x, i15 %y3, i32 4)109 %tmp2 = sext i15 %tmp to i16110 ret i16 %tmp2111}112 113define i4 @func4(i4 %x, i4 %y) nounwind {114; X64-LABEL: func4:115; X64: # %bb.0:116; X64-NEXT: andb $15, %sil117; X64-NEXT: andb $15, %dil118; X64-NEXT: shlb $2, %dil119; X64-NEXT: movzbl %dil, %eax120; X64-NEXT: divb %sil121; X64-NEXT: retq122;123; X86-LABEL: func4:124; X86: # %bb.0:125; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx126; X86-NEXT: andb $15, %cl127; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax128; X86-NEXT: andb $15, %al129; X86-NEXT: shlb $2, %al130; X86-NEXT: movzbl %al, %eax131; X86-NEXT: divb %cl132; X86-NEXT: retl133 %tmp = call i4 @llvm.udiv.fix.i4(i4 %x, i4 %y, i32 2)134 ret i4 %tmp135}136 137define i64 @func5(i64 %x, i64 %y) nounwind {138; X64-LABEL: func5:139; X64: # %bb.0:140; X64-NEXT: pushq %rax141; X64-NEXT: movq %rsi, %rdx142; X64-NEXT: movq %rdi, %rsi143; X64-NEXT: shlq $31, %rdi144; X64-NEXT: shrq $33, %rsi145; X64-NEXT: xorl %ecx, %ecx146; X64-NEXT: callq __udivti3@PLT147; X64-NEXT: popq %rcx148; X64-NEXT: retq149;150; X86-LABEL: func5:151; X86: # %bb.0:152; X86-NEXT: pushl %ebp153; X86-NEXT: movl %esp, %ebp154; X86-NEXT: pushl %esi155; X86-NEXT: andl $-16, %esp156; X86-NEXT: subl $80, %esp157; X86-NEXT: movl 8(%ebp), %eax158; X86-NEXT: movl 12(%ebp), %ecx159; X86-NEXT: movl 16(%ebp), %edx160; X86-NEXT: movl 20(%ebp), %esi161; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)162; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)163; X86-NEXT: movl %ecx, %edx164; X86-NEXT: shrl %edx165; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)166; X86-NEXT: shldl $31, %eax, %ecx167; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)168; X86-NEXT: shll $31, %eax169; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)170; X86-NEXT: leal {{[0-9]+}}(%esp), %eax171; X86-NEXT: movl %eax, (%esp)172; X86-NEXT: movl $0, {{[0-9]+}}(%esp)173; X86-NEXT: movl $0, {{[0-9]+}}(%esp)174; X86-NEXT: movl $0, {{[0-9]+}}(%esp)175; X86-NEXT: calll __udivti3176; X86-NEXT: subl $4, %esp177; X86-NEXT: movl {{[0-9]+}}(%esp), %eax178; X86-NEXT: movl {{[0-9]+}}(%esp), %edx179; X86-NEXT: leal -4(%ebp), %esp180; X86-NEXT: popl %esi181; X86-NEXT: popl %ebp182; X86-NEXT: retl183 %tmp = call i64 @llvm.udiv.fix.i64(i64 %x, i64 %y, i32 31)184 ret i64 %tmp185}186 187define i18 @func6(i16 %x, i16 %y) nounwind {188; X64-LABEL: func6:189; X64: # %bb.0:190; X64-NEXT: movswl %di, %eax191; X64-NEXT: andl $262143, %eax # imm = 0x3FFFF192; X64-NEXT: movswl %si, %ecx193; X64-NEXT: andl $262143, %ecx # imm = 0x3FFFF194; X64-NEXT: shll $7, %eax195; X64-NEXT: xorl %edx, %edx196; X64-NEXT: divl %ecx197; X64-NEXT: retq198;199; X86-LABEL: func6:200; X86: # %bb.0:201; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx202; X86-NEXT: andl $262143, %ecx # imm = 0x3FFFF203; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax204; X86-NEXT: andl $262143, %eax # imm = 0x3FFFF205; X86-NEXT: shll $7, %eax206; X86-NEXT: xorl %edx, %edx207; X86-NEXT: divl %ecx208; X86-NEXT: retl209 %x2 = sext i16 %x to i18210 %y2 = sext i16 %y to i18211 %tmp = call i18 @llvm.udiv.fix.i18(i18 %x2, i18 %y2, i32 7)212 ret i18 %tmp213}214 215define i16 @func7(i16 %x, i16 %y) nounwind {216; X64-LABEL: func7:217; X64: # %bb.0:218; X64-NEXT: movl %edi, %eax219; X64-NEXT: shll $16, %eax220; X64-NEXT: movzwl %si, %ecx221; X64-NEXT: xorl %edx, %edx222; X64-NEXT: divl %ecx223; X64-NEXT: # kill: def $ax killed $ax killed $eax224; X64-NEXT: retq225;226; X86-LABEL: func7:227; X86: # %bb.0:228; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx229; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax230; X86-NEXT: shll $16, %eax231; X86-NEXT: xorl %edx, %edx232; X86-NEXT: divl %ecx233; X86-NEXT: # kill: def $ax killed $ax killed $eax234; X86-NEXT: retl235 %tmp = call i16 @llvm.udiv.fix.i16(i16 %x, i16 %y, i32 16)236 ret i16 %tmp237}238 239define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {240; X64-LABEL: vec:241; X64: # %bb.0:242; X64-NEXT: pxor %xmm2, %xmm2243; X64-NEXT: movdqa %xmm1, %xmm3244; X64-NEXT: punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm2[2],xmm3[3],xmm2[3]245; X64-NEXT: movq %xmm3, %rcx246; X64-NEXT: movdqa %xmm0, %xmm4247; X64-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm2[2],xmm4[3],xmm2[3]248; X64-NEXT: psllq $31, %xmm4249; X64-NEXT: movq %xmm4, %rax250; X64-NEXT: xorl %edx, %edx251; X64-NEXT: divq %rcx252; X64-NEXT: movq %rax, %xmm3253; X64-NEXT: pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]254; X64-NEXT: movq %xmm4, %rax255; X64-NEXT: movdqa %xmm1, %xmm4256; X64-NEXT: psrldq {{.*#+}} xmm4 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero257; X64-NEXT: movq %xmm4, %rcx258; X64-NEXT: xorl %edx, %edx259; X64-NEXT: divq %rcx260; X64-NEXT: movq %rax, %xmm4261; X64-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]262; X64-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]263; X64-NEXT: psllq $31, %xmm0264; X64-NEXT: movq %xmm0, %rax265; X64-NEXT: movd %xmm1, %ecx266; X64-NEXT: xorl %edx, %edx267; X64-NEXT: divq %rcx268; X64-NEXT: movq %rax, %xmm2269; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]270; X64-NEXT: movq %xmm0, %rax271; X64-NEXT: psrlq $32, %xmm1272; X64-NEXT: movq %xmm1, %rcx273; X64-NEXT: xorl %edx, %edx274; X64-NEXT: divq %rcx275; X64-NEXT: movq %rax, %xmm0276; X64-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]277; X64-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]278; X64-NEXT: movaps %xmm2, %xmm0279; X64-NEXT: retq280;281; X86-LABEL: vec:282; X86: # %bb.0:283; X86-NEXT: pushl %ebp284; X86-NEXT: pushl %ebx285; X86-NEXT: pushl %edi286; X86-NEXT: pushl %esi287; X86-NEXT: pushl %eax288; X86-NEXT: movl {{[0-9]+}}(%esp), %esi289; X86-NEXT: movl {{[0-9]+}}(%esp), %edi290; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp291; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx292; X86-NEXT: movl {{[0-9]+}}(%esp), %eax293; X86-NEXT: movl %eax, %ecx294; X86-NEXT: shrl %ecx295; X86-NEXT: shll $31, %eax296; X86-NEXT: pushl $0297; X86-NEXT: pushl {{[0-9]+}}(%esp)298; X86-NEXT: pushl %ecx299; X86-NEXT: pushl %eax300; X86-NEXT: calll __udivdi3301; X86-NEXT: addl $16, %esp302; X86-NEXT: movl %eax, (%esp) # 4-byte Spill303; X86-NEXT: movl %ebx, %eax304; X86-NEXT: shrl %eax305; X86-NEXT: shll $31, %ebx306; X86-NEXT: pushl $0307; X86-NEXT: pushl {{[0-9]+}}(%esp)308; X86-NEXT: pushl %eax309; X86-NEXT: pushl %ebx310; X86-NEXT: calll __udivdi3311; X86-NEXT: addl $16, %esp312; X86-NEXT: movl %eax, %ebx313; X86-NEXT: movl %ebp, %eax314; X86-NEXT: shrl %eax315; X86-NEXT: shll $31, %ebp316; X86-NEXT: pushl $0317; X86-NEXT: pushl {{[0-9]+}}(%esp)318; X86-NEXT: pushl %eax319; X86-NEXT: pushl %ebp320; X86-NEXT: calll __udivdi3321; X86-NEXT: addl $16, %esp322; X86-NEXT: movl %eax, %ebp323; X86-NEXT: movl %edi, %eax324; X86-NEXT: shrl %eax325; X86-NEXT: shll $31, %edi326; X86-NEXT: pushl $0327; X86-NEXT: pushl {{[0-9]+}}(%esp)328; X86-NEXT: pushl %eax329; X86-NEXT: pushl %edi330; X86-NEXT: calll __udivdi3331; X86-NEXT: addl $16, %esp332; X86-NEXT: movl %eax, 12(%esi)333; X86-NEXT: movl %ebp, 8(%esi)334; X86-NEXT: movl %ebx, 4(%esi)335; X86-NEXT: movl (%esp), %eax # 4-byte Reload336; X86-NEXT: movl %eax, (%esi)337; X86-NEXT: movl %esi, %eax338; X86-NEXT: addl $4, %esp339; X86-NEXT: popl %esi340; X86-NEXT: popl %edi341; X86-NEXT: popl %ebx342; X86-NEXT: popl %ebp343; X86-NEXT: retl $4344 %tmp = call <4 x i32> @llvm.udiv.fix.v4i32(<4 x i32> %x, <4 x i32> %y, i32 31)345 ret <4 x i32> %tmp346}347