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