int sign1,sign2;
int rv;
+#if FL_MSL_AT_LOW_ADDRESS
l1 = get4((char *)&d1);
l2 = get4((char *)&d2);
+#else
+ l1 = get4(((char *)&d1+4));
+ l2 = get4(((char *)&d2+4));
+#endif
sign1 = SIGN(l1);
sign2 = SIGN(l2);
if (sign1 != sign2) {
}
else { /* decide in 2nd half */
unsigned long u1, u2;
+#if FL_MSL_AT_LOW_ADDRESS
u1 = get4(((char *)&d1 + 4));
u2 = get4(((char *)&d2 + 4));
+#else
+ u1 = get4((char *)&d1);
+ u2 = get4((char *)&d2);
+#endif
if (u1 == u2)
return(0);
if (u1 < u2) rv = 1;
* STORE MANTISSA
*/
+#if FL_MSL_AT_LOW_ADDRESS
put4(DBL->_s.p1.fract, (char *) &DBL->_s.p1.fract);
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 {
/*
goto zero;
}
/* 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);
+#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->exp ^= to->sign;
if (size == sizeof(DOUBLE))
leadbit++; /* will set Lead bit later */
else to->exp++;
- to->m1 = get4(cpt1);
-
if (size == sizeof(DOUBLE)) {
- to->m1 <<= DBL_M1LEFT; /* shift */
- to->exp -= DBL_BIAS; /* remove bias */
+#if FL_MSL_AT_LOW_ADDRESS
+ to->m1 = get4(cpt1);
cpt1 += 4;
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->m2 = (tmp<<DBL_LPACK); /* plus 22 == 32 */
}
else { /* size == sizeof(SINGLE) */
+ to->m1 = get4(cpt1);
to->m1 <<= SGL_M1LEFT; /* shift */
to->exp -= SGL_BIAS; /* remove bias */
to->m2 = 0L;
#define Xchar(ch) ((ch) & 0377)
#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 Xput2(i, c) (((c)[1] = (i)), ((c)[0] = (i) >> 8))
#define put2(i, c) { register int j = (i); Xput2(j, 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 put4(l, c) { register long x=(l); \
Xput2((int)x,(c)+2); \
NEGATE A FLOATING POINT (NGF 4)
*/
/********************************************************/
-/*
- Assumes exponent is located in bytes 0 & 1
-*/
-/********************************************************/
#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
ngf4(f)
_float f;
unsigned char *p;
if (f != (_float) 0) {
- p = (unsigned char *) &f;
+ p = (unsigned char *) &f + OFF;
*p ^= 0x80;
}
return f;
NEGATE A FLOATING POINT (NGF 8)
*/
/********************************************************/
-/*
- Assumes exponent is located in bytes 0 & 1
-*/
-/********************************************************/
#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
ngf8(f)
unsigned char *p;
if (f.__double[0] != 0 || f.__double[1] != 0) {
- p = (unsigned char *) &f;
+ p = (unsigned char *) &f + OFF;
*p ^= 0x80;
}
return f;
#include "FP_types.h"
-extern _float adf4();
+extern _float adf4(), ngf4();
_float
sbf4(s2,s1)
_float s1,s2;
{
- unsigned char *p;
_float *result = &s1; /* s1 may not be in a register! */
if (s2 == (_float) 0) {
return s1;
}
- p = (unsigned char *) &s2;
- *p ^= 0x80; /* change sign of s2 */
+ s2 = ngf4(s2);
*result = adf4(s2,s1);
return(s1); /* add and return result */
}
#include "FP_types.h"
-extern _double adf8();
+extern _double adf8(), ngf8();
_double
sbf8(s2,s1)
_double s1,s2;
{
- unsigned char *p; /* sufficient to access sign bit */
_double *result = &s1; /* s1 may not be in a register! */
if (s2.__double[0] == 0 && s2.__double[1] == 0) {
return s1;
}
- p = (unsigned char *) &s2;
- *p ^= 0x80; /* change sign of s2 */
+ s2 = ngf8(s2);
*result = adf8(s2,s1); /* add and return result */
return(s1);
}