|
|
1.1 root 1: /*---------------------------------------------------------------------------+
2: | poly_mul64.S |
3: | |
4: | Multiply two 64 bit integers. |
5: | |
6: | Copyright (C) 1992 W. Metzenthen, 22 Parker St, Ormond, Vic 3163, |
7: | Australia. E-mail [email protected] |
8: | |
9: | Call from C as: |
10: | void mul64(long long *a, long long *b, long long *result) |
11: | |
12: +---------------------------------------------------------------------------*/
13:
14:
15: #include "fpu_asm.h"
16:
17: .text
18: .align 2,144
19: .globl mul64
20: mul64:
21: pushl %ebp
22: movl %esp,%ebp
23: subl $16,%esp
24: pushl %esi
25: pushl %ebx
26:
27: movl PARAM1,%esi
28: movl PARAM2,%ecx
29: movl PARAM3,%ebx
30:
31: xor %eax,%eax
32: movl %eax,-4(%ebp)
33: movl %eax,-8(%ebp)
34:
35: movl (%esi),%eax
36: mull (%ecx)
37: movl %eax,-16(%ebp) // Not used
38: movl %edx,-12(%ebp)
39:
40: movl (%esi),%eax
41: mull 4(%ecx)
42: addl %eax,-12(%ebp)
43: adcl %edx,-8(%ebp)
44: adcl $0,-4(%ebp)
45:
46: movl 4(%esi),%eax
47: mull (%ecx)
48: addl %eax,-12(%ebp)
49: adcl %edx,-8(%ebp)
50: adcl $0,-4(%ebp)
51:
52: movl 4(%esi),%eax
53: mull 4(%ecx)
54: addl %eax,-8(%ebp)
55: adcl %edx,-4(%ebp)
56:
57: testb $128,-9(%ebp)
58: je L_no_round
59:
60: addl $1,-8(%ebp)
61: adcl $0,-4(%ebp)
62:
63: L_no_round:
64: movl -8(%ebp),%esi
65: movl %esi,(%ebx)
66: movl -4(%ebp),%esi
67: movl %esi,4(%ebx)
68:
69: popl %ebx
70: popl %esi
71: leave
72: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.