1192 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-pc-linux-gnu | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefixes=X64,X64-FAST4; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mattr=idivq-to-divl | FileCheck %s --check-prefixes=X64,X64-SLOW5 6define zeroext i16 @test1(i16 zeroext %x) nounwind {7; X86-LABEL: test1:8; X86: # %bb.0: # %entry9; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax10; X86-NEXT: imull $63551, %eax, %eax # imm = 0xF83F11; X86-NEXT: shrl $21, %eax12; X86-NEXT: # kill: def $ax killed $ax killed $eax13; X86-NEXT: retl14;15; X64-LABEL: test1:16; X64: # %bb.0: # %entry17; X64-NEXT: imull $63551, %edi, %eax # imm = 0xF83F18; X64-NEXT: shrl $21, %eax19; X64-NEXT: # kill: def $ax killed $ax killed $eax20; X64-NEXT: retq21entry:22 %div = udiv i16 %x, 3323 ret i16 %div24}25 26define zeroext i16 @test2(i8 signext %x, i16 zeroext %c) nounwind readnone ssp noredzone {27; X86-LABEL: test2:28; X86: # %bb.0: # %entry29; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax30; X86-NEXT: imull $43691, %eax, %eax # imm = 0xAAAB31; X86-NEXT: shrl $17, %eax32; X86-NEXT: # kill: def $ax killed $ax killed $eax33; X86-NEXT: retl34;35; X64-LABEL: test2:36; X64: # %bb.0: # %entry37; X64-NEXT: imull $43691, %esi, %eax # imm = 0xAAAB38; X64-NEXT: shrl $17, %eax39; X64-NEXT: # kill: def $ax killed $ax killed $eax40; X64-NEXT: retq41entry:42 %div = udiv i16 %c, 343 ret i16 %div44 45}46 47define zeroext i8 @test3(i8 zeroext %x, i8 zeroext %c) nounwind readnone ssp noredzone {48; X86-LABEL: test3:49; X86: # %bb.0: # %entry50; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax51; X86-NEXT: imull $171, %eax, %eax52; X86-NEXT: shrl $9, %eax53; X86-NEXT: # kill: def $al killed $al killed $eax54; X86-NEXT: retl55;56; X64-LABEL: test3:57; X64: # %bb.0: # %entry58; X64-NEXT: imull $171, %esi, %eax59; X64-NEXT: shrl $9, %eax60; X64-NEXT: # kill: def $al killed $al killed $eax61; X64-NEXT: retq62entry:63 %div = udiv i8 %c, 364 ret i8 %div65}66 67define signext i16 @test4(i16 signext %x) nounwind {68; X86-LABEL: test4:69; X86: # %bb.0: # %entry70; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax71; X86-NEXT: imull $1986, %eax, %eax # imm = 0x7C272; X86-NEXT: movl %eax, %ecx73; X86-NEXT: shrl $31, %ecx74; X86-NEXT: shrl $16, %eax75; X86-NEXT: addl %ecx, %eax76; X86-NEXT: # kill: def $ax killed $ax killed $eax77; X86-NEXT: retl78;79; X64-LABEL: test4:80; X64: # %bb.0: # %entry81; X64-NEXT: imull $1986, %edi, %eax # imm = 0x7C282; X64-NEXT: movl %eax, %ecx83; X64-NEXT: shrl $31, %ecx84; X64-NEXT: shrl $16, %eax85; X64-NEXT: addl %ecx, %eax86; X64-NEXT: # kill: def $ax killed $ax killed $eax87; X64-NEXT: retq88entry:89 %div = sdiv i16 %x, 33 ; <i32> [#uses=1]90 ret i16 %div91}92 93define i32 @test5(i32 %A) nounwind {94; X86-LABEL: test5:95; X86: # %bb.0:96; X86-NEXT: movl $365384439, %eax # imm = 0x15C752F797; X86-NEXT: mull {{[0-9]+}}(%esp)98; X86-NEXT: movl %edx, %eax99; X86-NEXT: shrl $27, %eax100; X86-NEXT: retl101;102; X64-LABEL: test5:103; X64: # %bb.0:104; X64-NEXT: movl %edi, %eax105; X64-NEXT: imulq $365384439, %rax, %rax # imm = 0x15C752F7106; X64-NEXT: shrq $59, %rax107; X64-NEXT: # kill: def $eax killed $eax killed $rax108; X64-NEXT: retq109 %tmp1 = udiv i32 %A, 1577682821 ; <i32> [#uses=1]110 ret i32 %tmp1111}112 113define signext i16 @test6(i16 signext %x) nounwind {114; X86-LABEL: test6:115; X86: # %bb.0: # %entry116; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax117; X86-NEXT: imull $26215, %eax, %eax # imm = 0x6667118; X86-NEXT: movl %eax, %ecx119; X86-NEXT: shrl $31, %ecx120; X86-NEXT: sarl $18, %eax121; X86-NEXT: addl %ecx, %eax122; X86-NEXT: # kill: def $ax killed $ax killed $eax123; X86-NEXT: retl124;125; X64-LABEL: test6:126; X64: # %bb.0: # %entry127; X64-NEXT: imull $26215, %edi, %eax # imm = 0x6667128; X64-NEXT: movl %eax, %ecx129; X64-NEXT: shrl $31, %ecx130; X64-NEXT: sarl $18, %eax131; X64-NEXT: addl %ecx, %eax132; X64-NEXT: # kill: def $ax killed $ax killed $eax133; X64-NEXT: retq134entry:135 %div = sdiv i16 %x, 10136 ret i16 %div137}138 139define i32 @test7(i32 %x) nounwind {140; X86-LABEL: test7:141; X86: # %bb.0:142; X86-NEXT: movl {{[0-9]+}}(%esp), %eax143; X86-NEXT: shrl $2, %eax144; X86-NEXT: movl $613566757, %ecx # imm = 0x24924925145; X86-NEXT: mull %ecx146; X86-NEXT: movl %edx, %eax147; X86-NEXT: retl148;149; X64-LABEL: test7:150; X64: # %bb.0:151; X64-NEXT: # kill: def $edi killed $edi def $rdi152; X64-NEXT: shrl $2, %edi153; X64-NEXT: imulq $613566757, %rdi, %rax # imm = 0x24924925154; X64-NEXT: shrq $32, %rax155; X64-NEXT: # kill: def $eax killed $eax killed $rax156; X64-NEXT: retq157 %div = udiv i32 %x, 28158 ret i32 %div159}160 161; PR13326162define i8 @test8(i8 %x) nounwind {163; X86-LABEL: test8:164; X86: # %bb.0:165; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax166; X86-NEXT: shrb %al167; X86-NEXT: movzbl %al, %eax168; X86-NEXT: imull $211, %eax, %eax169; X86-NEXT: shrl $13, %eax170; X86-NEXT: # kill: def $al killed $al killed $eax171; X86-NEXT: retl172;173; X64-LABEL: test8:174; X64: # %bb.0:175; X64-NEXT: shrb %dil176; X64-NEXT: movzbl %dil, %eax177; X64-NEXT: imull $211, %eax, %eax178; X64-NEXT: shrl $13, %eax179; X64-NEXT: # kill: def $al killed $al killed $eax180; X64-NEXT: retq181 %div = udiv i8 %x, 78182 ret i8 %div183}184 185define i8 @test9(i8 %x) nounwind {186; X86-LABEL: test9:187; X86: # %bb.0:188; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax189; X86-NEXT: shrb $2, %al190; X86-NEXT: movzbl %al, %eax191; X86-NEXT: imull $71, %eax, %eax192; X86-NEXT: shrl $11, %eax193; X86-NEXT: # kill: def $al killed $al killed $eax194; X86-NEXT: retl195;196; X64-LABEL: test9:197; X64: # %bb.0:198; X64-NEXT: shrb $2, %dil199; X64-NEXT: movzbl %dil, %eax200; X64-NEXT: imull $71, %eax, %eax201; X64-NEXT: shrl $11, %eax202; X64-NEXT: # kill: def $al killed $al killed $eax203; X64-NEXT: retq204 %div = udiv i8 %x, 116205 ret i8 %div206}207 208define i32 @testsize1(i32 %x) minsize nounwind {209; X86-LABEL: testsize1:210; X86: # %bb.0: # %entry211; X86-NEXT: movl {{[0-9]+}}(%esp), %eax212; X86-NEXT: pushl $32213; X86-NEXT: popl %ecx214; X86-NEXT: cltd215; X86-NEXT: idivl %ecx216; X86-NEXT: retl217;218; X64-LABEL: testsize1:219; X64: # %bb.0: # %entry220; X64-NEXT: movl %edi, %eax221; X64-NEXT: pushq $32222; X64-NEXT: popq %rcx223; X64-NEXT: cltd224; X64-NEXT: idivl %ecx225; X64-NEXT: retq226entry:227 %div = sdiv i32 %x, 32228 ret i32 %div229}230 231define i32 @testsize2(i32 %x) minsize nounwind {232; X86-LABEL: testsize2:233; X86: # %bb.0: # %entry234; X86-NEXT: movl {{[0-9]+}}(%esp), %eax235; X86-NEXT: pushl $33236; X86-NEXT: popl %ecx237; X86-NEXT: cltd238; X86-NEXT: idivl %ecx239; X86-NEXT: retl240;241; X64-LABEL: testsize2:242; X64: # %bb.0: # %entry243; X64-NEXT: movl %edi, %eax244; X64-NEXT: pushq $33245; X64-NEXT: popq %rcx246; X64-NEXT: cltd247; X64-NEXT: idivl %ecx248; X64-NEXT: retq249entry:250 %div = sdiv i32 %x, 33251 ret i32 %div252}253 254define i32 @testsize3(i32 %x) minsize nounwind {255; X86-LABEL: testsize3:256; X86: # %bb.0: # %entry257; X86-NEXT: movl {{[0-9]+}}(%esp), %eax258; X86-NEXT: shrl $5, %eax259; X86-NEXT: retl260;261; X64-LABEL: testsize3:262; X64: # %bb.0: # %entry263; X64-NEXT: movl %edi, %eax264; X64-NEXT: shrl $5, %eax265; X64-NEXT: retq266entry:267 %div = udiv i32 %x, 32268 ret i32 %div269}270 271define i32 @testsize4(i32 %x) minsize nounwind {272; X86-LABEL: testsize4:273; X86: # %bb.0: # %entry274; X86-NEXT: movl {{[0-9]+}}(%esp), %eax275; X86-NEXT: pushl $33276; X86-NEXT: popl %ecx277; X86-NEXT: xorl %edx, %edx278; X86-NEXT: divl %ecx279; X86-NEXT: retl280;281; X64-LABEL: testsize4:282; X64: # %bb.0: # %entry283; X64-NEXT: movl %edi, %eax284; X64-NEXT: pushq $33285; X64-NEXT: popq %rcx286; X64-NEXT: xorl %edx, %edx287; X64-NEXT: divl %ecx288; X64-NEXT: retq289entry:290 %div = udiv i32 %x, 33291 ret i32 %div292}293 294define i64 @PR23590(i64 %x) nounwind {295; X86-LABEL: PR23590:296; X86: # %bb.0: # %entry297; X86-NEXT: subl $12, %esp298; X86-NEXT: pushl $0299; X86-NEXT: pushl $12345 # imm = 0x3039300; X86-NEXT: pushl {{[0-9]+}}(%esp)301; X86-NEXT: pushl {{[0-9]+}}(%esp)302; X86-NEXT: calll __umoddi3303; X86-NEXT: addl $16, %esp304; X86-NEXT: pushl $0305; X86-NEXT: pushl $7306; X86-NEXT: pushl %edx307; X86-NEXT: pushl %eax308; X86-NEXT: calll __udivdi3309; X86-NEXT: addl $28, %esp310; X86-NEXT: retl311;312; X64-FAST-LABEL: PR23590:313; X64-FAST: # %bb.0: # %entry314; X64-FAST-NEXT: movabsq $6120523590596543007, %rcx # imm = 0x54F077C718E7C21F315; X64-FAST-NEXT: movq %rdi, %rax316; X64-FAST-NEXT: mulq %rcx317; X64-FAST-NEXT: shrq $12, %rdx318; X64-FAST-NEXT: imulq $12345, %rdx, %rax # imm = 0x3039319; X64-FAST-NEXT: subq %rax, %rdi320; X64-FAST-NEXT: movabsq $2635249153387078803, %rcx # imm = 0x2492492492492493321; X64-FAST-NEXT: movq %rdi, %rax322; X64-FAST-NEXT: mulq %rcx323; X64-FAST-NEXT: movq %rdx, %rax324; X64-FAST-NEXT: retq325;326; X64-SLOW-LABEL: PR23590:327; X64-SLOW: # %bb.0: # %entry328; X64-SLOW-NEXT: movabsq $6120523590596543007, %rcx # imm = 0x54F077C718E7C21F329; X64-SLOW-NEXT: movq %rdi, %rax330; X64-SLOW-NEXT: mulq %rcx331; X64-SLOW-NEXT: shrq $12, %rdx332; X64-SLOW-NEXT: imulq $12345, %rdx, %rax # imm = 0x3039333; X64-SLOW-NEXT: subq %rax, %rdi334; X64-SLOW-NEXT: imulq $613566757, %rdi, %rax # imm = 0x24924925335; X64-SLOW-NEXT: shrq $32, %rax336; X64-SLOW-NEXT: retq337entry:338 %rem = urem i64 %x, 12345339 %div = udiv i64 %rem, 7340 ret i64 %div341}342 343define { i64, i32 } @PR38622(i64) nounwind {344; X86-LABEL: PR38622:345; X86: # %bb.0:346; X86-NEXT: pushl %ebp347; X86-NEXT: pushl %ebx348; X86-NEXT: pushl %edi349; X86-NEXT: pushl %esi350; X86-NEXT: subl $12, %esp351; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx352; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp353; X86-NEXT: pushl $0354; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800355; X86-NEXT: pushl %ebp356; X86-NEXT: pushl %ebx357; X86-NEXT: calll __udivdi3358; X86-NEXT: addl $16, %esp359; X86-NEXT: movl %eax, %esi360; X86-NEXT: movl %edx, %edi361; X86-NEXT: pushl $0362; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800363; X86-NEXT: pushl %ebp364; X86-NEXT: pushl %ebx365; X86-NEXT: calll __umoddi3366; X86-NEXT: addl $16, %esp367; X86-NEXT: movl %eax, %ecx368; X86-NEXT: movl %esi, %eax369; X86-NEXT: movl %edi, %edx370; X86-NEXT: addl $12, %esp371; X86-NEXT: popl %esi372; X86-NEXT: popl %edi373; X86-NEXT: popl %ebx374; X86-NEXT: popl %ebp375; X86-NEXT: retl376;377; X64-LABEL: PR38622:378; X64: # %bb.0:379; X64-NEXT: movq %rdi, %rax380; X64-NEXT: shrq $11, %rax381; X64-NEXT: movabsq $4835703278458517, %rcx # imm = 0x112E0BE826D695382; X64-NEXT: mulq %rcx383; X64-NEXT: movq %rdx, %rax384; X64-NEXT: shrq $9, %rax385; X64-NEXT: imull $-294967296, %eax, %ecx # imm = 0xEE6B2800386; X64-NEXT: subl %ecx, %edi387; X64-NEXT: movl %edi, %edx388; X64-NEXT: retq389 %2 = udiv i64 %0, 4000000000390 %3 = urem i64 %0, 4000000000391 %4 = trunc i64 %3 to i32392 %5 = insertvalue { i64, i32 } undef, i64 %2, 0393 %6 = insertvalue { i64, i32 } %5, i32 %4, 1394 ret { i64, i32 } %6395}396 397define { i64, i32 } @PR38622_signed(i64) nounwind {398; X86-LABEL: PR38622_signed:399; X86: # %bb.0:400; X86-NEXT: pushl %ebp401; X86-NEXT: pushl %ebx402; X86-NEXT: pushl %edi403; X86-NEXT: pushl %esi404; X86-NEXT: subl $12, %esp405; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx406; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp407; X86-NEXT: pushl $0408; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800409; X86-NEXT: pushl %ebp410; X86-NEXT: pushl %ebx411; X86-NEXT: calll __divdi3412; X86-NEXT: addl $16, %esp413; X86-NEXT: movl %eax, %esi414; X86-NEXT: movl %edx, %edi415; X86-NEXT: pushl $0416; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800417; X86-NEXT: pushl %ebp418; X86-NEXT: pushl %ebx419; X86-NEXT: calll __moddi3420; X86-NEXT: addl $16, %esp421; X86-NEXT: movl %eax, %ecx422; X86-NEXT: movl %esi, %eax423; X86-NEXT: movl %edi, %edx424; X86-NEXT: addl $12, %esp425; X86-NEXT: popl %esi426; X86-NEXT: popl %edi427; X86-NEXT: popl %ebx428; X86-NEXT: popl %ebp429; X86-NEXT: retl430;431; X64-LABEL: PR38622_signed:432; X64: # %bb.0:433; X64-NEXT: movabsq $1237940039285380275, %rcx # imm = 0x112E0BE826D694B3434; X64-NEXT: movq %rdi, %rax435; X64-NEXT: imulq %rcx436; X64-NEXT: movq %rdx, %rax437; X64-NEXT: shrq $63, %rax438; X64-NEXT: sarq $28, %rdx439; X64-NEXT: addq %rdx, %rax440; X64-NEXT: imull $-294967296, %eax, %ecx # imm = 0xEE6B2800441; X64-NEXT: subl %ecx, %edi442; X64-NEXT: movl %edi, %edx443; X64-NEXT: retq444 %2 = sdiv i64 %0, 4000000000445 %3 = srem i64 %0, 4000000000446 %4 = trunc i64 %3 to i32447 %5 = insertvalue { i64, i32 } undef, i64 %2, 0448 %6 = insertvalue { i64, i32 } %5, i32 %4, 1449 ret { i64, i32 } %6450}451 452define i64 @urem_i64_3(i64 %x) nounwind {453; X86-LABEL: urem_i64_3:454; X86: # %bb.0: # %entry455; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx456; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx457; X86-NEXT: adcl $0, %ecx458; X86-NEXT: movl $-1431655765, %edx # imm = 0xAAAAAAAB459; X86-NEXT: movl %ecx, %eax460; X86-NEXT: mull %edx461; X86-NEXT: shrl %edx462; X86-NEXT: leal (%edx,%edx,2), %eax463; X86-NEXT: subl %eax, %ecx464; X86-NEXT: movl %ecx, %eax465; X86-NEXT: xorl %edx, %edx466; X86-NEXT: retl467;468; X64-LABEL: urem_i64_3:469; X64: # %bb.0: # %entry470; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB471; X64-NEXT: movq %rdi, %rax472; X64-NEXT: mulq %rcx473; X64-NEXT: shrq %rdx474; X64-NEXT: leaq (%rdx,%rdx,2), %rax475; X64-NEXT: subq %rax, %rdi476; X64-NEXT: movq %rdi, %rax477; X64-NEXT: retq478entry:479 %rem = urem i64 %x, 3480 ret i64 %rem481}482 483define i64 @urem_i64_5(i64 %x) nounwind {484; X86-LABEL: urem_i64_5:485; X86: # %bb.0: # %entry486; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx487; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx488; X86-NEXT: adcl $0, %ecx489; X86-NEXT: movl $-858993459, %edx # imm = 0xCCCCCCCD490; X86-NEXT: movl %ecx, %eax491; X86-NEXT: mull %edx492; X86-NEXT: shrl $2, %edx493; X86-NEXT: leal (%edx,%edx,4), %eax494; X86-NEXT: subl %eax, %ecx495; X86-NEXT: movl %ecx, %eax496; X86-NEXT: xorl %edx, %edx497; X86-NEXT: retl498;499; X64-LABEL: urem_i64_5:500; X64: # %bb.0: # %entry501; X64-NEXT: movabsq $-3689348814741910323, %rcx # imm = 0xCCCCCCCCCCCCCCCD502; X64-NEXT: movq %rdi, %rax503; X64-NEXT: mulq %rcx504; X64-NEXT: shrq $2, %rdx505; X64-NEXT: leaq (%rdx,%rdx,4), %rax506; X64-NEXT: subq %rax, %rdi507; X64-NEXT: movq %rdi, %rax508; X64-NEXT: retq509entry:510 %rem = urem i64 %x, 5511 ret i64 %rem512}513 514define i64 @urem_i64_15(i64 %x) nounwind {515; X86-LABEL: urem_i64_15:516; X86: # %bb.0: # %entry517; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx518; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx519; X86-NEXT: adcl $0, %ecx520; X86-NEXT: movl $-2004318071, %edx # imm = 0x88888889521; X86-NEXT: movl %ecx, %eax522; X86-NEXT: mull %edx523; X86-NEXT: shrl $3, %edx524; X86-NEXT: leal (%edx,%edx,4), %eax525; X86-NEXT: leal (%eax,%eax,2), %eax526; X86-NEXT: subl %eax, %ecx527; X86-NEXT: movl %ecx, %eax528; X86-NEXT: xorl %edx, %edx529; X86-NEXT: retl530;531; X64-LABEL: urem_i64_15:532; X64: # %bb.0: # %entry533; X64-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889534; X64-NEXT: movq %rdi, %rax535; X64-NEXT: mulq %rcx536; X64-NEXT: shrq $3, %rdx537; X64-NEXT: leaq (%rdx,%rdx,4), %rax538; X64-NEXT: leaq (%rax,%rax,2), %rax539; X64-NEXT: subq %rax, %rdi540; X64-NEXT: movq %rdi, %rax541; X64-NEXT: retq542entry:543 %rem = urem i64 %x, 15544 ret i64 %rem545}546 547define i64 @urem_i64_17(i64 %x) nounwind {548; X86-LABEL: urem_i64_17:549; X86: # %bb.0: # %entry550; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx551; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx552; X86-NEXT: adcl $0, %ecx553; X86-NEXT: movl $-252645135, %edx # imm = 0xF0F0F0F1554; X86-NEXT: movl %ecx, %eax555; X86-NEXT: mull %edx556; X86-NEXT: movl %edx, %eax557; X86-NEXT: andl $-16, %eax558; X86-NEXT: shrl $4, %edx559; X86-NEXT: addl %eax, %edx560; X86-NEXT: subl %edx, %ecx561; X86-NEXT: movl %ecx, %eax562; X86-NEXT: xorl %edx, %edx563; X86-NEXT: retl564;565; X64-LABEL: urem_i64_17:566; X64: # %bb.0: # %entry567; X64-NEXT: movabsq $-1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F1568; X64-NEXT: movq %rdi, %rax569; X64-NEXT: mulq %rcx570; X64-NEXT: movq %rdx, %rax571; X64-NEXT: andq $-16, %rax572; X64-NEXT: shrq $4, %rdx573; X64-NEXT: addq %rax, %rdx574; X64-NEXT: subq %rdx, %rdi575; X64-NEXT: movq %rdi, %rax576; X64-NEXT: retq577entry:578 %rem = urem i64 %x, 17579 ret i64 %rem580}581 582define i64 @urem_i64_255(i64 %x) nounwind {583; X86-LABEL: urem_i64_255:584; X86: # %bb.0: # %entry585; X86-NEXT: pushl %esi586; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx587; X86-NEXT: movl {{[0-9]+}}(%esp), %esi588; X86-NEXT: movl %ecx, %eax589; X86-NEXT: addl %esi, %eax590; X86-NEXT: adcl $0, %eax591; X86-NEXT: movl $-2139062143, %edx # imm = 0x80808081592; X86-NEXT: mull %edx593; X86-NEXT: shrl $7, %edx594; X86-NEXT: movl %edx, %eax595; X86-NEXT: shll $8, %eax596; X86-NEXT: subl %eax, %edx597; X86-NEXT: addl %esi, %ecx598; X86-NEXT: adcl %edx, %ecx599; X86-NEXT: movl %ecx, %eax600; X86-NEXT: xorl %edx, %edx601; X86-NEXT: popl %esi602; X86-NEXT: retl603;604; X64-LABEL: urem_i64_255:605; X64: # %bb.0: # %entry606; X64-NEXT: movabsq $-9187201950435737471, %rcx # imm = 0x8080808080808081607; X64-NEXT: movq %rdi, %rax608; X64-NEXT: mulq %rcx609; X64-NEXT: shrq $7, %rdx610; X64-NEXT: movq %rdx, %rax611; X64-NEXT: shlq $8, %rax612; X64-NEXT: subq %rax, %rdx613; X64-NEXT: leaq (%rdx,%rdi), %rax614; X64-NEXT: retq615entry:616 %rem = urem i64 %x, 255617 ret i64 %rem618}619 620define i64 @urem_i64_257(i64 %x) nounwind {621; X86-LABEL: urem_i64_257:622; X86: # %bb.0: # %entry623; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx624; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx625; X86-NEXT: adcl $0, %ecx626; X86-NEXT: movl $-16711935, %edx # imm = 0xFF00FF01627; X86-NEXT: movl %ecx, %eax628; X86-NEXT: mull %edx629; X86-NEXT: movl %edx, %eax630; X86-NEXT: andl $-256, %eax631; X86-NEXT: shrl $8, %edx632; X86-NEXT: addl %eax, %edx633; X86-NEXT: subl %edx, %ecx634; X86-NEXT: movl %ecx, %eax635; X86-NEXT: xorl %edx, %edx636; X86-NEXT: retl637;638; X64-LABEL: urem_i64_257:639; X64: # %bb.0: # %entry640; X64-NEXT: movabsq $-71777214294589695, %rcx # imm = 0xFF00FF00FF00FF01641; X64-NEXT: movq %rdi, %rax642; X64-NEXT: mulq %rcx643; X64-NEXT: movq %rdx, %rax644; X64-NEXT: andq $-256, %rax645; X64-NEXT: shrq $8, %rdx646; X64-NEXT: addq %rax, %rdx647; X64-NEXT: subq %rdx, %rdi648; X64-NEXT: movq %rdi, %rax649; X64-NEXT: retq650entry:651 %rem = urem i64 %x, 257652 ret i64 %rem653}654 655define i64 @urem_i64_65535(i64 %x) nounwind {656; X86-LABEL: urem_i64_65535:657; X86: # %bb.0: # %entry658; X86-NEXT: pushl %esi659; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx660; X86-NEXT: movl {{[0-9]+}}(%esp), %esi661; X86-NEXT: movl %ecx, %eax662; X86-NEXT: addl %esi, %eax663; X86-NEXT: adcl $0, %eax664; X86-NEXT: movl $-2147450879, %edx # imm = 0x80008001665; X86-NEXT: mull %edx666; X86-NEXT: shrl $15, %edx667; X86-NEXT: movl %edx, %eax668; X86-NEXT: shll $16, %eax669; X86-NEXT: subl %eax, %edx670; X86-NEXT: addl %esi, %ecx671; X86-NEXT: adcl %edx, %ecx672; X86-NEXT: movl %ecx, %eax673; X86-NEXT: xorl %edx, %edx674; X86-NEXT: popl %esi675; X86-NEXT: retl676;677; X64-LABEL: urem_i64_65535:678; X64: # %bb.0: # %entry679; X64-NEXT: movabsq $-9223231297218904063, %rcx # imm = 0x8000800080008001680; X64-NEXT: movq %rdi, %rax681; X64-NEXT: mulq %rcx682; X64-NEXT: shrq $15, %rdx683; X64-NEXT: movq %rdx, %rax684; X64-NEXT: shlq $16, %rax685; X64-NEXT: subq %rax, %rdx686; X64-NEXT: leaq (%rdx,%rdi), %rax687; X64-NEXT: retq688entry:689 %rem = urem i64 %x, 65535690 ret i64 %rem691}692 693define i64 @urem_i64_65537(i64 %x) nounwind {694; X86-LABEL: urem_i64_65537:695; X86: # %bb.0: # %entry696; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx697; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx698; X86-NEXT: adcl $0, %ecx699; X86-NEXT: movl $-65535, %edx # imm = 0xFFFF0001700; X86-NEXT: movl %ecx, %eax701; X86-NEXT: mull %edx702; X86-NEXT: movl %edx, %eax703; X86-NEXT: shrl $16, %eax704; X86-NEXT: shldl $16, %edx, %eax705; X86-NEXT: subl %eax, %ecx706; X86-NEXT: movl %ecx, %eax707; X86-NEXT: xorl %edx, %edx708; X86-NEXT: retl709;710; X64-LABEL: urem_i64_65537:711; X64: # %bb.0: # %entry712; X64-NEXT: movabsq $-281470681808895, %rcx # imm = 0xFFFF0000FFFF0001713; X64-NEXT: movq %rdi, %rax714; X64-NEXT: mulq %rcx715; X64-NEXT: movq %rdx, %rax716; X64-NEXT: andq $-65536, %rax # imm = 0xFFFF0000717; X64-NEXT: shrq $16, %rdx718; X64-NEXT: addq %rax, %rdx719; X64-NEXT: subq %rdx, %rdi720; X64-NEXT: movq %rdi, %rax721; X64-NEXT: retq722entry:723 %rem = urem i64 %x, 65537724 ret i64 %rem725}726 727define i64 @urem_i64_12(i64 %x) nounwind {728; X86-LABEL: urem_i64_12:729; X86: # %bb.0: # %entry730; X86-NEXT: pushl %esi731; X86-NEXT: movl {{[0-9]+}}(%esp), %esi732; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx733; X86-NEXT: movl %ecx, %eax734; X86-NEXT: shrl $2, %eax735; X86-NEXT: shldl $30, %esi, %ecx736; X86-NEXT: addl %eax, %ecx737; X86-NEXT: adcl $0, %ecx738; X86-NEXT: movl $-1431655765, %edx # imm = 0xAAAAAAAB739; X86-NEXT: movl %ecx, %eax740; X86-NEXT: mull %edx741; X86-NEXT: shrl %edx742; X86-NEXT: leal (%edx,%edx,2), %eax743; X86-NEXT: subl %eax, %ecx744; X86-NEXT: andl $3, %esi745; X86-NEXT: leal (%esi,%ecx,4), %eax746; X86-NEXT: xorl %edx, %edx747; X86-NEXT: popl %esi748; X86-NEXT: retl749;750; X64-LABEL: urem_i64_12:751; X64: # %bb.0: # %entry752; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB753; X64-NEXT: movq %rdi, %rax754; X64-NEXT: mulq %rcx755; X64-NEXT: shrq %rdx756; X64-NEXT: andq $-4, %rdx757; X64-NEXT: leaq (%rdx,%rdx,2), %rax758; X64-NEXT: subq %rax, %rdi759; X64-NEXT: movq %rdi, %rax760; X64-NEXT: retq761entry:762 %rem = urem i64 %x, 12763 ret i64 %rem764}765 766define i64 @udiv_i64_3(i64 %x) nounwind {767; X86-LABEL: udiv_i64_3:768; X86: # %bb.0: # %entry769; X86-NEXT: pushl %ebx770; X86-NEXT: pushl %edi771; X86-NEXT: pushl %esi772; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx773; X86-NEXT: movl {{[0-9]+}}(%esp), %edi774; X86-NEXT: movl %ecx, %esi775; X86-NEXT: addl %edi, %esi776; X86-NEXT: adcl $0, %esi777; X86-NEXT: movl $-1431655765, %ebx # imm = 0xAAAAAAAB778; X86-NEXT: movl %esi, %eax779; X86-NEXT: mull %ebx780; X86-NEXT: shrl %edx781; X86-NEXT: leal (%edx,%edx,2), %eax782; X86-NEXT: subl %eax, %esi783; X86-NEXT: subl %esi, %ecx784; X86-NEXT: sbbl $0, %edi785; X86-NEXT: movl %ecx, %eax786; X86-NEXT: mull %ebx787; X86-NEXT: imull $-1431655766, %ecx, %ecx # imm = 0xAAAAAAAA788; X86-NEXT: addl %ecx, %edx789; X86-NEXT: imull $-1431655765, %edi, %ecx # imm = 0xAAAAAAAB790; X86-NEXT: addl %ecx, %edx791; X86-NEXT: popl %esi792; X86-NEXT: popl %edi793; X86-NEXT: popl %ebx794; X86-NEXT: retl795;796; X64-LABEL: udiv_i64_3:797; X64: # %bb.0: # %entry798; X64-NEXT: movq %rdi, %rax799; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB800; X64-NEXT: mulq %rcx801; X64-NEXT: movq %rdx, %rax802; X64-NEXT: shrq %rax803; X64-NEXT: retq804entry:805 %rem = udiv i64 %x, 3806 ret i64 %rem807}808 809define i64 @udiv_i64_5(i64 %x) nounwind {810; X86-LABEL: udiv_i64_5:811; X86: # %bb.0: # %entry812; X86-NEXT: pushl %ebx813; X86-NEXT: pushl %edi814; X86-NEXT: pushl %esi815; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx816; X86-NEXT: movl {{[0-9]+}}(%esp), %edi817; X86-NEXT: movl %ecx, %esi818; X86-NEXT: addl %edi, %esi819; X86-NEXT: adcl $0, %esi820; X86-NEXT: movl $-858993459, %ebx # imm = 0xCCCCCCCD821; X86-NEXT: movl %esi, %eax822; X86-NEXT: mull %ebx823; X86-NEXT: shrl $2, %edx824; X86-NEXT: leal (%edx,%edx,4), %eax825; X86-NEXT: subl %eax, %esi826; X86-NEXT: subl %esi, %ecx827; X86-NEXT: sbbl $0, %edi828; X86-NEXT: movl %ecx, %eax829; X86-NEXT: mull %ebx830; X86-NEXT: imull $-858993460, %ecx, %ecx # imm = 0xCCCCCCCC831; X86-NEXT: addl %ecx, %edx832; X86-NEXT: imull $-858993459, %edi, %ecx # imm = 0xCCCCCCCD833; X86-NEXT: addl %ecx, %edx834; X86-NEXT: popl %esi835; X86-NEXT: popl %edi836; X86-NEXT: popl %ebx837; X86-NEXT: retl838;839; X64-LABEL: udiv_i64_5:840; X64: # %bb.0: # %entry841; X64-NEXT: movq %rdi, %rax842; X64-NEXT: movabsq $-3689348814741910323, %rcx # imm = 0xCCCCCCCCCCCCCCCD843; X64-NEXT: mulq %rcx844; X64-NEXT: movq %rdx, %rax845; X64-NEXT: shrq $2, %rax846; X64-NEXT: retq847entry:848 %rem = udiv i64 %x, 5849 ret i64 %rem850}851 852define i64 @udiv_i64_15(i64 %x) nounwind {853; X86-LABEL: udiv_i64_15:854; X86: # %bb.0: # %entry855; X86-NEXT: pushl %edi856; X86-NEXT: pushl %esi857; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx858; X86-NEXT: movl {{[0-9]+}}(%esp), %edi859; X86-NEXT: movl %ecx, %esi860; X86-NEXT: addl %edi, %esi861; X86-NEXT: adcl $0, %esi862; X86-NEXT: movl $-2004318071, %edx # imm = 0x88888889863; X86-NEXT: movl %esi, %eax864; X86-NEXT: mull %edx865; X86-NEXT: shrl $3, %edx866; X86-NEXT: leal (%edx,%edx,4), %eax867; X86-NEXT: leal (%eax,%eax,2), %eax868; X86-NEXT: subl %eax, %esi869; X86-NEXT: subl %esi, %ecx870; X86-NEXT: sbbl $0, %edi871; X86-NEXT: movl $-286331153, %edx # imm = 0xEEEEEEEF872; X86-NEXT: movl %ecx, %eax873; X86-NEXT: mull %edx874; X86-NEXT: imull $-286331154, %ecx, %ecx # imm = 0xEEEEEEEE875; X86-NEXT: addl %ecx, %edx876; X86-NEXT: imull $-286331153, %edi, %ecx # imm = 0xEEEEEEEF877; X86-NEXT: addl %ecx, %edx878; X86-NEXT: popl %esi879; X86-NEXT: popl %edi880; X86-NEXT: retl881;882; X64-LABEL: udiv_i64_15:883; X64: # %bb.0: # %entry884; X64-NEXT: movq %rdi, %rax885; X64-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889886; X64-NEXT: mulq %rcx887; X64-NEXT: movq %rdx, %rax888; X64-NEXT: shrq $3, %rax889; X64-NEXT: retq890entry:891 %rem = udiv i64 %x, 15892 ret i64 %rem893}894 895define i64 @udiv_i64_17(i64 %x) nounwind {896; X86-LABEL: udiv_i64_17:897; X86: # %bb.0: # %entry898; X86-NEXT: pushl %ebx899; X86-NEXT: pushl %edi900; X86-NEXT: pushl %esi901; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx902; X86-NEXT: movl {{[0-9]+}}(%esp), %edi903; X86-NEXT: movl %ecx, %esi904; X86-NEXT: addl %edi, %esi905; X86-NEXT: adcl $0, %esi906; X86-NEXT: movl $-252645135, %ebx # imm = 0xF0F0F0F1907; X86-NEXT: movl %esi, %eax908; X86-NEXT: mull %ebx909; X86-NEXT: movl %edx, %eax910; X86-NEXT: andl $-16, %eax911; X86-NEXT: shrl $4, %edx912; X86-NEXT: addl %eax, %edx913; X86-NEXT: subl %edx, %esi914; X86-NEXT: subl %esi, %ecx915; X86-NEXT: sbbl $0, %edi916; X86-NEXT: movl %ecx, %eax917; X86-NEXT: mull %ebx918; X86-NEXT: imull $-252645136, %ecx, %ecx # imm = 0xF0F0F0F0919; X86-NEXT: addl %ecx, %edx920; X86-NEXT: imull $-252645135, %edi, %ecx # imm = 0xF0F0F0F1921; X86-NEXT: addl %ecx, %edx922; X86-NEXT: popl %esi923; X86-NEXT: popl %edi924; X86-NEXT: popl %ebx925; X86-NEXT: retl926;927; X64-LABEL: udiv_i64_17:928; X64: # %bb.0: # %entry929; X64-NEXT: movq %rdi, %rax930; X64-NEXT: movabsq $-1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F1931; X64-NEXT: mulq %rcx932; X64-NEXT: movq %rdx, %rax933; X64-NEXT: shrq $4, %rax934; X64-NEXT: retq935entry:936 %rem = udiv i64 %x, 17937 ret i64 %rem938}939 940define i64 @udiv_i64_255(i64 %x) nounwind {941; X86-LABEL: udiv_i64_255:942; X86: # %bb.0: # %entry943; X86-NEXT: pushl %esi944; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx945; X86-NEXT: movl {{[0-9]+}}(%esp), %esi946; X86-NEXT: movl %ecx, %eax947; X86-NEXT: addl %esi, %eax948; X86-NEXT: adcl $0, %eax949; X86-NEXT: movl $-2139062143, %edx # imm = 0x80808081950; X86-NEXT: mull %edx951; X86-NEXT: shrl $7, %edx952; X86-NEXT: movl %edx, %eax953; X86-NEXT: shll $8, %eax954; X86-NEXT: subl %eax, %edx955; X86-NEXT: movl %ecx, %eax956; X86-NEXT: addl %esi, %eax957; X86-NEXT: adcl %edx, %eax958; X86-NEXT: subl %eax, %ecx959; X86-NEXT: sbbl $0, %esi960; X86-NEXT: movl $-16843009, %edx # imm = 0xFEFEFEFF961; X86-NEXT: movl %ecx, %eax962; X86-NEXT: mull %edx963; X86-NEXT: imull $-16843010, %ecx, %ecx # imm = 0xFEFEFEFE964; X86-NEXT: addl %ecx, %edx965; X86-NEXT: imull $-16843009, %esi, %ecx # imm = 0xFEFEFEFF966; X86-NEXT: addl %ecx, %edx967; X86-NEXT: popl %esi968; X86-NEXT: retl969;970; X64-LABEL: udiv_i64_255:971; X64: # %bb.0: # %entry972; X64-NEXT: movq %rdi, %rax973; X64-NEXT: movabsq $-9187201950435737471, %rcx # imm = 0x8080808080808081974; X64-NEXT: mulq %rcx975; X64-NEXT: movq %rdx, %rax976; X64-NEXT: shrq $7, %rax977; X64-NEXT: retq978entry:979 %rem = udiv i64 %x, 255980 ret i64 %rem981}982 983define i64 @udiv_i64_257(i64 %x) nounwind {984; X86-LABEL: udiv_i64_257:985; X86: # %bb.0: # %entry986; X86-NEXT: pushl %ebx987; X86-NEXT: pushl %edi988; X86-NEXT: pushl %esi989; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx990; X86-NEXT: movl {{[0-9]+}}(%esp), %edi991; X86-NEXT: movl %ecx, %esi992; X86-NEXT: addl %edi, %esi993; X86-NEXT: adcl $0, %esi994; X86-NEXT: movl $-16711935, %ebx # imm = 0xFF00FF01995; X86-NEXT: movl %esi, %eax996; X86-NEXT: mull %ebx997; X86-NEXT: movl %edx, %eax998; X86-NEXT: andl $-256, %eax999; X86-NEXT: shrl $8, %edx1000; X86-NEXT: addl %eax, %edx1001; X86-NEXT: subl %edx, %esi1002; X86-NEXT: subl %esi, %ecx1003; X86-NEXT: sbbl $0, %edi1004; X86-NEXT: movl %ecx, %eax1005; X86-NEXT: mull %ebx1006; X86-NEXT: imull $-16711936, %ecx, %ecx # imm = 0xFF00FF001007; X86-NEXT: addl %ecx, %edx1008; X86-NEXT: imull $-16711935, %edi, %ecx # imm = 0xFF00FF011009; X86-NEXT: addl %ecx, %edx1010; X86-NEXT: popl %esi1011; X86-NEXT: popl %edi1012; X86-NEXT: popl %ebx1013; X86-NEXT: retl1014;1015; X64-LABEL: udiv_i64_257:1016; X64: # %bb.0: # %entry1017; X64-NEXT: movq %rdi, %rax1018; X64-NEXT: movabsq $-71777214294589695, %rcx # imm = 0xFF00FF00FF00FF011019; X64-NEXT: mulq %rcx1020; X64-NEXT: movq %rdx, %rax1021; X64-NEXT: shrq $8, %rax1022; X64-NEXT: retq1023entry:1024 %rem = udiv i64 %x, 2571025 ret i64 %rem1026}1027 1028define i64 @udiv_i64_65535(i64 %x) nounwind {1029; X86-LABEL: udiv_i64_65535:1030; X86: # %bb.0: # %entry1031; X86-NEXT: pushl %esi1032; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1033; X86-NEXT: movl {{[0-9]+}}(%esp), %esi1034; X86-NEXT: movl %ecx, %eax1035; X86-NEXT: addl %esi, %eax1036; X86-NEXT: adcl $0, %eax1037; X86-NEXT: movl $-2147450879, %edx # imm = 0x800080011038; X86-NEXT: mull %edx1039; X86-NEXT: shrl $15, %edx1040; X86-NEXT: movl %edx, %eax1041; X86-NEXT: shll $16, %eax1042; X86-NEXT: subl %eax, %edx1043; X86-NEXT: movl %ecx, %eax1044; X86-NEXT: addl %esi, %eax1045; X86-NEXT: adcl %edx, %eax1046; X86-NEXT: subl %eax, %ecx1047; X86-NEXT: sbbl $0, %esi1048; X86-NEXT: movl $-65537, %edx # imm = 0xFFFEFFFF1049; X86-NEXT: movl %ecx, %eax1050; X86-NEXT: mull %edx1051; X86-NEXT: imull $-65538, %ecx, %ecx # imm = 0xFFFEFFFE1052; X86-NEXT: addl %ecx, %edx1053; X86-NEXT: movl %esi, %ecx1054; X86-NEXT: shll $16, %ecx1055; X86-NEXT: addl %esi, %ecx1056; X86-NEXT: subl %ecx, %edx1057; X86-NEXT: popl %esi1058; X86-NEXT: retl1059;1060; X64-LABEL: udiv_i64_65535:1061; X64: # %bb.0: # %entry1062; X64-NEXT: movq %rdi, %rax1063; X64-NEXT: movabsq $-9223231297218904063, %rcx # imm = 0x80008000800080011064; X64-NEXT: mulq %rcx1065; X64-NEXT: movq %rdx, %rax1066; X64-NEXT: shrq $15, %rax1067; X64-NEXT: retq1068entry:1069 %rem = udiv i64 %x, 655351070 ret i64 %rem1071}1072 1073define i64 @udiv_i64_65537(i64 %x) nounwind {1074; X86-LABEL: udiv_i64_65537:1075; X86: # %bb.0: # %entry1076; X86-NEXT: pushl %ebx1077; X86-NEXT: pushl %edi1078; X86-NEXT: pushl %esi1079; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1080; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1081; X86-NEXT: movl %ecx, %esi1082; X86-NEXT: addl %edi, %esi1083; X86-NEXT: adcl $0, %esi1084; X86-NEXT: movl $-65535, %ebx # imm = 0xFFFF00011085; X86-NEXT: movl %esi, %eax1086; X86-NEXT: mull %ebx1087; X86-NEXT: movl %edx, %eax1088; X86-NEXT: shrl $16, %eax1089; X86-NEXT: shldl $16, %edx, %eax1090; X86-NEXT: subl %eax, %esi1091; X86-NEXT: subl %esi, %ecx1092; X86-NEXT: sbbl $0, %edi1093; X86-NEXT: movl %ecx, %eax1094; X86-NEXT: mull %ebx1095; X86-NEXT: shll $16, %ecx1096; X86-NEXT: subl %ecx, %edx1097; X86-NEXT: movl %edi, %ecx1098; X86-NEXT: shll $16, %ecx1099; X86-NEXT: subl %ecx, %edi1100; X86-NEXT: addl %edi, %edx1101; X86-NEXT: popl %esi1102; X86-NEXT: popl %edi1103; X86-NEXT: popl %ebx1104; X86-NEXT: retl1105;1106; X64-LABEL: udiv_i64_65537:1107; X64: # %bb.0: # %entry1108; X64-NEXT: movq %rdi, %rax1109; X64-NEXT: movabsq $-281470681808895, %rcx # imm = 0xFFFF0000FFFF00011110; X64-NEXT: mulq %rcx1111; X64-NEXT: movq %rdx, %rax1112; X64-NEXT: shrq $16, %rax1113; X64-NEXT: retq1114entry:1115 %rem = udiv i64 %x, 655371116 ret i64 %rem1117}1118 1119define i64 @udiv_i64_12(i64 %x) nounwind {1120; X86-LABEL: udiv_i64_12:1121; X86: # %bb.0: # %entry1122; X86-NEXT: pushl %ebx1123; X86-NEXT: pushl %edi1124; X86-NEXT: pushl %esi1125; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx1126; X86-NEXT: movl {{[0-9]+}}(%esp), %edi1127; X86-NEXT: shrdl $2, %edi, %ecx1128; X86-NEXT: shrl $2, %edi1129; X86-NEXT: movl %ecx, %esi1130; X86-NEXT: addl %edi, %esi1131; X86-NEXT: adcl $0, %esi1132; X86-NEXT: movl $-1431655765, %ebx # imm = 0xAAAAAAAB1133; X86-NEXT: movl %esi, %eax1134; X86-NEXT: mull %ebx1135; X86-NEXT: shrl %edx1136; X86-NEXT: leal (%edx,%edx,2), %eax1137; X86-NEXT: subl %eax, %esi1138; X86-NEXT: subl %esi, %ecx1139; X86-NEXT: sbbl $0, %edi1140; X86-NEXT: movl %ecx, %eax1141; X86-NEXT: mull %ebx1142; X86-NEXT: imull $-1431655766, %ecx, %ecx # imm = 0xAAAAAAAA1143; X86-NEXT: addl %ecx, %edx1144; X86-NEXT: imull $-1431655765, %edi, %ecx # imm = 0xAAAAAAAB1145; X86-NEXT: addl %ecx, %edx1146; X86-NEXT: popl %esi1147; X86-NEXT: popl %edi1148; X86-NEXT: popl %ebx1149; X86-NEXT: retl1150;1151; X64-LABEL: udiv_i64_12:1152; X64: # %bb.0: # %entry1153; X64-NEXT: movq %rdi, %rax1154; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB1155; X64-NEXT: mulq %rcx1156; X64-NEXT: movq %rdx, %rax1157; X64-NEXT: shrq $3, %rax1158; X64-NEXT: retq1159entry:1160 %rem = udiv i64 %x, 121161 ret i64 %rem1162}1163 1164; Make sure we don't inline expand for optsize.1165define i64 @urem_i64_3_optsize(i64 %x) nounwind optsize {1166; X86-LABEL: urem_i64_3_optsize:1167; X86: # %bb.0: # %entry1168; X86-NEXT: subl $12, %esp1169; X86-NEXT: pushl $01170; X86-NEXT: pushl $31171; X86-NEXT: pushl {{[0-9]+}}(%esp)1172; X86-NEXT: pushl {{[0-9]+}}(%esp)1173; X86-NEXT: calll __umoddi31174; X86-NEXT: addl $28, %esp1175; X86-NEXT: retl1176;1177; X64-LABEL: urem_i64_3_optsize:1178; X64: # %bb.0: # %entry1179; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB1180; X64-NEXT: movq %rdi, %rax1181; X64-NEXT: mulq %rcx1182; X64-NEXT: shrq %rdx1183; X64-NEXT: leaq (%rdx,%rdx,2), %rax1184; X64-NEXT: subq %rax, %rdi1185; X64-NEXT: movq %rdi, %rax1186; X64-NEXT: retq1187entry:1188 %rem = urem i64 %x, 31189 ret i64 %rem1190}1191 1192