gcc subdir for combined gcc/ack library build
This commit is contained in:
parent
8c53e4007e
commit
1da5b5ccee
7
lib/gnu/Makefile
Normal file
7
lib/gnu/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
SUBDIRS = \
|
||||||
|
end \
|
||||||
|
ieee_float \
|
||||||
|
rts \
|
||||||
|
|
||||||
|
include ../Makefile.inc
|
5
lib/gnu/Makefile.gnu
Normal file
5
lib/gnu/Makefile.gnu
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
all:
|
||||||
|
cd end && gmake
|
||||||
|
cd ieee_float && gmake
|
||||||
|
cd rts && gmake
|
7
lib/gnu/end/Makefile
Normal file
7
lib/gnu/end/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
LIBRARIES = end
|
||||||
|
|
||||||
|
end_OBJECTS = gnu_end.o
|
||||||
|
|
||||||
|
include ../../Makefile.gnu.inc
|
||||||
|
|
16
lib/gnu/end/Makefile.gnu
Normal file
16
lib/gnu/end/Makefile.gnu
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
CC=gcc
|
||||||
|
AR=gar
|
||||||
|
AS=gas
|
||||||
|
|
||||||
|
VPATH=$(SRCDIR)/gnu/end
|
||||||
|
|
||||||
|
LIBRARY=../../end.a
|
||||||
|
OBJECTS=gnu_end.o
|
||||||
|
|
||||||
|
all: $(LIBRARY)
|
||||||
|
|
||||||
|
$(LIBRARY): $(OBJECTS)
|
||||||
|
$(AR) cr $@ *.o
|
||||||
|
|
||||||
|
gnu_end.o: gnu_end.s
|
||||||
|
|
5
lib/gnu/end/gnu_end.gs
Normal file
5
lib/gnu/end/gnu_end.gs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
.stabs "endbss",11,0,0,0
|
||||||
|
.stabs "__end",1,0,0,0
|
||||||
|
|
||||||
|
|
14
lib/gnu/ieee_float/Makefile
Normal file
14
lib/gnu/ieee_float/Makefile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
CFLAGS = -O -I..
|
||||||
|
|
||||||
|
LIBRARIES = libc
|
||||||
|
|
||||||
|
libc_OBJECTS = \
|
||||||
|
frexp.o \
|
||||||
|
isinf.o \
|
||||||
|
isnan.o \
|
||||||
|
ldexp.o \
|
||||||
|
modf.o \
|
||||||
|
fphook.o \
|
||||||
|
|
||||||
|
include ../../Makefile.gnu.inc
|
58
lib/gnu/ieee_float/Makefile.gnu.conv
Normal file
58
lib/gnu/ieee_float/Makefile.gnu.conv
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Makefile for lib/ieee_float.
|
||||||
|
|
||||||
|
#CC = gcc
|
||||||
|
#ARCH = eniac
|
||||||
|
CFLAGS = -O -I$(SRCDIR)/stdio
|
||||||
|
CC1 = $(CC) $(CFLAGS) -c
|
||||||
|
|
||||||
|
LIBRARY = ../../libc.a
|
||||||
|
LIBSOFT = ../../libsoft.a
|
||||||
|
|
||||||
|
OBJECTS = \
|
||||||
|
$(LIBRARY)(frexp.o) \
|
||||||
|
$(LIBRARY)(isinf.o) \
|
||||||
|
$(LIBRARY)(isnan.o) \
|
||||||
|
$(LIBRARY)(ldexp.o) \
|
||||||
|
$(LIBRARY)(modf.o) \
|
||||||
|
$(LIBRARY)(fphook.o) \
|
||||||
|
|
||||||
|
all: $(LIBRARY)
|
||||||
|
|
||||||
|
$(LIBRARY): $(OBJECTS)
|
||||||
|
$(AR) cr $@ *.o
|
||||||
|
|
||||||
|
$(LIBRARY)(frexp.o): frexp.c
|
||||||
|
$(LIBRARY)(isinf.o): isinf.c
|
||||||
|
$(LIBRARY)(isnan.o): isnan.c
|
||||||
|
$(LIBRARY)(ldexp.o): ldexp.c
|
||||||
|
$(LIBRARY)(modf.o): modf.c
|
||||||
|
$(LIBRARY)(fphook.o): fphook.c
|
||||||
|
SOFTOBJ = \
|
||||||
|
$(LIBSOFT)(frexp.o) \
|
||||||
|
$(LIBSOFT)(isinf.o) \
|
||||||
|
$(LIBSOFT)(isnan.o) \
|
||||||
|
$(LIBSOFT)(ldexp.o) \
|
||||||
|
$(LIBSOFT)(modf.o) \
|
||||||
|
|
||||||
|
soft: $(LIBSOFT)
|
||||||
|
|
||||||
|
$(LIBSOFT): $(SOFTOBJ)
|
||||||
|
$(CC) -c.a -o $@ *.o
|
||||||
|
rm *.o
|
||||||
|
|
||||||
|
$(LIBSOFT)(frexp.o): frexp.c
|
||||||
|
$(CC1) -fsoft frexp.c
|
||||||
|
|
||||||
|
$(LIBSOFT)(isinf.o): isinf.c
|
||||||
|
$(CC1) -fsoft isinf.c
|
||||||
|
|
||||||
|
$(LIBSOFT)(isnan.o): isnan.c
|
||||||
|
$(CC1) -fsoft isnan.c
|
||||||
|
|
||||||
|
$(LIBSOFT)(ldexp.o): ldexp.c
|
||||||
|
$(CC1) -fsoft ldexp.c
|
||||||
|
|
||||||
|
$(LIBSOFT)(modf.o): modf.c
|
||||||
|
$(CC1) -fsoft modf.c
|
||||||
|
|
||||||
|
# $PchId: Makefile,v 1.3 1996/02/22 21:01:39 philip Exp $
|
195
lib/gnu/ieee_float/fphook.c
Executable file
195
lib/gnu/ieee_float/fphook.c
Executable file
@ -0,0 +1,195 @@
|
|||||||
|
/*
|
||||||
|
* fltpr.c - print floating point numbers
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#ifndef NOFLOAT
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "../stdio/loc_incl.h"
|
||||||
|
int _fp_hook = 1;
|
||||||
|
|
||||||
|
static char *
|
||||||
|
_pfloat(long double r, register char *s, int n, int flags)
|
||||||
|
{
|
||||||
|
register char *s1;
|
||||||
|
int sign, dp;
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
s1 = _fcvt(r, n, &dp, &sign);
|
||||||
|
if (sign)
|
||||||
|
*s++ = '-';
|
||||||
|
else if (flags & FL_SIGN)
|
||||||
|
*s++ = '+';
|
||||||
|
else if (flags & FL_SPACE)
|
||||||
|
*s++ = ' ';
|
||||||
|
|
||||||
|
if (dp<=0)
|
||||||
|
*s++ = '0';
|
||||||
|
for (i=dp; i>0; i--)
|
||||||
|
if (*s1) *s++ = *s1++;
|
||||||
|
else *s++ = '0';
|
||||||
|
if (((i=n) > 0) || (flags & FL_ALT))
|
||||||
|
*s++ = '.';
|
||||||
|
while (++dp <= 0) {
|
||||||
|
if (--i<0)
|
||||||
|
break;
|
||||||
|
*s++ = '0';
|
||||||
|
}
|
||||||
|
while (--i >= 0)
|
||||||
|
if (*s1) *s++ = *s1++;
|
||||||
|
else *s++ = '0';
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
_pscien(long double r, register char *s, int n, int flags)
|
||||||
|
{
|
||||||
|
int sign, dp;
|
||||||
|
register char *s1;
|
||||||
|
|
||||||
|
s1 = _ecvt(r, n + 1, &dp, &sign);
|
||||||
|
if (sign)
|
||||||
|
*s++ = '-';
|
||||||
|
else if (flags & FL_SIGN)
|
||||||
|
*s++ = '+';
|
||||||
|
else if (flags & FL_SPACE)
|
||||||
|
*s++ = ' ';
|
||||||
|
|
||||||
|
*s++ = *s1++;
|
||||||
|
if ((n > 0) || (flags & FL_ALT))
|
||||||
|
*s++ = '.';
|
||||||
|
while (--n >= 0)
|
||||||
|
if (*s1) *s++ = *s1++;
|
||||||
|
else *s++ = '0';
|
||||||
|
*s++ = 'e';
|
||||||
|
if ( r != 0 ) --dp ;
|
||||||
|
if ( dp<0 ) {
|
||||||
|
*s++ = '-' ; dp= -dp ;
|
||||||
|
} else {
|
||||||
|
*s++ = '+' ;
|
||||||
|
}
|
||||||
|
if (dp >= 100) {
|
||||||
|
*s++ = '0' + (dp / 100);
|
||||||
|
dp %= 100;
|
||||||
|
}
|
||||||
|
*s++ = '0' + (dp/10);
|
||||||
|
*s++ = '0' + (dp%10);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NDIGINEXP(exp) (((exp) >= 100 || (exp) <= -100) ? 3 : 2)
|
||||||
|
#define LOW_EXP -4
|
||||||
|
#define USE_EXP(exp, ndigits) (((exp) < LOW_EXP + 1) || (exp >= ndigits + 1))
|
||||||
|
|
||||||
|
static char *
|
||||||
|
_gcvt(long double value, int ndigit, char *s, int flags)
|
||||||
|
{
|
||||||
|
int sign, dp;
|
||||||
|
register char *s1, *s2;
|
||||||
|
register int i;
|
||||||
|
register int nndigit = ndigit;
|
||||||
|
|
||||||
|
s1 = _ecvt(value, ndigit, &dp, &sign);
|
||||||
|
s2 = s;
|
||||||
|
if (sign) *s2++ = '-';
|
||||||
|
else if (flags & FL_SIGN)
|
||||||
|
*s2++ = '+';
|
||||||
|
else if (flags & FL_SPACE)
|
||||||
|
*s2++ = ' ';
|
||||||
|
|
||||||
|
if (!(flags & FL_ALT))
|
||||||
|
for (i = nndigit - 1; i > 0 && s1[i] == '0'; i--)
|
||||||
|
nndigit--;
|
||||||
|
|
||||||
|
if (USE_EXP(dp,ndigit)) {
|
||||||
|
/* Use E format */
|
||||||
|
dp--;
|
||||||
|
*s2++ = *s1++;
|
||||||
|
if ((nndigit > 1) || (flags & FL_ALT)) *s2++ = '.';
|
||||||
|
while (--nndigit > 0) *s2++ = *s1++;
|
||||||
|
*s2++ = 'e';
|
||||||
|
if (dp < 0) {
|
||||||
|
*s2++ = '-';
|
||||||
|
dp = -dp;
|
||||||
|
}
|
||||||
|
else *s2++ = '+';
|
||||||
|
s2 += NDIGINEXP(dp);
|
||||||
|
*s2 = 0;
|
||||||
|
for (i = NDIGINEXP(dp); i > 0; i--) {
|
||||||
|
*--s2 = dp % 10 + '0';
|
||||||
|
dp /= 10;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
/* Use f format */
|
||||||
|
if (dp <= 0) {
|
||||||
|
if (*s1 != '0') {
|
||||||
|
/* otherwise the whole number is 0 */
|
||||||
|
*s2++ = '0';
|
||||||
|
*s2++ = '.';
|
||||||
|
}
|
||||||
|
while (dp < 0) {
|
||||||
|
dp++;
|
||||||
|
*s2++ = '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 1; i <= nndigit; i++) {
|
||||||
|
*s2++ = *s1++;
|
||||||
|
if (i == dp) *s2++ = '.';
|
||||||
|
}
|
||||||
|
if (i <= dp) {
|
||||||
|
while (i++ <= dp) *s2++ = '0';
|
||||||
|
*s2++ = '.';
|
||||||
|
}
|
||||||
|
if ((s2[-1]=='.') && !(flags & FL_ALT)) s2--;
|
||||||
|
*s2 = '\0';
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
_f_print(va_list *ap, int flags, char *s, char c, int precision)
|
||||||
|
{
|
||||||
|
register char *old_s = s;
|
||||||
|
long double ld_val;
|
||||||
|
|
||||||
|
if (flags & FL_LONGDOUBLE) ld_val = va_arg(*ap, long double);
|
||||||
|
else ld_val = (long double) va_arg(*ap, double);
|
||||||
|
|
||||||
|
switch(c) {
|
||||||
|
case 'f':
|
||||||
|
s = _pfloat(ld_val, s, precision, flags);
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
case 'E':
|
||||||
|
s = _pscien(ld_val, s, precision , flags);
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
case 'G':
|
||||||
|
s = _gcvt(ld_val, precision, s, flags);
|
||||||
|
s += strlen(s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( c == 'E' || c == 'G') {
|
||||||
|
while (*old_s && *old_s != 'e') old_s++;
|
||||||
|
if (*old_s == 'e') *old_s = 'E';
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
#endif /* NOFLOAT */
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "../ansi/ext_fmt.h"
|
||||||
|
|
||||||
|
void _str_ext_cvt(const char *s, char **ss, struct EXTEND *e);
|
||||||
|
double _ext_dbl_cvt(struct EXTEND *e);
|
||||||
|
|
||||||
|
double
|
||||||
|
strtod(const char *p, char **pp)
|
||||||
|
{
|
||||||
|
struct EXTEND e;
|
||||||
|
|
||||||
|
_str_ext_cvt(p, pp, &e);
|
||||||
|
return _ext_dbl_cvt(&e);
|
||||||
|
}
|
60
lib/gnu/ieee_float/frexp.c
Normal file
60
lib/gnu/ieee_float/frexp.c
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
libc/ieee_float/frexp.c
|
||||||
|
|
||||||
|
Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
Implementation of frexp that directly manipulates the exponent bits in an
|
||||||
|
ieee float
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "ieee_float.h"
|
||||||
|
|
||||||
|
double frexp(value, eptr)
|
||||||
|
double value;
|
||||||
|
int *eptr;
|
||||||
|
{
|
||||||
|
struct f64 *f64p;
|
||||||
|
int exp, exp_bias;
|
||||||
|
double factor;
|
||||||
|
|
||||||
|
f64p= (struct f64 *)&value;
|
||||||
|
exp_bias= 0;
|
||||||
|
|
||||||
|
exp= F64_GET_EXP(f64p);
|
||||||
|
if (exp == F64_EXP_MAX)
|
||||||
|
{ /* Either infinity or Nan */
|
||||||
|
*eptr= 0;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
if (exp == 0)
|
||||||
|
{
|
||||||
|
/* Either 0 or denormal */
|
||||||
|
if (F64_GET_MANT_LOW(f64p) == 0 &&
|
||||||
|
F64_GET_MANT_HIGH(f64p) == 0)
|
||||||
|
{
|
||||||
|
*eptr= 0;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Multiply by 2^64 */
|
||||||
|
factor= 65536.0; /* 2^16 */
|
||||||
|
factor *= factor; /* 2^32 */
|
||||||
|
factor *= factor; /* 2^64 */
|
||||||
|
value *= factor;
|
||||||
|
exp_bias= 64;
|
||||||
|
exp= F64_GET_EXP(f64p);
|
||||||
|
}
|
||||||
|
|
||||||
|
exp= exp - F64_EXP_BIAS - exp_bias + 1;
|
||||||
|
*eptr= exp;
|
||||||
|
F64_SET_EXP(f64p, F64_EXP_BIAS-1);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $PchId: frexp.c,v 1.3 1996/02/22 21:01:39 philip Exp $
|
||||||
|
*/
|
51
lib/gnu/ieee_float/ieee_float.h
Normal file
51
lib/gnu/ieee_float/ieee_float.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
libc/ieee_float/ieee_float.h
|
||||||
|
|
||||||
|
Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
Define structures and macros for manipulating IEEE floats
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IEEE_FLOAT_H
|
||||||
|
#define IEEE_FLOAT_H
|
||||||
|
|
||||||
|
#define isnan __IsNan
|
||||||
|
|
||||||
|
struct f64
|
||||||
|
{
|
||||||
|
u32_t low_word;
|
||||||
|
u32_t high_word;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define F64_SIGN_SHIFT 31
|
||||||
|
#define F64_SIGN_MASK 1
|
||||||
|
|
||||||
|
#define F64_EXP_SHIFT 20
|
||||||
|
#define F64_EXP_MASK 0x7ff
|
||||||
|
#define F64_EXP_BIAS 1023
|
||||||
|
#define F64_EXP_MAX 2047
|
||||||
|
|
||||||
|
#define F64_MANT_SHIFT 0
|
||||||
|
#define F64_MANT_MASK 0xfffff
|
||||||
|
|
||||||
|
#define F64_GET_SIGN(fp) (((fp)->high_word >> F64_SIGN_SHIFT) & \
|
||||||
|
F64_SIGN_MASK)
|
||||||
|
#define F64_GET_EXP(fp) (((fp)->high_word >> F64_EXP_SHIFT) & \
|
||||||
|
F64_EXP_MASK)
|
||||||
|
#define F64_SET_EXP(fp, val) ((fp)->high_word= ((fp)->high_word & \
|
||||||
|
~(F64_EXP_MASK << F64_EXP_SHIFT)) | \
|
||||||
|
(((val) & F64_EXP_MASK) << F64_EXP_SHIFT))
|
||||||
|
|
||||||
|
#define F64_GET_MANT_LOW(fp) ((fp)->low_word)
|
||||||
|
#define F64_SET_MANT_LOW(fp, val) ((fp)->low_word= (val))
|
||||||
|
#define F64_GET_MANT_HIGH(fp) (((fp)->high_word >> F64_MANT_SHIFT) & \
|
||||||
|
F64_MANT_MASK)
|
||||||
|
#define F64_SET_MANT_HIGH(fp, val) ((fp)->high_word= ((fp)->high_word & \
|
||||||
|
~(F64_MANT_MASK << F64_MANT_SHIFT)) | \
|
||||||
|
(((val) & F64_MANT_MASK) << F64_MANT_SHIFT))
|
||||||
|
|
||||||
|
#endif /* IEEE_FLOAT_H */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $PchId: ieee_float.h,v 1.3 1996/02/22 21:01:39 philip Exp $
|
||||||
|
*/
|
31
lib/gnu/ieee_float/isinf.c
Normal file
31
lib/gnu/ieee_float/isinf.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
libc/ieee_float/isinf.c
|
||||||
|
|
||||||
|
Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
Implementation of isinf that directly tests the bits in an ieee float
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _MINIX_SOURCE
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "ieee_float.h"
|
||||||
|
|
||||||
|
int isinf(value)
|
||||||
|
double value;
|
||||||
|
{
|
||||||
|
struct f64 *f64p;
|
||||||
|
int exp;
|
||||||
|
|
||||||
|
f64p= (struct f64 *)&value;
|
||||||
|
exp= F64_GET_EXP(f64p);
|
||||||
|
if (exp != F64_EXP_MAX)
|
||||||
|
return 0;
|
||||||
|
return F64_GET_MANT_LOW(f64p) == 0 && F64_GET_MANT_HIGH(f64p) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $PchId: isinf.c,v 1.3 1996/02/22 21:01:39 philip Exp $
|
||||||
|
*/
|
31
lib/gnu/ieee_float/isnan.c
Normal file
31
lib/gnu/ieee_float/isnan.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
libc/ieee_float/isnan.c
|
||||||
|
|
||||||
|
Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
Implementation of isnan that directly tests the bits in an ieee float
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _MINIX_SOURCE
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "ieee_float.h"
|
||||||
|
|
||||||
|
int isnan(value)
|
||||||
|
double value;
|
||||||
|
{
|
||||||
|
struct f64 *f64p;
|
||||||
|
int exp;
|
||||||
|
|
||||||
|
f64p= (struct f64 *)&value;
|
||||||
|
exp= F64_GET_EXP(f64p);
|
||||||
|
if (exp != F64_EXP_MAX)
|
||||||
|
return 0;
|
||||||
|
return F64_GET_MANT_LOW(f64p) != 0 || F64_GET_MANT_HIGH(f64p) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $PchId: isnan.c,v 1.3 1996/02/22 21:01:39 philip Exp $
|
||||||
|
*/
|
99
lib/gnu/ieee_float/ldexp.c
Normal file
99
lib/gnu/ieee_float/ldexp.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
libc/ieee_float/ldexp.c
|
||||||
|
|
||||||
|
Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
Implementation of ldexp that directly manipulates the exponent bits in an
|
||||||
|
ieee float
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "ieee_float.h"
|
||||||
|
|
||||||
|
double ldexp(value, exp)
|
||||||
|
double value;
|
||||||
|
int exp;
|
||||||
|
{
|
||||||
|
struct f64 *f64p;
|
||||||
|
int oldexp, exp_bias;
|
||||||
|
double factor;
|
||||||
|
|
||||||
|
f64p= (struct f64 *)&value;
|
||||||
|
exp_bias= 0;
|
||||||
|
|
||||||
|
oldexp= F64_GET_EXP(f64p);
|
||||||
|
if (oldexp == F64_EXP_MAX)
|
||||||
|
{ /* Either infinity or Nan */
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
if (oldexp == 0)
|
||||||
|
{
|
||||||
|
/* Either 0 or denormal */
|
||||||
|
if (F64_GET_MANT_LOW(f64p) == 0 &&
|
||||||
|
F64_GET_MANT_HIGH(f64p) == 0)
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If exp is too large (> 2*F64_EXP_MAX) or too small
|
||||||
|
* (< -2*F64_EXP_MAX) return HUGE_VAL or 0. This prevents overflows
|
||||||
|
* in exp if exp is really weird
|
||||||
|
*/
|
||||||
|
if (exp >= 2*F64_EXP_MAX)
|
||||||
|
{
|
||||||
|
errno= ERANGE;
|
||||||
|
return HUGE_VAL;
|
||||||
|
}
|
||||||
|
if (exp <= -2*F64_EXP_MAX)
|
||||||
|
{
|
||||||
|
errno= ERANGE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Normalize a denormal */
|
||||||
|
if (oldexp == 0)
|
||||||
|
{
|
||||||
|
/* Multiply by 2^64 */
|
||||||
|
factor= 65536.0; /* 2^16 */
|
||||||
|
factor *= factor; /* 2^32 */
|
||||||
|
factor *= factor; /* 2^64 */
|
||||||
|
value *= factor;
|
||||||
|
exp= -64;
|
||||||
|
oldexp= F64_GET_EXP(f64p);
|
||||||
|
}
|
||||||
|
|
||||||
|
exp= oldexp + exp;
|
||||||
|
if (exp >= F64_EXP_MAX)
|
||||||
|
{ /* Overflow */
|
||||||
|
errno= ERANGE;
|
||||||
|
return HUGE_VAL;
|
||||||
|
}
|
||||||
|
if (exp > 0)
|
||||||
|
{
|
||||||
|
/* Normal */
|
||||||
|
F64_SET_EXP(f64p, exp);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
/* Denormal, or underflow. */
|
||||||
|
exp += 64;
|
||||||
|
F64_SET_EXP(f64p, exp);
|
||||||
|
/* Divide by 2^64 */
|
||||||
|
factor= 65536.0; /* 2^16 */
|
||||||
|
factor *= factor; /* 2^32 */
|
||||||
|
factor *= factor; /* 2^64 */
|
||||||
|
value /= factor;
|
||||||
|
if (value == 0.0)
|
||||||
|
{
|
||||||
|
/* Underflow */
|
||||||
|
errno= ERANGE;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $PchId: ldexp.c,v 1.3 1996/02/22 21:01:39 philip Exp $
|
||||||
|
*/
|
61
lib/gnu/ieee_float/modf.c
Normal file
61
lib/gnu/ieee_float/modf.c
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
libc/ieee_float/modf.c
|
||||||
|
|
||||||
|
Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
Implementation of modf that directly manipulates the exponent bits in an
|
||||||
|
ieee float
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "ieee_float.h"
|
||||||
|
|
||||||
|
double modf(value, iptr)
|
||||||
|
double value;
|
||||||
|
double *iptr;
|
||||||
|
{
|
||||||
|
struct f64 *f64p;
|
||||||
|
double tmp;
|
||||||
|
int exp;
|
||||||
|
int mask_bits;
|
||||||
|
u32_t mant;
|
||||||
|
|
||||||
|
f64p= (struct f64 *)&value;
|
||||||
|
|
||||||
|
exp= F64_GET_EXP(f64p);
|
||||||
|
exp -= F64_EXP_BIAS;
|
||||||
|
if (exp < 0)
|
||||||
|
{
|
||||||
|
*iptr= 0;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
mask_bits= 52-exp;
|
||||||
|
if (mask_bits <= 0)
|
||||||
|
{
|
||||||
|
*iptr= value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tmp= value;
|
||||||
|
if (mask_bits >= 32)
|
||||||
|
{
|
||||||
|
F64_SET_MANT_LOW(f64p, 0);
|
||||||
|
mask_bits -= 32;
|
||||||
|
mant= F64_GET_MANT_HIGH(f64p);
|
||||||
|
mant &= ~((1 << mask_bits)-1);
|
||||||
|
F64_SET_MANT_HIGH(f64p, mant);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mant= F64_GET_MANT_LOW(f64p);
|
||||||
|
mant &= ~((1 << mask_bits)-1);
|
||||||
|
F64_SET_MANT_LOW(f64p, mant);
|
||||||
|
}
|
||||||
|
*iptr= value;
|
||||||
|
return tmp-value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $PchId: modf.c,v 1.3 1996/02/22 21:01:39 philip Exp $
|
||||||
|
*/
|
10
lib/gnu/rts/Makefile
Normal file
10
lib/gnu/rts/Makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
LIBRARIES = libc
|
||||||
|
|
||||||
|
libc_OBJECTS = \
|
||||||
|
_longjmp.o \
|
||||||
|
_setjmp.o \
|
||||||
|
longjmp.o \
|
||||||
|
setjmp.o \
|
||||||
|
|
||||||
|
include ../../Makefile.gnu.inc
|
27
lib/gnu/rts/Makefile.gnu
Normal file
27
lib/gnu/rts/Makefile.gnu
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
CC=gcc
|
||||||
|
AR=gar
|
||||||
|
AS=gas
|
||||||
|
|
||||||
|
VPATH=$(SRCDIR)/gnu/rts
|
||||||
|
|
||||||
|
#Makefile for lib/gcc/mach/minix.i386/libsys.
|
||||||
|
|
||||||
|
LIBRARY = ../../libc.a
|
||||||
|
|
||||||
|
OBJECTS = \
|
||||||
|
_longjmp.o \
|
||||||
|
_setjmp.o \
|
||||||
|
longjmp.o \
|
||||||
|
setjmp.o \
|
||||||
|
|
||||||
|
all: $(LIBRARY)
|
||||||
|
|
||||||
|
$(LIBRARY): $(OBJECTS)
|
||||||
|
$(AR) cr $@ *.o
|
||||||
|
|
||||||
|
_longjmp.o: _longjmp.s
|
||||||
|
_setjmp.o: _setjmp.s
|
||||||
|
longjmp.o: longjmp.s
|
||||||
|
setjmp.o: setjmp.s
|
||||||
|
|
||||||
|
# $PchId: Makefile,v 1.4 1996/02/22 21:54:11 philip Exp $
|
38
lib/gnu/rts/_longjmp.gs
Normal file
38
lib/gnu/rts/_longjmp.gs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/ _longjmp.gnu.s
|
||||||
|
/
|
||||||
|
/ Created: Oct 15, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl __longjmp
|
||||||
|
__longjmp:
|
||||||
|
movl 4(%esp), %eax # jmp_buf
|
||||||
|
cmpl $0, 0(%eax) # save mask?
|
||||||
|
je 1f
|
||||||
|
leal 4(%eax), %ebx # pointer to sigset_t
|
||||||
|
pushl %ebx
|
||||||
|
call ___oldsigset # restore mask
|
||||||
|
addl $4, %esp
|
||||||
|
movl 4(%esp), %eax # jmp_buf
|
||||||
|
1:
|
||||||
|
movl 8(%esp), %ecx # result value
|
||||||
|
movl 12(%eax), %esp # restore stack pointer
|
||||||
|
|
||||||
|
movl 8(%eax), %ebx # restore program counter
|
||||||
|
movl %ebx, 0(%esp)
|
||||||
|
|
||||||
|
pushl %ecx # save result code
|
||||||
|
|
||||||
|
movl 16(%eax), %ebp # restore frame pointer
|
||||||
|
movl 20(%eax), %ebx
|
||||||
|
movl 24(%eax), %ecx
|
||||||
|
movl 28(%eax), %edx
|
||||||
|
movl 32(%eax), %esi
|
||||||
|
movl 36(%eax), %edi
|
||||||
|
pop %eax
|
||||||
|
testl %eax, %eax
|
||||||
|
jz 1f
|
||||||
|
ret
|
||||||
|
1: movl $1, %eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
/ $PchId: _longjmp.gnu.s,v 1.4 1996/03/12 19:30:02 philip Exp $
|
32
lib/gnu/rts/_setjmp.gs
Normal file
32
lib/gnu/rts/_setjmp.gs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/ _setjmp.gnu.s
|
||||||
|
/
|
||||||
|
/ Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl ___setjmp
|
||||||
|
___setjmp:
|
||||||
|
movl 4(%esp), %eax # jmp_buf
|
||||||
|
movl %ebx, 20(%eax) # save ebx
|
||||||
|
movl 0(%esp), %ebx
|
||||||
|
movl %ebx, 8(%eax) # save program counter
|
||||||
|
movl %esp, 12(%eax) # save stack pointer
|
||||||
|
movl %ebp, 16(%eax) # save frame pointer
|
||||||
|
movl 20(%eax), %ebx # restore ebx
|
||||||
|
movl %ecx, 24(%eax)
|
||||||
|
movl %edx, 28(%eax)
|
||||||
|
movl %esi, 32(%eax)
|
||||||
|
movl %edi, 36(%eax)
|
||||||
|
|
||||||
|
movl 8(%esp), %ebx # save mask?
|
||||||
|
movl %ebx, 0(%eax) # save whether to restore mask
|
||||||
|
testl %ebx, %ebx
|
||||||
|
jz 1f
|
||||||
|
leal 4(%eax), %ebx # pointer to sigset_t
|
||||||
|
pushl %ebx
|
||||||
|
call ___newsigset # save mask
|
||||||
|
addl $4, %esp
|
||||||
|
1:
|
||||||
|
movl $0, %eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
/ $PchId: _setjmp.gnu.s,v 1.4 1996/03/12 19:30:54 philip Exp $
|
6
lib/gnu/rts/longjmp.gs
Normal file
6
lib/gnu/rts/longjmp.gs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.text
|
||||||
|
.globl _longjmp
|
||||||
|
_longjmp:
|
||||||
|
jmp __longjmp
|
||||||
|
|
||||||
|
/ $PchId: longjmp.gnu.s,v 1.4 1996/03/12 19:31:18 philip Exp $
|
6
lib/gnu/rts/setjmp.gs
Normal file
6
lib/gnu/rts/setjmp.gs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.text
|
||||||
|
.globl _setjmp
|
||||||
|
_setjmp:
|
||||||
|
jmp ___setjmp
|
||||||
|
|
||||||
|
/ $PchId: setjmp.gnu.s,v 1.4 1996/03/12 19:31:18 philip Exp $
|
Loading…
x
Reference in New Issue
Block a user