[PATCH] ARM: Lindent GCC helper functions

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Russell King 2005-06-20 16:45:32 +01:00
parent f29481c0e7
commit 3ade2fe0fd
8 changed files with 226 additions and 265 deletions

View File

@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h" #include "gcclib.h"
s64 s64 __ashldi3(s64 u, int b)
__ashldi3 (s64 u, int b)
{ {
DIunion w; DIunion w;
int bm; int bm;
DIunion uu; DIunion uu;
if (b == 0) if (b == 0)
return u; return u;
uu.ll = u; uu.ll = u;
bm = (sizeof (s32) * BITS_PER_UNIT) - b; bm = (sizeof(s32) * BITS_PER_UNIT) - b;
if (bm <= 0) if (bm <= 0) {
{ w.s.low = 0;
w.s.low = 0; w.s.high = (u32) uu.s.low << -bm;
w.s.high = (u32)uu.s.low << -bm; } else {
} u32 carries = (u32) uu.s.low >> bm;
else w.s.low = (u32) uu.s.low << b;
{ w.s.high = ((u32) uu.s.high << b) | carries;
u32 carries = (u32)uu.s.low >> bm; }
w.s.low = (u32)uu.s.low << b;
w.s.high = ((u32)uu.s.high << b) | carries;
}
return w.ll; return w.ll;
} }

View File

@ -31,31 +31,27 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h" #include "gcclib.h"
s64 s64 __ashrdi3(s64 u, int b)
__ashrdi3 (s64 u, int b)
{ {
DIunion w; DIunion w;
int bm; int bm;
DIunion uu; DIunion uu;
if (b == 0) if (b == 0)
return u; return u;
uu.ll = u; uu.ll = u;
bm = (sizeof (s32) * BITS_PER_UNIT) - b; bm = (sizeof(s32) * BITS_PER_UNIT) - b;
if (bm <= 0) if (bm <= 0) {
{ /* w.s.high = 1..1 or 0..0 */
/* w.s.high = 1..1 or 0..0 */ w.s.high = uu.s.high >> (sizeof(s32) * BITS_PER_UNIT - 1);
w.s.high = uu.s.high >> (sizeof (s32) * BITS_PER_UNIT - 1); w.s.low = uu.s.high >> -bm;
w.s.low = uu.s.high >> -bm; } else {
} u32 carries = (u32) uu.s.high << bm;
else w.s.high = uu.s.high >> b;
{ w.s.low = ((u32) uu.s.low >> b) | carries;
u32 carries = (u32)uu.s.high << bm; }
w.s.high = uu.s.high >> b;
w.s.low = ((u32)uu.s.low >> b) | carries;
}
return w.ll; return w.ll;
} }

View File

@ -3,18 +3,20 @@
#include <linux/types.h> #include <linux/types.h>
#define BITS_PER_UNIT 8 #define BITS_PER_UNIT 8
#define SI_TYPE_SIZE (sizeof(s32) * BITS_PER_UNIT) #define SI_TYPE_SIZE (sizeof(s32) * BITS_PER_UNIT)
#ifdef __ARMEB__ #ifdef __ARMEB__
struct DIstruct {s32 high, low;}; struct DIstruct {
s32 high, low;
};
#else #else
struct DIstruct {s32 low, high;}; struct DIstruct {
s32 low, high;
};
#endif #endif
typedef union typedef union {
{ struct DIstruct s;
struct DIstruct s; s64 ll;
s64 ll;
} DIunion; } DIunion;

View File

