#include "tconfig.h"
#if _MIPS_SIM == 2 || _MIPS_SIM == 3
typedef int TItype __attribute__ ((mode (TI)));
typedef int DItype __attribute__ ((mode (DI)));
typedef int SItype __attribute__ ((mode (SI)));
typedef unsigned int UDItype __attribute__ ((mode (DI)));
typedef union
{
struct TIstruct {
#if LIBGCC2_WORDS_BIG_ENDIAN
DItype high, low;
#else
DItype low, high;
#endif
} s;
TItype ll;
} TIunion;
TItype __negti2 (TItype);
TItype __ashlti3 (TItype, int);
#if 0
TItype __ashrti3 (TItype, int);
#endif
TItype __lshrti3 (TItype, int);
TItype
__negti2 (TItype u)
{
TIunion w;
TIunion uu;
uu.ll = u;
w.s.low = -uu.s.low;
w.s.high = -uu.s.high - ((UDItype) w.s.low > 0);
return w.ll;
}
TItype
__ashlti3 (TItype u, int b)
{
TIunion w;
int bm;
TIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (DItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.low = 0;
w.s.high = (UDItype) uu.s.low << -bm;
}
else
{
UDItype carries = (UDItype) uu.s.low >> bm;
w.s.low = (UDItype) uu.s.low << b;
w.s.high = ((UDItype) uu.s.high << b) | carries;
}
return w.ll;
}
#if 0
TItype
__ashrti3 (TItype u, int b)
{
TIunion w;
int bm;
TIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (DItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.high = uu.s.high >> (sizeof (DItype) * BITS_PER_UNIT - 1);
w.s.low = uu.s.high >> -bm;
}
else
{
UDItype carries = (UDItype) uu.s.high << bm;
w.s.high = uu.s.high >> b;
w.s.low = ((UDItype) uu.s.low >> b) | carries;
}
return w.ll;
}
#endif
TItype
__lshrti3 (TItype u, int b)
{
TIunion w;
int bm;
TIunion uu;
if (b == 0)
return u;
uu.ll = u;
bm = (sizeof (DItype) * BITS_PER_UNIT) - b;
if (bm <= 0)
{
w.s.high = 0;
w.s.low = (UDItype) uu.s.high >> -bm;
}
else
{
UDItype carries = (UDItype) uu.s.high << bm;
w.s.high = (UDItype) uu.s.high >> b;
w.s.low = ((UDItype) uu.s.low >> b) | carries;
}
return w.ll;
}
#endif