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