brintos

brintos / llvm-project-archived public Read only

0
0
Text · 34.0 KiB · ac78136 Raw
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