提交 3ade2fe0 编写于 作者: R Russell King

[PATCH] ARM: Lindent GCC helper functions

Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
上级 f29481c0
...@@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA. */ ...@@ -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;
} }
...@@ -31,31 +31,27 @@ Boston, MA 02111-1307, USA. */ ...@@ -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;
} }
...@@ -3,18 +3,20 @@ ...@@ -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;
...@@ -114,7 +114,7 @@ ...@@ -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; \
......
...@@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA. */ ...@@ -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;
} }
...@@ -52,26 +52,21 @@ Boston, MA 02111-1307, USA. */ ...@@ -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;
} }
...@@ -31,21 +31,19 @@ Boston, MA 02111-1307, USA. */ ...@@ -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;
} }
...@@ -32,211 +32,191 @@ Boston, MA 02111-1307, USA. */ ...@@ -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) {
/* Normalize, i.e. make the most significant bit of the
if (bm != 0) denominator set. */
{
/* Normalize, i.e. make the most significant bit of the d0 = d0 << bm;
denominator set. */ n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
n0 = n0 << bm;
d0 = d0 << bm; }
n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
n0 = n0 << bm; udiv_qrnnd(q0, n0, n1, n0, d0);
} q1 = 0;
udiv_qrnnd (q0, n0, n1, n0, d0); /* Remainder in n0 >> bm. */
q1 = 0; } else {
/* qq = NN / 0d */
/* Remainder in n0 >> bm. */
} if (d0 == 0)
else d0 = 1 / d0; /* Divide intentionally by zero. */
{
/* qq = NN / 0d */ count_leading_zeros(bm, d0);
if (d0 == 0) if (bm == 0) {
d0 = 1 / d0; /* Divide intentionally by zero. */ /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
conclude (the most significant bit of n1 is set) /\ (the
count_leading_zeros (bm, d0); leading quotient digit q1 = 1).
if (bm == 0) This special case is necessary, not an optimization.
{ (Shifts counts of SI_TYPE_SIZE are undefined.) */
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
conclude (the most significant bit of n1 is set) /\ (the n1 -= d0;
leading quotient digit q1 = 1). q1 = 1;
} else {
This special case is necessary, not an optimization. /* Normalize. */
(Shifts counts of SI_TYPE_SIZE are undefined.) */
b = SI_TYPE_SIZE - bm;
n1 -= d0;
q1 = 1; d0 = d0 << bm;
} n2 = n1 >> b;
else n1 = (n1 << bm) | (n0 >> b);
{ n0 = n0 << bm;
/* Normalize. */
udiv_qrnnd(q1, n1, n2, n1, d0);
b = SI_TYPE_SIZE - bm; }
d0 = d0 << bm; /* n1 != d0... */
n2 = n1 >> b;
n1 = (n1 << bm) | (n0 >> b); udiv_qrnnd(q0, n0, n1, n0, d0);
n0 = n0 << bm;
/* Remainder in n0 >> bm. */
udiv_qrnnd (q1, n1, n2, n1, d0); }
}
if (rp != 0) {
/* n1 != d0... */ rr.s.low = n0 >> bm;
rr.s.high = 0;
udiv_qrnnd (q0, n0, n1, n0, d0); *rp = rr.ll;
}
/* Remainder in n0 >> bm. */ } else {
} if (d1 > n1) {
/* 00 = nn / DD */
if (rp != 0)
{ q0 = 0;
rr.s.low = n0 >> bm; q1 = 0;
rr.s.high = 0;
*rp = rr.ll; /* Remainder in n1n0. */
} if (rp != 0) {
} rr.s.low = n0;
else rr.s.high = n1;
{ *rp = rr.ll;
if (d1 > n1) }
{ } else {
/* 00 = nn / DD */ /* 0q = NN / dd */
q0 = 0; count_leading_zeros(bm, d1);
q1 = 0; if (bm == 0) {
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
/* Remainder in n1n0. */ conclude (the most significant bit of n1 is set) /\ (the
if (rp != 0) quotient digit q0 = 0 or 1).
{
rr.s.low = n0; This special case is necessary, not an optimization. */
rr.s.high = n1;
*rp = rr.ll; /* The condition on the next line takes advantage of that
} n1 >= d1 (true due to program flow). */
} if (n1 > d1 || n0 >= d0) {
else q0 = 1;
{ sub_ddmmss(n1, n0, n1, n0, d1, d0);
/* 0q = NN / dd */ } else
q0 = 0;
count_leading_zeros (bm, d1);
if (bm == 0) q1 = 0;
{
/* From (n1 >= d1) /\ (the most significant bit of d1 is set), if (rp != 0) {
conclude (the most significant bit of n1 is set) /\ (the rr.s.low = n0;
quotient digit q0 = 0 or 1). rr.s.high = n1;
*rp = rr.ll;
This special case is necessary, not an optimization. */ }
} else {
/* The condition on the next line takes advantage of that u32 m1, m0;
n1 >= d1 (true due to program flow). */ /* Normalize. */
if (n1 > d1 || n0 >= d0)
{ b = SI_TYPE_SIZE - bm;
q0 = 1;
sub_ddmmss (n1, n0, n1, n0, d1, d0); d1 = (d1 << bm) | (d0 >> b);
} d0 = d0 << bm;
else n2 = n1 >> b;
q0 = 0; n1 = (n1 << bm) | (n0 >> b);
n0 = n0 << bm;
q1 = 0;
udiv_qrnnd(q0, n1, n2, n1, d1);
if (rp != 0) umul_ppmm(m1, m0, q0, d0);
{
rr.s.low = n0; if (m1 > n1 || (m1 == n1 && m0 > n0)) {
rr.s.high = n1; q0--;
*rp = rr.ll; sub_ddmmss(m1, m0, m1, m0, d1, d0);
} }
}
else q1 = 0;
{
u32 m1, m0; /* Remainder in (n1n0 - m1m0) >> bm. */
/* Normalize. */ if (rp != 0) {
sub_ddmmss(n1, n0, n1, n0, m1, m0);
b = SI_TYPE_SIZE - bm; rr.s.low = (n1 << b) | (n0 >> bm);
rr.s.high = n1 >> bm;
d1 = (d1 << bm) | (d0 >> b); *rp = rr.ll;
d0 = d0 << bm; }
n2 = n1 >> b; }
n1 = (n1 << bm) | (n0 >> b); }
n0 = n0 << bm; }
udiv_qrnnd (q0, n1, n2, n1, d1); ww.s.low = q0;
umul_ppmm (m1, m0, q0, d0); ww.s.high = q1;
return ww.ll;
if (m1 > n1 || (m1 == n1 && m0 > n0))
{
q0--;
sub_ddmmss (m1, m0, m1, m0, d1, d0);
}
q1 = 0;
/* Remainder in (n1n0 - m1m0) >> bm. */
if (rp != 0)
{
sub_ddmmss (n1, n0, n1, n0, m1, m0);
rr.s.low = (n1 << b) | (n0 >> bm);
rr.s.high = n1 >> bm;
*rp = rr.ll;
}
}
}
}
ww.s.low = q0;
ww.s.high = q1;
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;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册