1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * ashldi3.c extracted from gcc-2.7.2.3/libgcc2.c and 3*4882a593Smuzhiyun * gcc-2.7.2.3/longlong.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 1989-2015 Free Software Foundation, Inc. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define BITS_PER_UNIT 8 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun typedef int SItype __attribute__ ((mode (SI))); 13*4882a593Smuzhiyun typedef unsigned int USItype __attribute__ ((mode (SI))); 14*4882a593Smuzhiyun typedef int DItype __attribute__ ((mode (DI))); 15*4882a593Smuzhiyun typedef int word_type __attribute__ ((mode (__word__))); 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct DIstruct {SItype high, low;}; 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun typedef union 20*4882a593Smuzhiyun { 21*4882a593Smuzhiyun struct DIstruct s; 22*4882a593Smuzhiyun DItype ll; 23*4882a593Smuzhiyun } DIunion; 24*4882a593Smuzhiyun __ashldi3(DItype u,word_type b)25*4882a593SmuzhiyunDItype __ashldi3 (DItype u, word_type b) 26*4882a593Smuzhiyun { 27*4882a593Smuzhiyun DIunion w; 28*4882a593Smuzhiyun word_type bm; 29*4882a593Smuzhiyun DIunion uu; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun if (b == 0) 32*4882a593Smuzhiyun return u; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun uu.ll = u; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun bm = (sizeof (SItype) * BITS_PER_UNIT) - b; 37*4882a593Smuzhiyun if (bm <= 0) 38*4882a593Smuzhiyun { 39*4882a593Smuzhiyun w.s.low = 0; 40*4882a593Smuzhiyun w.s.high = (USItype)uu.s.low << -bm; 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun else 43*4882a593Smuzhiyun { 44*4882a593Smuzhiyun USItype carries = (USItype)uu.s.low >> bm; 45*4882a593Smuzhiyun w.s.low = (USItype)uu.s.low << b; 46*4882a593Smuzhiyun w.s.high = ((USItype)uu.s.high << b) | carries; 47*4882a593Smuzhiyun } 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun return w.ll; 50*4882a593Smuzhiyun }