xref: /openbmc/u-boot/arch/sh/lib/ashrdi3.c (revision 9b5b60a05cb8bba2d135439419b2030764e359bd)
1*5f91a3adSMasahiro Yamada #include "libgcc.h"
2*5f91a3adSMasahiro Yamada 
__ashrdi3(long long u,word_type b)3*5f91a3adSMasahiro Yamada long 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