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 __ashrdi3(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.high = 1..1 or 0..0 */ 34 w.s.high = 35 uu.s.high >> 31; 36 w.s.low = uu.s.high >> -bm; 37 } else { 38 const unsigned int carries = (unsigned int) uu.s.high << bm; 39 40 w.s.high = uu.s.high >> b; 41 w.s.low = ((unsigned int) uu.s.low >> b) | carries; 42 } 43 44 return w.ll; 45 } 46 EXPORT_SYMBOL(__ashrdi3); 47