summaryrefslogtreecommitdiff
path: root/mpn
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2001-04-11 01:10:06 +0200
committerKevin Ryde <user42@zip.com.au>2001-04-11 01:10:06 +0200
commitd24a287e085bde492afef9686e3efc2fa5382b06 (patch)
treec53a80375298a96ed389d2f26479e1e71ab47ec2 /mpn
parent7d9f4e5385303ecf026f1b2d0729808774e18ae1 (diff)
downloadgmp-d24a287e085bde492afef9686e3efc2fa5382b06.tar.gz
* mpn/m68k/*.asm: New files, converted from .S. Merge add_n and sub_n
to aors_n, ditto mc68020 addmul_1 and submul_1 to aorsmul_1. No object code changes (except .type and .size now used on NetBSD 1.4).
Diffstat (limited to 'mpn')
-rw-r--r--mpn/m68k/rshift.asm150
1 files changed, 150 insertions, 0 deletions
diff --git a/mpn/m68k/rshift.asm b/mpn/m68k/rshift.asm
new file mode 100644
index 000000000..97059aadf
--- /dev/null
+++ b/mpn/m68k/rshift.asm
@@ -0,0 +1,150 @@
+dnl mc68020 mpn_rshift -- Shift right a low-level natural-number integer.
+dnl
+dnl cycles/limb
+dnl shift==1 shift>1
+dnl 68040: 7.0 9.5
+
+dnl Copyright 1996, 1999, 2000, 2001 Free Software Foundation, Inc.
+dnl
+dnl This file is part of the GNU MP Library.
+dnl
+dnl The GNU MP Library is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Lesser General Public License as
+dnl published by the Free Software Foundation; either version 2.1 of the
+dnl License, or (at your option) any later version.
+dnl
+dnl The GNU MP Library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl Lesser General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU Lesser General Public
+dnl License along with the GNU MP Library; see the file COPYING.LIB. If
+dnl not, write to the Free Software Foundation, Inc., 59 Temple Place -
+dnl Suite 330, Boston, MA 02111-1307, USA.
+
+include(`../config.m4')
+
+
+C INPUT PARAMETERS
+C res_ptr (sp + 4)
+C s_ptr (sp + 8)
+C s_size (sp + 16)
+C cnt (sp + 12)
+
+
+define(res_ptr, `a1')
+define(s_ptr, `a0')
+define(s_size, `d6')
+define(cnt, `d4')
+
+PROLOGUE(mpn_rshift)
+C Save used registers on the stack.
+ moveml d2-d6/a2, M(-,sp)
+
+C Copy the arguments to registers.
+ movel M(sp,28), res_ptr
+ movel M(sp,32), s_ptr
+ movel M(sp,36), s_size
+ movel M(sp,40), cnt
+
+ moveql #1, d5
+ cmpl d5, cnt
+ bne L(Lnormal)
+ cmpl res_ptr, s_ptr
+ bls L(Lspecial) C jump if res_ptr >= s_ptr
+
+ifelse(scale_available_p,1,`
+ lea M(res_ptr,s_size,l,4), a2
+',`
+ movel s_size, d0
+ asll #2, d0
+ lea M(res_ptr,d0,l), a2
+')
+ cmpl s_ptr, a2
+ bls L(Lspecial) C jump if s_ptr >= res_ptr + s_size
+
+L(Lnormal:)
+ moveql #32, d5
+ subl cnt, d5
+ movel M(s_ptr,+), d2
+ movel d2, d0
+ lsll d5, d0 C compute carry limb
+
+ lsrl cnt, d2
+ movel d2, d1
+ subql #1, s_size
+ beq L(Lend)
+ lsrl #1, s_size
+ bcs L(L1)
+ subql #1, s_size
+
+L(Loop:)
+ movel M(s_ptr,+), d2
+ movel d2, d3
+ lsll d5, d3
+ orl d3, d1
+ movel d1, M(res_ptr,+)
+ lsrl cnt, d2
+L(L1:)
+ movel M(s_ptr,+), d1
+ movel d1, d3
+ lsll d5, d3
+ orl d3, d2
+ movel d2, M(res_ptr,+)
+ lsrl cnt, d1
+
+ dbf s_size, L(Loop)
+ subl #0x10000, s_size
+ bcc L(Loop)
+
+L(Lend:)
+ movel d1, M(res_ptr) C store most significant limb
+
+C Restore used registers from stack frame.
+ moveml M(sp,+), d2-d6/a2
+ rts
+
+C We loop from most significant end of the arrays, which is only permissable
+C if the source and destination don't overlap, since the function is
+C documented to work for overlapping source and destination.
+
+L(Lspecial:)
+ifelse(scale_available_p,1,`
+ lea M(s_ptr,s_size,l,4), s_ptr
+ lea M(res_ptr,s_size,l,4), res_ptr
+',`
+ movel s_size, d0
+ asll #2, d0
+ addl s_size, s_ptr
+ addl s_size, res_ptr
+')
+
+ clrl d0 C initialize carry
+ eorw #1, s_size
+ lsrl #1, s_size
+ bcc L(LL1)
+ subql #1, s_size
+
+L(LLoop:)
+ movel M(-,s_ptr), d2
+ roxrl #1, d2
+ movel d2, M(-,res_ptr)
+L(LL1:)
+ movel M(-,s_ptr), d2
+ roxrl #1, d2
+ movel d2, M(-,res_ptr)
+
+ dbf s_size, L(LLoop)
+ roxrl #1, d0 C save cy in msb
+ subl #0x10000, s_size
+ bcs L(LLend)
+ addl d0, d0 C restore cy
+ bra L(LLoop)
+
+L(LLend:)
+C Restore used registers from stack frame.
+ moveml M(sp,+), d2-d6/a2
+ rts
+
+EPILOGUE(mpn_rshift)