#define BITS_PER_UNIT 8
typedef int HItype __attribute__ ((mode (HI)));
typedef unsigned int UHItype __attribute__ ((mode (HI)));
typedef int SItype __attribute__ ((mode (SI)));
typedef unsigned int USItype __attribute__ ((mode (SI)));
typedef int word_type __attribute__ ((mode (__word__)));
struct SIstruct {HItype low, high;};
typedef union
{
struct SIstruct s;
SItype ll;
} SIunion;
SItype
__lshrsi3 (SItype u, word_type b)
{
SIunion w;
word_type bm;
SIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (HItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.high = 0;
w.s.low = (UHItype)uu.s.high >> -bm;
}
else
{
UHItype carries = (UHItype)uu.s.high << bm;
w.s.high = (UHItype)uu.s.high >> b;
w.s.low = ((UHItype)uu.s.low >> b) | carries;
}
return w.ll;
}
SItype
__ashlsi3 (SItype u, word_type b)
{
SIunion w;
word_type bm;
SIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (HItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.low = 0;
w.s.high = (UHItype)uu.s.low << -bm;
}
else
{
UHItype carries = (UHItype)uu.s.low >> bm;
w.s.low = (UHItype)uu.s.low << b;
w.s.high = ((UHItype)uu.s.high << b) | carries;
}
return w.ll;
}
SItype
__ashrsi3 (SItype u, word_type b)
{
SIunion w;
word_type bm;
SIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (HItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.high = uu.s.high >> (sizeof (HItype) * BITS_PER_UNIT - 1);
w.s.low = uu.s.high >> -bm;
}
else
{
UHItype carries = (UHItype)uu.s.high << bm;
w.s.high = uu.s.high >> b;
w.s.low = ((UHItype)uu.s.low >> b) | carries;
}
return w.ll;
}
USItype
__mulsi3 (USItype a, USItype b)
{
USItype c = 0;
while (a != 0)
{
if (a & 1)
c += b;
a >>= 1;
b <<= 1;
}
return c;
}
USItype
udivmodsi4(USItype num, USItype den, word_type modwanted)
{
USItype bit = 1;
USItype res = 0;
while (den < num && bit && !(den & (1L<<31)))
{
den <<=1;
bit <<=1;
}
while (bit)
{
if (num >= den)
{
num -= den;
res |= bit;
}
bit >>=1;
den >>=1;
}
if (modwanted) return num;
return res;
}
SItype
__divsi3 (SItype a, SItype b)
{
word_type neg = 0;
SItype res;
if (a < 0)
{
a = -a;
neg = !neg;
}
if (b < 0)
{
b = -b;
neg = !neg;
}
res = udivmodsi4 (a, b, 0);
if (neg)
res = -res;
return res;
}
SItype
__modsi3 (SItype a, SItype b)
{
word_type neg = 0;
SItype res;
if (a < 0)
{
a = -a;
neg = 1;
}
if (b < 0)
b = -b;
res = udivmodsi4 (a, b, 1);
if (neg)
res = -res;
return res;
}
SItype
__udivsi3 (SItype a, SItype b)
{
return udivmodsi4 (a, b, 0);
}
SItype
__umodsi3 (SItype a, SItype b)
{
return udivmodsi4 (a, b, 1);
}