Home | History | Annotate | Line # | Download | only in or1k
      1 #define _FP_W_TYPE_SIZE		32
      2 #define _FP_W_TYPE		unsigned long
      3 #define _FP_WS_TYPE		signed long
      4 #define _FP_I_TYPE		long
      5 
      6 #define _FP_MUL_MEAT_S(R,X,Y)				\
      7   _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
      8 #define _FP_MUL_MEAT_D(R,X,Y)				\
      9   _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
     10 #define _FP_MUL_MEAT_Q(R,X,Y)				\
     11   _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
     12 
     13 #define _FP_DIV_MEAT_S(R,X,Y)	_FP_DIV_MEAT_1_loop(S,R,X,Y)
     14 #define _FP_DIV_MEAT_D(R,X,Y)	_FP_DIV_MEAT_2_udiv(D,R,X,Y)
     15 #define _FP_DIV_MEAT_Q(R,X,Y)	_FP_DIV_MEAT_4_udiv(Q,R,X,Y)
     16 
     17 #define _FP_NANFRAC_S		((_FP_QNANBIT_S << 1) - 1)
     18 #define _FP_NANFRAC_D		((_FP_QNANBIT_D << 1) - 1), -1
     19 #define _FP_NANFRAC_Q		((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
     20 #define _FP_NANSIGN_S		0
     21 #define _FP_NANSIGN_D		0
     22 #define _FP_NANSIGN_Q		0
     23 
     24 #define _FP_KEEPNANFRACP 1
     25 #define _FP_QNANNEGATEDP 0
     26 
     27 /* Someone please check this.  */
     28 #define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)			\
     29   do {								\
     30     if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)		\
     31 	&& !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))	\
     32       {								\
     33 	R##_s = Y##_s;						\
     34 	_FP_FRAC_COPY_##wc(R,Y);				\
     35       }								\
     36     else							\
     37       {								\
     38 	R##_s = X##_s;						\
     39 	_FP_FRAC_COPY_##wc(R,X);				\
     40       }								\
     41     R##_c = FP_CLS_NAN;						\
     42   } while (0)
     43 
     44 /* Handle getting and setting rounding mode for soft fp operations.  */
     45 
     46 #define FP_RND_NEAREST		(0x0 << 1)
     47 #define FP_RND_ZERO		(0x1 << 1)
     48 #define FP_RND_PINF		(0x2 << 1)
     49 #define FP_RND_MINF		(0x3 << 1)
     50 #define FP_RND_MASK		(0x3 << 1)
     51 
     52 #define FP_EX_OVERFLOW		1 << 3
     53 #define FP_EX_UNDERFLOW		1 << 4
     54 #define FP_EX_INEXACT		1 << 8
     55 #define FP_EX_INVALID		1 << 9
     56 #define FP_EX_DIVZERO		1 << 11
     57 #define FP_EX_ALL \
     58 	(FP_EX_INVALID | FP_EX_DIVZERO | FP_EX_OVERFLOW | FP_EX_UNDERFLOW \
     59 	 | FP_EX_INEXACT)
     60 
     61 #define _FP_DECL_EX \
     62   unsigned int _fpcsr __attribute__ ((unused)) = FP_RND_NEAREST
     63 
     64 #define FP_ROUNDMODE (_fpcsr & FP_RND_MASK)
     65 
     66 #ifdef __or1k_hard_float__
     67 #define FP_INIT_ROUNDMODE					\
     68 do {								\
     69   __asm__ volatile ("l.mfspr %0,r0,20" : "=r" (_fpcsr));	\
     70 } while (0)
     71 
     72 #define FP_HANDLE_EXCEPTIONS					\
     73 do {								\
     74   if (__builtin_expect (_fex, 0))				\
     75     {								\
     76       _fpcsr &= ~FP_EX_ALL;					\
     77       _fpcsr |= _fex;						\
     78       __asm__ volatile ("l.mtspr r0,%0,20" : : "r" (_fpcsr));	\
     79     }								\
     80 } while (0)
     81 #endif
     82 
     83 #define	__LITTLE_ENDIAN	1234
     84 #define	__BIG_ENDIAN	4321
     85 
     86 #define __BYTE_ORDER __BIG_ENDIAN
     87 
     88 #define _FP_TININESS_AFTER_ROUNDING 0
     89 
     90 /* Define ALIASNAME as a strong alias for NAME.  */
     91 # define strong_alias(name, aliasname) _strong_alias(name, aliasname)
     92 # define _strong_alias(name, aliasname) \
     93   extern __typeof (name) aliasname __attribute__ ((alias (#name)));
     94