Double Precision Floating Math implementation
This commit is contained in:
10
cross.mk
10
cross.mk
@@ -18,14 +18,6 @@ TAGSFILE = tags
|
|||||||
MANROFF = nroff -man -h
|
MANROFF = nroff -man -h
|
||||||
ELF2AOUT = cp
|
ELF2AOUT = cp
|
||||||
|
|
||||||
CFLAGS = -O -DCROSS
|
CFLAGS = -O -DCROSS -I/usr/include -I$(TOPSRC)/include
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
LIBS =
|
LIBS =
|
||||||
|
|
||||||
# Add system include path
|
|
||||||
ifeq (,$(wildcard /usr/include/i386-linux-gnu))
|
|
||||||
CFLAGS += -I/usr/include
|
|
||||||
else
|
|
||||||
CFLAGS += -I/usr/include/i386-linux-gnu
|
|
||||||
endif
|
|
||||||
CFLAGS += -I$(TOPSRC)/include
|
|
||||||
|
|||||||
@@ -12,8 +12,9 @@ extern double sinh(), cosh(), tanh();
|
|||||||
extern double gamma();
|
extern double gamma();
|
||||||
extern double j0(), j1(), jn(), y0(), y1(), yn();
|
extern double j0(), j1(), jn(), y0(), y1(), yn();
|
||||||
|
|
||||||
#define HUGE 1.701411733192644270e38
|
// ###PITO #define HUGE 1.701411733192644270e38
|
||||||
#define LOGHUGE 39
|
#define HUGE 1.79769313486231570000e+308
|
||||||
|
#define LOGHUGE 307
|
||||||
|
|
||||||
int isnanf(float x);
|
int isnanf(float x);
|
||||||
int isnan(double x);
|
int isnan(double x);
|
||||||
|
|||||||
@@ -22,8 +22,8 @@
|
|||||||
#define va_copy(dest, src) __builtin_va_copy((dest), (src))
|
#define va_copy(dest, src) __builtin_va_copy((dest), (src))
|
||||||
|
|
||||||
|
|
||||||
#ifndef _VA_LIST_T
|
#ifndef _VA_LIST
|
||||||
#define _VA_LIST_T
|
#define _VA_LIST
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
typedef __builtin_va_list va_list;
|
typedef __builtin_va_list va_list;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
10
lib/Makefile
10
lib/Makefile
@@ -5,15 +5,9 @@ PROG = ar as aout ld nm ranlib size strip
|
|||||||
# Build a list of the host include directories.
|
# Build a list of the host include directories.
|
||||||
CPP = $(shell gcc -print-prog-name=cc1)
|
CPP = $(shell gcc -print-prog-name=cc1)
|
||||||
HOSTINC = $(addprefix -I,$(shell echo | $(CPP) -v 2>&1 | grep '^ /.*include'))
|
HOSTINC = $(addprefix -I,$(shell echo | $(CPP) -v 2>&1 | grep '^ /.*include'))
|
||||||
|
HOSTINC += -I/usr/include/i386-linux-gnu
|
||||||
|
|
||||||
# Add system include path
|
CFLAGS += -nostdinc -g -Werror -Wall -DCROSS -I. $(HOSTINC) \
|
||||||
ifeq (,$(wildcard /usr/include/i386-linux-gnu))
|
|
||||||
HOSTINC += -I/usr/include
|
|
||||||
else
|
|
||||||
HOSTINC += -I/usr/include/i386-linux-gnu
|
|
||||||
endif
|
|
||||||
|
|
||||||
CFLAGS += -nostdinc -fno-builtin -g -Werror -Wall -DCROSS -I. $(HOSTINC) \
|
|
||||||
-I$(TOPSRC)/include -I$(TOPSRC)/src/cmd/ar \
|
-I$(TOPSRC)/include -I$(TOPSRC)/src/cmd/ar \
|
||||||
-I$(TOPSRC)/src/cmd/as
|
-I$(TOPSRC)/src/cmd/as
|
||||||
LDFLAGS += -g
|
LDFLAGS += -g
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
TOPSRC = $(shell cd ../../..; pwd)
|
TOPSRC = $(shell cd ../../..; pwd)
|
||||||
include $(TOPSRC)/target.mk
|
include $(TOPSRC)/target.mk
|
||||||
|
|
||||||
CFLAGS += ${DEFS} -Os
|
CFLAGS += ${DEFS}
|
||||||
|
|
||||||
SRCS = creat.c ftime.c gethostid.c gtty.c memccpy.c memchr.c memcmp.c \
|
SRCS = creat.c ftime.c gethostid.c gtty.c memccpy.c memchr.c memcmp.c \
|
||||||
memcpy.c memset.c nice.c pause.c rand.c sethostid.c \
|
memcpy.c memset.c nice.c pause.c rand.c sethostid.c \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
TOPSRC = $(shell cd ../../..; pwd)
|
TOPSRC = $(shell cd ../../..; pwd)
|
||||||
include $(TOPSRC)/target.mk
|
include $(TOPSRC)/target.mk
|
||||||
|
|
||||||
CFLAGS += ${DEFS} -Os -Wall -Werror
|
CFLAGS += ${DEFS}
|
||||||
|
|
||||||
SRCS = ${STDSRC}
|
SRCS = ${STDSRC}
|
||||||
OBJS = ${STDOBJ}
|
OBJS = ${STDOBJ}
|
||||||
@@ -19,7 +19,7 @@ STDSRC = abort.c alarm.c atof.c atoi.c atol.c calloc.c closedir.c crypt.c \
|
|||||||
getpass.c getpwent.c getloadavg.c getmntinfo.c \
|
getpass.c getpwent.c getloadavg.c getmntinfo.c \
|
||||||
getttyent.c getttynam.c getusershell.c getwd.c \
|
getttyent.c getttynam.c getusershell.c getwd.c \
|
||||||
initgroups.c isatty.c isinff.c isnanf.c ldexp.c malloc.c mktemp.c \
|
initgroups.c isatty.c isinff.c isnanf.c ldexp.c malloc.c mktemp.c \
|
||||||
modff.c ndbm.c nlist.c knlist.c opendir.c perror.c popen.c \
|
modff.c modf.c ndbm.c nlist.c knlist.c opendir.c perror.c popen.c \
|
||||||
psignal.c qsort.c random.c readdir.c regex.c scandir.c \
|
psignal.c qsort.c random.c readdir.c regex.c scandir.c \
|
||||||
seekdir.c setmode.c sethostname.c setenv.c siglist.c \
|
seekdir.c setmode.c sethostname.c setenv.c siglist.c \
|
||||||
signal.c siginterrupt.c sigsetops.c \
|
signal.c siginterrupt.c sigsetops.c \
|
||||||
@@ -36,7 +36,7 @@ STDOBJ = abort.o alarm.o atof.o atoi.o atol.o calloc.o closedir.o crypt.o \
|
|||||||
getpass.o getpwent.o getloadavg.o getmntinfo.o \
|
getpass.o getpwent.o getloadavg.o getmntinfo.o \
|
||||||
getttyent.o getttynam.o getusershell.o getwd.o \
|
getttyent.o getttynam.o getusershell.o getwd.o \
|
||||||
initgroups.o isatty.o isinff.o isnanf.o ldexp.o malloc.o mktemp.o \
|
initgroups.o isatty.o isinff.o isnanf.o ldexp.o malloc.o mktemp.o \
|
||||||
modff.o ndbm.o nlist.o knlist.o opendir.o perror.o popen.o \
|
modff.o modf.o ndbm.o nlist.o knlist.o opendir.o perror.o popen.o \
|
||||||
psignal.o qsort.o random.o readdir.o regex.o scandir.o \
|
psignal.o qsort.o random.o readdir.o regex.o scandir.o \
|
||||||
seekdir.o setmode.o sethostname.o setenv.o siglist.o \
|
seekdir.o setmode.o sethostname.o setenv.o siglist.o \
|
||||||
signal.o siginterrupt.o sigsetops.o \
|
signal.o siginterrupt.o sigsetops.o \
|
||||||
|
|||||||
@@ -13,15 +13,9 @@
|
|||||||
*/
|
*/
|
||||||
int isinff (float x)
|
int isinff (float x)
|
||||||
{
|
{
|
||||||
union {
|
long lx = *(long*) &x;
|
||||||
long s32;
|
long v = (lx & 0x7fffffff) ^ 0x7f800000;
|
||||||
float f32;
|
return ~((v | -v) >> 31) & (lx >> 30);
|
||||||
} u;
|
|
||||||
long v;
|
|
||||||
|
|
||||||
u.f32 = x;
|
|
||||||
v = (u.s32 & 0x7fffffff) ^ 0x7f800000;
|
|
||||||
return ~((v | -v) >> 31) & (u.s32 >> 30);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -13,15 +13,10 @@
|
|||||||
*/
|
*/
|
||||||
int isnanf (float x)
|
int isnanf (float x)
|
||||||
{
|
{
|
||||||
union {
|
long lx = *(long*) &x;
|
||||||
long s32;
|
|
||||||
float f32;
|
|
||||||
} u;
|
|
||||||
unsigned long ul;
|
|
||||||
|
|
||||||
u.f32 = x;
|
lx = 0x7f800000 - (lx & 0x7fffffff);
|
||||||
ul = 0x7f800000 - (u.s32 & 0x7fffffff);
|
return (int) (((unsigned long) lx) >> 31);
|
||||||
return ul >> 31;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1,46 +1,46 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <ieee.h>
|
||||||
|
|
||||||
|
static const double
|
||||||
|
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
|
||||||
|
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
|
||||||
|
huge = 1.0e+308,
|
||||||
|
tiny = 1.0e-307;
|
||||||
|
|
||||||
|
static double
|
||||||
|
_copysign(double x, double y)
|
||||||
|
{
|
||||||
|
unsigned long hx,hy;
|
||||||
|
GET_HIGH_WORD(hx,x);
|
||||||
|
GET_HIGH_WORD(hy,y);
|
||||||
|
SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000));
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
double
|
double
|
||||||
ldexp(fr, exp)
|
ldexp(double x, int n)
|
||||||
double fr;
|
|
||||||
int exp;
|
|
||||||
{
|
{
|
||||||
double huge = 1.701411834604692293e38;
|
unsigned long k,hx,lx;
|
||||||
int neg;
|
EXTRACT_WORDS(hx,lx,x);
|
||||||
int i;
|
k = (hx&0x7ff00000)>>20; /* extract exponent */
|
||||||
|
if (k==0) { /* 0 or subnormal x */
|
||||||
neg = 0;
|
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
|
||||||
if (fr < 0) {
|
x *= two54;
|
||||||
fr = -fr;
|
GET_HIGH_WORD(hx,x);
|
||||||
neg = 1;
|
k = ((hx&0x7ff00000)>>20) - 54;
|
||||||
|
if (n< -50000) return tiny*x; /*underflow*/
|
||||||
|
}
|
||||||
|
if (k==0x7ff) return x+x; /* NaN or Inf */
|
||||||
|
k = k+n;
|
||||||
|
if (k > 0x7fe) return huge*_copysign(huge,x); /* overflow */
|
||||||
|
if (k > 0) /* normal result */
|
||||||
|
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
|
||||||
|
if (k <= -54) {
|
||||||
|
if (n > 50000) /* in case integer overflow in n+k */
|
||||||
|
return huge*_copysign(huge,x); /*overflow*/
|
||||||
|
else return tiny*_copysign(tiny,x); /*underflow*/
|
||||||
}
|
}
|
||||||
fr = frexp(fr, &i);
|
k += 54; /* subnormal result */
|
||||||
while (fr < 0.5) {
|
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
|
||||||
fr = 2*fr;
|
return x*twom54;
|
||||||
i = i-1;
|
|
||||||
}
|
|
||||||
exp = exp+i;
|
|
||||||
if (exp > 127) {
|
|
||||||
if (neg)
|
|
||||||
return(-huge);
|
|
||||||
else
|
|
||||||
return(huge);
|
|
||||||
}
|
|
||||||
if (exp < -127)
|
|
||||||
return(0);
|
|
||||||
while (exp > 30) {
|
|
||||||
fr = fr*(1L<<30);
|
|
||||||
exp = exp-30;
|
|
||||||
}
|
|
||||||
while (exp < -30) {
|
|
||||||
fr = fr/(1L<<30);
|
|
||||||
exp = exp+30;
|
|
||||||
}
|
|
||||||
if (exp > 0)
|
|
||||||
fr = fr*(1L<<exp);
|
|
||||||
if (exp < 0)
|
|
||||||
fr = fr/(1L<<-exp);
|
|
||||||
if (neg)
|
|
||||||
fr = -fr;
|
|
||||||
return(fr);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,79 +1,95 @@
|
|||||||
/*
|
/*
|
||||||
|
* ====================================================
|
||||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
* Permission to use, copy, modify, and distribute this
|
* Permission to use, copy, modify, and distribute this
|
||||||
* software is freely granted, provided that this notice
|
* software is freely granted, provided that this notice
|
||||||
* is preserved.
|
* is preserved.
|
||||||
|
* ====================================================
|
||||||
*/
|
*/
|
||||||
#include <math.h>
|
// *** modified by Pito 11/2013 for RetroBSD ***
|
||||||
|
|
||||||
|
typedef union // LITTLE ENDIAN
|
||||||
|
{
|
||||||
|
double value;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned long lsw;
|
||||||
|
unsigned long msw;
|
||||||
|
} parts;
|
||||||
|
} ieee_double_shape_type;
|
||||||
|
|
||||||
/* Get two 32 bit ints from a double. */
|
/* Get two 32 bit ints from a double. */
|
||||||
|
|
||||||
#define EXTRACT_WORDS(high,low,d) \
|
#define EXTRACT_WORDS(ix0,ix1,d) \
|
||||||
high = *(unsigned long long*) &d; \
|
do { \
|
||||||
low = (*(unsigned long long*) &d) >> 32
|
ieee_double_shape_type ew_u; \
|
||||||
|
ew_u.value = (d); \
|
||||||
|
(ix0) = ew_u.parts.msw; \
|
||||||
|
(ix1) = ew_u.parts.lsw; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Get the more significant 32 bit int from a double. */
|
||||||
|
|
||||||
|
#define GET_HIGH_WORD(i,d) \
|
||||||
|
do { \
|
||||||
|
ieee_double_shape_type gh_u; \
|
||||||
|
gh_u.value = (d); \
|
||||||
|
(i) = gh_u.parts.msw; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/* Set a double from two 32 bit ints. */
|
/* Set a double from two 32 bit ints. */
|
||||||
|
|
||||||
#define INSERT_WORDS(d,high,low) \
|
#define INSERT_WORDS(d,ix0,ix1) \
|
||||||
*(unsigned long long*) &(x) = (unsigned long long) (high) << 32 | (low)
|
do { \
|
||||||
|
ieee_double_shape_type iw_u; \
|
||||||
|
iw_u.parts.msw = (ix0); \
|
||||||
|
iw_u.parts.lsw = (ix1); \
|
||||||
|
(d) = iw_u.value; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/*
|
double modf(double x, double *iptr)
|
||||||
* modf(double x, double *iptr)
|
|
||||||
* return fraction part of x, and return x's integral part in *iptr.
|
|
||||||
* Method:
|
|
||||||
* Bit twiddling.
|
|
||||||
*
|
|
||||||
* Exception:
|
|
||||||
* No exception.
|
|
||||||
*/
|
|
||||||
static const double one = 1.0;
|
|
||||||
|
|
||||||
double modf (double x, double *iptr)
|
|
||||||
{
|
{
|
||||||
long i0, i1, j0;
|
long int i0,i1,j0;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
|
double one = 1.0;
|
||||||
EXTRACT_WORDS (i0, i1, x);
|
EXTRACT_WORDS(i0,i1,x);
|
||||||
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; /* exponent of x */
|
j0 = ((i0>>20)&0x7ff)-0x3ff; /* exponent of x */
|
||||||
if (j0 < 20) { /* integer part in high x */
|
if(j0<20) { /* integer part in high x */
|
||||||
if (j0 < 0) { /* |x|<1 */
|
if(j0<0) { /* |x|<1 */
|
||||||
INSERT_WORDS (*iptr, i0 & 0x80000000, 0);
|
INSERT_WORDS(*iptr,i0&0x80000000,0); /* *iptr = +-0 */
|
||||||
/* *iptr = +-0 */
|
return x;
|
||||||
return x;
|
} else {
|
||||||
} else {
|
i = (0x000fffff)>>j0;
|
||||||
i = (0x000fffff) >> j0;
|
if(((i0&i)|i1)==0) { /* x is integral */
|
||||||
if (((i0 & i) | i1) == 0) { /* x is integral */
|
unsigned long high;
|
||||||
*iptr = x;
|
*iptr = x;
|
||||||
INSERT_WORDS (x, i0 & 0x80000000, 0);
|
GET_HIGH_WORD(high,x);
|
||||||
/* return +-0 */
|
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
||||||
return x;
|
return x;
|
||||||
} else {
|
} else {
|
||||||
INSERT_WORDS (*iptr, i0 & (~i), 0);
|
INSERT_WORDS(*iptr,i0&(~i),0);
|
||||||
return x - *iptr;
|
return x - *iptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (j0 > 51) { /* no fraction part */
|
} else if (j0>51) { /* no fraction part */
|
||||||
*iptr = x * one;
|
unsigned long high;
|
||||||
/* We must handle NaNs separately. */
|
*iptr = x*one;
|
||||||
if (j0 == 0x400 && ((i0 & 0xfffff) | i1))
|
GET_HIGH_WORD(high,x);
|
||||||
return x * one;
|
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
||||||
|
return x;
|
||||||
INSERT_WORDS (x, i0 & 0x80000000, 0);
|
} else { /* fraction part in low x */
|
||||||
/* return +-0 */
|
i = ((unsigned long)(0xffffffff))>>(j0-20);
|
||||||
return x;
|
if((i1&i)==0) { /* x is integral */
|
||||||
} else { /* fraction part in low x */
|
unsigned long high;
|
||||||
i = ((unsigned long) (0xffffffff)) >> (j0 - 20);
|
*iptr = x;
|
||||||
if ((i1 & i) == 0) { /* x is integral */
|
GET_HIGH_WORD(high,x);
|
||||||
*iptr = x;
|
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
|
||||||
INSERT_WORDS (x, i0 & 0x80000000, 0);
|
return x;
|
||||||
/* return +-0 */
|
} else {
|
||||||
return x;
|
INSERT_WORDS(*iptr,i0,i1&(~i));
|
||||||
} else {
|
return x - *iptr;
|
||||||
INSERT_WORDS (*iptr, i0, i1 & (~i));
|
}
|
||||||
return x - *iptr;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,43 +13,35 @@
|
|||||||
*/
|
*/
|
||||||
static const float one = 1.0;
|
static const float one = 1.0;
|
||||||
|
|
||||||
float modff (float fx, float *iptr)
|
float modff (float x, float *iptr)
|
||||||
{
|
{
|
||||||
union {
|
unsigned hx = *(unsigned*) &x & ~0x80000000;
|
||||||
unsigned u32;
|
unsigned s;
|
||||||
float f32;
|
|
||||||
} x;
|
|
||||||
unsigned hx, s;
|
|
||||||
|
|
||||||
x.f32 = fx;
|
|
||||||
hx = x.u32 & ~0x80000000;
|
|
||||||
if (hx >= 0x4b000000) { /* x is NaN, infinite, or integral */
|
if (hx >= 0x4b000000) { /* x is NaN, infinite, or integral */
|
||||||
*iptr = x.f32;
|
*iptr = x;
|
||||||
if (hx <= 0x7f800000)
|
if (hx <= 0x7f800000)
|
||||||
x.u32 &= 0x80000000;
|
*(unsigned*) &x &= 0x80000000;
|
||||||
return x.f32;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hx < 0x3f800000) { /* |x| < 1 */
|
if (hx < 0x3f800000) { /* |x| < 1 */
|
||||||
float ret = x.f32;
|
*iptr = x;
|
||||||
x.u32 &= 0x80000000;
|
*(unsigned*) iptr &= 0x80000000;
|
||||||
*iptr = x.f32;
|
return x;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* split x at the binary point */
|
/* split x at the binary point */
|
||||||
s = x.u32 & 0x80000000;
|
s = *(unsigned*) &x & 0x80000000;
|
||||||
fx = x.f32;
|
*(unsigned*) iptr = *(unsigned*) &x & ~((1 << (0x96 - (hx >> 23))) - 1);
|
||||||
x.u32 &= ~((1 << (0x96 - (hx >> 23))) - 1);
|
x -= *iptr;
|
||||||
*iptr = x.f32;
|
|
||||||
x.f32 = fx - *iptr;
|
|
||||||
|
|
||||||
/* restore sign in case difference is 0 */
|
/* restore sign in case difference is 0 */
|
||||||
x.u32 = (x.u32 & ~0x80000000) | s;
|
*(unsigned*) &x = (*(unsigned*) &x & ~0x80000000) | s;
|
||||||
return x.f32;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For PIC32, double is the same as float.
|
* For PIC32, double is the same as float.
|
||||||
*/
|
*/
|
||||||
double modf (double x, double *iptr) __attribute__((alias ("modff")));
|
//double modf (double x, double *iptr) __attribute__((alias ("modff")));
|
||||||
|
|||||||
@@ -465,7 +465,7 @@ dbm_nextkey(db)
|
|||||||
db->dbm_flags |= _DBM_IOERR;
|
db->dbm_flags |= _DBM_IOERR;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (db->dbm_pagbuf[0] != 0 && db->dbm_pagbuf[1] != 0) {
|
if (((short *)db->dbm_pagbuf)[0] != 0) {
|
||||||
item = makdatum(db->dbm_pagbuf, db->dbm_keyptr);
|
item = makdatum(db->dbm_pagbuf, db->dbm_keyptr);
|
||||||
if (item.dptr != NULL) {
|
if (item.dptr != NULL) {
|
||||||
db->dbm_keyptr += 2;
|
db->dbm_keyptr += 2;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ TOPSRC = $(shell cd ../../../..; pwd)
|
|||||||
include $(TOPSRC)/target.mk
|
include $(TOPSRC)/target.mk
|
||||||
|
|
||||||
ASFLAGS += ${DEFS}
|
ASFLAGS += ${DEFS}
|
||||||
CFLAGS += -Os
|
|
||||||
|
|
||||||
# modules which can not use SYSCALL and must be assembled from sources. The
|
# modules which can not use SYSCALL and must be assembled from sources. The
|
||||||
# rest of the system calls are generated with printf(1) and do not have
|
# rest of the system calls are generated with printf(1) and do not have
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
TOPSRC = $(shell cd ../../..; pwd)
|
TOPSRC = $(shell cd ../../..; pwd)
|
||||||
include $(TOPSRC)/target.mk
|
include $(TOPSRC)/target.mk
|
||||||
|
|
||||||
CFLAGS += ${DEFS} -Os
|
CFLAGS += ${DEFS}
|
||||||
|
|
||||||
SRCS = ${STDSRC} fgetc.c fgets.c fputc.c fputs.c gets.c puts.c \
|
SRCS = ${STDSRC} fgetc.c fgets.c fputc.c fputs.c gets.c puts.c \
|
||||||
feof.c ferror.c fileno.c
|
feof.c ferror.c fileno.c
|
||||||
|
|||||||
@@ -42,7 +42,9 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
/* Max number conversion buffer length: a long in base 2, plus NUL byte. */
|
/* Max number conversion buffer length: a long in base 2, plus NUL byte. */
|
||||||
#define MAXNBUF (sizeof(long) * 8 + 1)
|
//#define MAXNBUF (sizeof(long) * 8 + 1)
|
||||||
|
/* Max number conversion buffer length: MAXEXP(308) + MAXFRACTION(15) + 2 */
|
||||||
|
#define MAXNBUF 308+15+2
|
||||||
|
|
||||||
static unsigned char *ksprintn (unsigned char *buf, unsigned long v, unsigned char base,
|
static unsigned char *ksprintn (unsigned char *buf, unsigned long v, unsigned char base,
|
||||||
int width, unsigned char *lp);
|
int width, unsigned char *lp);
|
||||||
@@ -361,7 +363,20 @@ number: if (sign && ((long) ul != 0L)) {
|
|||||||
case 'F':
|
case 'F':
|
||||||
case 'g':
|
case 'g':
|
||||||
case 'G': {
|
case 'G': {
|
||||||
double d = va_arg (ap, double);
|
|
||||||
|
double d;
|
||||||
|
unsigned long *l = (unsigned long *) &d;
|
||||||
|
|
||||||
|
if (*(unsigned long*)&ap & 4) {
|
||||||
|
l[0]= va_arg(ap, unsigned long);
|
||||||
|
l[1]= va_arg(ap, unsigned long);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
l[0]= va_arg(ap, unsigned long);
|
||||||
|
l[0]= va_arg(ap, unsigned long);
|
||||||
|
l[1]= va_arg(ap, unsigned long);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* don't do unrealistic precision; just pad it with
|
* don't do unrealistic precision; just pad it with
|
||||||
* zeroes later, so buffer size stays rational.
|
* zeroes later, so buffer size stays rational.
|
||||||
@@ -583,10 +598,11 @@ cvt (double number, int prec, int sharpflag, unsigned char *negp, unsigned char
|
|||||||
* get integer portion of number; put into the end of the buffer; the
|
* get integer portion of number; put into the end of the buffer; the
|
||||||
* .01 is added for modf (356.0 / 10, &integer) returning .59999999...
|
* .01 is added for modf (356.0 / 10, &integer) returning .59999999...
|
||||||
*/
|
*/
|
||||||
for (p = endp - 1; integer; ++expcnt) {
|
p = endp - 1;
|
||||||
tmp = modf (integer / 10, &integer);
|
for (; integer && p >= startp; ++expcnt) {
|
||||||
*p-- = (int) ((tmp + .01) * 10) + '0';
|
tmp = modf(integer * 0.1L , &integer);
|
||||||
}
|
*p-- = (int)((tmp + .01L) * 10) + '0';
|
||||||
|
}
|
||||||
switch (fmtch) {
|
switch (fmtch) {
|
||||||
case 'f':
|
case 'f':
|
||||||
/* reverse integer into beginning of buffer */
|
/* reverse integer into beginning of buffer */
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define HAVE_FLOAT 1
|
||||||
|
|
||||||
#define SPC 01
|
#define SPC 01
|
||||||
#define STP 02
|
#define STP 02
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ TOPSRC = $(shell cd ../../..; pwd)
|
|||||||
include $(TOPSRC)/target.mk
|
include $(TOPSRC)/target.mk
|
||||||
|
|
||||||
DEFS =
|
DEFS =
|
||||||
CFLAGS += ${DEFS} -Os
|
CFLAGS += ${DEFS}
|
||||||
|
|
||||||
SRCS = getopt.c getsubopt.c strtol.c strtoul.c strtod.c
|
SRCS = getopt.c getsubopt.c strtol.c strtoul.c strtod.c
|
||||||
OBJS = getopt.o getsubopt.o strtol.o strtoul.o strtod.o
|
OBJS = getopt.o getsubopt.o strtol.o strtoul.o strtod.o
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ TOPSRC = $(shell cd ../../..; pwd)
|
|||||||
include $(TOPSRC)/target.mk
|
include $(TOPSRC)/target.mk
|
||||||
|
|
||||||
DEFS =
|
DEFS =
|
||||||
CFLAGS += ${DEFS} -Os
|
CFLAGS += ${DEFS}
|
||||||
|
|
||||||
SRCS = strcspn.c strpbrk.c strerror.c strsep.c strspn.c strstr.c strtok.c strtok_r.c
|
SRCS = strcspn.c strpbrk.c strerror.c strsep.c strspn.c strstr.c strtok.c strtok_r.c
|
||||||
OBJS = strcspn.o strpbrk.o strerror.o strsep.o strspn.o strstr.o strtok.o strtok_r.o
|
OBJS = strcspn.o strpbrk.o strerror.o strsep.o strspn.o strstr.o strtok.o strtok_r.o
|
||||||
|
|||||||
@@ -39,15 +39,17 @@ asin(arg)
|
|||||||
|
|
||||||
double
|
double
|
||||||
acos(arg)
|
acos(arg)
|
||||||
double arg;
|
double arg;
|
||||||
{
|
{
|
||||||
if(arg < 0)
|
double sign = 1.0;
|
||||||
arg = -arg;
|
if(arg < 0.0){
|
||||||
|
arg = -arg;
|
||||||
|
sign = -1.0;
|
||||||
|
}
|
||||||
|
if(arg > 1.0){
|
||||||
|
errno = EDOM;
|
||||||
|
return(0.0);
|
||||||
|
}
|
||||||
|
|
||||||
if(arg > 1.){
|
return(pio2 - sign*asin(arg));
|
||||||
errno = EDOM;
|
}
|
||||||
return(0.);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(pio2 - asin(arg));
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
double static sq2p1 =2.414213562373095048802e0;
|
static double sq2p1 =2.414213562373095048802e0;
|
||||||
static double sq2m1 = .414213562373095048802e0;
|
static double sq2m1 = .414213562373095048802e0;
|
||||||
static double pio2 =1.570796326794896619231e0;
|
static double pio2 =1.570796326794896619231e0;
|
||||||
static double pio4 = .785398163397448309615e0;
|
static double pio4 = .785398163397448309615e0;
|
||||||
|
|||||||
@@ -1,23 +1,47 @@
|
|||||||
/* Get two 32 bit ints from a double. */
|
typedef union // LITTLE ENDIAN
|
||||||
|
|
||||||
#define EXTRACT_WORDS(high,low,d) \
|
|
||||||
high = *(unsigned long long*) &d; \
|
|
||||||
low = (*(unsigned long long*) &d) >> 32
|
|
||||||
|
|
||||||
|
|
||||||
/* Set a double from two 32 bit ints. */
|
|
||||||
|
|
||||||
#define INSERT_WORDS(d,high,low) \
|
|
||||||
*(unsigned long long*) &(x) = (unsigned long long) (high) << 32 | (low)
|
|
||||||
|
|
||||||
|
|
||||||
typedef union
|
|
||||||
{
|
{
|
||||||
double value;
|
double value;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint32_t lsw;
|
unsigned long lsw;
|
||||||
uint32_t msw;
|
unsigned long msw;
|
||||||
} parts;
|
} parts;
|
||||||
} ieee_double_shape_type;
|
} ieee_double_shape_type;
|
||||||
|
|
||||||
|
/* Get two 32 bit ints from a double. */
|
||||||
|
|
||||||
|
#define EXTRACT_WORDS(ix0,ix1,d) \
|
||||||
|
do { \
|
||||||
|
ieee_double_shape_type ew_u; \
|
||||||
|
ew_u.value = (d); \
|
||||||
|
(ix0) = ew_u.parts.msw; \
|
||||||
|
(ix1) = ew_u.parts.lsw; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Get the more significant 32 bit int from a double. */
|
||||||
|
|
||||||
|
#define GET_HIGH_WORD(i,d) \
|
||||||
|
do { \
|
||||||
|
ieee_double_shape_type gh_u; \
|
||||||
|
gh_u.value = (d); \
|
||||||
|
(i) = gh_u.parts.msw; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Set a double from two 32 bit ints. */
|
||||||
|
|
||||||
|
#define INSERT_WORDS(d,ix0,ix1) \
|
||||||
|
do { \
|
||||||
|
ieee_double_shape_type iw_u; \
|
||||||
|
iw_u.parts.msw = (ix0); \
|
||||||
|
iw_u.parts.lsw = (ix1); \
|
||||||
|
(d) = iw_u.value; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SET_HIGH_WORD(d,v) \
|
||||||
|
do { \
|
||||||
|
ieee_double_shape_type sh_u; \
|
||||||
|
sh_u.value = (d); \
|
||||||
|
sh_u.parts.msw = (v); \
|
||||||
|
(d) = sh_u.value; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|||||||
@@ -405,8 +405,12 @@ again:
|
|||||||
bdwrite (bp);
|
bdwrite (bp);
|
||||||
}
|
}
|
||||||
bp = 0;
|
bp = 0;
|
||||||
|
// ###PITO
|
||||||
nc = (nc + NBPW-1) & ~(NBPW-1);
|
nc = (nc + NBPW-1) & ~(NBPW-1);
|
||||||
getxfile (ip, &exdata.ex_exec, nc + (na+4)*NBPW, uid, gid);
|
getxfile (ip, &exdata.ex_exec, nc + (na+4)*NBPW, uid, gid);
|
||||||
|
//nc = (nc + (NBPW*2)-1) & ~((NBPW*2)-1);
|
||||||
|
//getxfile (ip, &exdata.ex_exec, nc + (na+4)*(NBPW*2), uid, gid);
|
||||||
|
// ###PITO
|
||||||
if (u.u_error) {
|
if (u.u_error) {
|
||||||
//printf ("execve: getxfile error = %d\n", u.u_error);
|
//printf ("execve: getxfile error = %d\n", u.u_error);
|
||||||
badarg:
|
badarg:
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ SUBDIR = baremetal dip duinomite duinomite-uart duinomite-e \
|
|||||||
duinomite-e-uart explorer16 max32 max32-eth maximite \
|
duinomite-e-uart explorer16 max32 max32-eth maximite \
|
||||||
meb pinguino-micro starter-kit ubw32 ubw32-uart \
|
meb pinguino-micro starter-kit ubw32 ubw32-uart \
|
||||||
ubw32-uart-sdram baremetal fubarino fubarino-uart \
|
ubw32-uart-sdram baremetal fubarino fubarino-uart \
|
||||||
fubarino-uart-sramc mmb-mx7 maximite-color \
|
fubarino-uart-sramc mmb-mx7 maximite-color 32mxsdram-uart
|
||||||
32mxsdram-uart
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
|
|||||||
@@ -24,19 +24,29 @@
|
|||||||
* The values are dependant upon the presence of the -fno-short-double
|
* The values are dependant upon the presence of the -fno-short-double
|
||||||
* compiler option.
|
* compiler option.
|
||||||
*/
|
*/
|
||||||
#define DBL_EPSILON FLT_EPSILON
|
//#define DBL_EPSILON FLT_EPSILON
|
||||||
#define DBL_MAX FLT_MAX
|
//#define DBL_MAX FLT_MAX
|
||||||
#define DBL_MIN FLT_MIN
|
//#define DBL_MIN FLT_MIN
|
||||||
#define DBL_DIG FLT_DIG
|
//#define DBL_DIG FLT_DIG
|
||||||
#define DBL_MANT_DIG FLT_MANT_DIG
|
//#define DBL_MANT_DIG FLT_MANT_DIG
|
||||||
#define DBL_MAX_10_EXP FLT_MAX_10_EXP
|
//#define DBL_MAX_10_EXP FLT_MAX_10_EXP
|
||||||
#define DBL_MAX_EXP FLT_MAX_EXP
|
//#define DBL_MAX_EXP FLT_MAX_EXP
|
||||||
#define DBL_MIN_10_EXP FLT_MIN_10_EXP
|
//#define DBL_MIN_10_EXP FLT_MIN_10_EXP
|
||||||
#define DBL_MIN_EXP FLT_MIN_EXP
|
//#define DBL_MIN_EXP FLT_MIN_EXP
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These values provide information pertaining to the long double type.
|
* These values provide information pertaining to the long double type.
|
||||||
*/
|
*/
|
||||||
|
#define DBL_EPSILON 2.2204460492503131E-16
|
||||||
|
#define DBL_MAX 1.7976931348623157E+308
|
||||||
|
#define DBL_MIN 2.2250738585072014E-308
|
||||||
|
#define DBL_DIG 15
|
||||||
|
#define DBL_MANT_DIG 53
|
||||||
|
#define DBL_MAX_10_EXP 308
|
||||||
|
#define DBL_MAX_EXP 1024
|
||||||
|
#define DBL_MIN_10_EXP (-307)
|
||||||
|
#define DBL_MIN_EXP (-1021)
|
||||||
|
|
||||||
#define LDBL_EPSILON 2.2204460492503131E-16
|
#define LDBL_EPSILON 2.2204460492503131E-16
|
||||||
#define LDBL_MAX 1.7976931348623157E+308
|
#define LDBL_MAX 1.7976931348623157E+308
|
||||||
#define LDBL_MIN 2.2250738585072014E-308
|
#define LDBL_MIN 2.2250738585072014E-308
|
||||||
|
|||||||
@@ -1,11 +1,3 @@
|
|||||||
# chipKIT PIC32 compiler from UECIDE
|
|
||||||
ifdef UECIDE
|
|
||||||
ifndef GCCPREFIX
|
|
||||||
GCCPREFIX = ${HOME}/.uecide/compilers/pic32-tools/bin/pic32-
|
|
||||||
LDFLAGS = -Wl,--oformat=elf32-tradlittlemips
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# chipKIT PIC32 compiler on Linux
|
# chipKIT PIC32 compiler on Linux
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# Download from https://github.com/jasonkajita/chipKIT-cxx/downloads
|
# Download from https://github.com/jasonkajita/chipKIT-cxx/downloads
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ vers.o: $(BUILDPATH)/newvers.sh $(H)/*.h $(M)/*.[ch] $(S)/*.c
|
|||||||
$(CC) -c vers.c
|
$(CC) -c vers.c
|
||||||
|
|
||||||
reconfig:
|
reconfig:
|
||||||
../../../tools/configsys/config $(CONFIG)
|
$(CONFIGPATH)/config $(CONFIG)
|
||||||
|
|
||||||
.SUFFIXES: .i .srec .hex .dis .cpp .cxx .bin .elf
|
.SUFFIXES: .i .srec .hex .dis .cpp .cxx .bin .elf
|
||||||
|
|
||||||
|
|||||||
13
target.mk
13
target.mk
@@ -1,15 +1,6 @@
|
|||||||
MACHINE = mips
|
MACHINE = mips
|
||||||
DESTDIR ?= $(TOPSRC)
|
DESTDIR ?= $(TOPSRC)
|
||||||
|
|
||||||
# chipKIT PIC32 compiler from UECIDE
|
|
||||||
ifdef UECIDE
|
|
||||||
ifndef GCCPREFIX
|
|
||||||
GCCPREFIX = ${HOME}/.uecide/compilers/pic32-tools/bin/pic32-
|
|
||||||
LDFLAGS = -Wl,--oformat=elf32-tradlittlemips
|
|
||||||
INCLUDES = -I${HOME}/.uecide/compilers/pic32-tools/lib/gcc/pic32mx/4.5.1/include
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# chipKIT PIC32 compiler on Linux
|
# chipKIT PIC32 compiler on Linux
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# Download from https://github.com/jasonkajita/chipKIT-cxx/downloads
|
# Download from https://github.com/jasonkajita/chipKIT-cxx/downloads
|
||||||
@@ -34,8 +25,8 @@ ifndef GCCPREFIX
|
|||||||
INCLUDES =
|
INCLUDES =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CC = $(GCCPREFIX)gcc -mips32r2 -EL -msoft-float -nostdinc -fshort-double -I$(TOPSRC)/include $(INCLUDES)
|
CC = $(GCCPREFIX)gcc -mips32r2 -EL -msoft-float -nostdinc -fno-short-double -I$(TOPSRC)/include $(INCLUDES)
|
||||||
CXX = $(GCCPREFIX)g++ -mips32r2 -EL -msoft-float -nostdinc -fshort-double -I$(TOPSRC)/include $(INCLUDES)
|
CXX = $(GCCPREFIX)g++ -mips32r2 -EL -msoft-float -nostdinc -fno-short-double -I$(TOPSRC)/include $(INCLUDES)
|
||||||
LD = $(GCCPREFIX)ld
|
LD = $(GCCPREFIX)ld
|
||||||
AR = $(GCCPREFIX)ar
|
AR = $(GCCPREFIX)ar
|
||||||
RANLIB = $(GCCPREFIX)ranlib
|
RANLIB = $(GCCPREFIX)ranlib
|
||||||
|
|||||||
Reference in New Issue
Block a user