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