Annotation of OpenXM_contrib/gmp/mpn/x86/mod_1.asm, Revision 1.1.1.1
1.1 maekawa 1: dnl x86 mpn_mod_1 -- mpn by limb remainder.
2:
3:
4: dnl Copyright (C) 1999, 2000 Free Software Foundation, Inc.
5: dnl
6: dnl This file is part of the GNU MP Library.
7: dnl
8: dnl The GNU MP Library is free software; you can redistribute it and/or
9: dnl modify it under the terms of the GNU Lesser General Public License as
10: dnl published by the Free Software Foundation; either version 2.1 of the
11: dnl License, or (at your option) any later version.
12: dnl
13: dnl The GNU MP Library is distributed in the hope that it will be useful,
14: dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
15: dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16: dnl Lesser General Public License for more details.
17: dnl
18: dnl You should have received a copy of the GNU Lesser General Public
19: dnl License along with the GNU MP Library; see the file COPYING.LIB. If
20: dnl not, write to the Free Software Foundation, Inc., 59 Temple Place -
21: dnl Suite 330, Boston, MA 02111-1307, USA.
22:
23:
24: dnl cycles/limb
25: dnl K6 20
26: dnl P5 44
27: dnl P6 39
28: dnl 486 approx 42 maybe
29: dnl
30: dnl The following have their own optimized mod_1 implementations, but for
31: dnl reference the code here runs as follows.
32: dnl
33: dnl P6MMX 39
34: dnl K7 41
35:
36:
37: include(`../config.m4')
38:
39:
40: C mp_limb_t mpn_mod_1 (mp_srcptr src, mp_size_t size, mp_limb_t divisor);
41: C mp_limb_t mpn_mod_1c (mp_srcptr src, mp_size_t size, mp_limb_t divisor,
42: C mp_limb_t carry);
43: C
44: C Divide src,size by divisor and return the remainder. The quotient is
45: C discarded.
46: C
47: C See mpn/x86/divrem_1.asm for some comments.
48:
49: defframe(PARAM_CARRY, 16)
50: defframe(PARAM_DIVISOR,12)
51: defframe(PARAM_SIZE, 8)
52: defframe(PARAM_SRC, 4)
53:
54: .text
55: ALIGN(16)
56:
57: PROLOGUE(mpn_mod_1c)
58: deflit(`FRAME',0)
59:
60: movl PARAM_SIZE, %ecx
61: pushl %ebx FRAME_pushl()
62:
63: movl PARAM_SRC, %ebx
64: pushl %esi FRAME_pushl()
65:
66: movl PARAM_DIVISOR, %esi
67: orl %ecx, %ecx
68:
69: movl PARAM_CARRY, %edx
70: jnz LF(mpn_mod_1,top)
71:
72: popl %esi
73: movl %edx, %eax
74:
75: popl %ebx
76:
77: ret
78:
79: EPILOGUE()
80:
81:
82: PROLOGUE(mpn_mod_1)
83: deflit(`FRAME',0)
84:
85: movl PARAM_SIZE, %ecx
86: pushl %ebx FRAME_pushl()
87:
88: movl PARAM_SRC, %ebx
89: pushl %esi FRAME_pushl()
90:
91: orl %ecx, %ecx
92: jz L(done_zero)
93:
94: movl PARAM_DIVISOR, %esi
95: movl -4(%ebx,%ecx,4), %eax C src high limb
96:
97: cmpl %esi, %eax
98:
99: sbbl %edx, %edx C -1 if high<divisor
100:
101: addl %edx, %ecx C skip one division if high<divisor
102: jz L(done_eax)
103:
104: andl %eax, %edx C carry if high<divisor
105:
106:
107: L(top):
108: C eax scratch (quotient)
109: C ebx src
110: C ecx counter
111: C edx carry (remainder)
112: C esi divisor
113: C edi
114: C ebp
115:
116: movl -4(%ebx,%ecx,4), %eax
117:
118: divl %esi
119:
120: loop_or_decljnz L(top)
121:
122:
123: movl %edx, %eax
124: L(done_eax):
125: popl %esi
126:
127: popl %ebx
128:
129: ret
130:
131:
132: L(done_zero):
133: popl %esi
134: xorl %eax, %eax
135:
136: popl %ebx
137:
138: ret
139:
140:
141: EPILOGUE()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>