merged with Michael Felts latest version
This commit is contained in:
parent
b09805786d
commit
bcec2e84b5
40 changed files with 124 additions and 417 deletions
|
@ -36,8 +36,6 @@ mul_ext.c
|
|||
ngf4.c
|
||||
ngf8.c
|
||||
nrm_ext.c
|
||||
prt_dbl.c
|
||||
prt_ext.c
|
||||
sbf4.c
|
||||
sbf8.c
|
||||
sft_ext.c
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
/********************************************************/
|
||||
/*
|
||||
Type definitions for C Floating Point Package
|
||||
include file for floating point package
|
||||
*/
|
||||
/********************************************************/
|
||||
|
@ -20,6 +21,16 @@
|
|||
EXTEND: double precision extended format
|
||||
*/
|
||||
/********************************************************/
|
||||
|
||||
#ifdef EXT_DEBUG
|
||||
#ifndef __FPSTDIO
|
||||
#define __FPSTDIO
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __FPTYPES
|
||||
#define __FPTYPES
|
||||
typedef unsigned long _float;
|
||||
|
||||
typedef union {
|
||||
|
@ -55,6 +66,4 @@ typedef struct { /* expanded float format */
|
|||
unsigned long m1;
|
||||
unsigned long m2; /* includes guard byte */
|
||||
} EXTEND;
|
||||
#ifdef PRT_EXT
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
|
|
@ -41,9 +41,7 @@ LIST = cff4.$(SUF) cff8.$(SUF) cfu.$(SUF) cmf4.$(SUF) cmf8.$(SUF)\
|
|||
extend.$(SUF) compact.$(SUF)\
|
||||
add_ext.$(SUF) div_ext.$(SUF) mul_ext.$(SUF) nrm_ext.$(SUF)\
|
||||
sft_ext.$(SUF) sub_ext.$(SUF) zrf_ext.$(SUF)\
|
||||
adder.$(SUF) shifter.$(SUF)\
|
||||
prt_dbl.$(SUF)\
|
||||
fptrp.$(SUF) prt_ext.$(SUF) # debugging
|
||||
adder.$(SUF) shifter.$(SUF) fptrp.$(SUF)
|
||||
SLIST = cff4.s cff8.s cfu.s cmf4.s cmf8.s\
|
||||
cuf4.s cuf8.s\
|
||||
dvf4.s dvf8.s fef4.s fef8.s\
|
||||
|
@ -55,9 +53,7 @@ SLIST = cff4.s cff8.s cfu.s cmf4.s cmf8.s\
|
|||
extend.s compact.s\
|
||||
add_ext.s div_ext.s mul_ext.s nrm_ext.s\
|
||||
sft_ext.s sub_ext.s zrf_ext.s\
|
||||
adder.s shifter.s\
|
||||
prt_dbl.s\
|
||||
fptrp.s prt_ext.s # debugging
|
||||
adder.s shifter.s fptrp.s
|
||||
|
||||
SRC = FP_bias.h FP_shift.h FP_trap.h FP_types.h adder.h get_put.h\
|
||||
cff4.c cff8.c cfu.c cmf4.c cmf8.c\
|
||||
|
@ -71,9 +67,7 @@ SRC = FP_bias.h FP_shift.h FP_trap.h FP_types.h adder.h get_put.h\
|
|||
extend.c compact.c\
|
||||
add_ext.c div_ext.c mul_ext.c nrm_ext.c\
|
||||
sft_ext.c sub_ext.c zrf_ext.c\
|
||||
adder.c shifter.c\
|
||||
prt_dbl.c\
|
||||
fptrp.e prt_ext.c
|
||||
adder.c shifter.c fptrp.e
|
||||
|
||||
all: FP_$(MACH).a
|
||||
|
||||
|
@ -284,13 +278,3 @@ shifter.$(SUF): $(CDIR)/shifter.c
|
|||
ack -c.s -m$(MACH) $(EMFLAGS) $(CDIR)/shifter.c
|
||||
ed - shifter.s <$(CDIR)/FP.script
|
||||
ack -c -m$(MACH) $(EMFLAGS) shifter.s
|
||||
|
||||
prt_dbl.$(SUF): $(CDIR)/prt_dbl.c
|
||||
ack -c.s -m$(MACH) $(EMFLAGS) $(CDIR)/prt_dbl.c
|
||||
ed - prt_dbl.s <$(CDIR)/FP.script
|
||||
ack -c -m$(MACH) $(EMFLAGS) prt_dbl.s
|
||||
|
||||
prt_ext.$(SUF): $(CDIR)/prt_ext.c
|
||||
ack -c.s -m$(MACH) $(EMFLAGS) $(CDIR)/prt_ext.c
|
||||
ed - prt_ext.s <$(CDIR)/FP.script
|
||||
ack -c -m$(MACH) $(EMFLAGS) prt_ext.s
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
#define PRT_EXT
|
||||
ADD TWO EXTENDED FORMAT NUMBERS
|
||||
*/
|
||||
|
||||
|
@ -15,20 +14,10 @@
|
|||
add_ext(e1,e2)
|
||||
register EXTEND *e1,*e2;
|
||||
{
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("before ADD #1:",e1);
|
||||
prt_ext("before ADD #2:",e2);
|
||||
#endif PRT_EXT
|
||||
if (b64_add(&e1->m1,&e2->m1)) { /* addition carry */
|
||||
b64_sft(&e1->m1,1); /* shift mantissa one bit RIGHT */
|
||||
e1->m1 |= 0x80000000L; /* set max bit */
|
||||
e1->exp++; /* increase the exponent */
|
||||
}
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("AFTER ADD :",e1);
|
||||
#endif
|
||||
nrm_ext(e1);
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("AFTER NRM :",e1);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
* these are the routines the routines to do 32 and 64-bit addition
|
||||
*/
|
||||
|
||||
# ifdef DEBUG
|
||||
# ifdef EXT_DEBUG
|
||||
# include <stdio.h>
|
||||
# endif
|
||||
|
||||
|
@ -28,15 +28,15 @@ b64_add(e1,e2)
|
|||
*/
|
||||
register B64 *e1,*e2;
|
||||
{
|
||||
register short overflow;
|
||||
short carry;
|
||||
register int overflow;
|
||||
int carry;
|
||||
|
||||
/* add higher pair of 32 bits */
|
||||
overflow = b32_add(&e1->h_32,&e2->h_32);
|
||||
|
||||
/* add lower pair of 32 bits */
|
||||
carry = b32_add(&e1->l_32,&e2->l_32);
|
||||
# ifdef DEBUG
|
||||
# ifdef EXT_DEBUG
|
||||
printf("\t\t\t\t\tb64_add: overflow (%d); internal carry(%d)\n",
|
||||
overflow,carry);
|
||||
fflush(stdout);
|
||||
|
@ -55,7 +55,7 @@ register B64 *e1,*e2;
|
|||
b32_add(e1,e2)
|
||||
register unsigned long *e1,*e2;
|
||||
{
|
||||
register short carry;
|
||||
register int carry;
|
||||
|
||||
if (*e1 & *e2 & MAXBIT) /* both max_bits are set */
|
||||
carry = TRUE; /* so there is a carry */
|
||||
|
@ -65,7 +65,7 @@ register unsigned long *e1,*e2;
|
|||
? UNKNOWN
|
||||
/* both are clear - no carry */
|
||||
: FALSE;
|
||||
# ifdef DEBUG
|
||||
# ifdef EXT_DEBUG
|
||||
fflush(stdout);
|
||||
printf("\t\t\t\t\tb32_add: overflow before add(%d) test(%d)\n",
|
||||
carry,(*e1&MAXBIT)?FALSE:TRUE);
|
||||
|
@ -73,7 +73,7 @@ register unsigned long *e1,*e2;
|
|||
# endif
|
||||
|
||||
*e1 += *e2;
|
||||
# ifdef DEBUG
|
||||
# ifdef EXT_DEBUG
|
||||
printf("%08X\n",*e1);
|
||||
fflush(stdout);
|
||||
# endif
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
ADD TWO FLOATS - SINGLE
|
||||
ADD TWO FLOATS - SINGLE (ADF 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
@ -30,9 +30,6 @@ _float s1,s2;
|
|||
/* if signs differ do subtraction */
|
||||
/* result in e1 */
|
||||
if (e1.sign ^ e2.sign) {
|
||||
#ifdef DEBUG
|
||||
printf("\t\t\tADF calls SUBTRACT\n");
|
||||
#endif DEBUG
|
||||
/* set sign of e1 to sign of largest */
|
||||
swap = (e2.exp > e1.exp) ? 1 : (e2.exp < e1.exp) ? 0 :
|
||||
(e2.m1 > e1.m1 ) ? 1 : 0;
|
||||
|
@ -40,9 +37,6 @@ _float s1,s2;
|
|||
sft_ext(&e1,&e2);
|
||||
/* subtract the extended formats */
|
||||
if (swap) {
|
||||
#ifdef DEBUG
|
||||
printf("\t\t\t\tSWAP\n");
|
||||
#endif DEBUG
|
||||
sub_ext(&e2,&e1);
|
||||
e1 = e2;
|
||||
}
|
||||
|
@ -50,9 +44,6 @@ _float s1,s2;
|
|||
sub_ext(&e1,&e2);
|
||||
}
|
||||
else {
|
||||
#ifdef DEBUG
|
||||
printf("\t\t\tADF calls ADDITION\n");
|
||||
#endif DEBUG
|
||||
/* adjust mantissas to equal powers */
|
||||
sft_ext(&e1,&e2);
|
||||
add_ext(&e1,&e2);
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
ADD TWO FLOATS - DOUBLE
|
||||
ADD TWO FLOATS - DOUBLE (ADF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
@ -16,7 +16,7 @@ adf8(s2,s1)
|
|||
_double s1,s2;
|
||||
{
|
||||
EXTEND e1,e2;
|
||||
short swap;
|
||||
int swap;
|
||||
|
||||
if (s1.__double[0] == 0 && s1.__double[1] == 0) {
|
||||
s1 = s2;
|
||||
|
@ -28,10 +28,6 @@ _double s1,s2;
|
|||
|
||||
extend(&s1,&e1,sizeof(_double));
|
||||
extend(&s2,&e2,sizeof(_double));
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("ADF8: e1",&e1);
|
||||
prt_ext("ADF8: e2",&e2);
|
||||
#endif
|
||||
/* adjust mantissas to equal powers */
|
||||
if (e1.sign ^ e2.sign) { /* signs are different */
|
||||
/* determine which is largest number */
|
||||
|
@ -42,9 +38,6 @@ _double s1,s2;
|
|||
sft_ext(&e1,&e2);
|
||||
/* subtract the extended formats */
|
||||
if (swap) { /* &e2 is the largest number */
|
||||
#ifdef PRT_EXT
|
||||
fprintf(stderr,"ADF8: swaps and subtracts extended\n");
|
||||
#endif
|
||||
sub_ext(&e2,&e1);
|
||||
e1 = e2;
|
||||
}
|
||||
|
@ -57,9 +50,6 @@ _double s1,s2;
|
|||
sft_ext(&e1,&e2);
|
||||
add_ext(&e1,&e2);
|
||||
}
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("ADF8: e1 result",&e1);
|
||||
#endif
|
||||
compact(&e1,&s1,sizeof(_double));
|
||||
return(s1);
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT DOUBLE TO FLOAT
|
||||
CONVERT DOUBLE TO FLOAT (CFF 8 4)
|
||||
|
||||
This routine works quite simply. A floating point
|
||||
of size 08 is converted to extended format.
|
||||
|
@ -23,13 +23,5 @@ _double src; /* the source itself - THIS TIME it's DOUBLE */
|
|||
EXTEND buf;
|
||||
|
||||
extend(&src,&buf,8); /* no matter what */
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("CFF4() entry:",&buf);
|
||||
fprintf(stderr,"ds(%d),ss(%d),src(%08X%08X)\n",8,4,src.__double[0],
|
||||
src.__double[1]);
|
||||
#endif PRT_EXT
|
||||
compact(&buf,(_double *) &(src.__double[1]),4);
|
||||
#ifdef PRT_EXT
|
||||
fprintf(stderr,"CFF4() exit : %08X\n",src.__double[1]);
|
||||
#endif PRT_EXT
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT FLOAT TO DOUBLE
|
||||
CONVERT FLOAT TO DOUBLE (CFF 4 8)
|
||||
|
||||
This routine works quite simply. A floating point
|
||||
of size 04 is converted to extended format.
|
||||
|
@ -23,13 +23,5 @@ _float src; /* the space on the stack is for a double - see cg/table */
|
|||
EXTEND buf;
|
||||
|
||||
extend((_double *) &src,&buf,4); /* no matter what */
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("CFF8() entry:",&buf);
|
||||
fprintf(stderr,"ds(%d),ss(%d),src(%08X)\n",4,8,src);
|
||||
#endif
|
||||
compact(&buf,&src,8);
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr,"CFF8() exit : %08X",src.__double[0]);
|
||||
fprintf(stderr,"%08X\n",src.__double[1]);
|
||||
#endif DEBUG
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT FLOAT TO UNSIGNED
|
||||
CONVERT FLOAT TO SIGNED (CFI m n)
|
||||
|
||||
N.B. The caller must know what it is getting.
|
||||
A LONG is always returned. If it is an
|
||||
|
@ -27,9 +27,6 @@ _double src; /* assume worst case */
|
|||
short newint, max_exp;
|
||||
|
||||
extend(&src,&buf,ss); /* get extended format */
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("CFI() entry:",&buf);
|
||||
#endif PRT_EXT
|
||||
buf.exp--; /* additional bias correction */
|
||||
if (buf.exp < 1) { /* no conversion needed */
|
||||
src.__double[ss == 8] = 0L;
|
||||
|
@ -38,9 +35,6 @@ _double src; /* assume worst case */
|
|||
max_exp = (ds << 3) - 1; /* signed numbers */
|
||||
/* have more limited max_exp */
|
||||
if (buf.exp > max_exp) {
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("CFI() INT OVERFLOW", &buf);
|
||||
#endif PRT_EXT
|
||||
trap(EIOVFL); /* integer overflow */
|
||||
buf.exp %= max_exp; /* truncate */
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT FLOAT TO UNSIGNED
|
||||
CONVERT FLOAT TO UNSIGNED (CFU m n)
|
||||
|
||||
N.B. The caller must know what it is getting.
|
||||
A LONG is always returned. If it is an
|
||||
|
@ -27,9 +27,6 @@ _double src; /* assume worst case */
|
|||
short newint, max_exp;
|
||||
|
||||
extend(&src,&buf,ss); /* get extended format */
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("CFU() entry:",&buf);
|
||||
#endif PRT_EXT
|
||||
buf.exp--; /* additional bias correction */
|
||||
if (buf.exp < 1) { /* no conversion needed */
|
||||
src.__double[ss == 8] = 0L;
|
||||
|
@ -37,9 +34,6 @@ _double src; /* assume worst case */
|
|||
}
|
||||
max_exp = (ds << 3);
|
||||
if (buf.exp > max_exp) {
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("CFU() INT OVERFLOW",&buf);
|
||||
#endif PRT_EXT
|
||||
trap(EIOVFL); /* integer overflow */
|
||||
buf.exp %= max_exp;
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT INTEGER TO FLOAT
|
||||
CONVERT INTEGER TO FLOAT (CIF n 4)
|
||||
|
||||
THIS ROUTINE WORKS BY FILLING AN EXTENDED
|
||||
WITH THE INTEGER VALUE IN EXTENDED FORMAT
|
||||
|
@ -38,9 +38,6 @@ long src; /* largest possible integer to convert */
|
|||
buf.exp = 17;
|
||||
result = (_float *) &ss;
|
||||
}
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CIF4(ds(%d),ss(%d),src(%D))\n\n",4,ss,i_src);
|
||||
#endif
|
||||
if (i_src == 0) {
|
||||
*result = (_float) 0L;
|
||||
return(0L);
|
||||
|
@ -55,9 +52,6 @@ long src; /* largest possible integer to convert */
|
|||
if (ss != sizeof(long))
|
||||
buf.m1 <<= 16;
|
||||
nrm_ext(&buf); /* adjust mantissa field */
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CIF() buf.exp after nrm_ext() == %d\n\n",buf.exp);
|
||||
#endif
|
||||
compact(&buf,(_double *) result,4); /* put on stack */
|
||||
return(*result);
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT INTEGER TO FLOAT
|
||||
CONVERT INTEGER TO FLOAT (CIF n 8)
|
||||
|
||||
THIS ROUTINE WORKS BY FILLING AN EXTENDED
|
||||
WITH THE INTEGER VALUE IN EXTENDED FORMAT
|
||||
|
@ -37,9 +37,6 @@ long src; /* largest possible integer to convert */
|
|||
i_src = (long) *ipt;
|
||||
buf.exp = 17;
|
||||
}
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CIF8(ds(%d),ss(%d),src(%D))\n\n",8,ss,i_src);
|
||||
#endif
|
||||
if (i_src == 0) {
|
||||
zrf8(result);
|
||||
return(*result);
|
||||
|
@ -54,9 +51,6 @@ long src; /* largest possible integer to convert */
|
|||
if (ss != sizeof(long))
|
||||
buf.m1 <<= 16;
|
||||
nrm_ext(&buf);
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CIF() buf.exp after nrm_ext() == %d\n\n",buf.exp);
|
||||
#endif
|
||||
compact(&buf,result,8);
|
||||
return(*result);
|
||||
}
|
||||
|
|
|
@ -6,13 +6,12 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
COMPARE DOUBLES
|
||||
COMPARE SINGLES (CMF 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
#include "get_put.h"
|
||||
|
||||
short
|
||||
cmf4(f1,f2)
|
||||
_float f1,f2;
|
||||
{
|
||||
|
|
|
@ -6,13 +6,12 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
COMPARE DOUBLES
|
||||
COMPARE DOUBLES (CMF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
#include "get_put.h"
|
||||
|
||||
short
|
||||
cmf8(d1,d2)
|
||||
_double d1,d2;
|
||||
{
|
||||
|
|
|
@ -6,9 +6,6 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
#define PRT_EXIT
|
||||
#define PRT_TRAP
|
||||
#define PRT_ENTRY
|
||||
COMPACT EXTEND FORMAT INTO FLOAT OF PROPER SIZE
|
||||
*/
|
||||
|
||||
|
@ -28,35 +25,23 @@ int size;
|
|||
SINGLE *SGL;
|
||||
int exact;
|
||||
|
||||
#ifdef PRT_ENTRY
|
||||
prt_ext("enter compact:",f);
|
||||
#endif PRT_ENTRY
|
||||
if (size == sizeof(_double))
|
||||
/********************************************************/
|
||||
/*
|
||||
COMPACT EXTENDED INTO DOUBLE
|
||||
*/
|
||||
/********************************************************/
|
||||
{
|
||||
if (size == sizeof(_double)) {
|
||||
/*
|
||||
* COMPACT EXTENDED INTO DOUBLE
|
||||
*/
|
||||
if ((f->m1|(f->m2 & DBL_ZERO)) == 0L) {
|
||||
zrf8(to);
|
||||
goto leave;
|
||||
return;
|
||||
}
|
||||
f->exp += DBL_BIAS; /* restore proper bias */
|
||||
if (f->exp > DBL_MAX) {
|
||||
dbl_over: trap(EFOVFL);
|
||||
#ifdef PRT_TRAP
|
||||
prt_ext("FCOMPACT DBL OVERFLOW",f);
|
||||
#endif PRT_TRAP
|
||||
f->exp = DBL_MAX;
|
||||
f->m1 = f->m2 = 0L;
|
||||
if (error++)
|
||||
return;
|
||||
}
|
||||
else if (f->exp < DBL_MIN) {
|
||||
#ifdef PRT_TRAP
|
||||
prt_ext("FCOMPACT DBL UNDERFLOW",f);
|
||||
#endif PRT_TRAP
|
||||
trap(EFUNFL);
|
||||
f->exp = DBL_MIN;
|
||||
f->m1 = f->m2 = 0L;
|
||||
|
@ -87,14 +72,8 @@ dbl_over: trap(EFOVFL);
|
|||
if (f->m2 & DBL_ROUNDUP) {
|
||||
DBL->_s.p2++; /* rounding up */
|
||||
if (DBL->_s.p2 == 0L) { /* carry out */
|
||||
#ifdef PRT_RNDMSG
|
||||
write(2,"rounding up lsb\n",16);
|
||||
#endif PRT_RNDMSG
|
||||
DBL->_s.p1.fract++;
|
||||
if (DBL->_s.p1.fract & DBL_CARRYOUT) { /* carry out */
|
||||
#ifdef PRT_RNDMSG
|
||||
write(2,"shift due to rounding\n",22);
|
||||
#endif PRT_RNDMSG
|
||||
if (DBL->_s.p1.fract & 01)
|
||||
DBL->_s.p2 = CARRYBIT;
|
||||
DBL->_s.p1.fract >>= 1;
|
||||
|
@ -107,43 +86,36 @@ dbl_over: trap(EFOVFL);
|
|||
if (f->exp > DBL_MAX)
|
||||
goto dbl_over;
|
||||
|
||||
/* STORE EXPONENT: */
|
||||
/*
|
||||
* STORE EXPONENT:
|
||||
*
|
||||
* 1) clear leading bits (B4-B15)
|
||||
* 2) shift and store exponent
|
||||
*/
|
||||
|
||||
/* 1) clear leading bits (B4-B15) */
|
||||
DBL->_s.p1.fract &= DBL_MASK;
|
||||
|
||||
/* 2) shift and store exponent */
|
||||
f->exp <<= DBL_EXPSHIFT;
|
||||
DBL->_s.p1.fract |= ((long) f->exp << EXP_STORE);
|
||||
}
|
||||
else
|
||||
/********************************************************/
|
||||
/*
|
||||
COMPACT EXTENDED INTO FLOAT
|
||||
*/
|
||||
/********************************************************/
|
||||
{
|
||||
else {
|
||||
/*
|
||||
* COMPACT EXTENDED INTO FLOAT
|
||||
*/
|
||||
/* local CAST conversion */
|
||||
SGL = (SINGLE *) to;
|
||||
if ((f->m1 & SGL_ZERO) == 0L) {
|
||||
SGL->fract = 0L;
|
||||
goto leave;
|
||||
return;
|
||||
}
|
||||
f->exp += SGL_BIAS; /* restore bias */
|
||||
if (f->exp > SGL_MAX) {
|
||||
sgl_over: trap(EFOVFL);
|
||||
#ifdef PRT_TRAP
|
||||
prt_ext("FCOMPACT FLOAT OVERFLOW",f);
|
||||
#endif PRT_TRAP
|
||||
f->exp = SGL_MAX;
|
||||
f->m1 = f->m2 = 0L;
|
||||
if (error++)
|
||||
return;
|
||||
}
|
||||
else if (f->exp < SGL_MIN) {
|
||||
#ifdef PRT_TRAP
|
||||
prt_ext("FCOMPACT FLOAT UNDERFLOW",f);
|
||||
#endif PRT_TRAP
|
||||
trap(EFUNFL);
|
||||
f->exp = SGL_MIN;
|
||||
f->m1 = f->m2 = 0L;
|
||||
|
@ -167,9 +139,6 @@ sgl_over: trap(EFOVFL);
|
|||
/* INEXACT(); */
|
||||
if (f->m1 & SGL_ROUNDUP) {
|
||||
SGL->fract++;
|
||||
#ifdef PRT_RNDMSG
|
||||
write(2,"rounding up lsb\n",16);
|
||||
#endif PRT_RNDMSG
|
||||
/* check normal */
|
||||
if (SGL->fract & SGL_CARRYOUT) {
|
||||
SGL->fract >>= 1;
|
||||
|
@ -180,41 +149,34 @@ sgl_over: trap(EFOVFL);
|
|||
if (f->exp > SGL_MAX)
|
||||
goto sgl_over;
|
||||
|
||||
/* STORE EXPONENT */
|
||||
/* 1) clear leading bit of fraction */
|
||||
SGL->fract &= SGL_MASK; /* B23-B31 are 0 */
|
||||
/*
|
||||
* STORE EXPONENT:
|
||||
*
|
||||
* 1) clear leading bit of fraction
|
||||
* 2) shift and store exponent
|
||||
*/
|
||||
|
||||
/* 2) shift and store exponent */
|
||||
SGL->fract &= SGL_MASK; /* B23-B31 are 0 */
|
||||
f->exp <<= SGL_EXPSHIFT;
|
||||
SGL->fract |= ((long) f->exp << EXP_STORE);
|
||||
}
|
||||
|
||||
/********************************************************/
|
||||
/*
|
||||
STORE SIGN BIT
|
||||
*/
|
||||
/********************************************************/
|
||||
/*
|
||||
* STORE SIGN BIT
|
||||
*/
|
||||
if (f->sign) {
|
||||
SGL = (SINGLE *) to; /* make sure */
|
||||
SGL->fract |= CARRYBIT;
|
||||
}
|
||||
/********************************************************/
|
||||
/*
|
||||
STORE MANTISSA
|
||||
/*
|
||||
/********************************************************/
|
||||
|
||||
/*
|
||||
* STORE MANTISSA
|
||||
*/
|
||||
|
||||
if (size == sizeof(_double)) {
|
||||
put4(DBL->_s.p1.fract, (char *) &DBL->_s.p1.fract);
|
||||
put4(DBL->_s.p2, (char *) &DBL->_s.p2);
|
||||
}
|
||||
else
|
||||
else
|
||||
put4(SGL->fract, (char *) &SGL->fract);
|
||||
|
||||
leave:
|
||||
#ifdef PRT_EXIT
|
||||
prt_ext("exit compact:",f);
|
||||
prt_dbl((DOUBLE *) to,size); getchar();
|
||||
#endif PRT_EXIT
|
||||
; /* end of print statement or null statement */
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT INTEGER TO FLOAT
|
||||
CONVERT INTEGER TO FLOAT (CUF n 4)
|
||||
|
||||
THIS ROUTINE WORKS BY FILLING AN EXTENDED
|
||||
WITH THE INTEGER VALUE IN EXTENDED FORMAT
|
||||
|
@ -38,9 +38,6 @@ long src; /* largest possible integer to convert */
|
|||
buf.exp = 17;
|
||||
result = (_float *) &ss;
|
||||
}
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CUF4(ds(%d),ss(%d),src(%D))\n\n",4,ss,i_src);
|
||||
#endif
|
||||
if (i_src == 0) {
|
||||
*result = (_float) 0L;
|
||||
return (_float) 0L;
|
||||
|
@ -56,9 +53,6 @@ long src; /* largest possible integer to convert */
|
|||
|
||||
/* adjust mantissa field */
|
||||
nrm_ext(&buf);
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CUF() buf.exp after nrm_ext() == %d\n\n",buf.exp);
|
||||
#endif
|
||||
compact(&buf,(_double *) result,4);
|
||||
return *result;
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
CONVERT INTEGER TO FLOAT
|
||||
CONVERT INTEGER TO FLOAT (CUF n 8)
|
||||
|
||||
THIS ROUTINE WORKS BY FILLING AN EXTENDED
|
||||
WITH THE INTEGER VALUE IN EXTENDED FORMAT
|
||||
|
@ -34,9 +34,6 @@ long src; /* largest possible integer to convert */
|
|||
i_src = (long) *ipt;
|
||||
buf.exp = 17;
|
||||
}
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CUF8(ds(%d),ss(%d),src(%D))\n\n",8,ss,i_src);
|
||||
#endif
|
||||
if (i_src == 0) {
|
||||
zrf8(&ss);
|
||||
return;
|
||||
|
@ -52,8 +49,5 @@ long src; /* largest possible integer to convert */
|
|||
|
||||
/* adjust mantissa field */
|
||||
nrm_ext(&buf);
|
||||
#ifdef PRT_STDERR
|
||||
fprintf(stderr,"CUF() buf.exp after nrm_ext() == %d\n\n",buf.exp);
|
||||
#endif
|
||||
compact(&buf,(_double *) &ss,8);
|
||||
}
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
#define PRT_EXT
|
||||
#define PRT_ALL
|
||||
DIVIDE EXTENDED FORMAT
|
||||
*/
|
||||
|
||||
|
@ -21,10 +19,7 @@
|
|||
This is a routine to do the work.
|
||||
It is based on the partial products method
|
||||
and makes no use possible machine instructions
|
||||
to divide (hardware dividers). It is intended
|
||||
that it be rewritten to do so, but expedieancy
|
||||
requires that something be written NOW - and
|
||||
this is it.
|
||||
to divide (hardware dividers).
|
||||
*/
|
||||
/********************************************************/
|
||||
|
||||
|
@ -36,11 +31,6 @@ EXTEND *e1,*e2;
|
|||
unsigned long result[2];
|
||||
register unsigned long *lp;
|
||||
|
||||
#ifdef PRT_EXT
|
||||
fprintf("stderr:start div_ext:\n");
|
||||
prt_ext("dividend:",e1);
|
||||
prt_ext("divisor :",e2);
|
||||
#endif
|
||||
if ((e1->m1 | e1->m2) == 0) { /* 0 / anything == 0 */
|
||||
e1->exp = 0; /* make sure */
|
||||
return;
|
||||
|
@ -59,25 +49,32 @@ EXTEND *e1,*e2;
|
|||
e1->exp -= e2->exp;
|
||||
e1->exp += 2; /* bias correction */
|
||||
if (e1->exp < EXT_MIN) {
|
||||
error++;
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("DIV_EXT UNDERFLOW",e1);
|
||||
#endif PRT_EXT
|
||||
/*
|
||||
* Exception 8.4 - Underflow
|
||||
*/
|
||||
trap(EFUNFL); /* underflow */
|
||||
e1->exp = EXT_MIN;
|
||||
e1->m1 = e1->m2 = 0L;
|
||||
return;
|
||||
}
|
||||
if ((e2->m1 | e2->m2) == 0) {
|
||||
error++;
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("DIV_EXT DIV 0.0",e2);
|
||||
#endif PRT_EXT
|
||||
/*
|
||||
* Exception 8.2 - Divide by zero
|
||||
*/
|
||||
trap(EFDIVZ);
|
||||
e1->m1 = e1->m2 = 0L;
|
||||
e1->exp = EXT_MAX;
|
||||
}
|
||||
if (error)
|
||||
return;
|
||||
}
|
||||
if (e1->exp >= EXT_MAX) {
|
||||
/*
|
||||
* Exception 8.3 - Overflow
|
||||
*/
|
||||
trap(EFOVFL); /* overflow */
|
||||
e1->exp = EXT_MAX;
|
||||
e1->m1 = e1->m2 = 0L;
|
||||
return;
|
||||
}
|
||||
|
||||
/* do division of mantissas */
|
||||
/* uses partial product method */
|
||||
|
@ -100,10 +97,6 @@ EXTEND *e1,*e2;
|
|||
/* compare dividend and divisor */
|
||||
/* if dividend >= divisor add a bit */
|
||||
/* and subtract divisior from dividend */
|
||||
#ifdef PRT_ALL
|
||||
prt_ext("dividend:",e1);
|
||||
prt_ext("divisor :",e2);
|
||||
#endif
|
||||
|
||||
if ( (e1->m1 < e2->m1) ||
|
||||
((e1->m1 == e2->m1) && (e1->m2 < e2->m2) ))
|
||||
|
@ -115,15 +108,7 @@ EXTEND *e1,*e2;
|
|||
e1->m1 -= 1; /* carry in */
|
||||
e1->m1 -= e2->m1; /* do SUBTRACTION */
|
||||
e1->m2 -= e2->m2; /* SUBTRACTION */
|
||||
#ifdef PRT_ALL
|
||||
prt_ext("result :",e1);
|
||||
#endif
|
||||
}
|
||||
#ifdef PRT_ALL
|
||||
fprintf(stderr,"div_ext %d %08X%08X\n\n",64-count,
|
||||
result[0],result[1]);
|
||||
fflush(stderr);
|
||||
#endif
|
||||
|
||||
/* shift dividend left one bit OR */
|
||||
/* IF it equals ZERO we can break out */
|
||||
|
@ -146,14 +131,6 @@ EXTEND *e1,*e2;
|
|||
break; /* leave loop */
|
||||
} /* end of divide by subtraction loop */
|
||||
|
||||
/* DISPLAY RESULTS FOR DEBUGGING */
|
||||
#ifdef PRT_ALL
|
||||
prt_ext("dividend:",e1);
|
||||
prt_ext("divisor :",e2);
|
||||
fprintf(stderr,"div_ext %d %08X%08X\n",64-count,
|
||||
result[0],result[1]);
|
||||
#endif
|
||||
|
||||
if (count > 0) {
|
||||
lp = result;
|
||||
if (count > 31) { /* move to higher word */
|
||||
|
@ -169,18 +146,20 @@ EXTEND *e1,*e2;
|
|||
*lp <<= count;
|
||||
}
|
||||
}
|
||||
/*
|
||||
if (error)
|
||||
INEXACT();
|
||||
*/
|
||||
#ifdef EXCEPTION_INEXACT
|
||||
if (error) {
|
||||
/*
|
||||
* report here exception 8.5 - Inexact
|
||||
* from Draft 8.0 of IEEE P754:
|
||||
* In the absence of an invalid operation exception,
|
||||
* if the rounded result of an operation is not exact or if
|
||||
* it overflows without a trap, then the inexact exception
|
||||
* shall be assigned. The rounded or overflowed result
|
||||
* shall be delivered to the destination.
|
||||
*/
|
||||
INEXACT();
|
||||
#endif
|
||||
e1->m1 = result[0];
|
||||
e1->m2 = result[1];
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("result :",e1);
|
||||
#endif
|
||||
nrm_ext(e1);
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("after nrm:",e1);
|
||||
/*sleep(4);*/
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
DIVIDE TWO FLOATS - SINGLE Precision
|
||||
DIVIDE TWO FLOATS - SINGLE Precision (dvf 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
DIVIDE TWO FLOATS - DOUBLE Precision
|
||||
DIVIDE TWO FLOATS - DOUBLE Precision (DVF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,9 +6,6 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
#define PRT_EXIT
|
||||
#define PRT_ENTRY
|
||||
#define PRT_DBL
|
||||
CONVERTS FLOATING POINT TO EXTENDED FORMAT
|
||||
|
||||
Two sizes of FLOATING Point are known:
|
||||
|
@ -45,19 +42,11 @@ int size;
|
|||
unsigned long tmp;
|
||||
int leadbit = 0;
|
||||
|
||||
#ifdef PRT_ENTRY
|
||||
write(2,"entry extend: ",14);
|
||||
#ifdef PRT_DBL
|
||||
prt_dbl(from,size);
|
||||
#else
|
||||
write(2,"\n",1);
|
||||
#endif PRT_DBL
|
||||
#endif PRT_ENTRY
|
||||
f = (DOUBLE *) from; /* local cast conversion */
|
||||
if (f->_s.p1.fract == 0L) {
|
||||
if (size == sizeof(SINGLE)) {
|
||||
zero: zrf_ext(to);
|
||||
goto ready;
|
||||
return;
|
||||
}
|
||||
else if (f->_s.p2 == 0L)
|
||||
goto zero;
|
||||
|
@ -95,9 +84,4 @@ zero: zrf_ext(to);
|
|||
to->m1 |= NORMBIT; /* set bit L */
|
||||
if (leadbit == 0) /* set or clear Leading Bit */
|
||||
to->m1 &= ~NORMBIT; /* clear bit L */
|
||||
ready:
|
||||
#ifdef PRT_EXIT
|
||||
prt_ext("exit extend:",to)
|
||||
#endif PRT_EXIT
|
||||
; /* end of print statement or null statement */
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
SEPERATE INTO EXPONENT AND FRACTION
|
||||
SEPERATE INTO EXPONENT AND FRACTION (FEF 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
SEPERATE DOUBLE INTO EXPONENT AND FRACTION
|
||||
SEPERATE DOUBLE INTO EXPONENT AND FRACTION (FEF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
@ -22,16 +22,8 @@ _double s1;
|
|||
EXTEND buf;
|
||||
struct fef8_returns *r = (struct fef8_returns *) &s1;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("FEF8(): ");
|
||||
#endif DEBUG
|
||||
extend(&s1,&buf,sizeof(_double));
|
||||
r->e = buf.exp - 1;
|
||||
buf.exp = 1;
|
||||
compact(&buf,&r->f,sizeof(_double));
|
||||
#ifdef DEBUG
|
||||
printf("exponent = %3d fraction = 0x%08X%08X: ",
|
||||
r->f.__double[0],r->f.__double[1]);
|
||||
printf("FEF8()\n");
|
||||
#endif DEBUG
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
MULTIPLY AND DISMEMBER PARTS
|
||||
MULTIPLY AND DISMEMBER PARTS (FIF 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
MULTIPLY AND DISMEMBER PARTS
|
||||
MULTIPLY AND DISMEMBER PARTS (FIF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
* Multiply Single Precesion Float
|
||||
* Multiply Single Precesion Float (MLF 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
* Multiply Single Precesion Float
|
||||
* Multiply Single Precision Float (MLF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -17,17 +17,13 @@
|
|||
mul_ext(e1,e2)
|
||||
EXTEND *e1,*e2;
|
||||
{
|
||||
register short k,i,j; /* loop control */
|
||||
register int k,i,j; /* loop control */
|
||||
long unsigned *reg[7];
|
||||
long unsigned tmp[4];
|
||||
short unsigned mp[4]; /* multiplier */
|
||||
short unsigned mc[4]; /* multipcand */
|
||||
B64 low64,tmp64; /* 64 bit storage */
|
||||
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("before MUL_EXT() e1:",e1);
|
||||
prt_ext("before MUL_EXT() e2:",e2);
|
||||
#endif
|
||||
/* first save the sign (XOR) */
|
||||
|
||||
e1->sign ^= e2->sign;
|
||||
|
@ -66,24 +62,15 @@ EXTEND *e1,*e2;
|
|||
|
||||
/* check for overflow */
|
||||
if (e1->exp >= EXT_MAX) {
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("EXT_MUL OVERFLOW",e1);
|
||||
#endif
|
||||
trap(EFOVFL);
|
||||
/* if caught */
|
||||
/* return signed infinity */
|
||||
e1->exp = EXT_MAX;
|
||||
infinity: e1->m1 = e1->m2 =0L;
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("after MUL_EXT() e1:",e1);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
/* check for underflow */
|
||||
if (e1->exp < EXT_MIN) {
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("EXT_MUL UNDERFLOW",e1);
|
||||
#endif
|
||||
trap(EFUNFL);
|
||||
e1->exp = EXT_MIN;
|
||||
goto infinity;
|
||||
|
@ -101,16 +88,6 @@ infinity: e1->m1 = e1->m2 =0L;
|
|||
mc[1] = (unsigned short) e2->m1;
|
||||
mc[2] = e2->m2 >> 16;
|
||||
mc[3] = (unsigned short) e2->m2;
|
||||
# ifdef DEBUG
|
||||
for(i=0;i<4;i++)
|
||||
printf("%04x",mp[i]);
|
||||
putchar('\r');
|
||||
putchar('\n');
|
||||
for(i=0;i<4;i++)
|
||||
printf("%04x",mc[i]);
|
||||
putchar('\r');
|
||||
putchar('\n');
|
||||
# endif
|
||||
/*
|
||||
* assign pointers
|
||||
*/
|
||||
|
@ -135,72 +112,24 @@ infinity: e1->m1 = e1->m2 =0L;
|
|||
for(j=4;j--;) if (mc[j]) {
|
||||
k = i+j;
|
||||
tmp[0] = (long)mp[i] * (long)mc[j];
|
||||
# ifdef PRT_EXT2
|
||||
printf("%04x * %04x == %08X ",mp[i],mc[j],tmp[0]);
|
||||
printf("index == %d ",k);
|
||||
printf("register before add == %08X\n",*reg[k]);
|
||||
fflush(stdout);
|
||||
# endif
|
||||
#ifdef PRT_ADD
|
||||
printf("REGISTERS-----\n");
|
||||
printf("%08X %08X %08X %08X\n0000%04x %04x%04x %04x%04x %04x0000\n",
|
||||
*reg[0],*reg[2],*reg[4],*reg[6],
|
||||
(short)(*reg[1]>>16),(short)(*reg[1]),(short)(*reg[3]>>16),
|
||||
(short)(*reg[3]),(short)(*reg[5]>>16),(short)(*reg[5]));
|
||||
# endif
|
||||
if (b32_add(reg[k],tmp)) {
|
||||
for(tmp[0] = 0x10000L;k>0;)
|
||||
if (b32_add(reg[--k],tmp) == 0)
|
||||
break;
|
||||
#ifdef PRT_ADD
|
||||
printf("CARRY---------\n");
|
||||
printf("%08X %08X %08X %08X\n0000%04x %04x%04x %04x%04x %04x0000\n",
|
||||
*reg[0],*reg[2],*reg[4],*reg[6],
|
||||
(short)(*reg[1]>>16),(short)(*reg[1]),(short)(*reg[3]>>16),
|
||||
(short)(*reg[3]),(short)(*reg[5]>>16),(short)(*reg[5]));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* combine the registers to a total
|
||||
*/
|
||||
#ifdef PRT_ADD
|
||||
printf("%08X %08X %08X %08X\n0000%04x %04x%04x %04x%04x %04x0000\n",
|
||||
*reg[0],*reg[2],*reg[4],*reg[6],
|
||||
(short)(*reg[1]>>16),(short)(*reg[1]),(short)(*reg[3]>>16),
|
||||
(short)(*reg[3]),(short)(*reg[5]>>16),(short)(*reg[5]));
|
||||
# endif
|
||||
tmp64.h_32 = (*reg[1]>>16);
|
||||
tmp64.l_32 = (*reg[1]<<16) + (*reg[3]>>16);
|
||||
# ifdef PRT_ALL
|
||||
printf("%08X%08X tmp64\n",tmp64.h_32,tmp64.l_32);
|
||||
fflush(stdout);
|
||||
printf("%08X%08X e1->m1\n",e1->m1,e1->m2);
|
||||
fflush(stdout);
|
||||
# endif
|
||||
b64_add((B64 *)&e1->m1,&tmp64);
|
||||
# ifdef PRT_ALL
|
||||
printf("b64_add:\n");
|
||||
printf("%08X%08X e1->m1\n",e1->m1,e1->m2);
|
||||
fflush(stdout);
|
||||
# endif
|
||||
tmp64.l_32 = *reg[5]<<16;
|
||||
tmp64.h_32 = (*reg[5]>>16) + (*reg[3]<<16);
|
||||
if (b64_add(&low64,&tmp64))
|
||||
if (++e1->m2 == 0)
|
||||
e1->m1++;
|
||||
|
||||
# ifdef PRT_ADD
|
||||
printf("%08X %08X %08X %08X\n",e1->m1,e1->m2,low64.h_32,low64.l_32);
|
||||
fflush(stdout);
|
||||
#endif
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("after MUL_EXT() e1:",e1);
|
||||
#endif PRT_EXT
|
||||
nrm_ext(e1);
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("after NRM_EXT() e1:",e1);
|
||||
sleep(4);
|
||||
#endif PRT_EXT
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
NEGATE A FLOATING POINT
|
||||
NEGATE A FLOATING POINT (NGF 4)
|
||||
*/
|
||||
/********************************************************/
|
||||
/*
|
||||
|
@ -26,4 +26,3 @@ _float f;
|
|||
*p ^= 0x80;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
NEGATE A FLOATING POINT
|
||||
NEGATE A FLOATING POINT (NGF 8)
|
||||
*/
|
||||
/********************************************************/
|
||||
/*
|
||||
|
|
|
@ -21,17 +21,8 @@ EXTEND *e1;
|
|||
register unsigned long *mant_2;
|
||||
|
||||
/* local CAST conversion */
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("before NRM_EXT() e1:",e1);
|
||||
#endif PRT_EXT
|
||||
mant_1 = (unsigned long *) &e1->m1;
|
||||
/*
|
||||
THIS RESULTS IN A BAD CODE !!!!
|
||||
ANOTHER BUG IN EM CODE MAYBE????
|
||||
mant_2 = (unsigned long *) &e1->m2;
|
||||
*/
|
||||
/* statement that works */
|
||||
mant_2 = mant_1 + 1;
|
||||
|
||||
/* we assume that the mantissa != 0 */
|
||||
/* if it is then just return */
|
||||
|
@ -51,18 +42,6 @@ EXTEND *e1;
|
|||
*mant_1-- = 0L;
|
||||
e1->exp -= 32;
|
||||
}
|
||||
#ifdef OLD
|
||||
/* check that e1->m1 is not too large */
|
||||
if (*mant_1 & CARRYBIT) { /* carry occured */
|
||||
e1->exp++; /* increase exponent */
|
||||
*mant_2 >>= 1; /* right shift mantissa */
|
||||
if ((short) *mant_1 & 01)
|
||||
*mant_2 |= CARRYBIT;
|
||||
*mant_1 >>= 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
while ((*mant_1 & NORMBIT) == 0) {
|
||||
e1->exp--;
|
||||
*mant_1 <<= 1;
|
||||
|
@ -73,7 +52,4 @@ EXTEND *e1;
|
|||
}
|
||||
*mant_2 <<= 1;
|
||||
}
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("after NRM_EXT() e1:",e1);
|
||||
#endif PRT_EXT
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
SUBTRACT TWO FLOATS - SINGLE Precision
|
||||
SUBTRACT TWO FLOATS - SINGLE Precision (SBF 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
SUBTRACT TWO FLOATS - DOUBLE Precision
|
||||
SUBTRACT TWO FLOATS - DOUBLE Precision (SBF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
@ -22,9 +22,6 @@ _double s1,s2;
|
|||
/* s2 = -s2; */
|
||||
char unsigned *p; /* sufficient to access sign bit */
|
||||
|
||||
#ifdef PRT_EXT
|
||||
fprintf(stderr,"SBF8 ():\n");
|
||||
#endif
|
||||
if (s2.__double[0] == 0 && s2.__double[1] == 0) {
|
||||
return s1;
|
||||
}
|
||||
|
@ -33,4 +30,3 @@ _double s1,s2;
|
|||
s1 = adf8(s2,s1); /* add and return result */
|
||||
return(s1);
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
#define PRT_EXT
|
||||
SHIFT TWO EXTENDED NUMBERS INTO PROPER
|
||||
ALIGNMENT FOR ADDITION (exponents are equal)
|
||||
*/
|
||||
|
@ -17,13 +16,9 @@ sft_ext(e1,e2)
|
|||
EXTEND *e1,*e2;
|
||||
{
|
||||
register EXTEND *s;
|
||||
register short diff;
|
||||
register int diff;
|
||||
long tmp;
|
||||
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("enter sft_ext e1:",e1);
|
||||
prt_ext("enter sft_ext e2:",e2);
|
||||
#endif PRT_EXT
|
||||
diff = e1->exp - e2->exp;
|
||||
|
||||
if (!diff)
|
||||
|
@ -62,8 +57,4 @@ EXTEND *e1,*e2;
|
|||
s->m2 >>= diff;
|
||||
s->m2 |= tmp;
|
||||
}
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("exit sft_ext e1:",e1);
|
||||
prt_ext("exit sft_ext e2:",e2);
|
||||
#endif PRT_EXT
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
b64_sft(e1,n)
|
||||
B64 *e1;
|
||||
short n;
|
||||
int n;
|
||||
{
|
||||
if (n>0) do { /* RIGHT shift n bits */
|
||||
e1->l_32 >>= 1; /* shift 64 bits */
|
||||
|
|
|
@ -6,30 +6,23 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
#define PRT_EXT
|
||||
SUBTRACT EXTENDED FORMAT
|
||||
SUBTRACT 2 EXTENDED FORMAT NUMBERS
|
||||
*/
|
||||
/* assumes that e1 >= e2 on entry */
|
||||
/* no test is made to check this */
|
||||
/* so make sure yourself */
|
||||
/*
|
||||
* adf (addition routines) use this rather than
|
||||
* add_ext when the signs of the numbers are different.
|
||||
* sub_ext requires that e1 >= e2 on entry
|
||||
* otherwise nonsense results. If you use this routine
|
||||
* make certain this requirement is met.
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
sub_ext(e1,e2)
|
||||
EXTEND *e1,*e2;
|
||||
{
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("before SUB_EXT() e1:",e1);
|
||||
prt_ext("before SUB_EXT() e2:",e2);
|
||||
#endif PRT_EXT
|
||||
if (e2->m2 > e1->m2)
|
||||
e1->m1 -= 1; /* carry in */
|
||||
e1->m1 -= e2->m1;
|
||||
e1->m2 -= e2->m2;
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("after SUB_EXT() e1:",e1);
|
||||
#endif PRT_EXT
|
||||
nrm_ext(e1);
|
||||
#ifdef PRT_EXT
|
||||
prt_ext("after NRM_EXT() e1:",e1);
|
||||
#endif PRT_EXT
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
return a zero float
|
||||
return a zero float (ZRF 4)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
/*
|
||||
return a zero double
|
||||
return a zero double (ZRF 8)
|
||||
*/
|
||||
|
||||
#include "FP_types.h"
|
||||
|
|
|
@ -15,13 +15,12 @@ zrf_ext(e)
|
|||
EXTEND *e;
|
||||
{
|
||||
register short *ipt;
|
||||
register short i;
|
||||
register short zero = 0;
|
||||
register int i;
|
||||
|
||||
/* local CAST conversion */
|
||||
ipt = (short *) e;
|
||||
|
||||
i = sizeof(EXTEND)/sizeof(short);
|
||||
while (i--)
|
||||
*ipt++ = zero;
|
||||
*ipt++ = 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue