Home | History | Annotate | Line # | Download | only in spmath
      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