diff options
author | Kevin Ryde <user42@zip.com.au> | 2001-04-11 01:10:06 +0200 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2001-04-11 01:10:06 +0200 |
commit | d24a287e085bde492afef9686e3efc2fa5382b06 (patch) | |
tree | c53a80375298a96ed389d2f26479e1e71ab47ec2 /mpn | |
parent | 7d9f4e5385303ecf026f1b2d0729808774e18ae1 (diff) | |
download | gmp-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.asm | 150 |
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) |