home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gmp202.zip / mpn / x86 / lshift.S < prev    next >
Text File  |  1996-05-08  |  2KB  |  86 lines

  1. /* i80386 __mpn_lshift -- 
  2.  
  3. Copyright (C) 1992, 1994 Free Software Foundation, Inc.
  4.  
  5. This file is part of the GNU MP Library.
  6.  
  7. The GNU MP Library is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU Library General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at your
  10. option) any later version.
  11.  
  12. The GNU MP Library is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
  15. License for more details.
  16.  
  17. You should have received a copy of the GNU Library General Public License
  18. along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
  19. the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  20. MA 02111-1307, USA. */
  21.  
  22. /*
  23.   INPUT PARAMETERS
  24.   res_ptr    (sp + 4)
  25.   s_ptr        (sp + 8)
  26.   size        (sp + 12)
  27.   cnt        (sp + 16)
  28. */
  29.  
  30. #include "sysdep.h"
  31. #include "asm-syntax.h"
  32.  
  33. .text
  34.     ALIGN (3)
  35.     .globl C_SYMBOL_NAME(__mpn_lshift)
  36. C_SYMBOL_NAME(__mpn_lshift:)
  37.     pushl    %edi
  38.     pushl    %esi
  39.     pushl    %ebx
  40.  
  41.     movl    16(%esp),%edi        /* res_ptr */
  42.     movl    20(%esp),%esi        /* s_ptr */
  43.     movl    24(%esp),%edx        /* size */
  44.     movl    28(%esp),%ecx        /* cnt */
  45.  
  46.     subl    $4,%esi            /* adjust s_ptr */
  47.  
  48.     movl    (%esi,%edx,4),%ebx    /* read most significant limb */
  49.     xorl    %eax,%eax
  50.     shldl    %cl,%ebx,%eax        /* compute carry limb */
  51.     decl    %edx
  52.     jz    Lend
  53.     pushl    %eax            /* push carry limb onto stack */
  54.     testb    $1,%edx
  55.     jnz    L1            /* enter loop in the middle */
  56.     movl    %ebx,%eax
  57.  
  58.     ALIGN (3)
  59. Loop:    movl    (%esi,%edx,4),%ebx    /* load next lower limb */
  60.     shldl    %cl,%ebx,%eax        /* compute result limb */
  61.     movl    %eax,(%edi,%edx,4)    /* store it */
  62.     decl    %edx
  63. L1:    movl    (%esi,%edx,4),%eax
  64.     shldl    %cl,%eax,%ebx
  65.     movl    %ebx,(%edi,%edx,4)
  66.     decl    %edx
  67.     jnz    Loop
  68.  
  69.     shll    %cl,%eax        /* compute least significant limb */
  70.     movl    %eax,(%edi)        /* store it */
  71.  
  72.     popl    %eax            /* pop carry limb */
  73.  
  74.     popl    %ebx
  75.     popl    %esi
  76.     popl    %edi
  77.     ret
  78.  
  79. Lend:    shll    %cl,%ebx        /* compute least significant limb */
  80.     movl    %ebx,(%edi)        /* store it */
  81.  
  82.     popl    %ebx
  83.     popl    %esi
  84.     popl    %edi
  85.     ret
  86.