GCC/clang: int64 routines in C

This commit is contained in:
Arun Thomas
2010-11-12 18:38:10 +00:00
parent afeb246328
commit f0ab18377d
14 changed files with 411 additions and 13 deletions
+4
View File
@@ -1,6 +1,7 @@
# int64 sources
.PATH: ${.CURDIR}/arch/${ARCH}/int64
.if ${COMPILER_TYPE} == "ack"
SRCS+= \
add64.S \
add64u.S \
@@ -17,3 +18,6 @@ SRCS+= \
mul64u.S \
sub64.S \
sub64u.S
.elif ${COMPILER_TYPE} == "gnu"
SRCS+= int64.c
.endif
+171
View File
@@ -0,0 +1,171 @@
/*
* This file implements 64-bit arithmentic functions. These functions will
* go away once clang is ready.
*
* It will only work with GCC and clang.
*
*/
#include <minix/u64.h>
#include <limits.h>
#if !defined(__LONG_LONG_SUPPORTED)
#error "ERROR: This file requires long long support"
#endif
u64_t add64(u64_t i, u64_t j)
{
return i + j;
}
u64_t add64u(u64_t i, unsigned j)
{
return i + j;
}
u64_t add64ul(u64_t i, unsigned long j)
{
return i + j;
}
int bsr64(u64_t i)
{
int index;
u64_t mask;
for (index = 63, mask = 1ULL << 63; index >= 0; --index, mask >>= 1) {
if (i & mask)
return index;
}
return -1;
}
int cmp64(u64_t i, u64_t j)
{
if (i > j)
return 1;
else if (i < j)
return -1;
else /* (i == j) */
return 0;
}
int cmp64u(u64_t i, unsigned j)
{
if (i > j)
return 1;
else if (i < j)
return -1;
else /* (i == j) */
return 0;
}
int cmp64ul(u64_t i, unsigned long j)
{
if (i > j)
return 1;
else if (i < j)
return -1;
else /* (i == j) */
return 0;
}
unsigned cv64u(u64_t i)
{
/* return ULONG_MAX if really big */
if (i>>32)
return ULONG_MAX;
return (unsigned)i;
}
unsigned long cv64ul(u64_t i)
{
/* return ULONG_MAX if really big */
if (i>>32)
return ULONG_MAX;
return (unsigned long)i;
}
u64_t cvu64(unsigned i)
{
return i;
}
u64_t cvul64(unsigned long i)
{
return i;
}
unsigned diff64(u64_t i, u64_t j)
{
return (unsigned)(i - j);
}
u64_t div64(u64_t i, u64_t j)
{
return i / j;
}
u64_t rem64(u64_t i, u64_t j)
{
return i % j;
}
unsigned long div64u(u64_t i, unsigned j)
{
return (unsigned long)(i / j);
}
u64_t div64u64(u64_t i, unsigned j)
{
return i / j;
}
unsigned rem64u(u64_t i, unsigned j)
{
return (unsigned)(i % j);
}
unsigned long ex64lo(u64_t i)
{
return (unsigned long)i;
}
unsigned long ex64hi(u64_t i)
{
return (unsigned long)(i>>32);
}
u64_t make64(unsigned long lo, unsigned long hi)
{
return ((u64_t)hi << 32) | (u64_t)lo;
}
u64_t mul64(u64_t i, u64_t j)
{
return i * j;
}
u64_t mul64u(unsigned long i, unsigned j)
{
return (u64_t)i * j;
}
u64_t sub64(u64_t i, u64_t j)
{
return i - j;
}
u64_t sub64u(u64_t i, unsigned j)
{
return i - j;
}
u64_t sub64ul(u64_t i, unsigned long j)
{
return i - j;
}
+36
View File
@@ -3,6 +3,7 @@
*/
#include <minix/u64.h>
#if !defined(__LONG_LONG_SUPPORTED)
u64_t rrotate64(u64_t x, unsigned short b)
{
u64_t r, t;
@@ -72,5 +73,40 @@ u64_t not64(u64_t a)
return r;
}
#else
#if !defined(__LONG_LONG_SUPPORTED)
#error "ERROR: These functions require long long support"
#endif
u64_t rrotate64(u64_t x, unsigned short b)
{
b %= 64;
if ((b &= 63) == 0)
return x;
return (x >> b) | (x << (64 - b));
}
u64_t rshift64(u64_t x, unsigned short b)
{
if (b >= 64)
return 0;
return x >> b;
}
u64_t xor64(u64_t a, u64_t b)
{
return a ^ b;
}
u64_t and64(u64_t a, u64_t b)
{
return a & b;
}
u64_t not64(u64_t a)
{
return ~a;
}
#endif