[PATCH] ARM: Lindent GCC helper functions
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
f29481c0e7
commit
3ade2fe0fd
8 changed files with 226 additions and 265 deletions
|
@ -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. */
|
||||||
|
|
||||||
#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 @@
|
||||||
|
|
||||||
#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 @@
|
||||||
"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. */
|
||||||
|
|
||||||
#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. */
|
||||||
: "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. */
|
||||||
|
|
||||||
#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. */
|
||||||
#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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue