1 1.4 skrll /* $NetBSD: float.h,v 1.4 2009/01/27 11:49:54 skrll Exp $ */ 2 1.1 fredette 3 1.4 skrll /* $OpenBSD: float.h,v 1.7 2004/01/02 14:39:01 mickey Exp $ */ 4 1.1 fredette 5 1.1 fredette /* 6 1.1 fredette * Copyright 1996 1995 by Open Software Foundation, Inc. 7 1.1 fredette * All Rights Reserved 8 1.1 fredette * 9 1.1 fredette * Permission to use, copy, modify, and distribute this software and 10 1.1 fredette * its documentation for any purpose and without fee is hereby granted, 11 1.1 fredette * provided that the above copyright notice appears in all copies and 12 1.1 fredette * that both the copyright notice and this permission notice appear in 13 1.1 fredette * supporting documentation. 14 1.1 fredette * 15 1.1 fredette * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 16 1.1 fredette * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 17 1.1 fredette * FOR A PARTICULAR PURPOSE. 18 1.1 fredette * 19 1.1 fredette * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 20 1.1 fredette * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 21 1.1 fredette * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 22 1.1 fredette * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 23 1.1 fredette * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 24 1.1 fredette */ 25 1.1 fredette /* 26 1.1 fredette * pmk1.1 27 1.1 fredette */ 28 1.1 fredette /* 29 1.1 fredette * (c) Copyright 1986 HEWLETT-PACKARD COMPANY 30 1.1 fredette * 31 1.1 fredette * To anyone who acknowledges that this file is provided "AS IS" 32 1.1 fredette * without any express or implied warranty: 33 1.1 fredette * permission to use, copy, modify, and distribute this file 34 1.1 fredette * for any purpose is hereby granted without fee, provided that 35 1.1 fredette * the above copyright notice and this notice appears in all 36 1.1 fredette * copies, and that the name of Hewlett-Packard Company not be 37 1.1 fredette * used in advertising or publicity pertaining to distribution 38 1.1 fredette * of the software without specific, written prior permission. 39 1.1 fredette * Hewlett-Packard Company makes no representations about the 40 1.1 fredette * suitability of this software for any purpose. 41 1.1 fredette */ 42 1.1 fredette 43 1.2 chs #include <sys/types.h> 44 1.1 fredette #include <machine/float.h> 45 1.1 fredette 46 1.1 fredette #include "../spmath/fpbits.h" 47 1.1 fredette #include "../spmath/hppa.h" 48 1.1 fredette 49 1.1 fredette /* 50 1.1 fredette * Declare the basic structures for the 3 different 51 1.1 fredette * floating-point precisions. 52 1.1 fredette * 53 1.1 fredette * Single number 54 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 55 1.1 fredette * |s| exp | mantissa | 56 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 57 1.1 fredette */ 58 1.1 fredette #define Sall(object) (object) 59 1.1 fredette #define Ssign(object) Bitfield_extract( 0, 1,object) 60 1.1 fredette #define Ssignedsign(object) Bitfield_signed_extract( 0, 1,object) 61 1.1 fredette #define Sexponent(object) Bitfield_extract( 1, 8,object) 62 1.1 fredette #define Smantissa(object) Bitfield_mask( 9, 23,object) 63 1.1 fredette #define Ssignaling(object) Bitfield_extract( 9, 1,object) 64 1.1 fredette #define Ssignalingnan(object) Bitfield_extract( 1, 9,object) 65 1.1 fredette #define Shigh2mantissa(object) Bitfield_extract( 9, 2,object) 66 1.1 fredette #define Sexponentmantissa(object) Bitfield_mask( 1, 31,object) 67 1.1 fredette #define Ssignexponent(object) Bitfield_extract( 0, 9,object) 68 1.1 fredette #define Shidden(object) Bitfield_extract( 8, 1,object) 69 1.1 fredette #define Shiddenoverflow(object) Bitfield_extract( 7, 1,object) 70 1.1 fredette #define Shiddenhigh7mantissa(object) Bitfield_extract( 8, 8,object) 71 1.1 fredette #define Shiddenhigh3mantissa(object) Bitfield_extract( 8, 4,object) 72 1.1 fredette #define Slow(object) Bitfield_mask( 31, 1,object) 73 1.1 fredette #define Slow4(object) Bitfield_mask( 28, 4,object) 74 1.1 fredette #define Slow31(object) Bitfield_mask( 1, 31,object) 75 1.1 fredette #define Shigh31(object) Bitfield_extract( 0, 31,object) 76 1.1 fredette #define Ssignedhigh31(object) Bitfield_signed_extract( 0, 31,object) 77 1.1 fredette #define Shigh4(object) Bitfield_extract( 0, 4,object) 78 1.1 fredette #define Sbit24(object) Bitfield_extract( 24, 1,object) 79 1.1 fredette #define Sbit28(object) Bitfield_extract( 28, 1,object) 80 1.1 fredette #define Sbit29(object) Bitfield_extract( 29, 1,object) 81 1.1 fredette #define Sbit30(object) Bitfield_extract( 30, 1,object) 82 1.1 fredette #define Sbit31(object) Bitfield_mask( 31, 1,object) 83 1.1 fredette 84 1.1 fredette #define Deposit_ssign(object,value) Bitfield_deposit(value,0,1,object) 85 1.1 fredette #define Deposit_sexponent(object,value) Bitfield_deposit(value,1,8,object) 86 1.1 fredette #define Deposit_smantissa(object,value) Bitfield_deposit(value,9,23,object) 87 1.1 fredette #define Deposit_shigh2mantissa(object,value) Bitfield_deposit(value,9,2,object) 88 1.1 fredette #define Deposit_sexponentmantissa(object,value) \ 89 1.1 fredette Bitfield_deposit(value,1,31,object) 90 1.1 fredette #define Deposit_ssignexponent(object,value) Bitfield_deposit(value,0,9,object) 91 1.1 fredette #define Deposit_slow(object,value) Bitfield_deposit(value,31,1,object) 92 1.1 fredette #define Deposit_shigh4(object,value) Bitfield_deposit(value,0,4,object) 93 1.1 fredette 94 1.1 fredette #define Is_ssign(object) Bitfield_mask( 0, 1,object) 95 1.1 fredette #define Is_ssignaling(object) Bitfield_mask( 9, 1,object) 96 1.1 fredette #define Is_shidden(object) Bitfield_mask( 8, 1,object) 97 1.1 fredette #define Is_shiddenoverflow(object) Bitfield_mask( 7, 1,object) 98 1.1 fredette #define Is_slow(object) Bitfield_mask( 31, 1,object) 99 1.1 fredette #define Is_sbit24(object) Bitfield_mask( 24, 1,object) 100 1.1 fredette #define Is_sbit28(object) Bitfield_mask( 28, 1,object) 101 1.1 fredette #define Is_sbit29(object) Bitfield_mask( 29, 1,object) 102 1.1 fredette #define Is_sbit30(object) Bitfield_mask( 30, 1,object) 103 1.1 fredette #define Is_sbit31(object) Bitfield_mask( 31, 1,object) 104 1.1 fredette 105 1.1 fredette /* 106 1.1 fredette * Double number. 107 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 108 1.1 fredette * |s| exponent | mantissa part 1 | 109 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 110 1.1 fredette * 111 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 112 1.1 fredette * | mantissa part 2 | 113 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 114 1.1 fredette */ 115 1.1 fredette #define Dallp1(object) (object) 116 1.1 fredette #define Dsign(object) Bitfield_extract( 0, 1,object) 117 1.1 fredette #define Dsignedsign(object) Bitfield_signed_extract( 0, 1,object) 118 1.1 fredette #define Dexponent(object) Bitfield_extract( 1, 11,object) 119 1.1 fredette #define Dmantissap1(object) Bitfield_mask( 12, 20,object) 120 1.1 fredette #define Dsignaling(object) Bitfield_extract( 12, 1,object) 121 1.1 fredette #define Dsignalingnan(object) Bitfield_extract( 1, 12,object) 122 1.1 fredette #define Dhigh2mantissa(object) Bitfield_extract( 12, 2,object) 123 1.1 fredette #define Dexponentmantissap1(object) Bitfield_mask( 1, 31,object) 124 1.1 fredette #define Dsignexponent(object) Bitfield_extract( 0, 12,object) 125 1.1 fredette #define Dhidden(object) Bitfield_extract( 11, 1,object) 126 1.1 fredette #define Dhiddenoverflow(object) Bitfield_extract( 10, 1,object) 127 1.1 fredette #define Dhiddenhigh7mantissa(object) Bitfield_extract( 11, 8,object) 128 1.1 fredette #define Dhiddenhigh3mantissa(object) Bitfield_extract( 11, 4,object) 129 1.1 fredette #define Dlowp1(object) Bitfield_mask( 31, 1,object) 130 1.1 fredette #define Dlow31p1(object) Bitfield_mask( 1, 31,object) 131 1.1 fredette #define Dhighp1(object) Bitfield_extract( 0, 1,object) 132 1.1 fredette #define Dhigh4p1(object) Bitfield_extract( 0, 4,object) 133 1.1 fredette #define Dhigh31p1(object) Bitfield_extract( 0, 31,object) 134 1.1 fredette #define Dsignedhigh31p1(object) Bitfield_signed_extract( 0, 31,object) 135 1.1 fredette #define Dbit3p1(object) Bitfield_extract( 3, 1,object) 136 1.1 fredette 137 1.1 fredette #define Deposit_dsign(object,value) Bitfield_deposit(value,0,1,object) 138 1.1 fredette #define Deposit_dexponent(object,value) Bitfield_deposit(value,1,11,object) 139 1.1 fredette #define Deposit_dmantissap1(object,value) Bitfield_deposit(value,12,20,object) 140 1.1 fredette #define Deposit_dhigh2mantissa(object,value) Bitfield_deposit(value,12,2,object) 141 1.1 fredette #define Deposit_dexponentmantissap1(object,value) \ 142 1.1 fredette Bitfield_deposit(value,1,31,object) 143 1.1 fredette #define Deposit_dsignexponent(object,value) Bitfield_deposit(value,0,12,object) 144 1.1 fredette #define Deposit_dlowp1(object,value) Bitfield_deposit(value,31,1,object) 145 1.1 fredette #define Deposit_dhigh4p1(object,value) Bitfield_deposit(value,0,4,object) 146 1.1 fredette 147 1.1 fredette #define Is_dsign(object) Bitfield_mask( 0, 1,object) 148 1.1 fredette #define Is_dsignaling(object) Bitfield_mask( 12, 1,object) 149 1.1 fredette #define Is_dhidden(object) Bitfield_mask( 11, 1,object) 150 1.1 fredette #define Is_dhiddenoverflow(object) Bitfield_mask( 10, 1,object) 151 1.1 fredette #define Is_dlowp1(object) Bitfield_mask( 31, 1,object) 152 1.1 fredette #define Is_dhighp1(object) Bitfield_mask( 0, 1,object) 153 1.1 fredette #define Is_dbit3p1(object) Bitfield_mask( 3, 1,object) 154 1.1 fredette 155 1.1 fredette #define Dallp2(object) (object) 156 1.1 fredette #define Dmantissap2(object) (object) 157 1.1 fredette #define Dlowp2(object) Bitfield_mask( 31, 1,object) 158 1.1 fredette #define Dlow4p2(object) Bitfield_mask( 28, 4,object) 159 1.1 fredette #define Dlow31p2(object) Bitfield_mask( 1, 31,object) 160 1.1 fredette #define Dhighp2(object) Bitfield_extract( 0, 1,object) 161 1.1 fredette #define Dhigh31p2(object) Bitfield_extract( 0, 31,object) 162 1.1 fredette #define Dbit2p2(object) Bitfield_extract( 2, 1,object) 163 1.1 fredette #define Dbit3p2(object) Bitfield_extract( 3, 1,object) 164 1.1 fredette #define Dbit21p2(object) Bitfield_extract( 21, 1,object) 165 1.1 fredette #define Dbit28p2(object) Bitfield_extract( 28, 1,object) 166 1.1 fredette #define Dbit29p2(object) Bitfield_extract( 29, 1,object) 167 1.1 fredette #define Dbit30p2(object) Bitfield_extract( 30, 1,object) 168 1.1 fredette #define Dbit31p2(object) Bitfield_mask( 31, 1,object) 169 1.1 fredette 170 1.1 fredette #define Deposit_dlowp2(object,value) Bitfield_deposit(value,31,1,object) 171 1.1 fredette 172 1.1 fredette #define Is_dlowp2(object) Bitfield_mask( 31, 1,object) 173 1.1 fredette #define Is_dhighp2(object) Bitfield_mask( 0, 1,object) 174 1.1 fredette #define Is_dbit2p2(object) Bitfield_mask( 2, 1,object) 175 1.1 fredette #define Is_dbit3p2(object) Bitfield_mask( 3, 1,object) 176 1.1 fredette #define Is_dbit21p2(object) Bitfield_mask( 21, 1,object) 177 1.1 fredette #define Is_dbit28p2(object) Bitfield_mask( 28, 1,object) 178 1.1 fredette #define Is_dbit29p2(object) Bitfield_mask( 29, 1,object) 179 1.1 fredette #define Is_dbit30p2(object) Bitfield_mask( 30, 1,object) 180 1.1 fredette #define Is_dbit31p2(object) Bitfield_mask( 31, 1,object) 181 1.1 fredette 182 1.1 fredette /* 183 1.1 fredette * Quad number. 184 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 185 1.1 fredette * |s| exponent | mantissa part 1 | 186 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 187 1.1 fredette * 188 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 189 1.1 fredette * | mantissa part 2 | 190 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 191 1.1 fredette * 192 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 193 1.1 fredette * | mantissa part 3 | 194 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 195 1.1 fredette * 196 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 197 1.1 fredette * | mantissa part 4 | 198 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 199 1.1 fredette */ 200 1.1 fredette typedef struct 201 1.1 fredette { 202 1.1 fredette union 203 1.1 fredette { 204 1.1 fredette struct { unsigned qallp1; } u_qallp1; 205 1.1 fredette /* Not needed for now... 206 1.1 fredette Bitfield_extract( 0, 1,u_qsign,qsign) 207 1.1 fredette Bitfield_signed_extract( 0, 1,u_qsignedsign,qsignedsign) 208 1.1 fredette Bitfield_extract( 1, 15,u_qexponent,qexponent) 209 1.1 fredette Bitfield_extract(16, 16,u_qmantissap1,qmantissap1) 210 1.1 fredette Bitfield_extract(16, 1,u_qsignaling,qsignaling) 211 1.1 fredette Bitfield_extract(1, 16,u_qsignalingnan,qsignalingnan) 212 1.1 fredette Bitfield_extract(16, 2,u_qhigh2mantissa,qhigh2mantissa) 213 1.1 fredette Bitfield_extract( 1, 31,u_qexponentmantissap1,qexponentmantissap1) 214 1.1 fredette Bitfield_extract( 0, 16,u_qsignexponent,qsignexponent) 215 1.1 fredette Bitfield_extract(15, 1,u_qhidden,qhidden) 216 1.1 fredette Bitfield_extract(14, 1,u_qhiddenoverflow,qhiddenoverflow) 217 1.1 fredette Bitfield_extract(15, 8,u_qhiddenhigh7mantissa,qhiddenhigh7mantissa) 218 1.1 fredette Bitfield_extract(15, 4,u_qhiddenhigh3mantissa,qhiddenhigh3mantissa) 219 1.1 fredette Bitfield_extract(31, 1,u_qlowp1,qlowp1) 220 1.1 fredette Bitfield_extract( 1, 31,u_qlow31p1,qlow31p1) 221 1.1 fredette Bitfield_extract( 0, 1,u_qhighp1,qhighp1) 222 1.1 fredette Bitfield_extract( 0, 4,u_qhigh4p1,qhigh4p1) 223 1.1 fredette Bitfield_extract( 0, 31,u_qhigh31p1,qhigh31p1) 224 1.1 fredette */ 225 1.1 fredette } quad_u1; 226 1.1 fredette union 227 1.1 fredette { 228 1.1 fredette struct { unsigned qallp2; } u_qallp2; 229 1.1 fredette /* Not needed for now... 230 1.1 fredette Bitfield_extract(31, 1,u_qlowp2,qlowp2) 231 1.1 fredette Bitfield_extract( 1, 31,u_qlow31p2,qlow31p2) 232 1.1 fredette Bitfield_extract( 0, 1,u_qhighp2,qhighp2) 233 1.1 fredette Bitfield_extract( 0, 31,u_qhigh31p2,qhigh31p2) 234 1.1 fredette */ 235 1.1 fredette } quad_u2; 236 1.1 fredette union 237 1.1 fredette { 238 1.1 fredette struct { unsigned qallp3; } u_qallp3; 239 1.1 fredette /* Not needed for now... 240 1.1 fredette Bitfield_extract(31, 1,u_qlowp3,qlowp3) 241 1.1 fredette Bitfield_extract( 1, 31,u_qlow31p3,qlow31p3) 242 1.1 fredette Bitfield_extract( 0, 1,u_qhighp3,qhighp3) 243 1.1 fredette Bitfield_extract( 0, 31,u_qhigh31p3,qhigh31p3) 244 1.1 fredette */ 245 1.1 fredette } quad_u3; 246 1.1 fredette union 247 1.1 fredette { 248 1.1 fredette struct { unsigned qallp4; } u_qallp4; 249 1.1 fredette /* Not need for now... 250 1.1 fredette Bitfield_extract(31, 1,u_qlowp4,qlowp4) 251 1.1 fredette Bitfield_extract( 1, 31,u_qlow31p4,qlow31p4) 252 1.1 fredette Bitfield_extract( 0, 1,u_qhighp4,qhighp4) 253 1.1 fredette Bitfield_extract( 0, 31,u_qhigh31p4,qhigh31p4) 254 1.1 fredette */ 255 1.1 fredette } quad_u4; 256 1.1 fredette } quad_floating_point; 257 1.1 fredette 258 1.1 fredette /* Extension - An additional structure to hold the guard, round and 259 1.1 fredette * sticky bits during computations. 260 1.1 fredette */ 261 1.1 fredette #define Extall(object) (object) 262 1.1 fredette #define Extsign(object) Bitfield_extract( 0, 1,object) 263 1.1 fredette #define Exthigh31(object) Bitfield_extract( 0, 31,object) 264 1.1 fredette #define Extlow31(object) Bitfield_extract( 1, 31,object) 265 1.1 fredette #define Extlow(object) Bitfield_extract( 31, 1,object) 266 1.1 fredette 267 1.1 fredette /* 268 1.1 fredette * Declare the basic structures for the 3 different 269 1.1 fredette * fixed-point precisions. 270 1.1 fredette * 271 1.1 fredette * Single number 272 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 273 1.1 fredette * |s| integer | 274 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 275 1.1 fredette */ 276 1.1 fredette typedef int sgl_integer; 277 1.1 fredette 278 1.1 fredette /* 279 1.1 fredette * Double number. 280 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 281 1.1 fredette * |s| high integer | 282 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 283 1.1 fredette * 284 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 285 1.1 fredette * | low integer | 286 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 287 1.1 fredette */ 288 1.1 fredette struct dint { 289 1.1 fredette int wd0; 290 1.1 fredette unsigned int wd1; 291 1.1 fredette }; 292 1.1 fredette 293 1.1 fredette struct dblwd { 294 1.1 fredette unsigned int wd0; 295 1.1 fredette unsigned int wd1; 296 1.1 fredette }; 297 1.1 fredette 298 1.1 fredette /* 299 1.1 fredette * Quad number. 300 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 301 1.1 fredette * |s| integer part1 | 302 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 303 1.1 fredette * 304 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 305 1.1 fredette * | integer part 2 | 306 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 307 1.1 fredette * 308 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 309 1.1 fredette * | integer part 3 | 310 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 311 1.1 fredette * 312 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 313 1.1 fredette * | integer part 4 | 314 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 315 1.1 fredette */ 316 1.1 fredette 317 1.1 fredette struct quadwd { 318 1.1 fredette int wd0; 319 1.1 fredette unsigned int wd1; 320 1.1 fredette unsigned int wd2; 321 1.1 fredette unsigned int wd3; 322 1.1 fredette }; 323 1.1 fredette 324 1.1 fredette typedef struct quadwd quad_integer; 325 1.1 fredette 326 1.1 fredette 327 1.1 fredette /* useful typedefs */ 328 1.1 fredette typedef int sgl_floating_point; 329 1.1 fredette typedef struct dblwd dbl_floating_point; 330 1.1 fredette typedef struct dint dbl_integer; 331 1.1 fredette 332 1.1 fredette /* 333 1.1 fredette * Define the different precisions' parameters. 334 1.1 fredette */ 335 1.1 fredette #define SGL_BITLENGTH 32 336 1.4 skrll #define SGL_EMAX 127 337 1.1 fredette #define SGL_BIAS 127 338 1.1 fredette #define SGL_WRAP 192 339 1.4 skrll #define SGL_INFINITY_EXPONENT (SGL_EMAX+SGL_BIAS+1) 340 1.1 fredette #define SGL_THRESHOLD 32 341 1.1 fredette #define SGL_EXP_LENGTH 8 342 1.1 fredette #define SGL_P 24 343 1.1 fredette 344 1.1 fredette #define DBL_BITLENGTH 64 345 1.4 skrll #define DBL_EMAX 1023 346 1.1 fredette #define DBL_BIAS 1023 347 1.1 fredette #define DBL_WRAP 1536 348 1.4 skrll #define DBL_INFINITY_EXPONENT (DBL_EMAX+DBL_BIAS+1) 349 1.1 fredette #define DBL_THRESHOLD 64 350 1.1 fredette #define DBL_EXP_LENGTH 11 351 1.1 fredette #define DBL_P 53 352 1.1 fredette 353 1.1 fredette #define QUAD_BITLENGTH 128 354 1.4 skrll #define QUAD_EMAX 16383 355 1.1 fredette #define QUAD_BIAS 16383 356 1.1 fredette #define QUAD_WRAP 24576 357 1.4 skrll #define QUAD_INFINITY_EXPONENT (QUAD_EMAX+QUAD_BIAS+1) 358 1.1 fredette #define QUAD_P 113 359 1.1 fredette 360 1.1 fredette /* Boolean Values etc. */ 361 1.1 fredette #define NOT ! 362 1.1 fredette #define XOR ^ 363 1.1 fredette 364 1.1 fredette /* Declare status register equivalent to FPUs architecture. 365 1.1 fredette * 366 1.1 fredette * 0 1 2 3 4 5 6 7 8 910 1 2 3 4 5 6 7 8 920 1 2 3 4 5 6 7 8 930 1 367 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 368 1.1 fredette * |V|Z|O|U|I|C| rsv | model | version |RM |rsv|T|r|V|Z|O|U|I| 369 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 370 1.1 fredette */ 371 1.1 fredette #define Cbit(object) Bitfield_extract( 5, 1,object) 372 1.1 fredette #define Tbit(object) Bitfield_extract( 25, 1,object) 373 1.1 fredette #define Roundingmode(object) Bitfield_extract( 21, 2,object) 374 1.1 fredette #define Invalidtrap(object) Bitfield_extract( 27, 1,object) 375 1.1 fredette #define Divisionbyzerotrap(object) Bitfield_extract( 28, 1,object) 376 1.1 fredette #define Overflowtrap(object) Bitfield_extract( 29, 1,object) 377 1.1 fredette #define Underflowtrap(object) Bitfield_extract( 30, 1,object) 378 1.1 fredette #define Inexacttrap(object) Bitfield_extract( 31, 1,object) 379 1.1 fredette #define Invalidflag(object) Bitfield_extract( 0, 1,object) 380 1.1 fredette #define Divisionbyzeroflag(object) Bitfield_extract( 1, 1,object) 381 1.1 fredette #define Overflowflag(object) Bitfield_extract( 2, 1,object) 382 1.1 fredette #define Underflowflag(object) Bitfield_extract( 3, 1,object) 383 1.1 fredette #define Inexactflag(object) Bitfield_extract( 4, 1,object) 384 1.1 fredette #define Allflags(object) Bitfield_extract( 0, 5,object) 385 1.1 fredette 386 1.1 fredette /* Definitions relevant to the status register */ 387 1.1 fredette 388 1.1 fredette /* Rounding Modes */ 389 1.1 fredette #define ROUNDNEAREST 0 390 1.1 fredette #define ROUNDZERO 1 391 1.1 fredette #define ROUNDPLUS 2 392 1.1 fredette #define ROUNDMINUS 3 393 1.1 fredette 394 1.1 fredette /* Exceptions */ 395 1.1 fredette #define NOEXCEPTION 0x0 396 1.1 fredette #define INVALIDEXCEPTION 0x20 397 1.1 fredette #define DIVISIONBYZEROEXCEPTION 0x10 398 1.1 fredette #define OVERFLOWEXCEPTION 0x08 399 1.1 fredette #define UNDERFLOWEXCEPTION 0x04 400 1.1 fredette #define INEXACTEXCEPTION 0x02 401 1.1 fredette #define UNIMPLEMENTEDEXCEPTION 0x01 402 1.1 fredette 403 1.1 fredette /* Declare exception registers equivalent to FPUs architecture 404 1.1 fredette * 405 1.1 fredette * 0 1 2 3 4 5 6 7 8 910 1 2 3 4 5 6 7 8 920 1 2 3 4 5 6 7 8 930 1 406 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 407 1.1 fredette * |excepttype | r1 | r2/ext | operation |parm |n| t/cond | 408 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 409 1.1 fredette */ 410 1.1 fredette #define Allexception(object) (object) 411 1.1 fredette #define Exceptiontype(object) Bitfield_extract( 0, 6,object) 412 1.1 fredette #define Instructionfield(object) Bitfield_mask( 6,26,object) 413 1.1 fredette #define Parmfield(object) Bitfield_extract( 23, 3,object) 414 1.1 fredette #define Rabit(object) Bitfield_extract( 24, 1,object) 415 1.1 fredette #define Ibit(object) Bitfield_extract( 25, 1,object) 416 1.1 fredette 417 1.1 fredette #define Set_exceptiontype(object,value) Bitfield_deposit(value, 0, 6,object) 418 1.1 fredette #define Set_parmfield(object,value) Bitfield_deposit(value, 23, 3,object) 419 1.1 fredette #define Set_exceptiontype_and_instr_field(exception,instruction,object) \ 420 1.1 fredette object = ((exception) << 26) | (instruction) 421 1.1 fredette 422 1.1 fredette /* Declare the condition field 423 1.1 fredette * 424 1.1 fredette * 0 1 2 3 4 5 6 7 8 910 1 2 3 4 5 6 7 8 920 1 2 3 4 5 6 7 8 930 1 425 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 426 1.1 fredette * | |G|L|E|U|X| 427 1.1 fredette * +-------+-------+-------+-------+-------+-------+-------+-------+ 428 1.1 fredette */ 429 1.1 fredette #define Allexception(object) (object) 430 1.1 fredette #define Greaterthanbit(object) Bitfield_extract( 27, 1,object) 431 1.1 fredette #define Lessthanbit(object) Bitfield_extract( 28, 1,object) 432 1.1 fredette #define Equalbit(object) Bitfield_extract( 29, 1,object) 433 1.1 fredette #define Unorderedbit(object) Bitfield_extract( 30, 1,object) 434 1.1 fredette #define Exceptionbit(object) Bitfield_extract( 31, 1,object) 435 1.1 fredette 436 1.1 fredette /* An alias name for the status register */ 437 1.1 fredette #define Fpustatus_register (*status) 438 1.1 fredette 439 1.1 fredette /************************************************** 440 1.1 fredette * Status register referencing and manipulation. * 441 1.1 fredette **************************************************/ 442 1.1 fredette 443 1.1 fredette /* Rounding mode */ 444 1.1 fredette #define Rounding_mode() Roundingmode(Fpustatus_register) 445 1.1 fredette #define Is_rounding_mode(rmode) \ 446 1.1 fredette (Roundingmode(Fpustatus_register) == rmode) 447 1.1 fredette #define Set_rounding_mode(value) \ 448 1.1 fredette Bitfield_deposit(value,21,2,Fpustatus_register) 449 1.1 fredette 450 1.1 fredette /* Boolean testing of the trap enable bits */ 451 1.1 fredette #define Is_invalidtrap_enabled() Invalidtrap(Fpustatus_register) 452 1.1 fredette #define Is_divisionbyzerotrap_enabled() Divisionbyzerotrap(Fpustatus_register) 453 1.1 fredette #define Is_overflowtrap_enabled() Overflowtrap(Fpustatus_register) 454 1.1 fredette #define Is_underflowtrap_enabled() Underflowtrap(Fpustatus_register) 455 1.1 fredette #define Is_inexacttrap_enabled() Inexacttrap(Fpustatus_register) 456 1.1 fredette 457 1.1 fredette /* Set the indicated flags in the status register */ 458 1.1 fredette #define Set_invalidflag() Bitfield_deposit(1,0,1,Fpustatus_register) 459 1.1 fredette #define Set_divisionbyzeroflag() Bitfield_deposit(1,1,1,Fpustatus_register) 460 1.1 fredette #define Set_overflowflag() Bitfield_deposit(1,2,1,Fpustatus_register) 461 1.1 fredette #define Set_underflowflag() Bitfield_deposit(1,3,1,Fpustatus_register) 462 1.1 fredette #define Set_inexactflag() Bitfield_deposit(1,4,1,Fpustatus_register) 463 1.1 fredette 464 1.1 fredette #define Clear_all_flags() Bitfield_deposit(0,0,5,Fpustatus_register) 465 1.1 fredette 466 1.1 fredette /* Manipulate the trap and condition code bits (tbit and cbit) */ 467 1.1 fredette #define Set_tbit() Bitfield_deposit(1,25,1,Fpustatus_register) 468 1.1 fredette #define Clear_tbit() Bitfield_deposit(0,25,1,Fpustatus_register) 469 1.1 fredette #define Is_tbit_set() Tbit(Fpustatus_register) 470 1.1 fredette #define Is_cbit_set() Cbit(Fpustatus_register) 471 1.1 fredette 472 1.1 fredette #ifdef TIMEX 473 1.1 fredette #define Set_status_cbit(value) \ 474 1.1 fredette Bitfield_deposit(Bitfield_extract(10,10,Fpustatus_register),11,10,Fpustatus_register); \ 475 1.1 fredette Bitfield_deposit(Bitfield_extract(5,1,Fpustatus_register),10,1,Fpustatus_register); \ 476 1.1 fredette Bitfield_deposit(value,5,1,Fpustatus_register) 477 1.1 fredette #else 478 1.1 fredette #define Set_status_cbit(value) Bitfield_deposit(value,5,1,Fpustatus_register) 479 1.1 fredette #endif 480 1.1 fredette 481 1.1 fredette /******************************* 482 1.1 fredette * Condition field referencing * 483 1.1 fredette *******************************/ 484 1.1 fredette #define Unordered(cond) Unorderedbit(cond) 485 1.1 fredette #define Equal(cond) Equalbit(cond) 486 1.1 fredette #define Lessthan(cond) Lessthanbit(cond) 487 1.1 fredette #define Greaterthan(cond) Greaterthanbit(cond) 488 1.1 fredette #define Exception(cond) Exceptionbit(cond) 489 1.1 fredette 490 1.1 fredette 491 1.1 fredette /* Defines for the extension */ 492 1.1 fredette #define Ext_isone_sign(extent) (Extsign(extent)) 493 1.1 fredette #define Ext_isnotzero(extent) \ 494 1.1 fredette (Extall(extent)) 495 1.1 fredette #define Ext_isnotzero_lower(extent) \ 496 1.1 fredette (Extlow31(extent)) 497 1.1 fredette #define Ext_leftshiftby1(extent) \ 498 1.1 fredette Extall(extent) <<= 1 499 1.1 fredette #define Ext_negate(extent) \ 500 1.1 fredette (int )Extall(extent) = 0 - (int )Extall(extent) 501 1.1 fredette #define Ext_setone_low(extent) Bitfield_deposit(1,31,1,extent) 502 1.1 fredette 503