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