xref: /csrg-svn/lib/libc/quad/ashrdi3.c (revision 53459)
153434Sbostic /*-
253434Sbostic  * Copyright (c) 1992 The Regents of the University of California.
353434Sbostic  * All rights reserved.
453434Sbostic  *
553434Sbostic  * %sccs.include.redist.c%
653434Sbostic  */
753434Sbostic 
853434Sbostic #if defined(LIBC_SCCS) && !defined(lint)
9*53459Sbostic static char sccsid[] = "@(#)ashrdi3.c	5.3 (Berkeley) 05/12/92";
1053434Sbostic #endif /* LIBC_SCCS and not lint */
1153434Sbostic 
12*53459Sbostic /* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
13*53459Sbostic 
14*53459Sbostic This file is part of GNU CC.
15*53459Sbostic 
16*53459Sbostic GNU CC is free software; you can redistribute it and/or modify
17*53459Sbostic it under the terms of the GNU General Public License as published by
18*53459Sbostic the Free Software Foundation; either version 2, or (at your option)
19*53459Sbostic any later version.
20*53459Sbostic 
21*53459Sbostic GNU CC is distributed in the hope that it will be useful,
22*53459Sbostic but WITHOUT ANY WARRANTY; without even the implied warranty of
23*53459Sbostic MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24*53459Sbostic GNU General Public License for more details.
25*53459Sbostic 
26*53459Sbostic You should have received a copy of the GNU General Public License
27*53459Sbostic along with GNU CC; see the file COPYING.  If not, write to
28*53459Sbostic the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
29*53459Sbostic 
30*53459Sbostic /* As a special exception, if you link this library with files
31*53459Sbostic    compiled with GCC to produce an executable, this does not cause
32*53459Sbostic    the resulting executable to be covered by the GNU General Public License.
33*53459Sbostic    This exception does not however invalidate any other reasons why
34*53459Sbostic    the executable file might be covered by the GNU General Public License.  */
35*53459Sbostic 
3653434Sbostic #include "longlong.h"
3753434Sbostic 
3853434Sbostic long long
3953434Sbostic __ashrdi3 (u, b1)
4053434Sbostic      long long u;
4153434Sbostic      long long b1;
4253434Sbostic {
4353434Sbostic   long_long w;
4453434Sbostic   unsigned long carries;
4553434Sbostic   int bm;
4653434Sbostic   long_long uu;
4753434Sbostic   int b = b1;
4853434Sbostic 
4953434Sbostic   if (b == 0)
5053434Sbostic     return u;
5153434Sbostic 
5253434Sbostic   uu.ll = u;
5353434Sbostic 
5453452Sbostic   bm = (sizeof (int) * NBBY) - b;
5553434Sbostic   if (bm <= 0)
5653434Sbostic     {
5753434Sbostic       w.s.high = uu.s.high >> 31; /* just to make w.s.high 1..1 or 0..0 */
5853434Sbostic       w.s.low = uu.s.high >> -bm;
5953434Sbostic     }
6053434Sbostic   else
6153434Sbostic     {
6253434Sbostic       carries = (unsigned long)uu.s.high << bm;
6353434Sbostic       w.s.high = uu.s.high >> b;
6453434Sbostic       w.s.low = ((unsigned long)uu.s.low >> b) | carries;
6553434Sbostic     }
6653434Sbostic 
6753434Sbostic   return w.ll;
6853434Sbostic }
69