1dnl x86 mpn_lshift -- mpn left shift. 2 3dnl Copyright 1992, 1994, 1996, 1999-2002 Free Software Foundation, Inc. 4 5dnl This file is part of the GNU MP Library. 6dnl 7dnl The GNU MP Library is free software; you can redistribute it and/or modify 8dnl it under the terms of either: 9dnl 10dnl * the GNU Lesser General Public License as published by the Free 11dnl Software Foundation; either version 3 of the License, or (at your 12dnl option) any later version. 13dnl 14dnl or 15dnl 16dnl * the GNU General Public License as published by the Free Software 17dnl Foundation; either version 2 of the License, or (at your option) any 18dnl later version. 19dnl 20dnl or both in parallel, as here. 21dnl 22dnl The GNU MP Library is distributed in the hope that it will be useful, but 23dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 24dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 25dnl for more details. 26dnl 27dnl You should have received copies of the GNU General Public License and the 28dnl GNU Lesser General Public License along with the GNU MP Library. If not, 29dnl see https://www.gnu.org/licenses/. 30 31include(`../config.m4') 32 33 34C cycles/limb 35C P54 7.5 36C P55 7.0 37C P6 2.5 38C K6 4.5 39C K7 5.0 40C P4 14.5 41 42 43C mp_limb_t mpn_lshift (mp_ptr dst, mp_srcptr src, mp_size_t size, 44C unsigned shift); 45 46defframe(PARAM_SHIFT,16) 47defframe(PARAM_SIZE, 12) 48defframe(PARAM_SRC, 8) 49defframe(PARAM_DST, 4) 50 51 TEXT 52 ALIGN(8) 53PROLOGUE(mpn_lshift) 54 55 pushl %edi 56 pushl %esi 57 pushl %ebx 58deflit(`FRAME',12) 59 60 movl PARAM_DST,%edi 61 movl PARAM_SRC,%esi 62 movl PARAM_SIZE,%edx 63 movl PARAM_SHIFT,%ecx 64 65 subl $4,%esi C adjust src 66 67 movl (%esi,%edx,4),%ebx C read most significant limb 68 xorl %eax,%eax 69 shldl( %cl, %ebx, %eax) C compute carry limb 70 decl %edx 71 jz L(end) 72 pushl %eax C push carry limb onto stack 73 testb $1,%dl 74 jnz L(1) C enter loop in the middle 75 movl %ebx,%eax 76 77 ALIGN(8) 78L(oop): movl (%esi,%edx,4),%ebx C load next lower limb 79 shldl( %cl, %ebx, %eax) C compute result limb 80 movl %eax,(%edi,%edx,4) C store it 81 decl %edx 82L(1): movl (%esi,%edx,4),%eax 83 shldl( %cl, %eax, %ebx) 84 movl %ebx,(%edi,%edx,4) 85 decl %edx 86 jnz L(oop) 87 88 shll %cl,%eax C compute least significant limb 89 movl %eax,(%edi) C store it 90 91 popl %eax C pop carry limb 92 93 popl %ebx 94 popl %esi 95 popl %edi 96 ret 97 98L(end): shll %cl,%ebx C compute least significant limb 99 movl %ebx,(%edi) C store it 100 101 popl %ebx 102 popl %esi 103 popl %edi 104 ret 105 106EPILOGUE() 107