Home | History | Annotate | Download | only in libgcc
      1 /*
      2  * arch/i386/libgcc/__muldi3.S
      3  *
      4  * 64*64 = 64 bit unsigned multiplication
      5  */
      6 
      7 	.text
      8 	.align 4
      9 	.globl __muldi3
     10 	.type __muldi3,@function
     11 __muldi3:
     12 #if __SIZEOF_POINTER__ == 4
     13 	/* i386 */
     14 	push  %esi
     15 #ifndef REGPARM
     16 	movl  8(%esp),%eax
     17 	movl  %eax,%esi
     18 	movl  16(%esp),%ecx
     19 	mull  %ecx
     20 	imull 12(%esp),%ecx
     21 	imull 20(%esp),%esi
     22 	addl  %ecx,%edx
     23 	addl  %esi,%edx
     24 #else
     25 	movl  %eax,%esi
     26 	push  %edx
     27 	mull  %ecx
     28 	imull 8(%esp),%esi
     29 	addl  %esi,%edx
     30 	pop   %esi
     31 	imull %esi,%ecx
     32 	addl  %ecx,%edx
     33 #endif
     34 	pop   %esi
     35 	ret
     36 #elif __SIZEOF_POINTER__ == 8
     37 	/* x86_64 */
     38 	push  %rsi
     39 #ifndef REGPARM
     40 /*
     41 	movl  8(%esp),%eax
     42 	movl %eax,%esi
     43 	movl  16(%esp),%ecx
     44 	mull  %ecx
     45 	imull 12(%esp),%ecx
     46 	imull 20(%esp),%esi
     47 	addl  %ecx,%edx
     48 	addl  %esi,%edx
     49 */
     50 	movq  8(%rsp),%rax
     51 	movq %rax,%rsi
     52 	movq  16(%rsp),%rcx
     53 	mulq  %rcx
     54 	imulq 12(%rsp),%rcx
     55 	imulq 20(%rsp),%rsi
     56 	addq  %rcx,%rdx
     57 	addq  %rsi,%rdx
     58 #else
     59 /*
     60 	movl  %eax,%esi
     61 	push  %edx
     62 	mull  %ecx
     63 	imull 8(%esp),%esi
     64 	addl  %esi,%edx
     65 	pop   %rsi
     66 	imull %esi,%ecx
     67 	addl  %ecx,%edx
     68 */
     69 	movq  %rax,%rsi
     70 	pushq  %rdx
     71 	mulq  %rcx
     72 	imulq 8(%rsp),%rsi
     73 	addq  %rsi,%rdx
     74 	popq  %rsi
     75 	imulq %rsi,%rcx
     76 	addq  %rcx,%rdx
     77 #endif
     78 	pop   %rsi
     79 	ret
     80 #else
     81 #error "Unsupported architecture for __muldi3.S"
     82 #endif
     83 	.size __muldi3,.-__muldi3
     84