@ -114,7 +114,7 @@
"r" ((u32) (b)));} "r" ((u32) (b)));}
#define UMUL_TIME 20 #define UMUL_TIME 20
#define UDIV_TIME 100 #define UDIV_TIME 100
#endif /* __arm__ */ #endif /* __arm__ */
#define __umulsidi3(u, v) \ #define __umulsidi3(u, v) \
({DIunion __w; \ ({DIunion __w; \

View File

@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h" #include "gcclib.h"
s64 s64 __lshrdi3(s64 u, int b)
__lshrdi3 (s64 u, int b)
{ {
DIunion w; DIunion w;
int bm; int bm;
DIunion uu; DIunion uu;
if (b == 0) if (b == 0)
return u; return u;
uu.ll = u; uu.ll = u;
bm = (sizeof (s32) * BITS_PER_UNIT) - b; bm = (sizeof(s32) * BITS_PER_UNIT) - b;
if (bm <= 0) if (bm <= 0) {
{ w.s.high = 0;
w.s.high = 0; w.s.low = (u32) uu.s.high >> -bm;
w.s.low = (u32)uu.s.high >> -bm; } else {
} u32 carries = (u32) uu.s.high << bm;
else w.s.high = (u32) uu.s.high >> b;
{ w.s.low = ((u32) uu.s.low >> b) | carries;
u32 carries = (u32)uu.s.high << bm; }
w.s.high = (u32)uu.s.high >> b;
w.s.low = ((u32)uu.s.low >> b) | carries;
}
return w.ll; return w.ll;
} }

View File

@ -52,26 +52,21 @@ Boston, MA 02111-1307, USA. */
: "r" ((u32) (a)), \ : "r" ((u32) (a)), \
"r" ((u32) (b)));} "r" ((u32) (b)));}
#define __umulsidi3(u, v) \ #define __umulsidi3(u, v) \
({DIunion __w; \ ({DIunion __w; \
umul_ppmm (__w.s.high, __w.s.low, u, v); \ umul_ppmm (__w.s.high, __w.s.low, u, v); \
__w.ll; }) __w.ll; })
s64 __muldi3(s64 u, s64 v)
s64
__muldi3 (s64 u, s64 v)
{ {
DIunion w; DIunion w;
DIunion uu, vv; DIunion uu, vv;
uu.ll = u, uu.ll = u, vv.ll = v;
vv.ll = v;
w.ll = __umulsidi3 (uu.s.low, vv.s.low); w.ll = __umulsidi3(uu.s.low, vv.s.low);
w.s.high += ((u32) uu.s.low * (u32) vv.s.high w.s.high += ((u32) uu.s.low * (u32) vv.s.high
+ (u32) uu.s.high * (u32) vv.s.low); + (u32) uu.s.high * (u32) vv.s.low);
return w.ll; return w.ll;
} }

View File

@ -31,21 +31,19 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h" #include "gcclib.h"
int int __ucmpdi2(s64 a, s64 b)
__ucmpdi2 (s64 a, s64 b)
{ {
DIunion au, bu; DIunion au, bu;
au.ll = a, bu.ll = b; au.ll = a, bu.ll = b;
if ((u32) au.s.high < (u32) bu.s.high) if ((u32) au.s.high < (u32) bu.s.high)
return 0; return 0;
else if ((u32) au.s.high > (u32) bu.s.high) else if ((u32) au.s.high > (u32) bu.s.high)
return 2; return 2;
if ((u32) au.s.low < (u32) bu.s.low) if ((u32) au.s.low < (u32) bu.s.low)
return 0; return 0;
else if ((u32) au.s.low > (u32) bu.s.low) else if ((u32) au.s.low > (u32) bu.s.low)
return 2; return 2;
return 1; return 1;
} }

View File

