1 /* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License as published by 4 * the Free Software Foundation; either version 2 of the License, or 5 * (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, see the file COPYING, or write 14 * to the Free Software Foundation, Inc. 15 */ 16 17 #include <linux/export.h> 18 19 #include <linux/libgcc.h> 20 21 long long notrace __ashldi3(long long u, word_type b) 22 { 23 DWunion uu, w; 24 word_type bm; 25 26 if (b == 0) 27 return u; 28 29 uu.ll = u; 30 bm = 32 - b; 31 32 if (bm <= 0) { 33 w.s.low = 0; 34 w.s.high = (unsigned int) uu.s.low << -bm; 35 } else { 36 const unsigned int carries = (unsigned int) uu.s.low >> bm; 37 38 w.s.low = (unsigned int) uu.s.low << b; 39 w.s.high = ((unsigned int) uu.s.high << b) | carries; 40 } 41 42 return w.ll; 43 } 44 EXPORT_SYMBOL(__ashldi3); 45