changes for different byte orderings
This commit is contained in:
parent
07f019213d
commit
13ea4896b0
|
@ -23,8 +23,13 @@ _double d1,d2;
|
||||||
int sign1,sign2;
|
int sign1,sign2;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
#if FL_MSL_AT_LOW_ADDRESS
|
||||||
l1 = get4((char *)&d1);
|
l1 = get4((char *)&d1);
|
||||||
l2 = get4((char *)&d2);
|
l2 = get4((char *)&d2);
|
||||||
|
#else
|
||||||
|
l1 = get4(((char *)&d1+4));
|
||||||
|
l2 = get4(((char *)&d2+4));
|
||||||
|
#endif
|
||||||
sign1 = SIGN(l1);
|
sign1 = SIGN(l1);
|
||||||
sign2 = SIGN(l2);
|
sign2 = SIGN(l2);
|
||||||
if (sign1 != sign2) {
|
if (sign1 != sign2) {
|
||||||
|
@ -39,8 +44,13 @@ _double d1,d2;
|
||||||
}
|
}
|
||||||
else { /* decide in 2nd half */
|
else { /* decide in 2nd half */
|
||||||
unsigned long u1, u2;
|
unsigned long u1, u2;
|
||||||
|
#if FL_MSL_AT_LOW_ADDRESS
|
||||||
u1 = get4(((char *)&d1 + 4));
|
u1 = get4(((char *)&d1 + 4));
|
||||||
u2 = get4(((char *)&d2 + 4));
|
u2 = get4(((char *)&d2 + 4));
|
||||||
|
#else
|
||||||
|
u1 = get4((char *)&d1);
|
||||||
|
u2 = get4((char *)&d2);
|
||||||
|
#endif
|
||||||
if (u1 == u2)
|
if (u1 == u2)
|
||||||
return(0);
|
return(0);
|
||||||
if (u1 < u2) rv = 1;
|
if (u1 < u2) rv = 1;
|
||||||
|
|
|
@ -108,8 +108,16 @@ dbl_over: trap(EFOVFL);
|
||||||
* STORE MANTISSA
|
* STORE MANTISSA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if FL_MSL_AT_LOW_ADDRESS
|
||||||
put4(DBL->_s.p1.fract, (char *) &DBL->_s.p1.fract);
|
put4(DBL->_s.p1.fract, (char *) &DBL->_s.p1.fract);
|
||||||
put4(DBL->_s.p2, (char *) &DBL->_s.p2);
|
put4(DBL->_s.p2, (char *) &DBL->_s.p2);
|
||||||
|
#else
|
||||||
|
{ unsigned long l;
|
||||||
|
put4(DBL->_s.p2, (char *) &l);
|
||||||
|
put4(DBL->_s.p1.fract, (char *) &DBL->_s.p2);
|
||||||
|
DBL->_s.p1.fract = l;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -52,9 +52,20 @@ zero: zrf_ext(to);
|
||||||
goto zero;
|
goto zero;
|
||||||
}
|
}
|
||||||
/* there is a number to convert so lets get started */
|
/* there is a number to convert so lets get started */
|
||||||
/* first extract the exponent; its always in the first two bytes */
|
|
||||||
|
|
||||||
|
#if FL_MSL_AT_LOW_ADDRESS
|
||||||
|
#if FL_MSW_AT_LOW_ADDRESS
|
||||||
to->exp = uget2(cpt1);
|
to->exp = uget2(cpt1);
|
||||||
|
#else
|
||||||
|
to->exp = uget2(cpt1+2);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if FL_MSW_AT_LOW_ADDRESS
|
||||||
|
to->exp = uget2(cpt1+4);
|
||||||
|
#else
|
||||||
|
to->exp = uget2(cpt1+6);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
to->sign = (to->exp & 0x8000); /* set sign bit */
|
to->sign = (to->exp & 0x8000); /* set sign bit */
|
||||||
to->exp ^= to->sign;
|
to->exp ^= to->sign;
|
||||||
if (size == sizeof(DOUBLE))
|
if (size == sizeof(DOUBLE))
|
||||||
|
@ -65,17 +76,23 @@ zero: zrf_ext(to);
|
||||||
leadbit++; /* will set Lead bit later */
|
leadbit++; /* will set Lead bit later */
|
||||||
else to->exp++;
|
else to->exp++;
|
||||||
|
|
||||||
to->m1 = get4(cpt1);
|
|
||||||
|
|
||||||
if (size == sizeof(DOUBLE)) {
|
if (size == sizeof(DOUBLE)) {
|
||||||
to->m1 <<= DBL_M1LEFT; /* shift */
|
#if FL_MSL_AT_LOW_ADDRESS
|
||||||
to->exp -= DBL_BIAS; /* remove bias */
|
to->m1 = get4(cpt1);
|
||||||
cpt1 += 4;
|
cpt1 += 4;
|
||||||
tmp = get4(cpt1);
|
tmp = get4(cpt1);
|
||||||
|
#else
|
||||||
|
tmp = get4(cpt1);
|
||||||
|
cpt1 += 4;
|
||||||
|
to->m1 = get4(cpt1);
|
||||||
|
#endif
|
||||||
|
to->m1 <<= DBL_M1LEFT; /* shift */
|
||||||
|
to->exp -= DBL_BIAS; /* remove bias */
|
||||||
to->m1 |= (tmp>>DBL_RPACK); /* plus 10 == 32 */
|
to->m1 |= (tmp>>DBL_RPACK); /* plus 10 == 32 */
|
||||||
to->m2 = (tmp<<DBL_LPACK); /* plus 22 == 32 */
|
to->m2 = (tmp<<DBL_LPACK); /* plus 22 == 32 */
|
||||||
}
|
}
|
||||||
else { /* size == sizeof(SINGLE) */
|
else { /* size == sizeof(SINGLE) */
|
||||||
|
to->m1 = get4(cpt1);
|
||||||
to->m1 <<= SGL_M1LEFT; /* shift */
|
to->m1 <<= SGL_M1LEFT; /* shift */
|
||||||
to->exp -= SGL_BIAS; /* remove bias */
|
to->exp -= SGL_BIAS; /* remove bias */
|
||||||
to->m2 = 0L;
|
to->m2 = 0L;
|
||||||
|
|
|
@ -13,7 +13,11 @@
|
||||||
#define Xchar(ch) ((ch) & 0377)
|
#define Xchar(ch) ((ch) & 0377)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ! BYTES_REVERSED
|
#define BYTES_REVERSED (MSB_AT_LOW_ADDRESS != FL_MSB_AT_LOW_ADDRESS)
|
||||||
|
#define WORDS_REVERSED (MSW_AT_LOW_ADDRESS != FL_MSW_AT_LOW_ADDRESS)
|
||||||
|
#define LONGS_REVERSED (FL_MSL_AT_LOW_ADDRESS)
|
||||||
|
|
||||||
|
#if BYTES_REVERSED
|
||||||
#define uget2(c) (Xchar((c)[1]) | ((unsigned) Xchar((c)[0]) << 8))
|
#define uget2(c) (Xchar((c)[1]) | ((unsigned) Xchar((c)[0]) << 8))
|
||||||
#define Xput2(i, c) (((c)[1] = (i)), ((c)[0] = (i) >> 8))
|
#define Xput2(i, c) (((c)[1] = (i)), ((c)[0] = (i) >> 8))
|
||||||
#define put2(i, c) { register int j = (i); Xput2(j, c); }
|
#define put2(i, c) { register int j = (i); Xput2(j, c); }
|
||||||
|
@ -25,7 +29,7 @@
|
||||||
|
|
||||||
#define get2(c) ((short) uget2(c))
|
#define get2(c) ((short) uget2(c))
|
||||||
|
|
||||||
#if WORDS_REVERSED || ! BYTES_REVERSED
|
#if WORDS_REVERSED || BYTES_REVERSED
|
||||||
#define get4(c) (uget2((c)+2) | ((long) uget2(c) << 16))
|
#define get4(c) (uget2((c)+2) | ((long) uget2(c) << 16))
|
||||||
#define put4(l, c) { register long x=(l); \
|
#define put4(l, c) { register long x=(l); \
|
||||||
Xput2((int)x,(c)+2); \
|
Xput2((int)x,(c)+2); \
|
||||||
|
|
|
@ -9,13 +9,11 @@
|
||||||
NEGATE A FLOATING POINT (NGF 4)
|
NEGATE A FLOATING POINT (NGF 4)
|
||||||
*/
|
*/
|
||||||
/********************************************************/
|
/********************************************************/
|
||||||
/*
|
|
||||||
Assumes exponent is located in bytes 0 & 1
|
|
||||||
*/
|
|
||||||
/********************************************************/
|
|
||||||
|
|
||||||
#include "FP_types.h"
|
#include "FP_types.h"
|
||||||
|
#include "get_put.h"
|
||||||
|
|
||||||
|
#define OFF ((FL_MSW_AT_LOW_ADDRESS ? 0 : 2) + (FL_MSB_AT_LOW_ADDRESS ? 0 : 1))
|
||||||
_float
|
_float
|
||||||
ngf4(f)
|
ngf4(f)
|
||||||
_float f;
|
_float f;
|
||||||
|
@ -23,7 +21,7 @@ _float f;
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
|
|
||||||
if (f != (_float) 0) {
|
if (f != (_float) 0) {
|
||||||
p = (unsigned char *) &f;
|
p = (unsigned char *) &f + OFF;
|
||||||
*p ^= 0x80;
|
*p ^= 0x80;
|
||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
|
|
|
@ -9,12 +9,11 @@
|
||||||
NEGATE A FLOATING POINT (NGF 8)
|
NEGATE A FLOATING POINT (NGF 8)
|
||||||
*/
|
*/
|
||||||
/********************************************************/
|
/********************************************************/
|
||||||
/*
|
|
||||||
Assumes exponent is located in bytes 0 & 1
|
|
||||||
*/
|
|
||||||
/********************************************************/
|
|
||||||
|
|
||||||
#include "FP_types.h"
|
#include "FP_types.h"
|
||||||
|
#include "get_put.h"
|
||||||
|
|
||||||
|
#define OFF ((FL_MSL_AT_LOW_ADDRESS ? 0 : 4) + (FL_MSW_AT_LOW_ADDRESS ? 0 : 2) + (FL_MSB_AT_LOW_ADDRESS ? 0 : 1))
|
||||||
|
|
||||||
_double
|
_double
|
||||||
ngf8(f)
|
ngf8(f)
|
||||||
|
@ -23,7 +22,7 @@ _double f;
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
|
|
||||||
if (f.__double[0] != 0 || f.__double[1] != 0) {
|
if (f.__double[0] != 0 || f.__double[1] != 0) {
|
||||||
p = (unsigned char *) &f;
|
p = (unsigned char *) &f + OFF;
|
||||||
*p ^= 0x80;
|
*p ^= 0x80;
|
||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
|
|
|
@ -11,20 +11,18 @@
|
||||||
|
|
||||||
#include "FP_types.h"
|
#include "FP_types.h"
|
||||||
|
|
||||||
extern _float adf4();
|
extern _float adf4(), ngf4();
|
||||||
|
|
||||||
_float
|
_float
|
||||||
sbf4(s2,s1)
|
sbf4(s2,s1)
|
||||||
_float s1,s2;
|
_float s1,s2;
|
||||||
{
|
{
|
||||||
unsigned char *p;
|
|
||||||
_float *result = &s1; /* s1 may not be in a register! */
|
_float *result = &s1; /* s1 may not be in a register! */
|
||||||
|
|
||||||
if (s2 == (_float) 0) {
|
if (s2 == (_float) 0) {
|
||||||
return s1;
|
return s1;
|
||||||
}
|
}
|
||||||
p = (unsigned char *) &s2;
|
s2 = ngf4(s2);
|
||||||
*p ^= 0x80; /* change sign of s2 */
|
|
||||||
*result = adf4(s2,s1);
|
*result = adf4(s2,s1);
|
||||||
return(s1); /* add and return result */
|
return(s1); /* add and return result */
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,20 +11,18 @@
|
||||||
|
|
||||||
#include "FP_types.h"
|
#include "FP_types.h"
|
||||||
|
|
||||||
extern _double adf8();
|
extern _double adf8(), ngf8();
|
||||||
|
|
||||||
_double
|
_double
|
||||||
sbf8(s2,s1)
|
sbf8(s2,s1)
|
||||||
_double s1,s2;
|
_double s1,s2;
|
||||||
{
|
{
|
||||||
unsigned char *p; /* sufficient to access sign bit */
|
|
||||||
_double *result = &s1; /* s1 may not be in a register! */
|
_double *result = &s1; /* s1 may not be in a register! */
|
||||||
|
|
||||||
if (s2.__double[0] == 0 && s2.__double[1] == 0) {
|
if (s2.__double[0] == 0 && s2.__double[1] == 0) {
|
||||||
return s1;
|
return s1;
|
||||||
}
|
}
|
||||||
p = (unsigned char *) &s2;
|
s2 = ngf8(s2);
|
||||||
*p ^= 0x80; /* change sign of s2 */
|
|
||||||
*result = adf8(s2,s1); /* add and return result */
|
*result = adf8(s2,s1); /* add and return result */
|
||||||
return(s1);
|
return(s1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue