1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X32 3; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64 4 5define void @si64(i64 %x, i64 %y, i64* %p, i64* %q) nounwind { 6; X32-LABEL: si64: 7; X32: # %bb.0: 8; X32-NEXT: pushl %ebp 9; X32-NEXT: pushl %ebx 10; X32-NEXT: pushl %edi 11; X32-NEXT: pushl %esi 12; X32-NEXT: movl {{[0-9]+}}(%esp), %ebx 13; X32-NEXT: movl {{[0-9]+}}(%esp), %ebp 14; X32-NEXT: pushl %ebp 15; X32-NEXT: pushl %ebx 16; X32-NEXT: pushl {{[0-9]+}}(%esp) 17; X32-NEXT: pushl {{[0-9]+}}(%esp) 18; X32-NEXT: calll __divdi3 19; X32-NEXT: addl $16, %esp 20; X32-NEXT: movl %eax, %esi 21; X32-NEXT: movl %edx, %edi 22; X32-NEXT: pushl %ebp 23; X32-NEXT: pushl %ebx 24; X32-NEXT: pushl {{[0-9]+}}(%esp) 25; X32-NEXT: pushl {{[0-9]+}}(%esp) 26; X32-NEXT: calll __moddi3 27; X32-NEXT: addl $16, %esp 28; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 29; X32-NEXT: movl %edi, 4(%ecx) 30; X32-NEXT: movl %esi, (%ecx) 31; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 32; X32-NEXT: movl %edx, 4(%ecx) 33; X32-NEXT: movl %eax, (%ecx) 34; X32-NEXT: popl %esi 35; X32-NEXT: popl %edi 36; X32-NEXT: popl %ebx 37; X32-NEXT: popl %ebp 38; X32-NEXT: retl 39; 40; X64-LABEL: si64: 41; X64: # %bb.0: 42; X64-NEXT: movq %rdx, %r8 43; X64-NEXT: movq %rdi, %rax 44; X64-NEXT: cqto 45; X64-NEXT: idivq %rsi 46; X64-NEXT: movq %rax, (%r8) 47; X64-NEXT: movq %rdx, (%rcx) 48; X64-NEXT: retq 49 %r = sdiv i64 %x, %y 50 %t = srem i64 %x, %y 51 store i64 %r, i64* %p 52 store i64 %t, i64* %q 53 ret void 54} 55 56define void @si32(i32 %x, i32 %y, i32* %p, i32* %q) nounwind { 57; X32-LABEL: si32: 58; X32: # %bb.0: 59; X32-NEXT: pushl %esi 60; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 61; X32-NEXT: movl {{[0-9]+}}(%esp), %esi 62; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 63; X32-NEXT: cltd 64; X32-NEXT: idivl {{[0-9]+}}(%esp) 65; X32-NEXT: movl %eax, (%esi) 66; X32-NEXT: movl %edx, (%ecx) 67; X32-NEXT: popl %esi 68; X32-NEXT: retl 69; 70; X64-LABEL: si32: 71; X64: # %bb.0: 72; X64-NEXT: movq %rdx, %r8 73; X64-NEXT: movl %edi, %eax 74; X64-NEXT: cltd 75; X64-NEXT: idivl %esi 76; X64-NEXT: movl %eax, (%r8) 77; X64-NEXT: movl %edx, (%rcx) 78; X64-NEXT: retq 79 %r = sdiv i32 %x, %y 80 %t = srem i32 %x, %y 81 store i32 %r, i32* %p 82 store i32 %t, i32* %q 83 ret void 84} 85 86define void @si16(i16 %x, i16 %y, i16* %p, i16* %q) nounwind { 87; X32-LABEL: si16: 88; X32: # %bb.0: 89; X32-NEXT: pushl %esi 90; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 91; X32-NEXT: movl {{[0-9]+}}(%esp), %esi 92; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 93; X32-NEXT: cwtd 94; X32-NEXT: idivw {{[0-9]+}}(%esp) 95; X32-NEXT: movw %ax, (%esi) 96; X32-NEXT: movw %dx, (%ecx) 97; X32-NEXT: popl %esi 98; X32-NEXT: retl 99; 100; X64-LABEL: si16: 101; X64: # %bb.0: 102; X64-NEXT: movq %rdx, %r8 103; X64-NEXT: movl %edi, %eax 104; X64-NEXT: cwtd 105; X64-NEXT: idivw %si 106; X64-NEXT: movw %ax, (%r8) 107; X64-NEXT: movw %dx, (%rcx) 108; X64-NEXT: retq 109 %r = sdiv i16 %x, %y 110 %t = srem i16 %x, %y 111 store i16 %r, i16* %p 112 store i16 %t, i16* %q 113 ret void 114} 115 116define void @si8(i8 %x, i8 %y, i8* %p, i8* %q) nounwind { 117; X32-LABEL: si8: 118; X32: # %bb.0: 119; X32-NEXT: pushl %ebx 120; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 121; X32-NEXT: movl {{[0-9]+}}(%esp), %edx 122; X32-NEXT: movb {{[0-9]+}}(%esp), %al 123; X32-NEXT: cbtw 124; X32-NEXT: idivb {{[0-9]+}}(%esp) 125; X32-NEXT: movsbl %ah, %ebx 126; X32-NEXT: movb %al, (%edx) 127; X32-NEXT: movb %bl, (%ecx) 128; X32-NEXT: popl %ebx 129; X32-NEXT: retl 130; 131; X64-LABEL: si8: 132; X64: # %bb.0: 133; X64-NEXT: movl %edi, %eax 134; X64-NEXT: cbtw 135; X64-NEXT: idivb %sil 136; X64-NEXT: movsbl %ah, %esi 137; X64-NEXT: movb %al, (%rdx) 138; X64-NEXT: movb %sil, (%rcx) 139; X64-NEXT: retq 140 %r = sdiv i8 %x, %y 141 %t = srem i8 %x, %y 142 store i8 %r, i8* %p 143 store i8 %t, i8* %q 144 ret void 145} 146 147define void @ui64(i64 %x, i64 %y, i64* %p, i64* %q) nounwind { 148; X32-LABEL: ui64: 149; X32: # %bb.0: 150; X32-NEXT: pushl %ebp 151; X32-NEXT: pushl %ebx 152; X32-NEXT: pushl %edi 153; X32-NEXT: pushl %esi 154; X32-NEXT: movl {{[0-9]+}}(%esp), %ebx 155; X32-NEXT: movl {{[0-9]+}}(%esp), %ebp 156; X32-NEXT: pushl %ebp 157; X32-NEXT: pushl %ebx 158; X32-NEXT: pushl {{[0-9]+}}(%esp) 159; X32-NEXT: pushl {{[0-9]+}}(%esp) 160; X32-NEXT: calll __udivdi3 161; X32-NEXT: addl $16, %esp 162; X32-NEXT: movl %eax, %esi 163; X32-NEXT: movl %edx, %edi 164; X32-NEXT: pushl %ebp 165; X32-NEXT: pushl %ebx 166; X32-NEXT: pushl {{[0-9]+}}(%esp) 167; X32-NEXT: pushl {{[0-9]+}}(%esp) 168; X32-NEXT: calll __umoddi3 169; X32-NEXT: addl $16, %esp 170; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 171; X32-NEXT: movl %edi, 4(%ecx) 172; X32-NEXT: movl %esi, (%ecx) 173; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 174; X32-NEXT: movl %edx, 4(%ecx) 175; X32-NEXT: movl %eax, (%ecx) 176; X32-NEXT: popl %esi 177; X32-NEXT: popl %edi 178; X32-NEXT: popl %ebx 179; X32-NEXT: popl %ebp 180; X32-NEXT: retl 181; 182; X64-LABEL: ui64: 183; X64: # %bb.0: 184; X64-NEXT: movq %rdx, %r8 185; X64-NEXT: xorl %edx, %edx 186; X64-NEXT: movq %rdi, %rax 187; X64-NEXT: divq %rsi 188; X64-NEXT: movq %rax, (%r8) 189; X64-NEXT: movq %rdx, (%rcx) 190; X64-NEXT: retq 191 %r = udiv i64 %x, %y 192 %t = urem i64 %x, %y 193 store i64 %r, i64* %p 194 store i64 %t, i64* %q 195 ret void 196} 197 198define void @ui32(i32 %x, i32 %y, i32* %p, i32* %q) nounwind { 199; X32-LABEL: ui32: 200; X32: # %bb.0: 201; X32-NEXT: pushl %esi 202; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 203; X32-NEXT: movl {{[0-9]+}}(%esp), %esi 204; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 205; X32-NEXT: xorl %edx, %edx 206; X32-NEXT: divl {{[0-9]+}}(%esp) 207; X32-NEXT: movl %eax, (%esi) 208; X32-NEXT: movl %edx, (%ecx) 209; X32-NEXT: popl %esi 210; X32-NEXT: retl 211; 212; X64-LABEL: ui32: 213; X64: # %bb.0: 214; X64-NEXT: movq %rdx, %r8 215; X64-NEXT: xorl %edx, %edx 216; X64-NEXT: movl %edi, %eax 217; X64-NEXT: divl %esi 218; X64-NEXT: movl %eax, (%r8) 219; X64-NEXT: movl %edx, (%rcx) 220; X64-NEXT: retq 221 %r = udiv i32 %x, %y 222 %t = urem i32 %x, %y 223 store i32 %r, i32* %p 224 store i32 %t, i32* %q 225 ret void 226} 227 228define void @ui16(i16 %x, i16 %y, i16* %p, i16* %q) nounwind { 229; X32-LABEL: ui16: 230; X32: # %bb.0: 231; X32-NEXT: pushl %esi 232; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 233; X32-NEXT: movl {{[0-9]+}}(%esp), %esi 234; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 235; X32-NEXT: xorl %edx, %edx 236; X32-NEXT: divw {{[0-9]+}}(%esp) 237; X32-NEXT: movw %ax, (%esi) 238; X32-NEXT: movw %dx, (%ecx) 239; X32-NEXT: popl %esi 240; X32-NEXT: retl 241; 242; X64-LABEL: ui16: 243; X64: # %bb.0: 244; X64-NEXT: movq %rdx, %r8 245; X64-NEXT: xorl %edx, %edx 246; X64-NEXT: movl %edi, %eax 247; X64-NEXT: divw %si 248; X64-NEXT: movw %ax, (%r8) 249; X64-NEXT: movw %dx, (%rcx) 250; X64-NEXT: retq 251 %r = udiv i16 %x, %y 252 %t = urem i16 %x, %y 253 store i16 %r, i16* %p 254 store i16 %t, i16* %q 255 ret void 256} 257 258define void @ui8(i8 %x, i8 %y, i8* %p, i8* %q) nounwind { 259; X32-LABEL: ui8: 260; X32: # %bb.0: 261; X32-NEXT: pushl %ebx 262; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 263; X32-NEXT: movl {{[0-9]+}}(%esp), %edx 264; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax 265; X32-NEXT: # kill: def $eax killed $eax def $ax 266; X32-NEXT: divb {{[0-9]+}}(%esp) 267; X32-NEXT: movzbl %ah, %ebx 268; X32-NEXT: movb %al, (%edx) 269; X32-NEXT: movb %bl, (%ecx) 270; X32-NEXT: popl %ebx 271; X32-NEXT: retl 272; 273; X64-LABEL: ui8: 274; X64: # %bb.0: 275; X64-NEXT: movzbl %dil, %eax 276; X64-NEXT: # kill: def $eax killed $eax def $ax 277; X64-NEXT: divb %sil 278; X64-NEXT: movzbl %ah, %esi 279; X64-NEXT: movb %al, (%rdx) 280; X64-NEXT: movb %sil, (%rcx) 281; X64-NEXT: retq 282 %r = udiv i8 %x, %y 283 %t = urem i8 %x, %y 284 store i8 %r, i8* %p 285 store i8 %t, i8* %q 286 ret void 287} 288