xref: /openbsd-src/sys/arch/hppa/spmath/float.h (revision fd3fab60e412c0169fc77b801f774fbd6f347b59)
1*fd3fab60Sderaadt /*	$OpenBSD: float.h,v 1.8 2012/06/25 16:55:13 deraadt Exp $	*/
28a472b3eSmickey /*
3c2feb252Smickey   (c) Copyright 1986 HEWLETT-PACKARD COMPANY
4c2feb252Smickey   To anyone who acknowledges that this file is provided "AS IS"
5c2feb252Smickey   without any express or implied warranty:
6c2feb252Smickey       permission to use, copy, modify, and distribute this file
7c2feb252Smickey   for any purpose is hereby granted without fee, provided that
8c2feb252Smickey   the above copyright notice and this notice appears in all
9c2feb252Smickey   copies, and that the name of Hewlett-Packard Company not be
10c2feb252Smickey   used in advertising or publicity pertaining to distribution
11c2feb252Smickey   of the software without specific, written prior permission.
12c2feb252Smickey   Hewlett-Packard Company makes no representations about the
13c2feb252Smickey   suitability of this software for any purpose.
148a472b3eSmickey */
15c2feb252Smickey /* @(#)float.h: Revision: 2.14.88.2 Date: 93/12/08 13:27:42 */
16271fd23cSmickey 
17c2feb252Smickey #include "fpbits.h"
18c2feb252Smickey #include "hppa.h"
198a472b3eSmickey 
208a472b3eSmickey /*
218a472b3eSmickey  * Declare the basic structures for the 3 different
228a472b3eSmickey  * floating-point precisions.
238a472b3eSmickey  *
248a472b3eSmickey  * Single number
258a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
268a472b3eSmickey  * |s|       exp     |               mantissa                      |
278a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
288a472b3eSmickey  */
298a472b3eSmickey #define	Sall(object) (object)
308a472b3eSmickey #define	Ssign(object) Bitfield_extract( 0,  1,object)
318a472b3eSmickey #define	Ssignedsign(object) Bitfield_signed_extract( 0,  1,object)
328a472b3eSmickey #define	Sexponent(object) Bitfield_extract( 1,  8,object)
338a472b3eSmickey #define	Smantissa(object) Bitfield_mask( 9, 23,object)
348a472b3eSmickey #define	Ssignaling(object) Bitfield_extract( 9,  1,object)
358a472b3eSmickey #define	Ssignalingnan(object) Bitfield_extract( 1,  9,object)
368a472b3eSmickey #define	Shigh2mantissa(object) Bitfield_extract( 9,  2,object)
378a472b3eSmickey #define	Sexponentmantissa(object) Bitfield_mask( 1, 31,object)
388a472b3eSmickey #define	Ssignexponent(object) Bitfield_extract( 0,  9,object)
398a472b3eSmickey #define	Shidden(object) Bitfield_extract( 8,  1,object)
408a472b3eSmickey #define	Shiddenoverflow(object) Bitfield_extract( 7,  1,object)
418a472b3eSmickey #define	Shiddenhigh7mantissa(object) Bitfield_extract( 8,  8,object)
428a472b3eSmickey #define	Shiddenhigh3mantissa(object) Bitfield_extract( 8,  4,object)
438a472b3eSmickey #define	Slow(object) Bitfield_mask( 31,  1,object)
448a472b3eSmickey #define	Slow4(object) Bitfield_mask( 28,  4,object)
458a472b3eSmickey #define	Slow31(object) Bitfield_mask( 1, 31,object)
468a472b3eSmickey #define	Shigh31(object) Bitfield_extract( 0, 31,object)
478a472b3eSmickey #define	Ssignedhigh31(object) Bitfield_signed_extract( 0, 31,object)
488a472b3eSmickey #define	Shigh4(object) Bitfield_extract( 0,  4,object)
498a472b3eSmickey #define	Sbit24(object) Bitfield_extract( 24,  1,object)
508a472b3eSmickey #define	Sbit28(object) Bitfield_extract( 28,  1,object)
518a472b3eSmickey #define	Sbit29(object) Bitfield_extract( 29,  1,object)
528a472b3eSmickey #define	Sbit30(object) Bitfield_extract( 30,  1,object)
538a472b3eSmickey #define	Sbit31(object) Bitfield_mask( 31,  1,object)
548a472b3eSmickey 
558a472b3eSmickey #define Deposit_ssign(object,value) Bitfield_deposit(value,0,1,object)
568a472b3eSmickey #define Deposit_sexponent(object,value) Bitfield_deposit(value,1,8,object)
578a472b3eSmickey #define Deposit_smantissa(object,value) Bitfield_deposit(value,9,23,object)
588a472b3eSmickey #define Deposit_shigh2mantissa(object,value) Bitfield_deposit(value,9,2,object)
598a472b3eSmickey #define Deposit_sexponentmantissa(object,value) \
608a472b3eSmickey     Bitfield_deposit(value,1,31,object)
618a472b3eSmickey #define Deposit_ssignexponent(object,value) Bitfield_deposit(value,0,9,object)
628a472b3eSmickey #define Deposit_slow(object,value) Bitfield_deposit(value,31,1,object)
638a472b3eSmickey #define Deposit_shigh4(object,value) Bitfield_deposit(value,0,4,object)
648a472b3eSmickey 
658a472b3eSmickey #define	Is_ssign(object) Bitfield_mask( 0,  1,object)
668a472b3eSmickey #define	Is_ssignaling(object) Bitfield_mask( 9,  1,object)
678a472b3eSmickey #define	Is_shidden(object) Bitfield_mask( 8,  1,object)
688a472b3eSmickey #define	Is_shiddenoverflow(object) Bitfield_mask( 7,  1,object)
698a472b3eSmickey #define	Is_slow(object) Bitfield_mask( 31,  1,object)
708a472b3eSmickey #define	Is_sbit24(object) Bitfield_mask( 24,  1,object)
718a472b3eSmickey #define	Is_sbit28(object) Bitfield_mask( 28,  1,object)
728a472b3eSmickey #define	Is_sbit29(object) Bitfield_mask( 29,  1,object)
738a472b3eSmickey #define	Is_sbit30(object) Bitfield_mask( 30,  1,object)
748a472b3eSmickey #define	Is_sbit31(object) Bitfield_mask( 31,  1,object)
758a472b3eSmickey 
768a472b3eSmickey /*
778a472b3eSmickey  * Double number.
788a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
798a472b3eSmickey  * |s|       exponent      |          mantissa part 1              |
808a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
818a472b3eSmickey  *
828a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
838a472b3eSmickey  * |                    mantissa part 2                            |
848a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
858a472b3eSmickey  */
868a472b3eSmickey #define Dallp1(object) (object)
878a472b3eSmickey #define Dsign(object) Bitfield_extract( 0,  1,object)
888a472b3eSmickey #define Dsignedsign(object) Bitfield_signed_extract( 0,  1,object)
898a472b3eSmickey #define Dexponent(object) Bitfield_extract( 1,  11,object)
908a472b3eSmickey #define Dmantissap1(object) Bitfield_mask( 12, 20,object)
918a472b3eSmickey #define Dsignaling(object) Bitfield_extract( 12,  1,object)
928a472b3eSmickey #define Dsignalingnan(object) Bitfield_extract( 1,  12,object)
938a472b3eSmickey #define Dhigh2mantissa(object) Bitfield_extract( 12,  2,object)
948a472b3eSmickey #define Dexponentmantissap1(object) Bitfield_mask( 1, 31,object)
958a472b3eSmickey #define Dsignexponent(object) Bitfield_extract( 0, 12,object)
968a472b3eSmickey #define Dhidden(object) Bitfield_extract( 11,  1,object)
978a472b3eSmickey #define Dhiddenoverflow(object) Bitfield_extract( 10,  1,object)
988a472b3eSmickey #define Dhiddenhigh7mantissa(object) Bitfield_extract( 11,  8,object)
998a472b3eSmickey #define Dhiddenhigh3mantissa(object) Bitfield_extract( 11,  4,object)
1008a472b3eSmickey #define Dlowp1(object) Bitfield_mask( 31,  1,object)
1018a472b3eSmickey #define Dlow31p1(object) Bitfield_mask( 1, 31,object)
1028a472b3eSmickey #define Dhighp1(object) Bitfield_extract( 0,  1,object)
1038a472b3eSmickey #define Dhigh4p1(object) Bitfield_extract( 0,  4,object)
1048a472b3eSmickey #define Dhigh31p1(object) Bitfield_extract( 0, 31,object)
1058a472b3eSmickey #define Dsignedhigh31p1(object) Bitfield_signed_extract( 0, 31,object)
1068a472b3eSmickey #define Dbit3p1(object) Bitfield_extract( 3,  1,object)
1078a472b3eSmickey 
1088a472b3eSmickey #define Deposit_dsign(object,value) Bitfield_deposit(value,0,1,object)
1098a472b3eSmickey #define Deposit_dexponent(object,value) Bitfield_deposit(value,1,11,object)
1108a472b3eSmickey #define Deposit_dmantissap1(object,value) Bitfield_deposit(value,12,20,object)
1118a472b3eSmickey #define Deposit_dhigh2mantissa(object,value) Bitfield_deposit(value,12,2,object)
1128a472b3eSmickey #define Deposit_dexponentmantissap1(object,value) \
1138a472b3eSmickey     Bitfield_deposit(value,1,31,object)
1148a472b3eSmickey #define Deposit_dsignexponent(object,value) Bitfield_deposit(value,0,12,object)
1158a472b3eSmickey #define Deposit_dlowp1(object,value) Bitfield_deposit(value,31,1,object)
1168a472b3eSmickey #define Deposit_dhigh4p1(object,value) Bitfield_deposit(value,0,4,object)
1178a472b3eSmickey 
1188a472b3eSmickey #define Is_dsign(object) Bitfield_mask( 0,  1,object)
1198a472b3eSmickey #define Is_dsignaling(object) Bitfield_mask( 12,  1,object)
1208a472b3eSmickey #define Is_dhidden(object) Bitfield_mask( 11,  1,object)
1218a472b3eSmickey #define Is_dhiddenoverflow(object) Bitfield_mask( 10,  1,object)
1228a472b3eSmickey #define Is_dlowp1(object) Bitfield_mask( 31,  1,object)
1238a472b3eSmickey #define Is_dhighp1(object) Bitfield_mask( 0,  1,object)
1248a472b3eSmickey #define Is_dbit3p1(object) Bitfield_mask( 3,  1,object)
1258a472b3eSmickey 
1268a472b3eSmickey #define Dallp2(object) (object)
1278a472b3eSmickey #define Dmantissap2(object) (object)
1288a472b3eSmickey #define Dlowp2(object) Bitfield_mask( 31,  1,object)
1298a472b3eSmickey #define Dlow4p2(object) Bitfield_mask( 28,  4,object)
1308a472b3eSmickey #define Dlow31p2(object) Bitfield_mask( 1, 31,object)
1318a472b3eSmickey #define Dhighp2(object) Bitfield_extract( 0,  1,object)
1328a472b3eSmickey #define Dhigh31p2(object) Bitfield_extract( 0, 31,object)
1338a472b3eSmickey #define Dbit2p2(object) Bitfield_extract( 2,  1,object)
1348a472b3eSmickey #define Dbit3p2(object) Bitfield_extract( 3,  1,object)
1358a472b3eSmickey #define Dbit21p2(object) Bitfield_extract( 21,  1,object)
1368a472b3eSmickey #define Dbit28p2(object) Bitfield_extract( 28,  1,object)
1378a472b3eSmickey #define Dbit29p2(object) Bitfield_extract( 29,  1,object)
1388a472b3eSmickey #define Dbit30p2(object) Bitfield_extract( 30,  1,object)
1398a472b3eSmickey #define Dbit31p2(object) Bitfield_mask( 31,  1,object)
1408a472b3eSmickey 
1418a472b3eSmickey #define Deposit_dlowp2(object,value) Bitfield_deposit(value,31,1,object)
1428a472b3eSmickey 
1438a472b3eSmickey #define Is_dlowp2(object) Bitfield_mask( 31,  1,object)
1448a472b3eSmickey #define Is_dhighp2(object) Bitfield_mask( 0,  1,object)
1458a472b3eSmickey #define Is_dbit2p2(object) Bitfield_mask( 2,  1,object)
1468a472b3eSmickey #define Is_dbit3p2(object) Bitfield_mask( 3,  1,object)
1478a472b3eSmickey #define Is_dbit21p2(object) Bitfield_mask( 21,  1,object)
1488a472b3eSmickey #define Is_dbit28p2(object) Bitfield_mask( 28,  1,object)
1498a472b3eSmickey #define Is_dbit29p2(object) Bitfield_mask( 29,  1,object)
1508a472b3eSmickey #define Is_dbit30p2(object) Bitfield_mask( 30,  1,object)
1518a472b3eSmickey #define Is_dbit31p2(object) Bitfield_mask( 31,  1,object)
1528a472b3eSmickey 
1538a472b3eSmickey /*
1548a472b3eSmickey  * Quad number.
1558a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1568a472b3eSmickey  * |s|          exponent           |      mantissa part 1          |
1578a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1588a472b3eSmickey  *
1598a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1608a472b3eSmickey  * |                    mantissa part 2                            |
1618a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1628a472b3eSmickey  *
1638a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1648a472b3eSmickey  * |                    mantissa part 3                            |
1658a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1668a472b3eSmickey  *
1678a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1688a472b3eSmickey  * |                    mantissa part 4                            |
1698a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
1708a472b3eSmickey  */
1718a472b3eSmickey typedef struct
1728a472b3eSmickey     {
1738a472b3eSmickey     union
1748a472b3eSmickey 	{
1758a472b3eSmickey 	struct { unsigned qallp1; } u_qallp1;
1768a472b3eSmickey /* Not needed for now...
1778a472b3eSmickey 	Bitfield_extract( 0,  1,u_qsign,qsign)
1788a472b3eSmickey 	Bitfield_signed_extract( 0,  1,u_qsignedsign,qsignedsign)
1798a472b3eSmickey 	Bitfield_extract( 1, 15,u_qexponent,qexponent)
1808a472b3eSmickey 	Bitfield_extract(16, 16,u_qmantissap1,qmantissap1)
1818a472b3eSmickey 	Bitfield_extract(16,  1,u_qsignaling,qsignaling)
1828a472b3eSmickey 	Bitfield_extract(1,  16,u_qsignalingnan,qsignalingnan)
1838a472b3eSmickey 	Bitfield_extract(16,  2,u_qhigh2mantissa,qhigh2mantissa)
1848a472b3eSmickey 	Bitfield_extract( 1, 31,u_qexponentmantissap1,qexponentmantissap1)
1858a472b3eSmickey 	Bitfield_extract( 0, 16,u_qsignexponent,qsignexponent)
1868a472b3eSmickey 	Bitfield_extract(15,  1,u_qhidden,qhidden)
1878a472b3eSmickey 	Bitfield_extract(14,  1,u_qhiddenoverflow,qhiddenoverflow)
1888a472b3eSmickey 	Bitfield_extract(15,  8,u_qhiddenhigh7mantissa,qhiddenhigh7mantissa)
1898a472b3eSmickey 	Bitfield_extract(15,  4,u_qhiddenhigh3mantissa,qhiddenhigh3mantissa)
1908a472b3eSmickey 	Bitfield_extract(31,  1,u_qlowp1,qlowp1)
1918a472b3eSmickey 	Bitfield_extract( 1, 31,u_qlow31p1,qlow31p1)
1928a472b3eSmickey 	Bitfield_extract( 0,  1,u_qhighp1,qhighp1)
1938a472b3eSmickey 	Bitfield_extract( 0,  4,u_qhigh4p1,qhigh4p1)
1948a472b3eSmickey 	Bitfield_extract( 0, 31,u_qhigh31p1,qhigh31p1)
1958a472b3eSmickey   */
1968a472b3eSmickey 	} quad_u1;
1978a472b3eSmickey     union
1988a472b3eSmickey 	{
1998a472b3eSmickey 	struct { unsigned qallp2; } u_qallp2;
2008a472b3eSmickey   /* Not needed for now...
2018a472b3eSmickey 	Bitfield_extract(31,  1,u_qlowp2,qlowp2)
2028a472b3eSmickey 	Bitfield_extract( 1, 31,u_qlow31p2,qlow31p2)
2038a472b3eSmickey 	Bitfield_extract( 0,  1,u_qhighp2,qhighp2)
2048a472b3eSmickey 	Bitfield_extract( 0, 31,u_qhigh31p2,qhigh31p2)
2058a472b3eSmickey    */
2068a472b3eSmickey 	} quad_u2;
2078a472b3eSmickey     union
2088a472b3eSmickey 	{
2098a472b3eSmickey 	struct { unsigned qallp3; } u_qallp3;
2108a472b3eSmickey   /* Not needed for now...
2118a472b3eSmickey 	Bitfield_extract(31,  1,u_qlowp3,qlowp3)
2128a472b3eSmickey 	Bitfield_extract( 1, 31,u_qlow31p3,qlow31p3)
2138a472b3eSmickey 	Bitfield_extract( 0,  1,u_qhighp3,qhighp3)
2148a472b3eSmickey 	Bitfield_extract( 0, 31,u_qhigh31p3,qhigh31p3)
2158a472b3eSmickey    */
2168a472b3eSmickey 	} quad_u3;
2178a472b3eSmickey     union
2188a472b3eSmickey 	{
2198a472b3eSmickey 	struct { unsigned qallp4; } u_qallp4;
2208a472b3eSmickey     /* Not need for now...
2218a472b3eSmickey 	Bitfield_extract(31,  1,u_qlowp4,qlowp4)
2228a472b3eSmickey 	Bitfield_extract( 1, 31,u_qlow31p4,qlow31p4)
2238a472b3eSmickey 	Bitfield_extract( 0,  1,u_qhighp4,qhighp4)
2248a472b3eSmickey 	Bitfield_extract( 0, 31,u_qhigh31p4,qhigh31p4)
2258a472b3eSmickey      */
2268a472b3eSmickey 	} quad_u4;
2278a472b3eSmickey     } quad_floating_point;
2288a472b3eSmickey 
2298a472b3eSmickey /* Extension - An additional structure to hold the guard, round and
2308a472b3eSmickey  *             sticky bits during computations.
2318a472b3eSmickey  */
2328a472b3eSmickey #define Extall(object) (object)
2338a472b3eSmickey #define Extsign(object) Bitfield_extract( 0,  1,object)
2348a472b3eSmickey #define Exthigh31(object) Bitfield_extract( 0, 31,object)
2358a472b3eSmickey #define Extlow31(object) Bitfield_extract( 1, 31,object)
2368a472b3eSmickey #define Extlow(object) Bitfield_extract( 31,  1,object)
2378a472b3eSmickey 
2388a472b3eSmickey /*
2398a472b3eSmickey  * Declare the basic structures for the 3 different
2408a472b3eSmickey  * fixed-point precisions.
2418a472b3eSmickey  *
2428a472b3eSmickey  * Single number
2438a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2448a472b3eSmickey  * |s|                    integer                                  |
2458a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2468a472b3eSmickey  */
2478a472b3eSmickey typedef int sgl_integer;
2488a472b3eSmickey 
2498a472b3eSmickey /*
2508a472b3eSmickey  * Double number.
2518a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2528a472b3eSmickey  * |s|                     high integer                            |
2538a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2548a472b3eSmickey  *
2558a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2568a472b3eSmickey  * |                       low integer                             |
2578a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2588a472b3eSmickey  */
2598a472b3eSmickey struct dint {
2608a472b3eSmickey 	int  wd0;
2618a472b3eSmickey 	unsigned int wd1;
2628a472b3eSmickey };
2638a472b3eSmickey 
2648a472b3eSmickey struct dblwd {
2658a472b3eSmickey 	unsigned int wd0;
2668a472b3eSmickey 	unsigned int wd1;
2678a472b3eSmickey };
2688a472b3eSmickey 
2698a472b3eSmickey /*
2708a472b3eSmickey  * Quad number.
2718a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2728a472b3eSmickey  * |s|                  integer part1                              |
2738a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2748a472b3eSmickey  *
2758a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2768a472b3eSmickey  * |                    integer part 2                             |
2778a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2788a472b3eSmickey  *
2798a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2808a472b3eSmickey  * |                    integer part 3                             |
2818a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2828a472b3eSmickey  *
2838a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2848a472b3eSmickey  * |                    integer part 4                             |
2858a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
2868a472b3eSmickey  */
2878a472b3eSmickey 
2888a472b3eSmickey struct quadwd {
2898a472b3eSmickey 	int  wd0;
2908a472b3eSmickey 	unsigned int wd1;
2918a472b3eSmickey 	unsigned int wd2;
2928a472b3eSmickey 	unsigned int wd3;
2938a472b3eSmickey };
2948a472b3eSmickey 
2958a472b3eSmickey typedef struct quadwd quad_integer;
2968a472b3eSmickey 
2978a472b3eSmickey 
2988a472b3eSmickey /* useful typedefs */
2998a472b3eSmickey typedef int sgl_floating_point;
3008a472b3eSmickey typedef struct dblwd dbl_floating_point;
3018a472b3eSmickey typedef struct dint dbl_integer;
3028a472b3eSmickey 
3038a472b3eSmickey /*
3048a472b3eSmickey  * Define the different precisions' parameters.
3058a472b3eSmickey  */
3068a472b3eSmickey #define SGL_BITLENGTH 32
307966514f5Smickey #define SGL_EMAX 127
3088a472b3eSmickey #define SGL_BIAS 127
3098a472b3eSmickey #define SGL_WRAP 192
310966514f5Smickey #define SGL_INFINITY_EXPONENT (SGL_EMAX+SGL_BIAS+1)
3118a472b3eSmickey #define SGL_THRESHOLD 32
3128a472b3eSmickey #define SGL_EXP_LENGTH 8
3138a472b3eSmickey #define SGL_P 24
3148a472b3eSmickey 
3158a472b3eSmickey #define DBL_BITLENGTH 64
316966514f5Smickey #define DBL_EMAX 1023
3178a472b3eSmickey #define DBL_BIAS 1023
3188a472b3eSmickey #define DBL_WRAP 1536
319966514f5Smickey #define DBL_INFINITY_EXPONENT (DBL_EMAX+DBL_BIAS+1)
3208a472b3eSmickey #define DBL_THRESHOLD 64
3218a472b3eSmickey #define DBL_EXP_LENGTH 11
3228a472b3eSmickey #define DBL_P 53
3238a472b3eSmickey 
3248a472b3eSmickey #define QUAD_BITLENGTH 128
325966514f5Smickey #define QUAD_EMAX 16383
3268a472b3eSmickey #define QUAD_BIAS 16383
3278a472b3eSmickey #define QUAD_WRAP 24576
328966514f5Smickey #define QUAD_INFINITY_EXPONENT (QUAD_EMAX+QUAD_BIAS+1)
3298a472b3eSmickey #define QUAD_P 113
3308a472b3eSmickey 
3318a472b3eSmickey /* Boolean Values etc. */
3328a472b3eSmickey #define FALSE 0
3338a472b3eSmickey #define TRUE (!FALSE)
3348a472b3eSmickey #define NOT !
3358a472b3eSmickey #define XOR ^
3368a472b3eSmickey 
3378a472b3eSmickey /* Declare status register equivalent to FPUs architecture.
3388a472b3eSmickey  *
3398a472b3eSmickey  *  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
3408a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
3418a472b3eSmickey  * |V|Z|O|U|I|C|  rsv  |  model    | version |RM |rsv|T|r|V|Z|O|U|I|
3428a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
3438a472b3eSmickey  */
3448a472b3eSmickey #define Cbit(object) Bitfield_extract( 5, 1,object)
3458a472b3eSmickey #define Tbit(object) Bitfield_extract( 25, 1,object)
3468a472b3eSmickey #define Roundingmode(object) Bitfield_extract( 21, 2,object)
3478a472b3eSmickey #define Invalidtrap(object) Bitfield_extract( 27, 1,object)
3488a472b3eSmickey #define Divisionbyzerotrap(object) Bitfield_extract( 28, 1,object)
3498a472b3eSmickey #define Overflowtrap(object) Bitfield_extract( 29, 1,object)
3508a472b3eSmickey #define Underflowtrap(object) Bitfield_extract( 30, 1,object)
3518a472b3eSmickey #define Inexacttrap(object) Bitfield_extract( 31, 1,object)
3528a472b3eSmickey #define Invalidflag(object) Bitfield_extract( 0, 1,object)
3538a472b3eSmickey #define Divisionbyzeroflag(object) Bitfield_extract( 1, 1,object)
3548a472b3eSmickey #define Overflowflag(object) Bitfield_extract( 2, 1,object)
3558a472b3eSmickey #define Underflowflag(object) Bitfield_extract( 3, 1,object)
3568a472b3eSmickey #define Inexactflag(object) Bitfield_extract( 4, 1,object)
3578a472b3eSmickey #define Allflags(object) Bitfield_extract( 0, 5,object)
3588a472b3eSmickey 
3598a472b3eSmickey /* Definitions relevant to the status register */
3608a472b3eSmickey 
3618a472b3eSmickey /* Rounding Modes */
3628a472b3eSmickey #define ROUNDNEAREST 0
3638a472b3eSmickey #define ROUNDZERO    1
3648a472b3eSmickey #define ROUNDPLUS    2
3658a472b3eSmickey #define ROUNDMINUS   3
3668a472b3eSmickey 
3678a472b3eSmickey /* Exceptions */
3688a472b3eSmickey #define NOEXCEPTION		0x0
3698a472b3eSmickey #define INVALIDEXCEPTION	0x20
3708a472b3eSmickey #define DIVISIONBYZEROEXCEPTION	0x10
3718a472b3eSmickey #define OVERFLOWEXCEPTION	0x08
3728a472b3eSmickey #define UNDERFLOWEXCEPTION	0x04
3738a472b3eSmickey #define INEXACTEXCEPTION	0x02
3748a472b3eSmickey #define UNIMPLEMENTEDEXCEPTION	0x01
3758a472b3eSmickey 
3768a472b3eSmickey /* Declare exception registers equivalent to FPUs architecture
3778a472b3eSmickey  *
3788a472b3eSmickey  *  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
3798a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
3808a472b3eSmickey  * |excepttype |  r1     | r2/ext  |  operation  |parm |n| t/cond  |
3818a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
3828a472b3eSmickey  */
3838a472b3eSmickey #define Allexception(object) (object)
3848a472b3eSmickey #define Exceptiontype(object) Bitfield_extract( 0, 6,object)
3858a472b3eSmickey #define Instructionfield(object) Bitfield_mask( 6,26,object)
3868a472b3eSmickey #define Parmfield(object) Bitfield_extract( 23, 3,object)
3878a472b3eSmickey #define Rabit(object) Bitfield_extract( 24, 1,object)
3888a472b3eSmickey #define Ibit(object) Bitfield_extract( 25, 1,object)
3898a472b3eSmickey 
3908a472b3eSmickey #define Set_exceptiontype(object,value) Bitfield_deposit(value, 0, 6,object)
3918a472b3eSmickey #define Set_parmfield(object,value) Bitfield_deposit(value, 23, 3,object)
3928a472b3eSmickey #define Set_exceptiontype_and_instr_field(exception,instruction,object) \
393b94afd46Smickey     object = ((exception) << 26) | (instruction)
3948a472b3eSmickey 
3958a472b3eSmickey /* Declare the condition field
3968a472b3eSmickey  *
3978a472b3eSmickey  *  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
3988a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
3998a472b3eSmickey  * |                                                     |G|L|E|U|X|
4008a472b3eSmickey  * +-------+-------+-------+-------+-------+-------+-------+-------+
4018a472b3eSmickey  */
4028a472b3eSmickey #define Allexception(object) (object)
4038a472b3eSmickey #define Greaterthanbit(object) Bitfield_extract( 27, 1,object)
4048a472b3eSmickey #define Lessthanbit(object) Bitfield_extract( 28, 1,object)
4058a472b3eSmickey #define Equalbit(object) Bitfield_extract( 29, 1,object)
4068a472b3eSmickey #define Unorderedbit(object) Bitfield_extract( 30, 1,object)
4078a472b3eSmickey #define Exceptionbit(object) Bitfield_extract( 31, 1,object)
4088a472b3eSmickey 
4098a472b3eSmickey /* An alias name for the status register */
4108a472b3eSmickey #define Fpustatus_register (*status)
4118a472b3eSmickey 
4128a472b3eSmickey /**************************************************
4138a472b3eSmickey  * Status register referencing and manipulation.  *
4148a472b3eSmickey  **************************************************/
4158a472b3eSmickey 
4168a472b3eSmickey /* Rounding mode */
4178a472b3eSmickey #define Rounding_mode()  Roundingmode(Fpustatus_register)
4188a472b3eSmickey #define Is_rounding_mode(rmode) \
4198a472b3eSmickey     (Roundingmode(Fpustatus_register) == rmode)
4208a472b3eSmickey #define Set_rounding_mode(value) \
4218a472b3eSmickey     Bitfield_deposit(value,21,2,Fpustatus_register)
4228a472b3eSmickey 
4238a472b3eSmickey /* Boolean testing of the trap enable bits */
4248a472b3eSmickey #define Is_invalidtrap_enabled() Invalidtrap(Fpustatus_register)
4258a472b3eSmickey #define Is_divisionbyzerotrap_enabled() Divisionbyzerotrap(Fpustatus_register)
4268a472b3eSmickey #define Is_overflowtrap_enabled() Overflowtrap(Fpustatus_register)
4278a472b3eSmickey #define Is_underflowtrap_enabled() Underflowtrap(Fpustatus_register)
4288a472b3eSmickey #define Is_inexacttrap_enabled() Inexacttrap(Fpustatus_register)
4298a472b3eSmickey 
4308a472b3eSmickey /* Set the indicated flags in the status register */
4318a472b3eSmickey #define Set_invalidflag() Bitfield_deposit(1,0,1,Fpustatus_register)
4328a472b3eSmickey #define Set_divisionbyzeroflag() Bitfield_deposit(1,1,1,Fpustatus_register)
4338a472b3eSmickey #define Set_overflowflag() Bitfield_deposit(1,2,1,Fpustatus_register)
4348a472b3eSmickey #define Set_underflowflag() Bitfield_deposit(1,3,1,Fpustatus_register)
4358a472b3eSmickey #define Set_inexactflag() Bitfield_deposit(1,4,1,Fpustatus_register)
4368a472b3eSmickey 
4378a472b3eSmickey #define Clear_all_flags() Bitfield_deposit(0,0,5,Fpustatus_register)
4388a472b3eSmickey 
4398a472b3eSmickey /* Manipulate the trap and condition code bits (tbit and cbit) */
4408a472b3eSmickey #define Set_tbit() Bitfield_deposit(1,25,1,Fpustatus_register)
4418a472b3eSmickey #define Clear_tbit() Bitfield_deposit(0,25,1,Fpustatus_register)
4428a472b3eSmickey #define Is_tbit_set() Tbit(Fpustatus_register)
4438a472b3eSmickey #define Is_cbit_set() Cbit(Fpustatus_register)
4448a472b3eSmickey 
4458a472b3eSmickey #ifdef TIMEX
4468a472b3eSmickey #define Set_status_cbit(value) \
4478a472b3eSmickey 	Bitfield_deposit(Bitfield_extract(10,10,Fpustatus_register),11,10,Fpustatus_register); \
4488a472b3eSmickey 	Bitfield_deposit(Bitfield_extract(5,1,Fpustatus_register),10,1,Fpustatus_register); \
4498a472b3eSmickey 	Bitfield_deposit(value,5,1,Fpustatus_register)
4508a472b3eSmickey #else
4518a472b3eSmickey #define Set_status_cbit(value) Bitfield_deposit(value,5,1,Fpustatus_register)
4528a472b3eSmickey #endif
4538a472b3eSmickey 
4548a472b3eSmickey /*******************************
4558a472b3eSmickey  * Condition field referencing *
4568a472b3eSmickey  *******************************/
4578a472b3eSmickey #define Unordered(cond) Unorderedbit(cond)
4588a472b3eSmickey #define Equal(cond) Equalbit(cond)
4598a472b3eSmickey #define Lessthan(cond) Lessthanbit(cond)
4608a472b3eSmickey #define Greaterthan(cond) Greaterthanbit(cond)
4618a472b3eSmickey #define Exception(cond) Exceptionbit(cond)
4628a472b3eSmickey 
4638a472b3eSmickey 
4648a472b3eSmickey /* Defines for the extension */
4658a472b3eSmickey #define Ext_isone_sign(extent) (Extsign(extent))
4668a472b3eSmickey #define Ext_isnotzero(extent) \
4678a472b3eSmickey     (Extall(extent))
4688a472b3eSmickey #define Ext_isnotzero_lower(extent) \
4698a472b3eSmickey     (Extlow31(extent))
4708a472b3eSmickey #define Ext_leftshiftby1(extent) \
4718a472b3eSmickey     Extall(extent) <<= 1
4728a472b3eSmickey #define Ext_negate(extent) \
4738a472b3eSmickey     (int )Extall(extent) = 0 - (int )Extall(extent)
4748a472b3eSmickey #define Ext_setone_low(extent) Bitfield_deposit(1,31,1,extent)
475