#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 */