@ -32,211 +32,191 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h" #include "gcclib.h"
#include "longlong.h" #include "longlong.h"
static const u8 __clz_tab[] = static const u8 __clz_tab[] = {
{ 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5, 5, 5, 5, 5, 5, 5, 5,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 6, 6, 6, 6, 6, 6, 6, 6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 7, 7, 7, 7, 7, 7, 7, 7,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 7, 7, 7, 7, 7, 7, 7, 7,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
}; };
u64 u64 __udivmoddi4(u64 n, u64 d, u64 * rp)
__udivmoddi4 (u64 n, u64 d, u64 *rp)
{ {
DIunion ww; DIunion ww;
DIunion nn, dd; DIunion nn, dd;
DIunion rr; DIunion rr;
u32 d0, d1, n0, n1, n2; u32 d0, d1, n0, n1, n2;
u32 q0, q1; u32 q0, q1;
u32 b, bm; u32 b, bm;
nn.ll = n; nn.ll = n;
dd.ll = d; dd.ll = d;
d0 = dd.s.low; d0 = dd.s.low;
d1 = dd.s.high; d1 = dd.s.high;
n0 = nn.s.low; n0 = nn.s.low;
n1 = nn.s.high; n1 = nn.s.high;
if (d1 == 0) if (d1 == 0) {
{ if (d0 > n1) {
if (d0 > n1) /* 0q = nn / 0D */
{
/* 0q = nn / 0D */
count_leading_zeros (bm, d0); count_leading_zeros(bm, d0);
if (bm != 0) if (bm != 0) {
{ /* Normalize, i.e. make the most significant bit of the
/* Normalize, i.e. make the most significant bit of the denominator set. */
denominator set. */
d0 = d0 << bm; d0 = d0 << bm;
n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm)); n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
n0 = n0 << bm; n0 = n0 << bm;
} }
udiv_qrnnd (q0, n0, n1, n0, d0); udiv_qrnnd(q0, n0, n1, n0, d0);
q1 = 0; q1 = 0;
/* Remainder in n0 >> bm. */ /* Remainder in n0 >> bm. */
} } else {
else /* qq = NN / 0d */
{
/* qq = NN / 0d */
if (d0 == 0) if (d0 == 0)
d0 = 1 / d0; /* Divide intentionally by zero. */ d0 = 1 / d0; /* Divide intentionally by zero. */
count_leading_zeros (bm, d0); count_leading_zeros(bm, d0);
if (bm == 0) if (bm == 0) {
{ /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
/* From (n1 >= d0) /\ (the most significant bit of d0 is set), conclude (the most significant bit of n1 is set) /\ (the
conclude (the most significant bit of n1 is set) /\ (the leading quotient digit q1 = 1).
leading quotient digit q1 = 1).
This special case is necessary, not an optimization. This special case is necessary, not an optimization.
(Shifts counts of SI_TYPE_SIZE are undefined.) */ (Shifts counts of SI_TYPE_SIZE are undefined.) */
n1 -= d0; n1 -= d0;
q1 = 1; q1 = 1;
} } else {
else /* Normalize. */
{
/* Normalize. */
b = SI_TYPE_SIZE - bm; b = SI_TYPE_SIZE - bm;
d0 = d0 << bm; d0 = d0 << bm;
n2 = n1 >> b; n2 = n1 >> b;
n1 = (n1 << bm) | (n0 >> b); n1 = (n1 << bm) | (n0 >> b);
n0 = n0 << bm; n0 = n0 << bm;
udiv_qrnnd (q1, n1, n2, n1, d0); udiv_qrnnd(q1, n1, n2, n1, d0);
} }
/* n1 != d0... */ /* n1 != d0... */
udiv_qrnnd (q0, n0, n1, n0, d0); udiv_qrnnd(q0, n0, n1, n0, d0);
/* Remainder in n0 >> bm. */ /* Remainder in n0 >> bm. */
} }
if (rp != 0) if (rp != 0) {
{ rr.s.low = n0 >> bm;
rr.s.low = n0 >> bm; rr.s.high = 0;
rr.s.high = 0; *rp = rr.ll;
*rp = rr.ll; }
} } else {
} if (d1 > n1) {
else /* 00 = nn / DD */
{
if (d1 > n1)
{
/* 00 = nn / DD */
q0 = 0; q0 = 0;
q1 = 0; q1 = 0;
/* Remainder in n1n0. */ /* Remainder in n1n0. */
if (rp != 0) if (rp != 0) {
{ rr.s.low = n0;
rr.s.low = n0; rr.s.high = n1;
rr.s.high = n1; *rp = rr.ll;
*rp = rr.ll; }
} } else {
} /* 0q = NN / dd */
else
{
/* 0q = NN / dd */
count_leading_zeros (bm, d1); count_leading_zeros(bm, d1);
if (bm == 0) if (bm == 0) {
{ /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
/* From (n1 >= d1) /\ (the most significant bit of d1 is set), conclude (the most significant bit of n1 is set) /\ (the
conclude (the most significant bit of n1 is set) /\ (the quotient digit q0 = 0 or 1).
quotient digit q0 = 0 or 1).
This special case is necessary, not an optimization. */ This special case is necessary, not an optimization. */
/* The condition on the next line takes advantage of that /* The condition on the next line takes advantage of that
n1 >= d1 (true due to program flow). */ n1 >= d1 (true due to program flow). */
if (n1 > d1 || n0 >= d0) if (n1 > d1 || n0 >= d0) {
{ q0 = 1;
q0 = 1; sub_ddmmss(n1, n0, n1, n0, d1, d0);
sub_ddmmss (n1, n0, n1, n0, d1, d0); } else
} q0 = 0;
else
q0 = 0;
q1 = 0; q1 = 0;
if (rp != 0) if (rp != 0) {
{ rr.s.low = n0;
rr.s.low = n0; rr.s.high = n1;
rr.s.high = n1; *rp = rr.ll;
*rp = rr.ll; }
} } else {
} u32 m1, m0;
else /* Normalize. */
{
u32 m1, m0;
/* Normalize. */
b = SI_TYPE_SIZE - bm; b = SI_TYPE_SIZE - bm;
d1 = (d1 << bm) | (d0 >> b); d1 = (d1 << bm) | (d0 >> b);
d0 = d0 << bm; d0 = d0 << bm;
n2 = n1 >> b; n2 = n1 >> b;
n1 = (n1 << bm) | (n0 >> b); n1 = (n1 << bm) | (n0 >> b);
n0 = n0 << bm; n0 = n0 << bm;
udiv_qrnnd (q0, n1, n2, n1, d1); udiv_qrnnd(q0, n1, n2, n1, d1);
umul_ppmm (m1, m0, q0, d0); umul_ppmm(m1, m0, q0, d0);
if (m1 > n1 || (m1 == n1 && m0 > n0)) if (m1 > n1 || (m1 == n1 && m0 > n0)) {
{ q0--;
q0--; sub_ddmmss(m1, m0, m1, m0, d1, d0);
sub_ddmmss (m1, m0, m1, m0, d1, d0); }
}
q1 = 0; q1 = 0;
/* Remainder in (n1n0 - m1m0) >> bm. */ /* Remainder in (n1n0 - m1m0) >> bm. */
if (rp != 0) if (rp != 0) {
{ sub_ddmmss(n1, n0, n1, n0, m1, m0);
sub_ddmmss (n1, n0, n1, n0, m1, m0); rr.s.low = (n1 << b) | (n0 >> bm);
rr.s.low = (n1 << b) | (n0 >> bm); rr.s.high = n1 >> bm;
rr.s.high = n1 >> bm; *rp = rr.ll;
*rp = rr.ll; }
} }
} }
} }
}
ww.s.low = q0; ww.s.low = q0;
ww.s.high = q1; ww.s.high = q1;
return ww.ll; return ww.ll;
} }
u64 u64 __udivdi3(u64 n, u64 d)
__udivdi3 (u64 n, u64 d)
{ {
return __udivmoddi4 (n, d, (u64 *) 0); return __udivmoddi4(n, d, (u64 *) 0);
} }
u64 u64 __umoddi3(u64 u, u64 v)
__umoddi3 (u64 u, u64 v)
{ {
u64 w; u64 w;
(void) __udivmoddi4 (u ,v, &w); (void)__udivmoddi4(u, v, &w);
return w; return w;
} }