glibc/sysdeps/m68k/rshift.S

147 lines
3.6 KiB
ArmAsm
Raw Normal View History

/* mc68020 __mpn_rshift -- Shift right a low-level natural-number integer.
* sysdeps/m68k/add_n.S: Use ENTRY and END macros. * sysdeps/m68k/lshift.S: Likewise. * sysdeps/m68k/rshift.S: Likewise. * sysdeps/m68k/sub_n.S: Likewise. * sysdeps/m68k/m68020/addmul_1.S: Likewise. * sysdeps/m68k/m68020/mul_1.S: Likewise. * sysdeps/m68k/m68020/submul_1.S: Likewise. * sysdeps/unix/sysv/linux/m68k/sysdep.S: Use ENTRY macro. [_LIBC_REENTRANT]: Don't store into global errno. * sysdeps/m68k/sysdep.h: New file. * sysdeps/unix/sysv/linux/m68k/sysdep.h: Use it. Use the macros ENTRY, CALL_MCOUNT, JUMPTARGET and syscall_error from there. (DO_CALL): Change to expect syscall name as argument. (PSEUDO): Pass syscall_name to DO_CALL. (SYSCALL_ERROR_HANDLER) [_LIBC_REENTRANT]: Don't store into global errno. Fri Mar 6 10:40:30 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/add_n.S: Use ENTRY and END macros. * sysdeps/m68k/lshift.S: Likewise. * sysdeps/m68k/rshift.S: Likewise. * sysdeps/m68k/sub_n.S: Likewise. * sysdeps/m68k/m68020/addmul_1.S: Likewise. * sysdeps/m68k/m68020/mul_1.S: Likewise. * sysdeps/m68k/m68020/submul_1.S: Likewise. * sysdeps/unix/sysv/linux/m68k/sysdep.S: Use ENTRY macro. [_LIBC_REENTRANT]: Don't store into global errno. * sysdeps/m68k/sysdep.h: New file. * sysdeps/unix/sysv/linux/m68k/sysdep.h: Use it. Use the macros ENTRY, CALL_MCOUNT, JUMPTARGET and syscall_error from there. (DO_CALL): Change to expect syscall name as argument. (PSEUDO): Pass syscall_name to DO_CALL. (SYSCALL_ERROR_HANDLER) [_LIBC_REENTRANT]: Don't store into global errno.
1998-03-06 01:48:50 +00:00
Copyright (C) 1996, 1998 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
2001-07-07 10:13:33 +00:00
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version.
The GNU MP Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
2001-07-07 10:13:33 +00:00
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
2001-07-07 10:13:33 +00:00
You should have received a copy of the GNU Lesser General Public License
along with the GNU MP Library; see the file COPYING.LIB. If not, write to
1996-05-07 21:04:52 +00:00
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s_ptr (sp + 8)
s_size (sp + 16)
cnt (sp + 12)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#define res_ptr a1
#define s_ptr a0
#define s_size d6
#define cnt d4
TEXT
* sysdeps/m68k/add_n.S: Use ENTRY and END macros. * sysdeps/m68k/lshift.S: Likewise. * sysdeps/m68k/rshift.S: Likewise. * sysdeps/m68k/sub_n.S: Likewise. * sysdeps/m68k/m68020/addmul_1.S: Likewise. * sysdeps/m68k/m68020/mul_1.S: Likewise. * sysdeps/m68k/m68020/submul_1.S: Likewise. * sysdeps/unix/sysv/linux/m68k/sysdep.S: Use ENTRY macro. [_LIBC_REENTRANT]: Don't store into global errno. * sysdeps/m68k/sysdep.h: New file. * sysdeps/unix/sysv/linux/m68k/sysdep.h: Use it. Use the macros ENTRY, CALL_MCOUNT, JUMPTARGET and syscall_error from there. (DO_CALL): Change to expect syscall name as argument. (PSEUDO): Pass syscall_name to DO_CALL. (SYSCALL_ERROR_HANDLER) [_LIBC_REENTRANT]: Don't store into global errno. Fri Mar 6 10:40:30 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/add_n.S: Use ENTRY and END macros. * sysdeps/m68k/lshift.S: Likewise. * sysdeps/m68k/rshift.S: Likewise. * sysdeps/m68k/sub_n.S: Likewise. * sysdeps/m68k/m68020/addmul_1.S: Likewise. * sysdeps/m68k/m68020/mul_1.S: Likewise. * sysdeps/m68k/m68020/submul_1.S: Likewise. * sysdeps/unix/sysv/linux/m68k/sysdep.S: Use ENTRY macro. [_LIBC_REENTRANT]: Don't store into global errno. * sysdeps/m68k/sysdep.h: New file. * sysdeps/unix/sysv/linux/m68k/sysdep.h: Use it. Use the macros ENTRY, CALL_MCOUNT, JUMPTARGET and syscall_error from there. (DO_CALL): Change to expect syscall name as argument. (PSEUDO): Pass syscall_name to DO_CALL. (SYSCALL_ERROR_HANDLER) [_LIBC_REENTRANT]: Don't store into global errno.
1998-03-06 01:48:50 +00:00
ENTRY(__mpn_rshift)
/* Save used registers on the stack. */
moveml R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
/* Copy the arguments to registers. */
movel MEM_DISP(sp,28),R(res_ptr)
movel MEM_DISP(sp,32),R(s_ptr)
movel MEM_DISP(sp,36),R(s_size)
movel MEM_DISP(sp,40),R(cnt)
moveql #1,R(d5)
cmpl R(d5),R(cnt)
bne L(Lnormal)
cmpl R(res_ptr),R(s_ptr)
bls L(Lspecial) /* jump if res_ptr >= s_ptr */
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
lea MEM_INDX1(res_ptr,s_size,l,4),R(a2)
#else /* not mc68020 */
movel R(s_size),R(d0)
asll #2,R(d0)
lea MEM_INDX(res_ptr,d0,l),R(a2)
#endif
cmpl R(s_ptr),R(a2)
bls L(Lspecial) /* jump if s_ptr >= res_ptr + s_size */
L(Lnormal:)
moveql #32,R(d5)
subl R(cnt),R(d5)
movel MEM_POSTINC(s_ptr),R(d2)
movel R(d2),R(d0)
lsll R(d5),R(d0) /* compute carry limb */
Update from main archive 961219 Thu Dec 19 23:28:33 1996 Ulrich Drepper <drepper@cygnus.com> * resolv/resolv.h: Update from BIND 4.9.5-P1. * resolv/res_comp.c: Likewise. * resolv/res_debug.c: Likewise. * resolv/Banner: Update version number. Thu Dec 19 20:58:53 1996 Ulrich Drepper <drepper@cygnus.com> * elf/dlfcn.h: Add extern "C" wrapper. * io/utime.h: Don't define NULL since this isn't allowed in POSIX. * io/sys/stat.h: Declare `lstat' only if __USE_BSD || __USE_XOPEN_EXTENDED. * locale/locale.h: Define NULL. * math/math.c: Don't include <errno.h> to define math errors. * stdlib/stdlib.h: Likewise. * posix/unistd.h: Don't declare environ. * posix/sys/utsname.h (struct utsname): Declare member domainname as __domainname is !__USE_GNU. * signal/signal.h: Declare size_t only if __USE_BSD || __USE_XOPEN_EXTENDED. * stdio/stdio.h: Don't declare cuserid when __USE_POSIX, but instead when __USE_XOPEN. * string/string.h: Define strndup only if __USE_GNU. * sysdeps/unix/sysv/linux/clock.c: New file. * sysdeps/unix/sysv/linux/timebits.h: Define CLOCKS_PER_SEC as 1000000 per X/Open standard. * features.h: Add code to recognize _POSIX_C_SOURCE value 199309. Define __USE_POSIX199309. * posix/unistd.h: Declare fdatasync only if __USE_POSIX199309. * time/time.c: Declare nanosleep only if __USE_POSIX199309. Patches by Rüdiger Helsch <rh@unifix.de>. * locale/locale.h: Add declaration of newlocale and freelocale. * new-malloc/Makefile (distibute): Add mtrace.awk. (dist-routines): Add mcheck and mtrace. (install-lib, non-lib.a): Define as libmcheck.a. * new-malloc/malloc.h: Add declaration of __malloc_initialized. * new-malloc/mcheck.c: New file. * new-malloc/mcheck.h: New file. * new-malloc/mtrace.c: New file. * new-malloc/mtrace.awk: New file. * posix/unistd.h: Correct prototype for usleep. * sysdeps/unix/bsd/usleep.c: De-ANSI-declfy. Correct return type. * sysdeps/unix/sysv/linux/usleep.c: Real implementation based on nanosleep. * signal/signal.h: Change protoype of __sigpause to take two arguments. Remove prototype for sigpause. Add two different macros named sigpause selected when __USE_BSD or __USE_XOPEN are defined. This is necessary since the old BSD definition of theis function collides with the X/Open definition. * sysdeps/posix/sigpause.c: Change function definition to also fit X/Open definition. * sysdeps/libm-i387/e_exp.S: Make sure stack is empty when the function is left. * sysdeps/libm-i387/e_expl.S: Likewise. Patch by HJ Lu. 1996-12-17 Paul Eggert <eggert@twinsun.com> * many, many files: Spelling corrections. * catgets/catgetsinfo.h (mmapped): Renamed from mmaped (in struct catalog_info.status). * mach/err_kern.sub (err_codes_unix), string/stratcliff.c (main): Fix spelling in message. * po/libc.pot: Fix spelling in message for `zic'; this anticipates a fix in the tzcode distribution. Wed Dec 18 15:48:02 1996 Ulrich Drepper <drepper@cygnus.com> * time/strftime.c: Implement ^ flag to cause output be converted to use upper case characters. * time/zic.c: Update from ADO tzcode1996n. Wed Dec 18 14:29:24 1996 Erik Naggum <erik@naggum.no> * time/strftime.c (add): Don't change global `i' until all is over. Define NULL is not already defined. Tue Dec 17 09:49:03 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * libio/iovsprintf.c (_IO_vsprintf): Change `&sf' to `&sf._sbf._f' to avoid the need for a cast. * libio/iovsscanf.c (_IO_vsscanf): Likewise. * sunrpc/rpc/xdr.h: Add prototype for xdr_free.
1996-12-20 01:39:50 +00:00
lsrl R(cnt),R(d2)
movel R(d2),R(d1)
subql #1,R(s_size)
beq L(Lend)
lsrl #1,R(s_size)
bcs L(L1)
subql #1,R(s_size)
L(Loop:)
movel MEM_POSTINC(s_ptr),R(d2)
movel R(d2),R(d3)
lsll R(d5),R(d3)
orl R(d3),R(d1)
movel R(d1),MEM_POSTINC(res_ptr)
lsrl R(cnt),R(d2)
L(L1:)
movel MEM_POSTINC(s_ptr),R(d1)
movel R(d1),R(d3)
lsll R(d5),R(d3)
orl R(d3),R(d2)
movel R(d2),MEM_POSTINC(res_ptr)
lsrl R(cnt),R(d1)
dbf R(s_size),L(Loop)
subl #0x10000,R(s_size)
bcc L(Loop)
L(Lend:)
movel R(d1),MEM(res_ptr) /* store most significant limb */
/* Restore used registers from stack frame. */
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
rts
/* We loop from most significant end of the arrays, which is only
Update from main archive 961219 Thu Dec 19 23:28:33 1996 Ulrich Drepper <drepper@cygnus.com> * resolv/resolv.h: Update from BIND 4.9.5-P1. * resolv/res_comp.c: Likewise. * resolv/res_debug.c: Likewise. * resolv/Banner: Update version number. Thu Dec 19 20:58:53 1996 Ulrich Drepper <drepper@cygnus.com> * elf/dlfcn.h: Add extern "C" wrapper. * io/utime.h: Don't define NULL since this isn't allowed in POSIX. * io/sys/stat.h: Declare `lstat' only if __USE_BSD || __USE_XOPEN_EXTENDED. * locale/locale.h: Define NULL. * math/math.c: Don't include <errno.h> to define math errors. * stdlib/stdlib.h: Likewise. * posix/unistd.h: Don't declare environ. * posix/sys/utsname.h (struct utsname): Declare member domainname as __domainname is !__USE_GNU. * signal/signal.h: Declare size_t only if __USE_BSD || __USE_XOPEN_EXTENDED. * stdio/stdio.h: Don't declare cuserid when __USE_POSIX, but instead when __USE_XOPEN. * string/string.h: Define strndup only if __USE_GNU. * sysdeps/unix/sysv/linux/clock.c: New file. * sysdeps/unix/sysv/linux/timebits.h: Define CLOCKS_PER_SEC as 1000000 per X/Open standard. * features.h: Add code to recognize _POSIX_C_SOURCE value 199309. Define __USE_POSIX199309. * posix/unistd.h: Declare fdatasync only if __USE_POSIX199309. * time/time.c: Declare nanosleep only if __USE_POSIX199309. Patches by Rüdiger Helsch <rh@unifix.de>. * locale/locale.h: Add declaration of newlocale and freelocale. * new-malloc/Makefile (distibute): Add mtrace.awk. (dist-routines): Add mcheck and mtrace. (install-lib, non-lib.a): Define as libmcheck.a. * new-malloc/malloc.h: Add declaration of __malloc_initialized. * new-malloc/mcheck.c: New file. * new-malloc/mcheck.h: New file. * new-malloc/mtrace.c: New file. * new-malloc/mtrace.awk: New file. * posix/unistd.h: Correct prototype for usleep. * sysdeps/unix/bsd/usleep.c: De-ANSI-declfy. Correct return type. * sysdeps/unix/sysv/linux/usleep.c: Real implementation based on nanosleep. * signal/signal.h: Change protoype of __sigpause to take two arguments. Remove prototype for sigpause. Add two different macros named sigpause selected when __USE_BSD or __USE_XOPEN are defined. This is necessary since the old BSD definition of theis function collides with the X/Open definition. * sysdeps/posix/sigpause.c: Change function definition to also fit X/Open definition. * sysdeps/libm-i387/e_exp.S: Make sure stack is empty when the function is left. * sysdeps/libm-i387/e_expl.S: Likewise. Patch by HJ Lu. 1996-12-17 Paul Eggert <eggert@twinsun.com> * many, many files: Spelling corrections. * catgets/catgetsinfo.h (mmapped): Renamed from mmaped (in struct catalog_info.status). * mach/err_kern.sub (err_codes_unix), string/stratcliff.c (main): Fix spelling in message. * po/libc.pot: Fix spelling in message for `zic'; this anticipates a fix in the tzcode distribution. Wed Dec 18 15:48:02 1996 Ulrich Drepper <drepper@cygnus.com> * time/strftime.c: Implement ^ flag to cause output be converted to use upper case characters. * time/zic.c: Update from ADO tzcode1996n. Wed Dec 18 14:29:24 1996 Erik Naggum <erik@naggum.no> * time/strftime.c (add): Don't change global `i' until all is over. Define NULL is not already defined. Tue Dec 17 09:49:03 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * libio/iovsprintf.c (_IO_vsprintf): Change `&sf' to `&sf._sbf._f' to avoid the need for a cast. * libio/iovsscanf.c (_IO_vsscanf): Likewise. * sunrpc/rpc/xdr.h: Add prototype for xdr_free.
1996-12-20 01:39:50 +00:00
permissible if the source and destination don't overlap, since the
function is documented to work for overlapping source and destination. */
L(Lspecial:)
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
#else /* not mc68000 */
movel R(s_size),R(d0)
asll #2,R(d0)
addl R(s_size),R(s_ptr)
addl R(s_size),R(res_ptr)
#endif
clrl R(d0) /* initialize carry */
eorw #1,R(s_size)
lsrl #1,R(s_size)
bcc L(LL1)
subql #1,R(s_size)
L(LLoop:)
movel MEM_PREDEC(s_ptr),R(d2)
roxrl #1,R(d2)
movel R(d2),MEM_PREDEC(res_ptr)
L(LL1:)
movel MEM_PREDEC(s_ptr),R(d2)
roxrl #1,R(d2)
movel R(d2),MEM_PREDEC(res_ptr)
dbf R(s_size),L(LLoop)
roxrl #1,R(d0) /* save cy in msb */
subl #0x10000,R(s_size)
bcs L(LLend)
addl R(d0),R(d0) /* restore cy */
bra L(LLoop)
L(LLend:)
/* Restore used registers from stack frame. */
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
rts
* sysdeps/m68k/add_n.S: Use ENTRY and END macros. * sysdeps/m68k/lshift.S: Likewise. * sysdeps/m68k/rshift.S: Likewise. * sysdeps/m68k/sub_n.S: Likewise. * sysdeps/m68k/m68020/addmul_1.S: Likewise. * sysdeps/m68k/m68020/mul_1.S: Likewise. * sysdeps/m68k/m68020/submul_1.S: Likewise. * sysdeps/unix/sysv/linux/m68k/sysdep.S: Use ENTRY macro. [_LIBC_REENTRANT]: Don't store into global errno. * sysdeps/m68k/sysdep.h: New file. * sysdeps/unix/sysv/linux/m68k/sysdep.h: Use it. Use the macros ENTRY, CALL_MCOUNT, JUMPTARGET and syscall_error from there. (DO_CALL): Change to expect syscall name as argument. (PSEUDO): Pass syscall_name to DO_CALL. (SYSCALL_ERROR_HANDLER) [_LIBC_REENTRANT]: Don't store into global errno. Fri Mar 6 10:40:30 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/add_n.S: Use ENTRY and END macros. * sysdeps/m68k/lshift.S: Likewise. * sysdeps/m68k/rshift.S: Likewise. * sysdeps/m68k/sub_n.S: Likewise. * sysdeps/m68k/m68020/addmul_1.S: Likewise. * sysdeps/m68k/m68020/mul_1.S: Likewise. * sysdeps/m68k/m68020/submul_1.S: Likewise. * sysdeps/unix/sysv/linux/m68k/sysdep.S: Use ENTRY macro. [_LIBC_REENTRANT]: Don't store into global errno. * sysdeps/m68k/sysdep.h: New file. * sysdeps/unix/sysv/linux/m68k/sysdep.h: Use it. Use the macros ENTRY, CALL_MCOUNT, JUMPTARGET and syscall_error from there. (DO_CALL): Change to expect syscall name as argument. (PSEUDO): Pass syscall_name to DO_CALL. (SYSCALL_ERROR_HANDLER) [_LIBC_REENTRANT]: Don't store into global errno.
1998-03-06 01:48:50 +00:00
END(__mpn_rshift)