diff options
Diffstat (limited to 'sysdeps/i386/rshift.S')
-rw-r--r-- | sysdeps/i386/rshift.S | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/sysdeps/i386/rshift.S b/sysdeps/i386/rshift.S index 51973fe..3fd0afe 100644 --- a/sysdeps/i386/rshift.S +++ b/sysdeps/i386/rshift.S @@ -1,5 +1,5 @@ /* i80386 __mpn_rshift -- - Copyright (C) 1992, 1994, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1992,1994,1997-2000,2005 Free Software Foundation, Inc. This file is part of the GNU MP Library. The GNU MP Library is free software; you can redistribute it and/or modify @@ -33,11 +33,16 @@ ENTRY (BP_SYM (__mpn_rshift)) ENTER pushl %edi + cfi_adjust_cfa_offset (4) pushl %esi + cfi_adjust_cfa_offset (4) pushl %ebx + cfi_adjust_cfa_offset (4) movl RES(%esp),%edi + cfi_rel_offset (edi, 8) movl S(%esp),%esi + cfi_rel_offset (esi, 4) movl SIZE(%esp),%edx movl CNT(%esp),%ecx #if __BOUNDED_POINTERS__ @@ -51,11 +56,13 @@ ENTRY (BP_SYM (__mpn_rshift)) negl %edx movl (%esi,%edx,4),%ebx /* read least significant limb */ + cfi_rel_offset (ebx, 0) xorl %eax,%eax shrdl %cl,%ebx,%eax /* compute carry limb */ incl %edx jz L(end) pushl %eax /* push carry limb onto stack */ + cfi_adjust_cfa_offset (4) testb $1,%dl jnz L(1) /* enter loop in the middle */ movl %ebx,%eax @@ -75,20 +82,37 @@ L(1): movl (%esi,%edx,4),%eax movl %eax,(%edi) /* store it */ popl %eax /* pop carry limb */ + cfi_adjust_cfa_offset (-4) popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) popl %esi + cfi_adjust_cfa_offset (-4) + cfi_restore (esi) popl %edi + cfi_adjust_cfa_offset (-4) + cfi_restore (edi) LEAVE ret + cfi_adjust_cfa_offset (12) + cfi_rel_offset (edi, 8) + cfi_rel_offset (esi, 4) + cfi_rel_offset (ebx, 0) L(end): shrl %cl,%ebx /* compute most significant limb */ movl %ebx,(%edi) /* store it */ popl %ebx + cfi_adjust_cfa_offset (-4) + cfi_restore (ebx) popl %esi + cfi_adjust_cfa_offset (-4) + cfi_restore (esi) popl %edi + cfi_adjust_cfa_offset (-4) + cfi_restore (edi) LEAVE ret |