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