Marek Vasut | d2aa5dc | 2012-08-12 16:53:35 +0200 | [diff] [blame] | 1 | #include "libgcc.h" |
2 | |||||
3 | long long __lshrdi3(long long u, word_type b) | ||||
4 | { | ||||
5 | DWunion uu, w; | ||||
6 | word_type bm; | ||||
7 | |||||
8 | if (b == 0) | ||||
9 | return u; | ||||
10 | |||||
11 | uu.ll = u; | ||||
12 | bm = 32 - b; | ||||
13 | |||||
14 | if (bm <= 0) { | ||||
15 | w.s.high = 0; | ||||
16 | w.s.low = (unsigned int) uu.s.high >> -bm; | ||||
17 | } else { | ||||
18 | const unsigned int carries = (unsigned int) uu.s.high << bm; | ||||
19 | |||||
20 | w.s.high = (unsigned int) uu.s.high >> b; | ||||
21 | w.s.low = ((unsigned int) uu.s.low >> b) | carries; | ||||
22 | } | ||||
23 | |||||
24 | return w.ll; | ||||
25 | } |