Annotation of OpenXM_contrib/gmp/mpn/m68k/rshift.asm, Revision 1.1.1.1
1.1 ohara 1: dnl mc68020 mpn_rshift -- mpn right shift.
2: dnl
3: dnl cycles/limb
4: dnl shift==1 shift>1
5: dnl 68040: 7.0 9.5
6:
7: dnl Copyright 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
8: dnl
9: dnl This file is part of the GNU MP Library.
10: dnl
11: dnl The GNU MP Library is free software; you can redistribute it and/or
12: dnl modify it under the terms of the GNU Lesser General Public License as
13: dnl published by the Free Software Foundation; either version 2.1 of the
14: dnl License, or (at your option) any later version.
15: dnl
16: dnl The GNU MP Library is distributed in the hope that it will be useful,
17: dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
18: dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19: dnl Lesser General Public License for more details.
20: dnl
21: dnl You should have received a copy of the GNU Lesser General Public
22: dnl License along with the GNU MP Library; see the file COPYING.LIB. If
23: dnl not, write to the Free Software Foundation, Inc., 59 Temple Place -
24: dnl Suite 330, Boston, MA 02111-1307, USA.
25:
26: include(`../config.m4')
27:
28:
29: C INPUT PARAMETERS
30: C res_ptr (sp + 4)
31: C s_ptr (sp + 8)
32: C s_size (sp + 16)
33: C cnt (sp + 12)
34:
35: define(res_ptr, `a1')
36: define(s_ptr, `a0')
37: define(s_size, `d6')
38: define(cnt, `d4')
39:
40: PROLOGUE(mpn_rshift)
41: C Save used registers on the stack.
42: moveml d2-d6/a2, M(-,sp)
43:
44: C Copy the arguments to registers.
45: movel M(sp,28), res_ptr
46: movel M(sp,32), s_ptr
47: movel M(sp,36), s_size
48: movel M(sp,40), cnt
49:
50: moveql #1, d5
51: cmpl d5, cnt
52: bne L(Lnormal)
53: cmpl res_ptr, s_ptr
54: bls L(Lspecial) C jump if res_ptr >= s_ptr
55:
56: ifelse(scale_available_p,1,`
57: lea M(res_ptr,s_size,l,4), a2
58: ',`
59: movel s_size, d0
60: asll #2, d0
61: lea M(res_ptr,d0,l), a2
62: ')
63: cmpl s_ptr, a2
64: bls L(Lspecial) C jump if s_ptr >= res_ptr + s_size
65:
66: L(Lnormal:)
67: moveql #32, d5
68: subl cnt, d5
69: movel M(s_ptr,+), d2
70: movel d2, d0
71: lsll d5, d0 C compute carry limb
72:
73: lsrl cnt, d2
74: movel d2, d1
75: subql #1, s_size
76: beq L(Lend)
77: lsrl #1, s_size
78: bcs L(L1)
79: subql #1, s_size
80:
81: L(Loop:)
82: movel M(s_ptr,+), d2
83: movel d2, d3
84: lsll d5, d3
85: orl d3, d1
86: movel d1, M(res_ptr,+)
87: lsrl cnt, d2
88: L(L1:)
89: movel M(s_ptr,+), d1
90: movel d1, d3
91: lsll d5, d3
92: orl d3, d2
93: movel d2, M(res_ptr,+)
94: lsrl cnt, d1
95:
96: dbf s_size, L(Loop)
97: subl #0x10000, s_size
98: bcc L(Loop)
99:
100: L(Lend:)
101: movel d1, M(res_ptr) C store most significant limb
102:
103: C Restore used registers from stack frame.
104: moveml M(sp,+), d2-d6/a2
105: rts
106:
107: C We loop from most significant end of the arrays, which is only permissable
108: C if the source and destination don't overlap, since the function is
109: C documented to work for overlapping source and destination.
110:
111: L(Lspecial:)
112: ifelse(scale_available_p,1,`
113: lea M(s_ptr,s_size,l,4), s_ptr
114: lea M(res_ptr,s_size,l,4), res_ptr
115: ',`
116: movel s_size, d0
117: asll #2, d0
118: addl d0, s_ptr
119: addl d0, res_ptr
120: ')
121:
122: clrl d0 C initialize carry
123: eorw #1, s_size
124: lsrl #1, s_size
125: bcc L(LL1)
126: subql #1, s_size
127:
128: L(LLoop:)
129: movel M(-,s_ptr), d2
130: roxrl #1, d2
131: movel d2, M(-,res_ptr)
132: L(LL1:)
133: movel M(-,s_ptr), d2
134: roxrl #1, d2
135: movel d2, M(-,res_ptr)
136:
137: dbf s_size, L(LLoop)
138: roxrl #1, d0 C save cy in msb
139: subl #0x10000, s_size
140: bcs L(LLend)
141: addl d0, d0 C restore cy
142: bra L(LLoop)
143:
144: L(LLend:)
145: C Restore used registers from stack frame.
146: moveml M(sp,+), d2-d6/a2
147: rts
148:
149: EPILOGUE(mpn_rshift)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>