mirror of
https://github.com/Cesarus85/ringfall-mjolnir-vr.git
synced 2026-10-23 16:00:32 +02:00
259 lines
7.5 KiB
C
259 lines
7.5 KiB
C
/* $Header: /usr/people/sam/tiff/libtiff/junk/machdep.h,v 1.16 91/07/16 16:30:45 sam Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 1988, 1989, 1990, 1991 Sam Leffler
|
|
* Copyright (c) 1991 Silicon Graphics, Inc.
|
|
*
|
|
* Permission to use, copy, modify, distribute, and sell this software and
|
|
* its documentation for any purpose is hereby granted without fee, provided
|
|
* that (i) the above copyright notices and this permission notice appear in
|
|
* all copies of the software and related documentation, and (ii) the names of
|
|
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
* publicity relating to the software without the specific, prior written
|
|
* permission of Sam Leffler and Silicon Graphics.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
*
|
|
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
* OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#ifndef _MACHDEP_
|
|
#define _MACHDEP_
|
|
/*
|
|
* Machine dependent definitions:
|
|
* o floating point formats
|
|
* o byte ordering
|
|
*
|
|
* NB, there are lots of assumptions here:
|
|
* - 32-bit natural integers (sign extension code)
|
|
* - native float is 4 bytes (floating point conversion)
|
|
* - native double is 8 bytes (floating point conversion)
|
|
*/
|
|
|
|
#if defined(sun) || defined(sparc) || defined(stellar) || defined(MIPSEB) || defined(hpux) || defined(apollo) || defined(NeXT) || defined(_IBMR2)
|
|
#define BIGENDIAN 1
|
|
#define IEEEFP
|
|
#endif /* sun || sparc || stellar || MIPSEB || hpux || apollo || NeXT || _IBMR2 */
|
|
|
|
/* MIPSEL = MIPS w/ Little Endian byte ordering (e.g. DEC 3100) */
|
|
#if defined(MIPSEL)
|
|
#define BIGENDIAN 0
|
|
#define IEEEFP
|
|
#endif /* MIPSEL */
|
|
|
|
#ifdef transputer
|
|
#define BIGENDIAN 0
|
|
#define IEEEFP /* IEEE floating point supported */
|
|
#endif /* transputer */
|
|
|
|
#if defined(m386) || defined(M_I86) || defined(i386)
|
|
#define BIGENDIAN 0
|
|
#define IEEEFP /* IEEE floating point supported */
|
|
#endif /* m386 || M_I86 || i386 */
|
|
|
|
#ifdef IEEEFP
|
|
typedef struct ieeedouble nativedouble;
|
|
typedef struct ieeefloat nativefloat;
|
|
#define ISFRACTION(e) (1022 - 4 <= (e) && (e) <= 1022 + 15)
|
|
#define EXTRACTFRACTION(dp, fract) \
|
|
((fract) = ((unsigned long)(1<<31)|((dp)->native.mant<<11)|\
|
|
((dp)->native.mant2>>21)) >> (1022+16-(dp)->native.exp))
|
|
#define EXTRACTEXPONENT(dp, exponent) ((exponent) = (dp)->native.exp)
|
|
#define NATIVE2IEEEFLOAT(fp)
|
|
#define IEEEFLOAT2NATIVE(fp)
|
|
#define IEEEDOUBLE2NATIVE(dp)
|
|
|
|
#define TIFFSwabArrayOfFloat(fp,n) TIFFSwabArrayOfLong((unsigned long *)fp,n)
|
|
#define TIFFSwabArrayOfDouble(dp,n) TIFFSwabArrayOfLong((unsigned long *)dp,2*n)
|
|
#endif /* IEEEFP */
|
|
|
|
#ifdef tahoe
|
|
#define BIGENDIAN 1
|
|
|
|
typedef struct {
|
|
unsigned sign:1;
|
|
unsigned exp:8;
|
|
unsigned mant:23;
|
|
unsigned mant2;
|
|
} nativedouble;
|
|
typedef struct {
|
|
unsigned sign:1;
|
|
unsigned exp:8;
|
|
unsigned mant:23;
|
|
} nativefloat;
|
|
#define ISFRACTION(e) (128 - 4 <= (e) && (e) <= 128 + 15)
|
|
#define EXTRACTFRACTION(dp, fract) \
|
|
((fract) = ((1<<31)|((dp)->native.mant<<8)|((dp)->native.mant2>>15)) >> \
|
|
(128+16-(dp)->native.exp))
|
|
#define EXTRACTEXPONENT(dp, exponent) ((exponent) = (dp)->native.exp - 2)
|
|
/*
|
|
* Beware, over/under-flow in conversions will
|
|
* result in garbage values -- handling it would
|
|
* require a subroutine call or lots more code.
|
|
*/
|
|
#define NATIVE2IEEEFLOAT(fp) { \
|
|
if ((fp)->native.exp) \
|
|
(fp)->ieee.exp = (fp)->native.exp - 129 + 127; /* alter bias */\
|
|
}
|
|
#define IEEEFLOAT2NATIVE(fp) { \
|
|
if ((fp)->ieee.exp) \
|
|
(fp)->native.exp = (fp)->ieee.exp - 127 + 129; /* alter bias */\
|
|
}
|
|
#define IEEEDOUBLE2NATIVE(dp) { \
|
|
if ((dp)->native.exp = (dp)->ieee.exp) \
|
|
(dp)->native.exp += -1023 + 129; \
|
|
(dp)->native.mant = ((dp)->ieee.mant<<3)|((dp)->native.mant2>>29); \
|
|
(dp)->native.mant2 <<= 3; \
|
|
}
|
|
/* the following is to work around a compiler bug... */
|
|
#define SIGNEXTEND(a,b) { char ch; ch = (a); (b) = ch; }
|
|
|
|
#define TIFFSwabArrayOfFloat(fp,n) TIFFSwabArrayOfLong((unsigned long *)fp,n)
|
|
#define TIFFSwabArrayOfDouble(dp,n) TIFFSwabArrayOfLong((unsigned long *)dp,2*n)
|
|
#endif /* tahoe */
|
|
|
|
#ifdef vax
|
|
#define BIGENDIAN 0
|
|
|
|
typedef struct {
|
|
unsigned mant1:7;
|
|
unsigned exp:8;
|
|
unsigned sign:1;
|
|
unsigned mant2:16;
|
|
unsigned mant3;
|
|
} nativedouble;
|
|
typedef struct {
|
|
unsigned mant1:7;
|
|
unsigned exp:8;
|
|
unsigned sign:1;
|
|
unsigned mant2:16;
|
|
} nativefloat;
|
|
#define ISFRACTION(e) (128 - 4 <= (e) && (e) <= 128 + 15)
|
|
#define EXTRACTFRACTION(dp, fract) \
|
|
((fract) = ((1<<31)|((dp)->native.mant1<<16)|(dp)->native.mant2)) >> \
|
|
(128+16-(dp)->native.exp))
|
|
#define EXTRACTEXPONENT(dp, exponent) ((exponent) = (dp)->native.exp - 2)
|
|
/*
|
|
* Beware, these do not handle over/under-flow
|
|
* during conversion from ieee to native format.
|
|
*/
|
|
#define NATIVE2IEEEFLOAT(fp) { \
|
|
float_t t; \
|
|
if (t.ieee.exp = (fp)->native.exp) \
|
|
t.ieee.exp += -129 + 127; \
|
|
t.ieee.sign = (fp)->native.sign; \
|
|
t.ieee.mant = ((fp)->native.mant1<<16)|(fp)->native.mant2; \
|
|
*(fp) = t; \
|
|
}
|
|
#define IEEEFLOAT2NATIVE(fp) { \
|
|
float_t t; int v = (fp)->ieee.exp; \
|
|
if (v) v += -127 + 129; /* alter bias of exponent */\
|
|
t.native.exp = v; /* implicit truncation of exponent */\
|
|
t.native.sign = (fp)->ieee.sign; \
|
|
v = (fp)->ieee.mant; \
|
|
t.native.mant1 = v >> 16; \
|
|
t.native.mant2 = v;\
|
|
*(fp) = v; \
|
|
}
|
|
#define IEEEDOUBLE2NATIVE(dp) { \
|
|
double_t t; int v = (dp)->ieee.exp; \
|
|
if (v) v += -1023 + 129; /* if can alter bias of exponent */\
|
|
t.native.exp = v; /* implicit truncation of exponent */\
|
|
v = (dp)->ieee.mant; \
|
|
t.native.sign = (dp)->ieee.sign; \
|
|
t.native.mant1 = v >> 16; \
|
|
t.native.mant2 = v;\
|
|
t.native.mant3 = (dp)->mant2; \
|
|
*(dp) = t; \
|
|
}
|
|
|
|
#define TIFFSwabArrayOfFloat(fp,n) TIFFSwabArrayOfLong((unsigned long *)fp,n)
|
|
#define TIFFSwabArrayOfDouble(dp,n) TIFFSwabArrayOfLong((unsigned long *)dp,2*n)
|
|
#endif /* vax */
|
|
|
|
/*
|
|
* These unions are used during floating point
|
|
* conversions. The macros given above define
|
|
* the conversion operations.
|
|
*/
|
|
|
|
typedef struct ieeedouble {
|
|
#if BIGENDIAN == 1
|
|
#if !defined(_IBMR2)
|
|
unsigned sign:1;
|
|
unsigned exp:11;
|
|
unsigned long mant:20;
|
|
unsigned mant2;
|
|
#else /* _IBMR2 */
|
|
unsigned sign:1;
|
|
unsigned exp:11;
|
|
unsigned mant:20;
|
|
unsigned mant2;
|
|
#endif /* _IBMR2 */
|
|
#else
|
|
#if !defined(vax)
|
|
#ifdef INT_16_BIT /* MSDOS C compilers */
|
|
unsigned long mant2;
|
|
unsigned long mant:20;
|
|
unsigned long exp:11;
|
|
unsigned long sign:1;
|
|
#else /* 32 bit ints */
|
|
unsigned mant2;
|
|
unsigned long mant:20;
|
|
unsigned exp:11;
|
|
unsigned sign:1;
|
|
#endif /* 32 bit ints */
|
|
#else
|
|
unsigned long mant:20;
|
|
unsigned exp:11;
|
|
unsigned sign:1;
|
|
unsigned mant2;
|
|
#endif /* !vax */
|
|
#endif
|
|
} ieeedouble;
|
|
typedef struct ieeefloat {
|
|
#if BIGENDIAN == 1
|
|
#if !defined(_IBMR2)
|
|
unsigned sign:1;
|
|
unsigned exp:8;
|
|
unsigned long mant:23;
|
|
#else /* _IBMR2 */
|
|
unsigned sign:1;
|
|
unsigned exp:8;
|
|
unsigned mant:23;
|
|
#endif /* _IBMR2 */
|
|
#else
|
|
#ifdef INT_16_BIT /* MSDOS C compilers */
|
|
unsigned long mant:23;
|
|
unsigned long exp:8;
|
|
unsigned long sign:1;
|
|
#else /* 32 bit ints */
|
|
unsigned long mant:23;
|
|
unsigned exp:8;
|
|
unsigned sign:1;
|
|
#endif /* 32 bit ints */
|
|
#endif
|
|
} ieeefloat;
|
|
|
|
typedef union {
|
|
ieeedouble ieee;
|
|
nativedouble native;
|
|
char b[8];
|
|
double d;
|
|
} double_t;
|
|
|
|
typedef union {
|
|
ieeefloat ieee;
|
|
nativefloat native;
|
|
char b[4];
|
|
float f;
|
|
} float_t;
|
|
#endif /* _MACHDEP_ */
|