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