2005-04-16 15:20:36 -07:00
/* ashrdi3.c extracted from gcc-2.95.2/libgcc2.c which is: */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC .
GNU CC is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 , or ( at your option )
any later version .
GNU CC is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
2014-11-08 19:19:07 +01:00
GNU General Public License for more details . */
2005-04-16 15:20:36 -07:00
2016-01-11 13:04:04 -05:00
# include <linux/compiler.h>
# include <linux/export.h>
2005-04-16 15:20:36 -07:00
# define BITS_PER_UNIT 8
typedef int SItype __attribute__ ( ( mode ( SI ) ) ) ;
typedef unsigned int USItype __attribute__ ( ( mode ( SI ) ) ) ;
typedef int DItype __attribute__ ( ( mode ( DI ) ) ) ;
typedef int word_type __attribute__ ( ( mode ( __word__ ) ) ) ;
struct DIstruct { SItype high , low ; } ;
typedef union
{
struct DIstruct s ;
DItype ll ;
} DIunion ;
DItype
__ashldi3 ( DItype u , word_type b )
{
DIunion w ;
word_type bm ;
DIunion uu ;
if ( b = = 0 )
return u ;
uu . ll = u ;
bm = ( sizeof ( SItype ) * BITS_PER_UNIT ) - b ;
if ( bm < = 0 )
{
w . s . low = 0 ;
w . s . high = ( USItype ) uu . s . low < < - bm ;
}
else
{
USItype carries = ( USItype ) uu . s . low > > bm ;
w . s . low = ( USItype ) uu . s . low < < b ;
w . s . high = ( ( USItype ) uu . s . high < < b ) | carries ;
}
return w . ll ;
}
2016-01-11 13:04:04 -05:00
EXPORT_SYMBOL ( __ashldi3 ) ;