1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
/* Pentium __mpn_add_n -- Add two limb vectors of the same length > 0 and store
sum in a third limb vector.
Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
The GNU MP Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
License for more details.
You should have received a copy of the GNU Library General Public License
along with the GNU MP Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 12)
size (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#define t1 %eax
#define t2 %edx
#define src1 %esi
#define src2 %ebp
#define dst %edi
#define x %ebx
.text
ALIGN (3)
.globl C_SYMBOL_NAME(__mpn_add_n)
C_SYMBOL_NAME(__mpn_add_n:)
pushl %edi
pushl %esi
pushl %ebx
pushl %ebp
movl 20(%esp),dst /* res_ptr */
movl 24(%esp),src1 /* s1_ptr */
movl 28(%esp),src2 /* s2_ptr */
movl 32(%esp),%ecx /* size */
movl (src2),x
decl %ecx
movl %ecx,t2
shrl $3,%ecx
andl $7,t2
testl %ecx,%ecx /* zero carry flag */
jz Lend
pushl t2
ALIGN (3)
Loop: movl 28(dst),%eax /* fetch destination cache line */
leal 32(dst),dst
L1: movl (src1),t1
movl 4(src1),t2
adcl x,t1
movl 4(src2),x
adcl x,t2
movl 8(src2),x
movl t1,-32(dst)
movl t2,-28(dst)
L2: movl 8(src1),t1
movl 12(src1),t2
adcl x,t1
movl 12(src2),x
adcl x,t2
movl 16(src2),x
movl t1,-24(dst)
movl t2,-20(dst)
L3: movl 16(src1),t1
movl 20(src1),t2
adcl x,t1
movl 20(src2),x
adcl x,t2
movl 24(src2),x
movl t1,-16(dst)
movl t2,-12(dst)
L4: movl 24(src1),t1
movl 28(src1),t2
adcl x,t1
movl 28(src2),x
adcl x,t2
movl 32(src2),x
movl t1,-8(dst)
movl t2,-4(dst)
leal 32(src1),src1
leal 32(src2),src2
decl %ecx
jnz Loop
popl t2
Lend:
decl t2 /* test t2 w/o clobbering carry */
js Lend2
incl t2
Loop2:
leal 4(dst),dst
movl (src1),t1
adcl x,t1
movl 4(src2),x
movl t1,-4(dst)
leal 4(src1),src1
leal 4(src2),src2
decl t2
jnz Loop2
Lend2:
movl (src1),t1
adcl x,t1
movl t1,(dst)
sbbl %eax,%eax
negl %eax
popl %ebp
popl %ebx
popl %esi
popl %edi
ret
|