1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-pc-linux-gnu | FileCheck %s --check-prefix=X86 3; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefixes=X64,X64-FAST 4; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mattr=idivq-to-divl | FileCheck %s --check-prefixes=X64,X64-SLOW 5 6define zeroext i16 @test1(i16 zeroext %x) nounwind { 7; X86-LABEL: test1: 8; X86: # %bb.0: # %entry 9; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 10; X86-NEXT: imull $63551, %eax, %eax # imm = 0xF83F 11; X86-NEXT: shrl $21, %eax 12; X86-NEXT: # kill: def $ax killed $ax killed $eax 13; X86-NEXT: retl 14; 15; X64-LABEL: test1: 16; X64: # %bb.0: # %entry 17; X64-NEXT: imull $63551, %edi, %eax # imm = 0xF83F 18; X64-NEXT: shrl $21, %eax 19; X64-NEXT: # kill: def $ax killed $ax killed $eax 20; X64-NEXT: retq 21entry: 22 %div = udiv i16 %x, 33 23 ret i16 %div 24} 25 26define zeroext i16 @test2(i8 signext %x, i16 zeroext %c) nounwind readnone ssp noredzone { 27; X86-LABEL: test2: 28; X86: # %bb.0: # %entry 29; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 30; X86-NEXT: imull $43691, %eax, %eax # imm = 0xAAAB 31; X86-NEXT: shrl $17, %eax 32; X86-NEXT: # kill: def $ax killed $ax killed $eax 33; X86-NEXT: retl 34; 35; X64-LABEL: test2: 36; X64: # %bb.0: # %entry 37; X64-NEXT: imull $43691, %esi, %eax # imm = 0xAAAB 38; X64-NEXT: shrl $17, %eax 39; X64-NEXT: # kill: def $ax killed $ax killed $eax 40; X64-NEXT: retq 41entry: 42 %div = udiv i16 %c, 3 43 ret i16 %div 44 45} 46 47define zeroext i8 @test3(i8 zeroext %x, i8 zeroext %c) nounwind readnone ssp noredzone { 48; X86-LABEL: test3: 49; X86: # %bb.0: # %entry 50; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 51; X86-NEXT: imull $171, %eax, %eax 52; X86-NEXT: shrl $9, %eax 53; X86-NEXT: # kill: def $al killed $al killed $eax 54; X86-NEXT: retl 55; 56; X64-LABEL: test3: 57; X64: # %bb.0: # %entry 58; X64-NEXT: imull $171, %esi, %eax 59; X64-NEXT: shrl $9, %eax 60; X64-NEXT: # kill: def $al killed $al killed $eax 61; X64-NEXT: retq 62entry: 63 %div = udiv i8 %c, 3 64 ret i8 %div 65} 66 67define signext i16 @test4(i16 signext %x) nounwind { 68; X86-LABEL: test4: 69; X86: # %bb.0: # %entry 70; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax 71; X86-NEXT: imull $1986, %eax, %eax # imm = 0x7C2 72; X86-NEXT: movl %eax, %ecx 73; X86-NEXT: shrl $31, %ecx 74; X86-NEXT: shrl $16, %eax 75; X86-NEXT: addl %ecx, %eax 76; X86-NEXT: # kill: def $ax killed $ax killed $eax 77; X86-NEXT: retl 78; 79; X64-LABEL: test4: 80; X64: # %bb.0: # %entry 81; X64-NEXT: imull $1986, %edi, %eax # imm = 0x7C2 82; X64-NEXT: movl %eax, %ecx 83; X64-NEXT: shrl $31, %ecx 84; X64-NEXT: shrl $16, %eax 85; X64-NEXT: addl %ecx, %eax 86; X64-NEXT: # kill: def $ax killed $ax killed $eax 87; X64-NEXT: retq 88entry: 89 %div = sdiv i16 %x, 33 ; <i32> [#uses=1] 90 ret i16 %div 91} 92 93define i32 @test5(i32 %A) nounwind { 94; X86-LABEL: test5: 95; X86: # %bb.0: 96; X86-NEXT: movl $365384439, %eax # imm = 0x15C752F7 97; X86-NEXT: mull {{[0-9]+}}(%esp) 98; X86-NEXT: movl %edx, %eax 99; X86-NEXT: shrl $27, %eax 100; X86-NEXT: retl 101; 102; X64-LABEL: test5: 103; X64: # %bb.0: 104; X64-NEXT: movl %edi, %eax 105; X64-NEXT: imulq $365384439, %rax, %rax # imm = 0x15C752F7 106; X64-NEXT: shrq $59, %rax 107; X64-NEXT: # kill: def $eax killed $eax killed $rax 108; X64-NEXT: retq 109 %tmp1 = udiv i32 %A, 1577682821 ; <i32> [#uses=1] 110 ret i32 %tmp1 111} 112 113define signext i16 @test6(i16 signext %x) nounwind { 114; X86-LABEL: test6: 115; X86: # %bb.0: # %entry 116; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax 117; X86-NEXT: imull $26215, %eax, %eax # imm = 0x6667 118; X86-NEXT: movl %eax, %ecx 119; X86-NEXT: shrl $31, %ecx 120; X86-NEXT: sarl $18, %eax 121; X86-NEXT: addl %ecx, %eax 122; X86-NEXT: # kill: def $ax killed $ax killed $eax 123; X86-NEXT: retl 124; 125; X64-LABEL: test6: 126; X64: # %bb.0: # %entry 127; X64-NEXT: imull $26215, %edi, %eax # imm = 0x6667 128; X64-NEXT: movl %eax, %ecx 129; X64-NEXT: shrl $31, %ecx 130; X64-NEXT: sarl $18, %eax 131; X64-NEXT: addl %ecx, %eax 132; X64-NEXT: # kill: def $ax killed $ax killed $eax 133; X64-NEXT: retq 134entry: 135 %div = sdiv i16 %x, 10 136 ret i16 %div 137} 138 139define i32 @test7(i32 %x) nounwind { 140; X86-LABEL: test7: 141; X86: # %bb.0: 142; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 143; X86-NEXT: shrl $2, %eax 144; X86-NEXT: movl $613566757, %ecx # imm = 0x24924925 145; X86-NEXT: mull %ecx 146; X86-NEXT: movl %edx, %eax 147; X86-NEXT: retl 148; 149; X64-LABEL: test7: 150; X64: # %bb.0: 151; X64-NEXT: # kill: def $edi killed $edi def $rdi 152; X64-NEXT: shrl $2, %edi 153; X64-NEXT: imulq $613566757, %rdi, %rax # imm = 0x24924925 154; X64-NEXT: shrq $32, %rax 155; X64-NEXT: # kill: def $eax killed $eax killed $rax 156; X64-NEXT: retq 157 %div = udiv i32 %x, 28 158 ret i32 %div 159} 160 161; PR13326 162define i8 @test8(i8 %x) nounwind { 163; X86-LABEL: test8: 164; X86: # %bb.0: 165; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 166; X86-NEXT: shrb %al 167; X86-NEXT: movzbl %al, %eax 168; X86-NEXT: imull $211, %eax, %eax 169; X86-NEXT: shrl $13, %eax 170; X86-NEXT: # kill: def $al killed $al killed $eax 171; X86-NEXT: retl 172; 173; X64-LABEL: test8: 174; X64: # %bb.0: 175; X64-NEXT: shrb %dil 176; X64-NEXT: movzbl %dil, %eax 177; X64-NEXT: imull $211, %eax, %eax 178; X64-NEXT: shrl $13, %eax 179; X64-NEXT: # kill: def $al killed $al killed $eax 180; X64-NEXT: retq 181 %div = udiv i8 %x, 78 182 ret i8 %div 183} 184 185define i8 @test9(i8 %x) nounwind { 186; X86-LABEL: test9: 187; X86: # %bb.0: 188; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 189; X86-NEXT: shrb $2, %al 190; X86-NEXT: movzbl %al, %eax 191; X86-NEXT: imull $71, %eax, %eax 192; X86-NEXT: shrl $11, %eax 193; X86-NEXT: # kill: def $al killed $al killed $eax 194; X86-NEXT: retl 195; 196; X64-LABEL: test9: 197; X64: # %bb.0: 198; X64-NEXT: shrb $2, %dil 199; X64-NEXT: movzbl %dil, %eax 200; X64-NEXT: imull $71, %eax, %eax 201; X64-NEXT: shrl $11, %eax 202; X64-NEXT: # kill: def $al killed $al killed $eax 203; X64-NEXT: retq 204 %div = udiv i8 %x, 116 205 ret i8 %div 206} 207 208define i32 @testsize1(i32 %x) minsize nounwind { 209; X86-LABEL: testsize1: 210; X86: # %bb.0: # %entry 211; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 212; X86-NEXT: pushl $32 213; X86-NEXT: popl %ecx 214; X86-NEXT: cltd 215; X86-NEXT: idivl %ecx 216; X86-NEXT: retl 217; 218; X64-LABEL: testsize1: 219; X64: # %bb.0: # %entry 220; X64-NEXT: movl %edi, %eax 221; X64-NEXT: pushq $32 222; X64-NEXT: popq %rcx 223; X64-NEXT: cltd 224; X64-NEXT: idivl %ecx 225; X64-NEXT: retq 226entry: 227 %div = sdiv i32 %x, 32 228 ret i32 %div 229} 230 231define i32 @testsize2(i32 %x) minsize nounwind { 232; X86-LABEL: testsize2: 233; X86: # %bb.0: # %entry 234; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 235; X86-NEXT: pushl $33 236; X86-NEXT: popl %ecx 237; X86-NEXT: cltd 238; X86-NEXT: idivl %ecx 239; X86-NEXT: retl 240; 241; X64-LABEL: testsize2: 242; X64: # %bb.0: # %entry 243; X64-NEXT: movl %edi, %eax 244; X64-NEXT: pushq $33 245; X64-NEXT: popq %rcx 246; X64-NEXT: cltd 247; X64-NEXT: idivl %ecx 248; X64-NEXT: retq 249entry: 250 %div = sdiv i32 %x, 33 251 ret i32 %div 252} 253 254define i32 @testsize3(i32 %x) minsize nounwind { 255; X86-LABEL: testsize3: 256; X86: # %bb.0: # %entry 257; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 258; X86-NEXT: shrl $5, %eax 259; X86-NEXT: retl 260; 261; X64-LABEL: testsize3: 262; X64: # %bb.0: # %entry 263; X64-NEXT: movl %edi, %eax 264; X64-NEXT: shrl $5, %eax 265; X64-NEXT: retq 266entry: 267 %div = udiv i32 %x, 32 268 ret i32 %div 269} 270 271define i32 @testsize4(i32 %x) minsize nounwind { 272; X86-LABEL: testsize4: 273; X86: # %bb.0: # %entry 274; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 275; X86-NEXT: pushl $33 276; X86-NEXT: popl %ecx 277; X86-NEXT: xorl %edx, %edx 278; X86-NEXT: divl %ecx 279; X86-NEXT: retl 280; 281; X64-LABEL: testsize4: 282; X64: # %bb.0: # %entry 283; X64-NEXT: movl %edi, %eax 284; X64-NEXT: pushq $33 285; X64-NEXT: popq %rcx 286; X64-NEXT: xorl %edx, %edx 287; X64-NEXT: divl %ecx 288; X64-NEXT: retq 289entry: 290 %div = udiv i32 %x, 33 291 ret i32 %div 292} 293 294define i64 @PR23590(i64 %x) nounwind { 295; X86-LABEL: PR23590: 296; X86: # %bb.0: # %entry 297; X86-NEXT: subl $12, %esp 298; X86-NEXT: pushl $0 299; X86-NEXT: pushl $12345 # imm = 0x3039 300; X86-NEXT: pushl {{[0-9]+}}(%esp) 301; X86-NEXT: pushl {{[0-9]+}}(%esp) 302; X86-NEXT: calll __umoddi3 303; X86-NEXT: addl $16, %esp 304; X86-NEXT: pushl $0 305; X86-NEXT: pushl $7 306; X86-NEXT: pushl %edx 307; X86-NEXT: pushl %eax 308; X86-NEXT: calll __udivdi3 309; X86-NEXT: addl $28, %esp 310; X86-NEXT: retl 311; 312; X64-FAST-LABEL: PR23590: 313; X64-FAST: # %bb.0: # %entry 314; X64-FAST-NEXT: movabsq $6120523590596543007, %rcx # imm = 0x54F077C718E7C21F 315; X64-FAST-NEXT: movq %rdi, %rax 316; X64-FAST-NEXT: mulq %rcx 317; X64-FAST-NEXT: shrq $12, %rdx 318; X64-FAST-NEXT: imulq $12345, %rdx, %rax # imm = 0x3039 319; X64-FAST-NEXT: subq %rax, %rdi 320; X64-FAST-NEXT: movabsq $2635249153387078803, %rcx # imm = 0x2492492492492493 321; X64-FAST-NEXT: movq %rdi, %rax 322; X64-FAST-NEXT: mulq %rcx 323; X64-FAST-NEXT: movq %rdx, %rax 324; X64-FAST-NEXT: retq 325; 326; X64-SLOW-LABEL: PR23590: 327; X64-SLOW: # %bb.0: # %entry 328; X64-SLOW-NEXT: movabsq $6120523590596543007, %rcx # imm = 0x54F077C718E7C21F 329; X64-SLOW-NEXT: movq %rdi, %rax 330; X64-SLOW-NEXT: mulq %rcx 331; X64-SLOW-NEXT: shrq $12, %rdx 332; X64-SLOW-NEXT: imulq $12345, %rdx, %rax # imm = 0x3039 333; X64-SLOW-NEXT: subq %rax, %rdi 334; X64-SLOW-NEXT: imulq $613566757, %rdi, %rax # imm = 0x24924925 335; X64-SLOW-NEXT: shrq $32, %rax 336; X64-SLOW-NEXT: retq 337entry: 338 %rem = urem i64 %x, 12345 339 %div = udiv i64 %rem, 7 340 ret i64 %div 341} 342 343define { i64, i32 } @PR38622(i64) nounwind { 344; X86-LABEL: PR38622: 345; X86: # %bb.0: 346; X86-NEXT: pushl %ebp 347; X86-NEXT: pushl %ebx 348; X86-NEXT: pushl %edi 349; X86-NEXT: pushl %esi 350; X86-NEXT: subl $12, %esp 351; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 352; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp 353; X86-NEXT: pushl $0 354; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800 355; X86-NEXT: pushl %ebp 356; X86-NEXT: pushl %ebx 357; X86-NEXT: calll __udivdi3 358; X86-NEXT: addl $16, %esp 359; X86-NEXT: movl %eax, %esi 360; X86-NEXT: movl %edx, %edi 361; X86-NEXT: pushl $0 362; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800 363; X86-NEXT: pushl %ebp 364; X86-NEXT: pushl %ebx 365; X86-NEXT: calll __umoddi3 366; X86-NEXT: addl $16, %esp 367; X86-NEXT: movl %eax, %ecx 368; X86-NEXT: movl %esi, %eax 369; X86-NEXT: movl %edi, %edx 370; X86-NEXT: addl $12, %esp 371; X86-NEXT: popl %esi 372; X86-NEXT: popl %edi 373; X86-NEXT: popl %ebx 374; X86-NEXT: popl %ebp 375; X86-NEXT: retl 376; 377; X64-LABEL: PR38622: 378; X64: # %bb.0: 379; X64-NEXT: movq %rdi, %rax 380; X64-NEXT: shrq $11, %rax 381; X64-NEXT: movabsq $4835703278458517, %rcx # imm = 0x112E0BE826D695 382; X64-NEXT: mulq %rcx 383; X64-NEXT: movq %rdx, %rax 384; X64-NEXT: shrq $9, %rax 385; X64-NEXT: imull $-294967296, %eax, %ecx # imm = 0xEE6B2800 386; X64-NEXT: subl %ecx, %edi 387; X64-NEXT: movl %edi, %edx 388; X64-NEXT: retq 389 %2 = udiv i64 %0, 4000000000 390 %3 = urem i64 %0, 4000000000 391 %4 = trunc i64 %3 to i32 392 %5 = insertvalue { i64, i32 } undef, i64 %2, 0 393 %6 = insertvalue { i64, i32 } %5, i32 %4, 1 394 ret { i64, i32 } %6 395} 396 397define { i64, i32 } @PR38622_signed(i64) nounwind { 398; X86-LABEL: PR38622_signed: 399; X86: # %bb.0: 400; X86-NEXT: pushl %ebp 401; X86-NEXT: pushl %ebx 402; X86-NEXT: pushl %edi 403; X86-NEXT: pushl %esi 404; X86-NEXT: subl $12, %esp 405; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 406; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp 407; X86-NEXT: pushl $0 408; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800 409; X86-NEXT: pushl %ebp 410; X86-NEXT: pushl %ebx 411; X86-NEXT: calll __divdi3 412; X86-NEXT: addl $16, %esp 413; X86-NEXT: movl %eax, %esi 414; X86-NEXT: movl %edx, %edi 415; X86-NEXT: pushl $0 416; X86-NEXT: pushl $-294967296 # imm = 0xEE6B2800 417; X86-NEXT: pushl %ebp 418; X86-NEXT: pushl %ebx 419; X86-NEXT: calll __moddi3 420; X86-NEXT: addl $16, %esp 421; X86-NEXT: movl %eax, %ecx 422; X86-NEXT: movl %esi, %eax 423; X86-NEXT: movl %edi, %edx 424; X86-NEXT: addl $12, %esp 425; X86-NEXT: popl %esi 426; X86-NEXT: popl %edi 427; X86-NEXT: popl %ebx 428; X86-NEXT: popl %ebp 429; X86-NEXT: retl 430; 431; X64-LABEL: PR38622_signed: 432; X64: # %bb.0: 433; X64-NEXT: movabsq $1237940039285380275, %rcx # imm = 0x112E0BE826D694B3 434; X64-NEXT: movq %rdi, %rax 435; X64-NEXT: imulq %rcx 436; X64-NEXT: movq %rdx, %rax 437; X64-NEXT: shrq $63, %rax 438; X64-NEXT: sarq $28, %rdx 439; X64-NEXT: addq %rdx, %rax 440; X64-NEXT: imull $-294967296, %eax, %ecx # imm = 0xEE6B2800 441; X64-NEXT: subl %ecx, %edi 442; X64-NEXT: movl %edi, %edx 443; X64-NEXT: retq 444 %2 = sdiv i64 %0, 4000000000 445 %3 = srem i64 %0, 4000000000 446 %4 = trunc i64 %3 to i32 447 %5 = insertvalue { i64, i32 } undef, i64 %2, 0 448 %6 = insertvalue { i64, i32 } %5, i32 %4, 1 449 ret { i64, i32 } %6 450} 451 452define i64 @urem_i64_3(i64 %x) nounwind { 453; X86-LABEL: urem_i64_3: 454; X86: # %bb.0: # %entry 455; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 456; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx 457; X86-NEXT: adcl $0, %ecx 458; X86-NEXT: movl $-1431655765, %edx # imm = 0xAAAAAAAB 459; X86-NEXT: movl %ecx, %eax 460; X86-NEXT: mull %edx 461; X86-NEXT: shrl %edx 462; X86-NEXT: leal (%edx,%edx,2), %eax 463; X86-NEXT: subl %eax, %ecx 464; X86-NEXT: movl %ecx, %eax 465; X86-NEXT: xorl %edx, %edx 466; X86-NEXT: retl 467; 468; X64-LABEL: urem_i64_3: 469; X64: # %bb.0: # %entry 470; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB 471; X64-NEXT: movq %rdi, %rax 472; X64-NEXT: mulq %rcx 473; X64-NEXT: shrq %rdx 474; X64-NEXT: leaq (%rdx,%rdx,2), %rax 475; X64-NEXT: subq %rax, %rdi 476; X64-NEXT: movq %rdi, %rax 477; X64-NEXT: retq 478entry: 479 %rem = urem i64 %x, 3 480 ret i64 %rem 481} 482 483define i64 @urem_i64_5(i64 %x) nounwind { 484; X86-LABEL: urem_i64_5: 485; X86: # %bb.0: # %entry 486; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 487; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx 488; X86-NEXT: adcl $0, %ecx 489; X86-NEXT: movl $-858993459, %edx # imm = 0xCCCCCCCD 490; X86-NEXT: movl %ecx, %eax 491; X86-NEXT: mull %edx 492; X86-NEXT: shrl $2, %edx 493; X86-NEXT: leal (%edx,%edx,4), %eax 494; X86-NEXT: subl %eax, %ecx 495; X86-NEXT: movl %ecx, %eax 496; X86-NEXT: xorl %edx, %edx 497; X86-NEXT: retl 498; 499; X64-LABEL: urem_i64_5: 500; X64: # %bb.0: # %entry 501; X64-NEXT: movabsq $-3689348814741910323, %rcx # imm = 0xCCCCCCCCCCCCCCCD 502; X64-NEXT: movq %rdi, %rax 503; X64-NEXT: mulq %rcx 504; X64-NEXT: shrq $2, %rdx 505; X64-NEXT: leaq (%rdx,%rdx,4), %rax 506; X64-NEXT: subq %rax, %rdi 507; X64-NEXT: movq %rdi, %rax 508; X64-NEXT: retq 509entry: 510 %rem = urem i64 %x, 5 511 ret i64 %rem 512} 513 514define i64 @urem_i64_15(i64 %x) nounwind { 515; X86-LABEL: urem_i64_15: 516; X86: # %bb.0: # %entry 517; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 518; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx 519; X86-NEXT: adcl $0, %ecx 520; X86-NEXT: movl $-2004318071, %edx # imm = 0x88888889 521; X86-NEXT: movl %ecx, %eax 522; X86-NEXT: mull %edx 523; X86-NEXT: shrl $3, %edx 524; X86-NEXT: leal (%edx,%edx,4), %eax 525; X86-NEXT: leal (%eax,%eax,2), %eax 526; X86-NEXT: subl %eax, %ecx 527; X86-NEXT: movl %ecx, %eax 528; X86-NEXT: xorl %edx, %edx 529; X86-NEXT: retl 530; 531; X64-LABEL: urem_i64_15: 532; X64: # %bb.0: # %entry 533; X64-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889 534; X64-NEXT: movq %rdi, %rax 535; X64-NEXT: mulq %rcx 536; X64-NEXT: shrq $3, %rdx 537; X64-NEXT: leaq (%rdx,%rdx,4), %rax 538; X64-NEXT: leaq (%rax,%rax,2), %rax 539; X64-NEXT: subq %rax, %rdi 540; X64-NEXT: movq %rdi, %rax 541; X64-NEXT: retq 542entry: 543 %rem = urem i64 %x, 15 544 ret i64 %rem 545} 546 547define i64 @urem_i64_17(i64 %x) nounwind { 548; X86-LABEL: urem_i64_17: 549; X86: # %bb.0: # %entry 550; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 551; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx 552; X86-NEXT: adcl $0, %ecx 553; X86-NEXT: movl $-252645135, %edx # imm = 0xF0F0F0F1 554; X86-NEXT: movl %ecx, %eax 555; X86-NEXT: mull %edx 556; X86-NEXT: movl %edx, %eax 557; X86-NEXT: andl $-16, %eax 558; X86-NEXT: shrl $4, %edx 559; X86-NEXT: addl %eax, %edx 560; X86-NEXT: subl %edx, %ecx 561; X86-NEXT: movl %ecx, %eax 562; X86-NEXT: xorl %edx, %edx 563; X86-NEXT: retl 564; 565; X64-LABEL: urem_i64_17: 566; X64: # %bb.0: # %entry 567; X64-NEXT: movabsq $-1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F1 568; X64-NEXT: movq %rdi, %rax 569; X64-NEXT: mulq %rcx 570; X64-NEXT: movq %rdx, %rax 571; X64-NEXT: andq $-16, %rax 572; X64-NEXT: shrq $4, %rdx 573; X64-NEXT: addq %rax, %rdx 574; X64-NEXT: subq %rdx, %rdi 575; X64-NEXT: movq %rdi, %rax 576; X64-NEXT: retq 577entry: 578 %rem = urem i64 %x, 17 579 ret i64 %rem 580} 581 582define i64 @urem_i64_255(i64 %x) nounwind { 583; X86-LABEL: urem_i64_255: 584; X86: # %bb.0: # %entry 585; X86-NEXT: pushl %esi 586; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 587; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 588; X86-NEXT: movl %ecx, %eax 589; X86-NEXT: addl %esi, %eax 590; X86-NEXT: adcl $0, %eax 591; X86-NEXT: movl $-2139062143, %edx # imm = 0x80808081 592; X86-NEXT: mull %edx 593; X86-NEXT: shrl $7, %edx 594; X86-NEXT: movl %edx, %eax 595; X86-NEXT: shll $8, %eax 596; X86-NEXT: subl %eax, %edx 597; X86-NEXT: addl %esi, %ecx 598; X86-NEXT: adcl %edx, %ecx 599; X86-NEXT: movl %ecx, %eax 600; X86-NEXT: xorl %edx, %edx 601; X86-NEXT: popl %esi 602; X86-NEXT: retl 603; 604; X64-LABEL: urem_i64_255: 605; X64: # %bb.0: # %entry 606; X64-NEXT: movabsq $-9187201950435737471, %rcx # imm = 0x8080808080808081 607; X64-NEXT: movq %rdi, %rax 608; X64-NEXT: mulq %rcx 609; X64-NEXT: shrq $7, %rdx 610; X64-NEXT: movq %rdx, %rax 611; X64-NEXT: shlq $8, %rax 612; X64-NEXT: subq %rax, %rdx 613; X64-NEXT: leaq (%rdx,%rdi), %rax 614; X64-NEXT: retq 615entry: 616 %rem = urem i64 %x, 255 617 ret i64 %rem 618} 619 620define i64 @urem_i64_257(i64 %x) nounwind { 621; X86-LABEL: urem_i64_257: 622; X86: # %bb.0: # %entry 623; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 624; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx 625; X86-NEXT: adcl $0, %ecx 626; X86-NEXT: movl $-16711935, %edx # imm = 0xFF00FF01 627; X86-NEXT: movl %ecx, %eax 628; X86-NEXT: mull %edx 629; X86-NEXT: movl %edx, %eax 630; X86-NEXT: andl $-256, %eax 631; X86-NEXT: shrl $8, %edx 632; X86-NEXT: addl %eax, %edx 633; X86-NEXT: subl %edx, %ecx 634; X86-NEXT: movl %ecx, %eax 635; X86-NEXT: xorl %edx, %edx 636; X86-NEXT: retl 637; 638; X64-LABEL: urem_i64_257: 639; X64: # %bb.0: # %entry 640; X64-NEXT: movabsq $-71777214294589695, %rcx # imm = 0xFF00FF00FF00FF01 641; X64-NEXT: movq %rdi, %rax 642; X64-NEXT: mulq %rcx 643; X64-NEXT: movq %rdx, %rax 644; X64-NEXT: andq $-256, %rax 645; X64-NEXT: shrq $8, %rdx 646; X64-NEXT: addq %rax, %rdx 647; X64-NEXT: subq %rdx, %rdi 648; X64-NEXT: movq %rdi, %rax 649; X64-NEXT: retq 650entry: 651 %rem = urem i64 %x, 257 652 ret i64 %rem 653} 654 655define i64 @urem_i64_65535(i64 %x) nounwind { 656; X86-LABEL: urem_i64_65535: 657; X86: # %bb.0: # %entry 658; X86-NEXT: pushl %esi 659; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 660; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 661; X86-NEXT: movl %ecx, %eax 662; X86-NEXT: addl %esi, %eax 663; X86-NEXT: adcl $0, %eax 664; X86-NEXT: movl $-2147450879, %edx # imm = 0x80008001 665; X86-NEXT: mull %edx 666; X86-NEXT: shrl $15, %edx 667; X86-NEXT: movl %edx, %eax 668; X86-NEXT: shll $16, %eax 669; X86-NEXT: subl %eax, %edx 670; X86-NEXT: addl %esi, %ecx 671; X86-NEXT: adcl %edx, %ecx 672; X86-NEXT: movl %ecx, %eax 673; X86-NEXT: xorl %edx, %edx 674; X86-NEXT: popl %esi 675; X86-NEXT: retl 676; 677; X64-LABEL: urem_i64_65535: 678; X64: # %bb.0: # %entry 679; X64-NEXT: movabsq $-9223231297218904063, %rcx # imm = 0x8000800080008001 680; X64-NEXT: movq %rdi, %rax 681; X64-NEXT: mulq %rcx 682; X64-NEXT: shrq $15, %rdx 683; X64-NEXT: movq %rdx, %rax 684; X64-NEXT: shlq $16, %rax 685; X64-NEXT: subq %rax, %rdx 686; X64-NEXT: leaq (%rdx,%rdi), %rax 687; X64-NEXT: retq 688entry: 689 %rem = urem i64 %x, 65535 690 ret i64 %rem 691} 692 693define i64 @urem_i64_65537(i64 %x) nounwind { 694; X86-LABEL: urem_i64_65537: 695; X86: # %bb.0: # %entry 696; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 697; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx 698; X86-NEXT: adcl $0, %ecx 699; X86-NEXT: movl $-65535, %edx # imm = 0xFFFF0001 700; X86-NEXT: movl %ecx, %eax 701; X86-NEXT: mull %edx 702; X86-NEXT: movl %edx, %eax 703; X86-NEXT: shrl $16, %eax 704; X86-NEXT: shldl $16, %edx, %eax 705; X86-NEXT: subl %eax, %ecx 706; X86-NEXT: movl %ecx, %eax 707; X86-NEXT: xorl %edx, %edx 708; X86-NEXT: retl 709; 710; X64-LABEL: urem_i64_65537: 711; X64: # %bb.0: # %entry 712; X64-NEXT: movabsq $-281470681808895, %rcx # imm = 0xFFFF0000FFFF0001 713; X64-NEXT: movq %rdi, %rax 714; X64-NEXT: mulq %rcx 715; X64-NEXT: movq %rdx, %rax 716; X64-NEXT: andq $-65536, %rax # imm = 0xFFFF0000 717; X64-NEXT: shrq $16, %rdx 718; X64-NEXT: addq %rax, %rdx 719; X64-NEXT: subq %rdx, %rdi 720; X64-NEXT: movq %rdi, %rax 721; X64-NEXT: retq 722entry: 723 %rem = urem i64 %x, 65537 724 ret i64 %rem 725} 726 727define i64 @urem_i64_12(i64 %x) nounwind { 728; X86-LABEL: urem_i64_12: 729; X86: # %bb.0: # %entry 730; X86-NEXT: pushl %esi 731; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 732; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 733; X86-NEXT: movl %ecx, %eax 734; X86-NEXT: shrl $2, %eax 735; X86-NEXT: shldl $30, %esi, %ecx 736; X86-NEXT: addl %eax, %ecx 737; X86-NEXT: adcl $0, %ecx 738; X86-NEXT: movl $-1431655765, %edx # imm = 0xAAAAAAAB 739; X86-NEXT: movl %ecx, %eax 740; X86-NEXT: mull %edx 741; X86-NEXT: shrl %edx 742; X86-NEXT: leal (%edx,%edx,2), %eax 743; X86-NEXT: subl %eax, %ecx 744; X86-NEXT: andl $3, %esi 745; X86-NEXT: leal (%esi,%ecx,4), %eax 746; X86-NEXT: xorl %edx, %edx 747; X86-NEXT: popl %esi 748; X86-NEXT: retl 749; 750; X64-LABEL: urem_i64_12: 751; X64: # %bb.0: # %entry 752; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB 753; X64-NEXT: movq %rdi, %rax 754; X64-NEXT: mulq %rcx 755; X64-NEXT: shrq %rdx 756; X64-NEXT: andq $-4, %rdx 757; X64-NEXT: leaq (%rdx,%rdx,2), %rax 758; X64-NEXT: subq %rax, %rdi 759; X64-NEXT: movq %rdi, %rax 760; X64-NEXT: retq 761entry: 762 %rem = urem i64 %x, 12 763 ret i64 %rem 764} 765 766define i64 @udiv_i64_3(i64 %x) nounwind { 767; X86-LABEL: udiv_i64_3: 768; X86: # %bb.0: # %entry 769; X86-NEXT: pushl %ebx 770; X86-NEXT: pushl %edi 771; X86-NEXT: pushl %esi 772; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 773; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 774; X86-NEXT: movl %ecx, %esi 775; X86-NEXT: addl %edi, %esi 776; X86-NEXT: adcl $0, %esi 777; X86-NEXT: movl $-1431655765, %ebx # imm = 0xAAAAAAAB 778; X86-NEXT: movl %esi, %eax 779; X86-NEXT: mull %ebx 780; X86-NEXT: shrl %edx 781; X86-NEXT: leal (%edx,%edx,2), %eax 782; X86-NEXT: subl %eax, %esi 783; X86-NEXT: subl %esi, %ecx 784; X86-NEXT: sbbl $0, %edi 785; X86-NEXT: movl %ecx, %eax 786; X86-NEXT: mull %ebx 787; X86-NEXT: imull $-1431655766, %ecx, %ecx # imm = 0xAAAAAAAA 788; X86-NEXT: addl %ecx, %edx 789; X86-NEXT: imull $-1431655765, %edi, %ecx # imm = 0xAAAAAAAB 790; X86-NEXT: addl %ecx, %edx 791; X86-NEXT: popl %esi 792; X86-NEXT: popl %edi 793; X86-NEXT: popl %ebx 794; X86-NEXT: retl 795; 796; X64-LABEL: udiv_i64_3: 797; X64: # %bb.0: # %entry 798; X64-NEXT: movq %rdi, %rax 799; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB 800; X64-NEXT: mulq %rcx 801; X64-NEXT: movq %rdx, %rax 802; X64-NEXT: shrq %rax 803; X64-NEXT: retq 804entry: 805 %rem = udiv i64 %x, 3 806 ret i64 %rem 807} 808 809define i64 @udiv_i64_5(i64 %x) nounwind { 810; X86-LABEL: udiv_i64_5: 811; X86: # %bb.0: # %entry 812; X86-NEXT: pushl %ebx 813; X86-NEXT: pushl %edi 814; X86-NEXT: pushl %esi 815; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 816; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 817; X86-NEXT: movl %ecx, %esi 818; X86-NEXT: addl %edi, %esi 819; X86-NEXT: adcl $0, %esi 820; X86-NEXT: movl $-858993459, %ebx # imm = 0xCCCCCCCD 821; X86-NEXT: movl %esi, %eax 822; X86-NEXT: mull %ebx 823; X86-NEXT: shrl $2, %edx 824; X86-NEXT: leal (%edx,%edx,4), %eax 825; X86-NEXT: subl %eax, %esi 826; X86-NEXT: subl %esi, %ecx 827; X86-NEXT: sbbl $0, %edi 828; X86-NEXT: movl %ecx, %eax 829; X86-NEXT: mull %ebx 830; X86-NEXT: imull $-858993460, %ecx, %ecx # imm = 0xCCCCCCCC 831; X86-NEXT: addl %ecx, %edx 832; X86-NEXT: imull $-858993459, %edi, %ecx # imm = 0xCCCCCCCD 833; X86-NEXT: addl %ecx, %edx 834; X86-NEXT: popl %esi 835; X86-NEXT: popl %edi 836; X86-NEXT: popl %ebx 837; X86-NEXT: retl 838; 839; X64-LABEL: udiv_i64_5: 840; X64: # %bb.0: # %entry 841; X64-NEXT: movq %rdi, %rax 842; X64-NEXT: movabsq $-3689348814741910323, %rcx # imm = 0xCCCCCCCCCCCCCCCD 843; X64-NEXT: mulq %rcx 844; X64-NEXT: movq %rdx, %rax 845; X64-NEXT: shrq $2, %rax 846; X64-NEXT: retq 847entry: 848 %rem = udiv i64 %x, 5 849 ret i64 %rem 850} 851 852define i64 @udiv_i64_15(i64 %x) nounwind { 853; X86-LABEL: udiv_i64_15: 854; X86: # %bb.0: # %entry 855; X86-NEXT: pushl %edi 856; X86-NEXT: pushl %esi 857; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 858; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 859; X86-NEXT: movl %ecx, %esi 860; X86-NEXT: addl %edi, %esi 861; X86-NEXT: adcl $0, %esi 862; X86-NEXT: movl $-2004318071, %edx # imm = 0x88888889 863; X86-NEXT: movl %esi, %eax 864; X86-NEXT: mull %edx 865; X86-NEXT: shrl $3, %edx 866; X86-NEXT: leal (%edx,%edx,4), %eax 867; X86-NEXT: leal (%eax,%eax,2), %eax 868; X86-NEXT: subl %eax, %esi 869; X86-NEXT: subl %esi, %ecx 870; X86-NEXT: sbbl $0, %edi 871; X86-NEXT: movl $-286331153, %edx # imm = 0xEEEEEEEF 872; X86-NEXT: movl %ecx, %eax 873; X86-NEXT: mull %edx 874; X86-NEXT: imull $-286331154, %ecx, %ecx # imm = 0xEEEEEEEE 875; X86-NEXT: addl %ecx, %edx 876; X86-NEXT: imull $-286331153, %edi, %ecx # imm = 0xEEEEEEEF 877; X86-NEXT: addl %ecx, %edx 878; X86-NEXT: popl %esi 879; X86-NEXT: popl %edi 880; X86-NEXT: retl 881; 882; X64-LABEL: udiv_i64_15: 883; X64: # %bb.0: # %entry 884; X64-NEXT: movq %rdi, %rax 885; X64-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889 886; X64-NEXT: mulq %rcx 887; X64-NEXT: movq %rdx, %rax 888; X64-NEXT: shrq $3, %rax 889; X64-NEXT: retq 890entry: 891 %rem = udiv i64 %x, 15 892 ret i64 %rem 893} 894 895define i64 @udiv_i64_17(i64 %x) nounwind { 896; X86-LABEL: udiv_i64_17: 897; X86: # %bb.0: # %entry 898; X86-NEXT: pushl %ebx 899; X86-NEXT: pushl %edi 900; X86-NEXT: pushl %esi 901; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 902; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 903; X86-NEXT: movl %ecx, %esi 904; X86-NEXT: addl %edi, %esi 905; X86-NEXT: adcl $0, %esi 906; X86-NEXT: movl $-252645135, %ebx # imm = 0xF0F0F0F1 907; X86-NEXT: movl %esi, %eax 908; X86-NEXT: mull %ebx 909; X86-NEXT: movl %edx, %eax 910; X86-NEXT: andl $-16, %eax 911; X86-NEXT: shrl $4, %edx 912; X86-NEXT: addl %eax, %edx 913; X86-NEXT: subl %edx, %esi 914; X86-NEXT: subl %esi, %ecx 915; X86-NEXT: sbbl $0, %edi 916; X86-NEXT: movl %ecx, %eax 917; X86-NEXT: mull %ebx 918; X86-NEXT: imull $-252645136, %ecx, %ecx # imm = 0xF0F0F0F0 919; X86-NEXT: addl %ecx, %edx 920; X86-NEXT: imull $-252645135, %edi, %ecx # imm = 0xF0F0F0F1 921; X86-NEXT: addl %ecx, %edx 922; X86-NEXT: popl %esi 923; X86-NEXT: popl %edi 924; X86-NEXT: popl %ebx 925; X86-NEXT: retl 926; 927; X64-LABEL: udiv_i64_17: 928; X64: # %bb.0: # %entry 929; X64-NEXT: movq %rdi, %rax 930; X64-NEXT: movabsq $-1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F1 931; X64-NEXT: mulq %rcx 932; X64-NEXT: movq %rdx, %rax 933; X64-NEXT: shrq $4, %rax 934; X64-NEXT: retq 935entry: 936 %rem = udiv i64 %x, 17 937 ret i64 %rem 938} 939 940define i64 @udiv_i64_255(i64 %x) nounwind { 941; X86-LABEL: udiv_i64_255: 942; X86: # %bb.0: # %entry 943; X86-NEXT: pushl %esi 944; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 945; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 946; X86-NEXT: movl %ecx, %eax 947; X86-NEXT: addl %esi, %eax 948; X86-NEXT: adcl $0, %eax 949; X86-NEXT: movl $-2139062143, %edx # imm = 0x80808081 950; X86-NEXT: mull %edx 951; X86-NEXT: shrl $7, %edx 952; X86-NEXT: movl %edx, %eax 953; X86-NEXT: shll $8, %eax 954; X86-NEXT: subl %eax, %edx 955; X86-NEXT: movl %ecx, %eax 956; X86-NEXT: addl %esi, %eax 957; X86-NEXT: adcl %edx, %eax 958; X86-NEXT: subl %eax, %ecx 959; X86-NEXT: sbbl $0, %esi 960; X86-NEXT: movl $-16843009, %edx # imm = 0xFEFEFEFF 961; X86-NEXT: movl %ecx, %eax 962; X86-NEXT: mull %edx 963; X86-NEXT: imull $-16843010, %ecx, %ecx # imm = 0xFEFEFEFE 964; X86-NEXT: addl %ecx, %edx 965; X86-NEXT: imull $-16843009, %esi, %ecx # imm = 0xFEFEFEFF 966; X86-NEXT: addl %ecx, %edx 967; X86-NEXT: popl %esi 968; X86-NEXT: retl 969; 970; X64-LABEL: udiv_i64_255: 971; X64: # %bb.0: # %entry 972; X64-NEXT: movq %rdi, %rax 973; X64-NEXT: movabsq $-9187201950435737471, %rcx # imm = 0x8080808080808081 974; X64-NEXT: mulq %rcx 975; X64-NEXT: movq %rdx, %rax 976; X64-NEXT: shrq $7, %rax 977; X64-NEXT: retq 978entry: 979 %rem = udiv i64 %x, 255 980 ret i64 %rem 981} 982 983define i64 @udiv_i64_257(i64 %x) nounwind { 984; X86-LABEL: udiv_i64_257: 985; X86: # %bb.0: # %entry 986; X86-NEXT: pushl %ebx 987; X86-NEXT: pushl %edi 988; X86-NEXT: pushl %esi 989; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 990; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 991; X86-NEXT: movl %ecx, %esi 992; X86-NEXT: addl %edi, %esi 993; X86-NEXT: adcl $0, %esi 994; X86-NEXT: movl $-16711935, %ebx # imm = 0xFF00FF01 995; X86-NEXT: movl %esi, %eax 996; X86-NEXT: mull %ebx 997; X86-NEXT: movl %edx, %eax 998; X86-NEXT: andl $-256, %eax 999; X86-NEXT: shrl $8, %edx 1000; X86-NEXT: addl %eax, %edx 1001; X86-NEXT: subl %edx, %esi 1002; X86-NEXT: subl %esi, %ecx 1003; X86-NEXT: sbbl $0, %edi 1004; X86-NEXT: movl %ecx, %eax 1005; X86-NEXT: mull %ebx 1006; X86-NEXT: imull $-16711936, %ecx, %ecx # imm = 0xFF00FF00 1007; X86-NEXT: addl %ecx, %edx 1008; X86-NEXT: imull $-16711935, %edi, %ecx # imm = 0xFF00FF01 1009; X86-NEXT: addl %ecx, %edx 1010; X86-NEXT: popl %esi 1011; X86-NEXT: popl %edi 1012; X86-NEXT: popl %ebx 1013; X86-NEXT: retl 1014; 1015; X64-LABEL: udiv_i64_257: 1016; X64: # %bb.0: # %entry 1017; X64-NEXT: movq %rdi, %rax 1018; X64-NEXT: movabsq $-71777214294589695, %rcx # imm = 0xFF00FF00FF00FF01 1019; X64-NEXT: mulq %rcx 1020; X64-NEXT: movq %rdx, %rax 1021; X64-NEXT: shrq $8, %rax 1022; X64-NEXT: retq 1023entry: 1024 %rem = udiv i64 %x, 257 1025 ret i64 %rem 1026} 1027 1028define i64 @udiv_i64_65535(i64 %x) nounwind { 1029; X86-LABEL: udiv_i64_65535: 1030; X86: # %bb.0: # %entry 1031; X86-NEXT: pushl %esi 1032; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1033; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 1034; X86-NEXT: movl %ecx, %eax 1035; X86-NEXT: addl %esi, %eax 1036; X86-NEXT: adcl $0, %eax 1037; X86-NEXT: movl $-2147450879, %edx # imm = 0x80008001 1038; X86-NEXT: mull %edx 1039; X86-NEXT: shrl $15, %edx 1040; X86-NEXT: movl %edx, %eax 1041; X86-NEXT: shll $16, %eax 1042; X86-NEXT: subl %eax, %edx 1043; X86-NEXT: movl %ecx, %eax 1044; X86-NEXT: addl %esi, %eax 1045; X86-NEXT: adcl %edx, %eax 1046; X86-NEXT: subl %eax, %ecx 1047; X86-NEXT: sbbl $0, %esi 1048; X86-NEXT: movl $-65537, %edx # imm = 0xFFFEFFFF 1049; X86-NEXT: movl %ecx, %eax 1050; X86-NEXT: mull %edx 1051; X86-NEXT: imull $-65538, %ecx, %ecx # imm = 0xFFFEFFFE 1052; X86-NEXT: addl %ecx, %edx 1053; X86-NEXT: movl %esi, %ecx 1054; X86-NEXT: shll $16, %ecx 1055; X86-NEXT: addl %esi, %ecx 1056; X86-NEXT: subl %ecx, %edx 1057; X86-NEXT: popl %esi 1058; X86-NEXT: retl 1059; 1060; X64-LABEL: udiv_i64_65535: 1061; X64: # %bb.0: # %entry 1062; X64-NEXT: movq %rdi, %rax 1063; X64-NEXT: movabsq $-9223231297218904063, %rcx # imm = 0x8000800080008001 1064; X64-NEXT: mulq %rcx 1065; X64-NEXT: movq %rdx, %rax 1066; X64-NEXT: shrq $15, %rax 1067; X64-NEXT: retq 1068entry: 1069 %rem = udiv i64 %x, 65535 1070 ret i64 %rem 1071} 1072 1073define i64 @udiv_i64_65537(i64 %x) nounwind { 1074; X86-LABEL: udiv_i64_65537: 1075; X86: # %bb.0: # %entry 1076; X86-NEXT: pushl %ebx 1077; X86-NEXT: pushl %edi 1078; X86-NEXT: pushl %esi 1079; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1080; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 1081; X86-NEXT: movl %ecx, %esi 1082; X86-NEXT: addl %edi, %esi 1083; X86-NEXT: adcl $0, %esi 1084; X86-NEXT: movl $-65535, %ebx # imm = 0xFFFF0001 1085; X86-NEXT: movl %esi, %eax 1086; X86-NEXT: mull %ebx 1087; X86-NEXT: movl %edx, %eax 1088; X86-NEXT: shrl $16, %eax 1089; X86-NEXT: shldl $16, %edx, %eax 1090; X86-NEXT: subl %eax, %esi 1091; X86-NEXT: subl %esi, %ecx 1092; X86-NEXT: sbbl $0, %edi 1093; X86-NEXT: movl %ecx, %eax 1094; X86-NEXT: mull %ebx 1095; X86-NEXT: shll $16, %ecx 1096; X86-NEXT: subl %ecx, %edx 1097; X86-NEXT: movl %edi, %ecx 1098; X86-NEXT: shll $16, %ecx 1099; X86-NEXT: subl %ecx, %edi 1100; X86-NEXT: addl %edi, %edx 1101; X86-NEXT: popl %esi 1102; X86-NEXT: popl %edi 1103; X86-NEXT: popl %ebx 1104; X86-NEXT: retl 1105; 1106; X64-LABEL: udiv_i64_65537: 1107; X64: # %bb.0: # %entry 1108; X64-NEXT: movq %rdi, %rax 1109; X64-NEXT: movabsq $-281470681808895, %rcx # imm = 0xFFFF0000FFFF0001 1110; X64-NEXT: mulq %rcx 1111; X64-NEXT: movq %rdx, %rax 1112; X64-NEXT: shrq $16, %rax 1113; X64-NEXT: retq 1114entry: 1115 %rem = udiv i64 %x, 65537 1116 ret i64 %rem 1117} 1118 1119define i64 @udiv_i64_12(i64 %x) nounwind { 1120; X86-LABEL: udiv_i64_12: 1121; X86: # %bb.0: # %entry 1122; X86-NEXT: pushl %ebx 1123; X86-NEXT: pushl %edi 1124; X86-NEXT: pushl %esi 1125; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1126; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 1127; X86-NEXT: shrdl $2, %edi, %ecx 1128; X86-NEXT: shrl $2, %edi 1129; X86-NEXT: movl %ecx, %esi 1130; X86-NEXT: addl %edi, %esi 1131; X86-NEXT: adcl $0, %esi 1132; X86-NEXT: movl $-1431655765, %ebx # imm = 0xAAAAAAAB 1133; X86-NEXT: movl %esi, %eax 1134; X86-NEXT: mull %ebx 1135; X86-NEXT: shrl %edx 1136; X86-NEXT: leal (%edx,%edx,2), %eax 1137; X86-NEXT: subl %eax, %esi 1138; X86-NEXT: subl %esi, %ecx 1139; X86-NEXT: sbbl $0, %edi 1140; X86-NEXT: movl %ecx, %eax 1141; X86-NEXT: mull %ebx 1142; X86-NEXT: imull $-1431655766, %ecx, %ecx # imm = 0xAAAAAAAA 1143; X86-NEXT: addl %ecx, %edx 1144; X86-NEXT: imull $-1431655765, %edi, %ecx # imm = 0xAAAAAAAB 1145; X86-NEXT: addl %ecx, %edx 1146; X86-NEXT: popl %esi 1147; X86-NEXT: popl %edi 1148; X86-NEXT: popl %ebx 1149; X86-NEXT: retl 1150; 1151; X64-LABEL: udiv_i64_12: 1152; X64: # %bb.0: # %entry 1153; X64-NEXT: movq %rdi, %rax 1154; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB 1155; X64-NEXT: mulq %rcx 1156; X64-NEXT: movq %rdx, %rax 1157; X64-NEXT: shrq $3, %rax 1158; X64-NEXT: retq 1159entry: 1160 %rem = udiv i64 %x, 12 1161 ret i64 %rem 1162} 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: # %entry 1168; X86-NEXT: subl $12, %esp 1169; X86-NEXT: pushl $0 1170; X86-NEXT: pushl $3 1171; X86-NEXT: pushl {{[0-9]+}}(%esp) 1172; X86-NEXT: pushl {{[0-9]+}}(%esp) 1173; X86-NEXT: calll __umoddi3 1174; X86-NEXT: addl $28, %esp 1175; X86-NEXT: retl 1176; 1177; X64-LABEL: urem_i64_3_optsize: 1178; X64: # %bb.0: # %entry 1179; X64-NEXT: movabsq $-6148914691236517205, %rcx # imm = 0xAAAAAAAAAAAAAAAB 1180; X64-NEXT: movq %rdi, %rax 1181; X64-NEXT: mulq %rcx 1182; X64-NEXT: shrq %rdx 1183; X64-NEXT: leaq (%rdx,%rdx,2), %rax 1184; X64-NEXT: subq %rax, %rdi 1185; X64-NEXT: movq %rdi, %rax 1186; X64-NEXT: retq 1187entry: 1188 %rem = urem i64 %x, 3 1189 ret i64 %rem 1190} 1191 1192