00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef SOFT_FP_H
00035 #define SOFT_FP_H
00036
00037 #ifdef _LIBC
00038 #include <sfp-machine.h>
00039 #else
00040 #include "sfp-machine.h"
00041 #endif
00042
00043
00044 #ifndef __BYTE_ORDER
00045 #ifdef _LIBC
00046 #include <endian.h>
00047 #else
00048 #error "endianness not defined by sfp-machine.h"
00049 #endif
00050 #endif
00051
00052 #define _FP_WORKBITS 3
00053 #define _FP_WORK_LSB ((_FP_W_TYPE)1 << 3)
00054 #define _FP_WORK_ROUND ((_FP_W_TYPE)1 << 2)
00055 #define _FP_WORK_GUARD ((_FP_W_TYPE)1 << 1)
00056 #define _FP_WORK_STICKY ((_FP_W_TYPE)1 << 0)
00057
00058 #ifndef FP_RND_NEAREST
00059 # define FP_RND_NEAREST 0
00060 # define FP_RND_ZERO 1
00061 # define FP_RND_PINF 2
00062 # define FP_RND_MINF 3
00063 #endif
00064 #ifndef FP_ROUNDMODE
00065 # define FP_ROUNDMODE FP_RND_NEAREST
00066 #endif
00067
00068
00069 #ifndef FP_EX_INVALID
00070 #define FP_EX_INVALID 0
00071 #endif
00072 #ifndef FP_EX_OVERFLOW
00073 #define FP_EX_OVERFLOW 0
00074 #endif
00075 #ifndef FP_EX_UNDERFLOW
00076 #define FP_EX_UNDERFLOW 0
00077 #endif
00078 #ifndef FP_EX_DIVZERO
00079 #define FP_EX_DIVZERO 0
00080 #endif
00081 #ifndef FP_EX_INEXACT
00082 #define FP_EX_INEXACT 0
00083 #endif
00084 #ifndef FP_EX_DENORM
00085 #define FP_EX_DENORM 0
00086 #endif
00087
00088 #ifdef _FP_DECL_EX
00089 #define FP_DECL_EX \
00090 int _fex = 0; \
00091 _FP_DECL_EX
00092 #else
00093 #define FP_DECL_EX int _fex = 0
00094 #endif
00095
00096 #ifndef FP_INIT_ROUNDMODE
00097 #define FP_INIT_ROUNDMODE do {} while (0)
00098 #endif
00099
00100 #ifndef FP_HANDLE_EXCEPTIONS
00101 #define FP_HANDLE_EXCEPTIONS do {} while (0)
00102 #endif
00103
00104 #ifndef FP_INHIBIT_RESULTS
00105
00106
00107
00108
00109
00110 #define FP_INHIBIT_RESULTS 0
00111 #endif
00112
00113 #define FP_SET_EXCEPTION(ex) \
00114 _fex |= (ex)
00115
00116 #define FP_UNSET_EXCEPTION(ex) \
00117 _fex &= ~(ex)
00118
00119 #define FP_CLEAR_EXCEPTIONS \
00120 _fex = 0
00121
00122 #define _FP_ROUND_NEAREST(wc, X) \
00123 do { \
00124 if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND) \
00125 _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \
00126 } while (0)
00127
00128 #define _FP_ROUND_ZERO(wc, X) (void)0
00129
00130 #define _FP_ROUND_PINF(wc, X) \
00131 do { \
00132 if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
00133 _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
00134 } while (0)
00135
00136 #define _FP_ROUND_MINF(wc, X) \
00137 do { \
00138 if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \
00139 _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \
00140 } while (0)
00141
00142 #define _FP_ROUND(wc, X) \
00143 do { \
00144 if (_FP_FRAC_LOW_##wc(X) & 7) \
00145 FP_SET_EXCEPTION(FP_EX_INEXACT); \
00146 switch (FP_ROUNDMODE) \
00147 { \
00148 case FP_RND_NEAREST: \
00149 _FP_ROUND_NEAREST(wc,X); \
00150 break; \
00151 case FP_RND_ZERO: \
00152 _FP_ROUND_ZERO(wc,X); \
00153 break; \
00154 case FP_RND_PINF: \
00155 _FP_ROUND_PINF(wc,X); \
00156 break; \
00157 case FP_RND_MINF: \
00158 _FP_ROUND_MINF(wc,X); \
00159 break; \
00160 } \
00161 } while (0)
00162
00163 #define FP_CLS_NORMAL 0
00164 #define FP_CLS_ZERO 1
00165 #define FP_CLS_INF 2
00166 #define FP_CLS_NAN 3
00167
00168 #define _FP_CLS_COMBINE(x,y) (((x) << 2) | (y))
00169
00170 #include "op-1.h"
00171 #include "op-2.h"
00172 #include "op-4.h"
00173 #include "op-8.h"
00174 #include "op-common.h"
00175
00176
00177 #define UWtype _FP_W_TYPE
00178 #define W_TYPE_SIZE _FP_W_TYPE_SIZE
00179
00180 typedef int QItype __attribute__((mode(QI)));
00181 typedef int SItype __attribute__((mode(SI)));
00182 typedef int DItype __attribute__((mode(DI)));
00183 typedef unsigned int UQItype __attribute__((mode(QI)));
00184 typedef unsigned int USItype __attribute__((mode(SI)));
00185 typedef unsigned int UDItype __attribute__((mode(DI)));
00186 #if _FP_W_TYPE_SIZE == 32
00187 typedef unsigned int UHWtype __attribute__((mode(HI)));
00188 #elif _FP_W_TYPE_SIZE == 64
00189 typedef USItype UHWtype;
00190 #endif
00191
00192 #define SI_BITS (__CHAR_BIT__ * (int)sizeof(SItype))
00193 #define DI_BITS (__CHAR_BIT__ * (int)sizeof(DItype))
00194
00195 #ifndef umul_ppmm
00196 #ifdef _LIBC
00197 #include <stdlib/longlong.h>
00198 #else
00199 #include "longlong.h"
00200 #endif
00201 #endif
00202
00203 #ifdef _LIBC
00204 #include <stdlib.h>
00205 #else
00206 extern void abort (void);
00207 #endif
00208
00209 #endif