xref: /rk3399_rockchip-uboot/arch/arc/lib/libgcc2.c (revision e1cc4d31f889428a4ca73120951389c756404184)
1*a67ef280SAlexey Brodkin /*
2*a67ef280SAlexey Brodkin  * Copyright (C) 1989-2013 Free Software Foundation, Inc.
3*a67ef280SAlexey Brodkin  *
4*a67ef280SAlexey Brodkin  * SPDX-License-Identifier:	GPL-2.0+
5*a67ef280SAlexey Brodkin  */
6*a67ef280SAlexey Brodkin 
7*a67ef280SAlexey Brodkin #include "libgcc2.h"
8*a67ef280SAlexey Brodkin 
9*a67ef280SAlexey Brodkin DWtype
__ashldi3(DWtype u,shift_count_type b)10*a67ef280SAlexey Brodkin __ashldi3(DWtype u, shift_count_type b)
11*a67ef280SAlexey Brodkin {
12*a67ef280SAlexey Brodkin 	if (b == 0)
13*a67ef280SAlexey Brodkin 		return u;
14*a67ef280SAlexey Brodkin 
15*a67ef280SAlexey Brodkin 	const DWunion uu = {.ll = u};
16*a67ef280SAlexey Brodkin 	const shift_count_type bm = W_TYPE_SIZE - b;
17*a67ef280SAlexey Brodkin 	DWunion w;
18*a67ef280SAlexey Brodkin 
19*a67ef280SAlexey Brodkin 	if (bm <= 0) {
20*a67ef280SAlexey Brodkin 		w.s.low = 0;
21*a67ef280SAlexey Brodkin 		w.s.high = (UWtype)uu.s.low << -bm;
22*a67ef280SAlexey Brodkin 	} else {
23*a67ef280SAlexey Brodkin 		const UWtype carries = (UWtype) uu.s.low >> bm;
24*a67ef280SAlexey Brodkin 
25*a67ef280SAlexey Brodkin 		w.s.low = (UWtype)uu.s.low << b;
26*a67ef280SAlexey Brodkin 		w.s.high = ((UWtype)uu.s.high << b) | carries;
27*a67ef280SAlexey Brodkin 	}
28*a67ef280SAlexey Brodkin 
29*a67ef280SAlexey Brodkin 	return w.ll;
30*a67ef280SAlexey Brodkin }
31*a67ef280SAlexey Brodkin 
32*a67ef280SAlexey Brodkin DWtype
__ashrdi3(DWtype u,shift_count_type b)33*a67ef280SAlexey Brodkin __ashrdi3(DWtype u, shift_count_type b)
34*a67ef280SAlexey Brodkin {
35*a67ef280SAlexey Brodkin 	if (b == 0)
36*a67ef280SAlexey Brodkin 		return u;
37*a67ef280SAlexey Brodkin 
38*a67ef280SAlexey Brodkin 	const DWunion uu = {.ll = u};
39*a67ef280SAlexey Brodkin 	const shift_count_type bm = W_TYPE_SIZE - b;
40*a67ef280SAlexey Brodkin 	DWunion w;
41*a67ef280SAlexey Brodkin 
42*a67ef280SAlexey Brodkin 	if (bm <= 0) {
43*a67ef280SAlexey Brodkin 		/* w.s.high = 1..1 or 0..0 */
44*a67ef280SAlexey Brodkin 		w.s.high = uu.s.high >> (W_TYPE_SIZE - 1);
45*a67ef280SAlexey Brodkin 		w.s.low = uu.s.high >> -bm;
46*a67ef280SAlexey Brodkin 	} else {
47*a67ef280SAlexey Brodkin 		const UWtype carries = (UWtype) uu.s.high << bm;
48*a67ef280SAlexey Brodkin 
49*a67ef280SAlexey Brodkin 		w.s.high = uu.s.high >> b;
50*a67ef280SAlexey Brodkin 		w.s.low = ((UWtype)uu.s.low >> b) | carries;
51*a67ef280SAlexey Brodkin 	}
52*a67ef280SAlexey Brodkin 
53*a67ef280SAlexey Brodkin 	return w.ll;
54*a67ef280SAlexey Brodkin }
55*a67ef280SAlexey Brodkin 
56*a67ef280SAlexey Brodkin DWtype
__lshrdi3(DWtype u,shift_count_type b)57*a67ef280SAlexey Brodkin __lshrdi3(DWtype u, shift_count_type b)
58*a67ef280SAlexey Brodkin {
59*a67ef280SAlexey Brodkin 	if (b == 0)
60*a67ef280SAlexey Brodkin 		return u;
61*a67ef280SAlexey Brodkin 
62*a67ef280SAlexey Brodkin 	const DWunion uu = {.ll = u};
63*a67ef280SAlexey Brodkin 	const shift_count_type bm = W_TYPE_SIZE - b;
64*a67ef280SAlexey Brodkin 	DWunion w;
65*a67ef280SAlexey Brodkin 
66*a67ef280SAlexey Brodkin 	if (bm <= 0) {
67*a67ef280SAlexey Brodkin 		w.s.high = 0;
68*a67ef280SAlexey Brodkin 		w.s.low = (UWtype)uu.s.high >> -bm;
69*a67ef280SAlexey Brodkin 	} else {
70*a67ef280SAlexey Brodkin 		const UWtype carries = (UWtype)uu.s.high << bm;
71*a67ef280SAlexey Brodkin 
72*a67ef280SAlexey Brodkin 		w.s.high = (UWtype)uu.s.high >> b;
73*a67ef280SAlexey Brodkin 		w.s.low = ((UWtype)uu.s.low >> b) | carries;
74*a67ef280SAlexey Brodkin 	}
75*a67ef280SAlexey Brodkin 
76*a67ef280SAlexey Brodkin 	return w.ll;
77*a67ef280SAlexey Brodkin }
78*a67ef280SAlexey Brodkin 
79*a67ef280SAlexey Brodkin unsigned long
udivmodsi4(unsigned long num,unsigned long den,int modwanted)80*a67ef280SAlexey Brodkin udivmodsi4(unsigned long num, unsigned long den, int modwanted)
81*a67ef280SAlexey Brodkin {
82*a67ef280SAlexey Brodkin 	unsigned long bit = 1;
83*a67ef280SAlexey Brodkin 	unsigned long res = 0;
84*a67ef280SAlexey Brodkin 
85*a67ef280SAlexey Brodkin 	while (den < num && bit && !(den & (1L<<31))) {
86*a67ef280SAlexey Brodkin 		den <<= 1;
87*a67ef280SAlexey Brodkin 		bit <<= 1;
88*a67ef280SAlexey Brodkin 	}
89*a67ef280SAlexey Brodkin 
90*a67ef280SAlexey Brodkin 	while (bit) {
91*a67ef280SAlexey Brodkin 		if (num >= den) {
92*a67ef280SAlexey Brodkin 			num -= den;
93*a67ef280SAlexey Brodkin 			res |= bit;
94*a67ef280SAlexey Brodkin 		}
95*a67ef280SAlexey Brodkin 		bit >>= 1;
96*a67ef280SAlexey Brodkin 		den >>= 1;
97*a67ef280SAlexey Brodkin 	}
98*a67ef280SAlexey Brodkin 
99*a67ef280SAlexey Brodkin 	if (modwanted)
100*a67ef280SAlexey Brodkin 		return num;
101*a67ef280SAlexey Brodkin 
102*a67ef280SAlexey Brodkin 	return res;
103*a67ef280SAlexey Brodkin }
104*a67ef280SAlexey Brodkin 
105*a67ef280SAlexey Brodkin long
__divsi3(long a,long b)106*a67ef280SAlexey Brodkin __divsi3(long a, long b)
107*a67ef280SAlexey Brodkin {
108*a67ef280SAlexey Brodkin 	int neg = 0;
109*a67ef280SAlexey Brodkin 	long res;
110*a67ef280SAlexey Brodkin 
111*a67ef280SAlexey Brodkin 	if (a < 0) {
112*a67ef280SAlexey Brodkin 		a = -a;
113*a67ef280SAlexey Brodkin 		neg = !neg;
114*a67ef280SAlexey Brodkin 	}
115*a67ef280SAlexey Brodkin 
116*a67ef280SAlexey Brodkin 	if (b < 0) {
117*a67ef280SAlexey Brodkin 		b = -b;
118*a67ef280SAlexey Brodkin 		neg = !neg;
119*a67ef280SAlexey Brodkin 	}
120*a67ef280SAlexey Brodkin 
121*a67ef280SAlexey Brodkin 	res = udivmodsi4(a, b, 0);
122*a67ef280SAlexey Brodkin 
123*a67ef280SAlexey Brodkin 	if (neg)
124*a67ef280SAlexey Brodkin 		res = -res;
125*a67ef280SAlexey Brodkin 
126*a67ef280SAlexey Brodkin 	return res;
127*a67ef280SAlexey Brodkin }
128*a67ef280SAlexey Brodkin 
129*a67ef280SAlexey Brodkin long
__modsi3(long a,long b)130*a67ef280SAlexey Brodkin __modsi3(long a, long b)
131*a67ef280SAlexey Brodkin {
132*a67ef280SAlexey Brodkin 	int neg = 0;
133*a67ef280SAlexey Brodkin 	long res;
134*a67ef280SAlexey Brodkin 
135*a67ef280SAlexey Brodkin 	if (a < 0) {
136*a67ef280SAlexey Brodkin 		a = -a;
137*a67ef280SAlexey Brodkin 		neg = 1;
138*a67ef280SAlexey Brodkin 	}
139*a67ef280SAlexey Brodkin 
140*a67ef280SAlexey Brodkin 	if (b < 0)
141*a67ef280SAlexey Brodkin 		b = -b;
142*a67ef280SAlexey Brodkin 
143*a67ef280SAlexey Brodkin 	res = udivmodsi4(a, b, 1);
144*a67ef280SAlexey Brodkin 
145*a67ef280SAlexey Brodkin 	if (neg)
146*a67ef280SAlexey Brodkin 		res = -res;
147*a67ef280SAlexey Brodkin 
148*a67ef280SAlexey Brodkin 	return res;
149*a67ef280SAlexey Brodkin }
150*a67ef280SAlexey Brodkin 
151*a67ef280SAlexey Brodkin long
__udivsi3(long a,long b)152*a67ef280SAlexey Brodkin __udivsi3(long a, long b)
153*a67ef280SAlexey Brodkin {
154*a67ef280SAlexey Brodkin 	return udivmodsi4(a, b, 0);
155*a67ef280SAlexey Brodkin }
156*a67ef280SAlexey Brodkin 
157*a67ef280SAlexey Brodkin long
__umodsi3(long a,long b)158*a67ef280SAlexey Brodkin __umodsi3(long a, long b)
159*a67ef280SAlexey Brodkin {
160*a67ef280SAlexey Brodkin 	return udivmodsi4(a, b, 1);
161*a67ef280SAlexey Brodkin }
162