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