84 lines
1.2 KiB
ArmAsm
84 lines
1.2 KiB
ArmAsm
/*
|
|
* arch/i386/libgcc/__muldi3.S
|
|
*
|
|
* 64*64 = 64 bit unsigned multiplication
|
|
*/
|
|
|
|
.text
|
|
.align 4
|
|
.globl __muldi3
|
|
.type __muldi3,@function
|
|
__muldi3:
|
|
#if __SIZEOF_POINTER__ == 4
|
|
/* i386 */
|
|
push %esi
|
|
#ifndef REGPARM
|
|
movl 8(%esp),%eax
|
|
movl %eax,%esi
|
|
movl 16(%esp),%ecx
|
|
mull %ecx
|
|
imull 12(%esp),%ecx
|
|
imull 20(%esp),%esi
|
|
addl %ecx,%edx
|
|
addl %esi,%edx
|
|
#else
|
|
movl %eax,%esi
|
|
push %edx
|
|
mull %ecx
|
|
imull 8(%esp),%esi
|
|
addl %esi,%edx
|
|
pop %esi
|
|
imull %esi,%ecx
|
|
addl %ecx,%edx
|
|
#endif
|
|
pop %esi
|
|
ret
|
|
#elif __SIZEOF_POINTER__ == 8
|
|
/* x86_64 */
|
|
push %rsi
|
|
#ifndef REGPARM
|
|
/*
|
|
movl 8(%esp),%eax
|
|
movl %eax,%esi
|
|
movl 16(%esp),%ecx
|
|
mull %ecx
|
|
imull 12(%esp),%ecx
|
|
imull 20(%esp),%esi
|
|
addl %ecx,%edx
|
|
addl %esi,%edx
|
|
*/
|
|
movq 8(%rsp),%rax
|
|
movq %rax,%rsi
|
|
movq 16(%rsp),%rcx
|
|
mulq %rcx
|
|
imulq 12(%rsp),%rcx
|
|
imulq 20(%rsp),%rsi
|
|
addq %rcx,%rdx
|
|
addq %rsi,%rdx
|
|
#else
|
|
/*
|
|
movl %eax,%esi
|
|
push %edx
|
|
mull %ecx
|
|
imull 8(%esp),%esi
|
|
addl %esi,%edx
|
|
pop %rsi
|
|
imull %esi,%ecx
|
|
addl %ecx,%edx
|
|
*/
|
|
movq %rax,%rsi
|
|
pushq %rdx
|
|
mulq %rcx
|
|
imulq 8(%rsp),%rsi
|
|
addq %rsi,%rdx
|
|
popq %rsi
|
|
imulq %rsi,%rcx
|
|
addq %rcx,%rdx
|
|
#endif
|
|
pop %rsi
|
|
ret
|
|
#else
|
|
#error "Unsupported architecture for __muldi3.S"
|
|
#endif
|
|
.size __muldi3,.-__muldi3
|