Annotation of OpenXM_contrib/gmp/mpn/x86/lshift.asm, Revision 1.1
1.1 ! maekawa 1: dnl x86 mpn_lshift -- mpn left shift.
! 2:
! 3: dnl Copyright (C) 1992, 1994, 1996, 1999, 2000 Free Software Foundation,
! 4: dnl 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: include(`../config.m4')
! 25:
! 26:
! 27: C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size,
! 28: C unsigned shift);
! 29:
! 30: defframe(PARAM_SHIFT,16)
! 31: defframe(PARAM_SIZE, 12)
! 32: defframe(PARAM_SRC, 8)
! 33: defframe(PARAM_DST, 4)
! 34:
! 35: .text
! 36: ALIGN(8)
! 37: PROLOGUE(mpn_lshift)
! 38:
! 39: pushl %edi
! 40: pushl %esi
! 41: pushl %ebx
! 42: deflit(`FRAME',12)
! 43:
! 44: movl PARAM_DST,%edi
! 45: movl PARAM_SRC,%esi
! 46: movl PARAM_SIZE,%edx
! 47: movl PARAM_SHIFT,%ecx
! 48:
! 49: subl $4,%esi C adjust src
! 50:
! 51: movl (%esi,%edx,4),%ebx C read most significant limb
! 52: xorl %eax,%eax
! 53: shldl( %cl, %ebx, %eax) C compute carry limb
! 54: decl %edx
! 55: jz L(end)
! 56: pushl %eax C push carry limb onto stack
! 57: testb $1,%dl
! 58: jnz L(1) C enter loop in the middle
! 59: movl %ebx,%eax
! 60:
! 61: ALIGN(8)
! 62: L(oop): movl (%esi,%edx,4),%ebx C load next lower limb
! 63: shldl( %cl, %ebx, %eax) C compute result limb
! 64: movl %eax,(%edi,%edx,4) C store it
! 65: decl %edx
! 66: L(1): movl (%esi,%edx,4),%eax
! 67: shldl( %cl, %eax, %ebx)
! 68: movl %ebx,(%edi,%edx,4)
! 69: decl %edx
! 70: jnz L(oop)
! 71:
! 72: shll %cl,%eax C compute least significant limb
! 73: movl %eax,(%edi) C store it
! 74:
! 75: popl %eax C pop carry limb
! 76:
! 77: popl %ebx
! 78: popl %esi
! 79: popl %edi
! 80: ret
! 81:
! 82: L(end): shll %cl,%ebx C compute least significant limb
! 83: movl %ebx,(%edi) C store it
! 84:
! 85: popl %ebx
! 86: popl %esi
! 87: popl %edi
! 88: ret
! 89:
! 90: EPILOGUE()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>