home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
mint
/
mntlib16.lzh
/
MNTLIB16
/
FLONUM.H
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-03
|
5KB
|
179 lines
#ifndef FLONUM_H
#define FLONUM_H
/* Defs and macros for floating point code. This stuff is heavily based
on Scott McCauley's code, except that this version works :-} */
/* These definitions work for machines where an SF value is
returned in the same register as an int. */
#ifndef SFVALUE
#define SFVALUE int
#endif
#ifndef INTIFY
#define INTIFY(FLOATVAL) (intify.f = (FLOATVAL), intify.i)
#endif
/* quasi-IEEE floating point number definitions */
struct bitfloat {
unsigned long sign : 1;
unsigned long exp : 8;
unsigned long mant : 23;
};
struct bitdouble {
unsigned long sign : 1;
unsigned long exp : 11;
unsigned long mant1 : 20;
unsigned long mant2;
};
union double_di {
double d;
long i[2];
};
union flt_or_int {
long i;
float f;
};
#ifdef WORDS_BIG_ENDIAN
# define HIGH 0
# define LOW 1
#else
# define HIGH 1
# define LOW 0
#endif
/*
* all float/double/long now coded in assembler, dont define anything
* below this line
*/
#if 0
/* start of symbolic asm definitions */
/* you may have to change the g's to d's if you start getting
illegal operands from as */
#define MUL(a, b) \
asm volatile ("mulu %2,%0" : "=d" (b) : "0" (b) , "g" (a))
#define DIV(a, b) \
asm volatile ("divu %2,%0" : "=d" (b) : "0" (b) , "g" (a))
#define SWAP(a) \
asm volatile ("swap %0" : "=r" (a) : "0" (a))
#define ASL2(r1, r2) { \
asm volatile ("asll #1,%0" : "=d" (r2) : "0" (r2)); \
asm volatile ("roxll #1,%0" : "=d" (r1) : "0" (r1)); \
}
#define ASL3(r1, r2, r3) { \
asm volatile ("asll #1,%0" : "=d" (r3) : "0" (r3)); \
asm volatile ("roxll #1,%0" : "=d" (r2) : "0" (r2)); \
asm volatile ("roxll #1,%0" : "=d" (r1) : "0" (r1)); \
}
#define ASR2(r1, r2) { \
asm volatile ("asrl #1,%0" : "=d" (r1) : "0" (r1)); \
asm volatile ("roxrl #1,%0" : "=d" (r2) : "0" (r2)); \
}
#define ASR3(r1, r2, r3) { \
asm volatile ("asrl #1,%0" : "=d" (r1) : "0" (r1)); \
asm volatile ("roxrl #1,%0" : "=d" (r2) : "0" (r2)); \
asm volatile ("roxrl #1,%0" : "=d" (r3) : "0" (r3)); \
}
#define ASR4(r1, r2, r3, r4) { \
asm volatile ("asrl #1,%0" : "=d" (r1) : "0" (r1)); \
asm volatile ("roxrl #1,%0" : "=d" (r2) : "0" (r2)); \
asm volatile ("roxrl #1,%0" : "=d" (r3) : "0" (r3)); \
asm volatile ("roxrl #1,%0" : "=d" (r4) : "0" (r4)); \
}
#define ADD2(r1, r2, r3, r4) { \
asm volatile ("addl %2,%0" : "=g" (r4) : "0" (r4) , "g" (r2)); \
asm volatile ("addxl %2,%0" : "=g" (r3) : "0" (r3) , "g" (r1)); \
}
/* y <- y - x */
#define SUB3(x1, x2, x3, y1, y2, y3) { \
asm volatile ("subl %2,%0" : "=g" (y3) : "0" (y3) , "d" (x3)); \
asm volatile ("subxl %2,%0" : "=g" (y2) : "0" (y2) , "d" (x2)); \
asm volatile ("subxl %2,%0" : "=g" (y1) : "0" (y1) , "d" (x1)); \
}
/* sub4 here is rather complex, as the compiler is overwhelmed by me wanting
to have 8 data registers allocated for mantissa accumulators. Help it out
by declaring a temp that it can move stuff in and out of. */
#define SUB4(x1, x2, x3, x4, y1, y2, y3, y4) { \
register long temp = y4; \
asm volatile ("subl %2,%0" : "=d" (temp) : "0" (temp) , "d" (x4)); \
y4 = temp; temp = y3; \
asm volatile ("subxl %2,%0" : "=d" (temp) : "0" (temp) , "d" (x3)); \
y3 = temp; temp = y2; \
asm volatile ("subxl %2,%0" : "=d" (temp) : "0" (temp) , "d" (x2)); \
y2 = temp; temp = y1; \
asm volatile ("subxl %2,%0" : "=d" (temp) : "0" (temp) , "d" (x1)); \
y1 = temp; \
}
#define NEG(r1, r2) { \
asm volatile ("negl %0" : "=d" (r2) : "0" (r2)); \
asm volatile ("negxl %0" : "=d" (r1) : "0" (r1)); \
}
/* switches for which routines to compile. All the single-float and
long-int arithmetic routines are turned off here, as they were all
done in assembly language last year. */
/*
#define L_umulsi3
#define L_mulsi3
#define L_udivsi3
#define L_divsi3
#define L_umodsi3
#define L_modsi3
#define L_lshrsi3
#define L_lshlsi3
#define L_ashrsi3
#define L_ashlsi3
*/
/* These are now in kai-uwe .s files
#define L_divdf3
#define L_muldf3
#define L_negdf2
#define L_adddf3
#define L_subdf3
#define L_cmpdf2
#define L_fixunsdfsi
#define L_floatsidf
*/
/*
these three are now in gnulib2 (were in dflonum.h pre gcc1.36)
#define L_fixunsdfdi
#define L_fixdfdi
#define L_floatdidf
#define L_addsf3
#define L_negsf2
#define L_subsf3
#define L_cmpsf2
#define L_mulsf3
#define L_divsf3
*/
/* These too are now in kai-uwe .s files
#define L_truncdfsf2
#define L_extendsfdf2
*/
#endif /* #if 0 */
#endif /* FLONUM_H */