1*5f91a3adSMasahiro Yamada #include "libgcc.h" 2*5f91a3adSMasahiro Yamada __ashrdi3(long long u,word_type b)3*5f91a3adSMasahiro Yamadalong long __ashrdi3(long long u, word_type b) 4*5f91a3adSMasahiro Yamada { 5*5f91a3adSMasahiro Yamada DWunion uu, w; 6*5f91a3adSMasahiro Yamada word_type bm; 7*5f91a3adSMasahiro Yamada 8*5f91a3adSMasahiro Yamada if (b == 0) 9*5f91a3adSMasahiro Yamada return u; 10*5f91a3adSMasahiro Yamada 11*5f91a3adSMasahiro Yamada uu.ll = u; 12*5f91a3adSMasahiro Yamada bm = 32 - b; 13*5f91a3adSMasahiro Yamada 14*5f91a3adSMasahiro Yamada if (bm <= 0) { 15*5f91a3adSMasahiro Yamada /* w.s.high = 1..1 or 0..0 */ 16*5f91a3adSMasahiro Yamada w.s.high = 17*5f91a3adSMasahiro Yamada uu.s.high >> 31; 18*5f91a3adSMasahiro Yamada w.s.low = uu.s.high >> -bm; 19*5f91a3adSMasahiro Yamada } else { 20*5f91a3adSMasahiro Yamada const unsigned int carries = (unsigned int) uu.s.high << bm; 21*5f91a3adSMasahiro Yamada 22*5f91a3adSMasahiro Yamada w.s.high = uu.s.high >> b; 23*5f91a3adSMasahiro Yamada w.s.low = ((unsigned int) uu.s.low >> b) | carries; 24*5f91a3adSMasahiro Yamada } 25*5f91a3adSMasahiro Yamada 26*5f91a3adSMasahiro Yamada return w.ll; 27*5f91a3adSMasahiro Yamada } 28