2005-04-17 02:20:36 +04: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 21:19:07 +03:00
GNU General Public License for more details . */
2005-04-17 02:20:36 +04:00
2016-01-11 21:04:04 +03:00
# include <linux/compiler.h>
# include <linux/export.h>
2005-04-17 02:20:36 +04:00
# define BITS_PER_UNIT 8
2017-02-25 02:00:35 +03:00
typedef int SItype __mode ( SI ) ;
typedef unsigned int USItype __mode ( SI ) ;
typedef int DItype __mode ( DI ) ;
typedef int word_type __mode ( __word__ ) ;
2005-04-17 02:20:36 +04:00
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 21:04:04 +03:00
EXPORT_SYMBOL ( __ashldi3 ) ;