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