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=X32 3; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64 4 5define zeroext i16 @test1(i16 zeroext %x) nounwind { 6; X32-LABEL: test1: 7; X32: # BB#0: # %entry 8; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 9; X32-NEXT: imull $63551, %eax, %eax # imm = 0xF83F 10; X32-NEXT: shrl $21, %eax 11; X32-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 12; X32-NEXT: retl 13; 14; X64-LABEL: test1: 15; X64: # BB#0: # %entry 16; X64-NEXT: imull $63551, %edi, %eax # imm = 0xF83F 17; X64-NEXT: shrl $21, %eax 18; X64-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 19; X64-NEXT: retq 20entry: 21 %div = udiv i16 %x, 33 22 ret i16 %div 23} 24 25define zeroext i16 @test2(i8 signext %x, i16 zeroext %c) nounwind readnone ssp noredzone { 26; X32-LABEL: test2: 27; X32: # BB#0: # %entry 28; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 29; X32-NEXT: imull $43691, %eax, %eax # imm = 0xAAAB 30; X32-NEXT: shrl $17, %eax 31; X32-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 32; X32-NEXT: retl 33; 34; X64-LABEL: test2: 35; X64: # BB#0: # %entry 36; X64-NEXT: imull $43691, %esi, %eax # imm = 0xAAAB 37; X64-NEXT: shrl $17, %eax 38; X64-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 39; X64-NEXT: retq 40entry: 41 %div = udiv i16 %c, 3 42 ret i16 %div 43 44} 45 46define zeroext i8 @test3(i8 zeroext %x, i8 zeroext %c) nounwind readnone ssp noredzone { 47; X32-LABEL: test3: 48; X32: # BB#0: # %entry 49; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax 50; X32-NEXT: imull $171, %eax, %eax 51; X32-NEXT: andl $65024, %eax # imm = 0xFE00 52; X32-NEXT: shrl $9, %eax 53; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 54; X32-NEXT: retl 55; 56; X64-LABEL: test3: 57; X64: # BB#0: # %entry 58; X64-NEXT: imull $171, %esi, %eax 59; X64-NEXT: andl $65024, %eax # imm = 0xFE00 60; X64-NEXT: shrl $9, %eax 61; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 62; X64-NEXT: retq 63entry: 64 %div = udiv i8 %c, 3 65 ret i8 %div 66} 67 68define signext i16 @test4(i16 signext %x) nounwind { 69; X32-LABEL: test4: 70; X32: # BB#0: # %entry 71; X32-NEXT: movswl {{[0-9]+}}(%esp), %eax 72; X32-NEXT: imull $1986, %eax, %eax # imm = 0x7C2 73; X32-NEXT: movl %eax, %ecx 74; X32-NEXT: shrl $31, %ecx 75; X32-NEXT: shrl $16, %eax 76; X32-NEXT: addl %ecx, %eax 77; X32-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 78; X32-NEXT: retl 79; 80; X64-LABEL: test4: 81; X64: # BB#0: # %entry 82; X64-NEXT: imull $1986, %edi, %eax # imm = 0x7C2 83; X64-NEXT: movl %eax, %ecx 84; X64-NEXT: shrl $31, %ecx 85; X64-NEXT: shrl $16, %eax 86; X64-NEXT: addl %ecx, %eax 87; X64-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 88; X64-NEXT: retq 89entry: 90 %div = sdiv i16 %x, 33 ; <i32> [#uses=1] 91 ret i16 %div 92} 93 94define i32 @test5(i32 %A) nounwind { 95; X32-LABEL: test5: 96; X32: # BB#0: 97; X32-NEXT: movl $365384439, %eax # imm = 0x15C752F7 98; X32-NEXT: mull {{[0-9]+}}(%esp) 99; X32-NEXT: shrl $27, %edx 100; X32-NEXT: movl %edx, %eax 101; X32-NEXT: retl 102; 103; X64-LABEL: test5: 104; X64: # BB#0: 105; X64-NEXT: movl %edi, %eax 106; X64-NEXT: imulq $365384439, %rax, %rax # imm = 0x15C752F7 107; X64-NEXT: shrq $59, %rax 108; X64-NEXT: # kill: %EAX<def> %EAX<kill> %RAX<kill> 109; X64-NEXT: retq 110 %tmp1 = udiv i32 %A, 1577682821 ; <i32> [#uses=1] 111 ret i32 %tmp1 112} 113 114define signext i16 @test6(i16 signext %x) nounwind { 115; X32-LABEL: test6: 116; X32: # BB#0: # %entry 117; X32-NEXT: movswl {{[0-9]+}}(%esp), %eax 118; X32-NEXT: imull $26215, %eax, %eax # imm = 0x6667 119; X32-NEXT: movl %eax, %ecx 120; X32-NEXT: shrl $31, %ecx 121; X32-NEXT: sarl $18, %eax 122; X32-NEXT: addl %ecx, %eax 123; X32-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 124; X32-NEXT: retl 125; 126; X64-LABEL: test6: 127; X64: # BB#0: # %entry 128; X64-NEXT: imull $26215, %edi, %eax # imm = 0x6667 129; X64-NEXT: movl %eax, %ecx 130; X64-NEXT: shrl $31, %ecx 131; X64-NEXT: sarl $18, %eax 132; X64-NEXT: addl %ecx, %eax 133; X64-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 134; X64-NEXT: retq 135entry: 136 %div = sdiv i16 %x, 10 137 ret i16 %div 138} 139 140define i32 @test7(i32 %x) nounwind { 141; X32-LABEL: test7: 142; X32: # BB#0: 143; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 144; X32-NEXT: shrl $2, %eax 145; X32-NEXT: movl $613566757, %ecx # imm = 0x24924925 146; X32-NEXT: mull %ecx 147; X32-NEXT: movl %edx, %eax 148; X32-NEXT: retl 149; 150; X64-LABEL: test7: 151; X64: # BB#0: 152; X64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def> 153; X64-NEXT: shrl $2, %edi 154; X64-NEXT: imulq $613566757, %rdi, %rax # imm = 0x24924925 155; X64-NEXT: shrq $32, %rax 156; X64-NEXT: # kill: %EAX<def> %EAX<kill> %RAX<kill> 157; X64-NEXT: retq 158 %div = udiv i32 %x, 28 159 ret i32 %div 160} 161 162; PR13326 163define i8 @test8(i8 %x) nounwind { 164; X32-LABEL: test8: 165; X32: # BB#0: 166; X32-NEXT: movb {{[0-9]+}}(%esp), %al 167; X32-NEXT: shrb %al 168; X32-NEXT: movzbl %al, %eax 169; X32-NEXT: imull $211, %eax, %eax 170; X32-NEXT: andl $24576, %eax # imm = 0x6000 171; X32-NEXT: shrl $13, %eax 172; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 173; X32-NEXT: retl 174; 175; X64-LABEL: test8: 176; X64: # BB#0: 177; X64-NEXT: shrb %dil 178; X64-NEXT: movzbl %dil, %eax 179; X64-NEXT: imull $211, %eax, %eax 180; X64-NEXT: andl $24576, %eax # imm = 0x6000 181; X64-NEXT: shrl $13, %eax 182; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 183; X64-NEXT: retq 184 %div = udiv i8 %x, 78 185 ret i8 %div 186} 187 188define i8 @test9(i8 %x) nounwind { 189; X32-LABEL: test9: 190; X32: # BB#0: 191; X32-NEXT: movb {{[0-9]+}}(%esp), %al 192; X32-NEXT: shrb $2, %al 193; X32-NEXT: movzbl %al, %eax 194; X32-NEXT: imull $71, %eax, %eax 195; X32-NEXT: andl $6144, %eax # imm = 0x1800 196; X32-NEXT: shrl $11, %eax 197; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 198; X32-NEXT: retl 199; 200; X64-LABEL: test9: 201; X64: # BB#0: 202; X64-NEXT: shrb $2, %dil 203; X64-NEXT: movzbl %dil, %eax 204; X64-NEXT: imull $71, %eax, %eax 205; X64-NEXT: andl $6144, %eax # imm = 0x1800 206; X64-NEXT: shrl $11, %eax 207; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> 208; X64-NEXT: retq 209 %div = udiv i8 %x, 116 210 ret i8 %div 211} 212 213define i32 @testsize1(i32 %x) minsize nounwind { 214; X32-LABEL: testsize1: 215; X32: # BB#0: # %entry 216; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 217; X32-NEXT: pushl $32 218; X32-NEXT: popl %ecx 219; X32-NEXT: cltd 220; X32-NEXT: idivl %ecx 221; X32-NEXT: retl 222; 223; X64-LABEL: testsize1: 224; X64: # BB#0: # %entry 225; X64-NEXT: pushq $32 226; X64-NEXT: popq %rcx 227; X64-NEXT: movl %edi, %eax 228; X64-NEXT: cltd 229; X64-NEXT: idivl %ecx 230; X64-NEXT: retq 231entry: 232 %div = sdiv i32 %x, 32 233 ret i32 %div 234} 235 236define i32 @testsize2(i32 %x) minsize nounwind { 237; X32-LABEL: testsize2: 238; X32: # BB#0: # %entry 239; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 240; X32-NEXT: pushl $33 241; X32-NEXT: popl %ecx 242; X32-NEXT: cltd 243; X32-NEXT: idivl %ecx 244; X32-NEXT: retl 245; 246; X64-LABEL: testsize2: 247; X64: # BB#0: # %entry 248; X64-NEXT: pushq $33 249; X64-NEXT: popq %rcx 250; X64-NEXT: movl %edi, %eax 251; X64-NEXT: cltd 252; X64-NEXT: idivl %ecx 253; X64-NEXT: retq 254entry: 255 %div = sdiv i32 %x, 33 256 ret i32 %div 257} 258 259define i32 @testsize3(i32 %x) minsize nounwind { 260; X32-LABEL: testsize3: 261; X32: # BB#0: # %entry 262; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 263; X32-NEXT: shrl $5, %eax 264; X32-NEXT: retl 265; 266; X64-LABEL: testsize3: 267; X64: # BB#0: # %entry 268; X64-NEXT: shrl $5, %edi 269; X64-NEXT: movl %edi, %eax 270; X64-NEXT: retq 271entry: 272 %div = udiv i32 %x, 32 273 ret i32 %div 274} 275 276define i32 @testsize4(i32 %x) minsize nounwind { 277; X32-LABEL: testsize4: 278; X32: # BB#0: # %entry 279; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 280; X32-NEXT: pushl $33 281; X32-NEXT: popl %ecx 282; X32-NEXT: xorl %edx, %edx 283; X32-NEXT: divl %ecx 284; X32-NEXT: retl 285; 286; X64-LABEL: testsize4: 287; X64: # BB#0: # %entry 288; X64-NEXT: pushq $33 289; X64-NEXT: popq %rcx 290; X64-NEXT: xorl %edx, %edx 291; X64-NEXT: movl %edi, %eax 292; X64-NEXT: divl %ecx 293; X64-NEXT: retq 294entry: 295 %div = udiv i32 %x, 33 296 ret i32 %div 297} 298 299define i64 @PR23590(i64 %x) nounwind { 300; X32-LABEL: PR23590: 301; X32: # BB#0: # %entry 302; X32-NEXT: subl $12, %esp 303; X32-NEXT: pushl $0 304; X32-NEXT: pushl $12345 # imm = 0x3039 305; X32-NEXT: pushl {{[0-9]+}}(%esp) 306; X32-NEXT: pushl {{[0-9]+}}(%esp) 307; X32-NEXT: calll __umoddi3 308; X32-NEXT: addl $16, %esp 309; X32-NEXT: pushl $0 310; X32-NEXT: pushl $7 311; X32-NEXT: pushl %edx 312; X32-NEXT: pushl %eax 313; X32-NEXT: calll __udivdi3 314; X32-NEXT: addl $28, %esp 315; X32-NEXT: retl 316; 317; X64-LABEL: PR23590: 318; X64: # BB#0: # %entry 319; X64-NEXT: movq %rdi, %rcx 320; X64-NEXT: movabsq $6120523590596543007, %rdx # imm = 0x54F077C718E7C21F 321; X64-NEXT: movq %rcx, %rax 322; X64-NEXT: mulq %rdx 323; X64-NEXT: shrq $12, %rdx 324; X64-NEXT: imulq $12345, %rdx, %rax # imm = 0x3039 325; X64-NEXT: subq %rax, %rcx 326; X64-NEXT: movabsq $2635249153387078803, %rdx # imm = 0x2492492492492493 327; X64-NEXT: movq %rcx, %rax 328; X64-NEXT: mulq %rdx 329; X64-NEXT: subq %rdx, %rcx 330; X64-NEXT: shrq %rcx 331; X64-NEXT: leaq (%rcx,%rdx), %rax 332; X64-NEXT: shrq $2, %rax 333; X64-NEXT: retq 334entry: 335 %rem = urem i64 %x, 12345 336 %div = udiv i64 %rem, 7 337 ret i64 %div 338} 339