1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Linux/PA-RISC Project (http://www.parisc-linux.org/) 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Floating-point emulation code 6*4882a593Smuzhiyun * Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun /* 9*4882a593Smuzhiyun * BEGIN_DESC 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * File: 12*4882a593Smuzhiyun * @(#) pa/spmath/float.h $Revision: 1.1 $ 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * Purpose: 15*4882a593Smuzhiyun * <<please update with a synopis of the functionality provided by this file>> 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * BE header: no 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * Shipped: yes 20*4882a593Smuzhiyun * /usr/conf/pa/spmath/float.h 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * END_DESC 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #ifdef __NO_PA_HDRS 26*4882a593Smuzhiyun PA header file -- do not include this header file for non-PA builds. 27*4882a593Smuzhiyun #endif 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #include "fpbits.h" 30*4882a593Smuzhiyun #include "hppa.h" 31*4882a593Smuzhiyun /* 32*4882a593Smuzhiyun * Want to pick up the FPU capability flags, not the PDC structures. 33*4882a593Smuzhiyun * 'LOCORE' isn't really true in this case, but we don't want the C structures 34*4882a593Smuzhiyun * so it suits our purposes 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun #define LOCORE 37*4882a593Smuzhiyun #include "fpu.h" 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* 40*4882a593Smuzhiyun * Declare the basic structures for the 3 different 41*4882a593Smuzhiyun * floating-point precisions. 42*4882a593Smuzhiyun * 43*4882a593Smuzhiyun * Single number 44*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 45*4882a593Smuzhiyun * |s| exp | mantissa | 46*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun #define Sall(object) (object) 49*4882a593Smuzhiyun #define Ssign(object) Bitfield_extract( 0, 1,object) 50*4882a593Smuzhiyun #define Ssignedsign(object) Bitfield_signed_extract( 0, 1,object) 51*4882a593Smuzhiyun #define Sexponent(object) Bitfield_extract( 1, 8,object) 52*4882a593Smuzhiyun #define Smantissa(object) Bitfield_mask( 9, 23,object) 53*4882a593Smuzhiyun #define Ssignaling(object) Bitfield_extract( 9, 1,object) 54*4882a593Smuzhiyun #define Ssignalingnan(object) Bitfield_extract( 1, 9,object) 55*4882a593Smuzhiyun #define Shigh2mantissa(object) Bitfield_extract( 9, 2,object) 56*4882a593Smuzhiyun #define Sexponentmantissa(object) Bitfield_mask( 1, 31,object) 57*4882a593Smuzhiyun #define Ssignexponent(object) Bitfield_extract( 0, 9,object) 58*4882a593Smuzhiyun #define Shidden(object) Bitfield_extract( 8, 1,object) 59*4882a593Smuzhiyun #define Shiddenoverflow(object) Bitfield_extract( 7, 1,object) 60*4882a593Smuzhiyun #define Shiddenhigh7mantissa(object) Bitfield_extract( 8, 8,object) 61*4882a593Smuzhiyun #define Shiddenhigh3mantissa(object) Bitfield_extract( 8, 4,object) 62*4882a593Smuzhiyun #define Slow(object) Bitfield_mask( 31, 1,object) 63*4882a593Smuzhiyun #define Slow4(object) Bitfield_mask( 28, 4,object) 64*4882a593Smuzhiyun #define Slow31(object) Bitfield_mask( 1, 31,object) 65*4882a593Smuzhiyun #define Shigh31(object) Bitfield_extract( 0, 31,object) 66*4882a593Smuzhiyun #define Ssignedhigh31(object) Bitfield_signed_extract( 0, 31,object) 67*4882a593Smuzhiyun #define Shigh4(object) Bitfield_extract( 0, 4,object) 68*4882a593Smuzhiyun #define Sbit24(object) Bitfield_extract( 24, 1,object) 69*4882a593Smuzhiyun #define Sbit28(object) Bitfield_extract( 28, 1,object) 70*4882a593Smuzhiyun #define Sbit29(object) Bitfield_extract( 29, 1,object) 71*4882a593Smuzhiyun #define Sbit30(object) Bitfield_extract( 30, 1,object) 72*4882a593Smuzhiyun #define Sbit31(object) Bitfield_mask( 31, 1,object) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define Deposit_ssign(object,value) Bitfield_deposit(value,0,1,object) 75*4882a593Smuzhiyun #define Deposit_sexponent(object,value) Bitfield_deposit(value,1,8,object) 76*4882a593Smuzhiyun #define Deposit_smantissa(object,value) Bitfield_deposit(value,9,23,object) 77*4882a593Smuzhiyun #define Deposit_shigh2mantissa(object,value) Bitfield_deposit(value,9,2,object) 78*4882a593Smuzhiyun #define Deposit_sexponentmantissa(object,value) \ 79*4882a593Smuzhiyun Bitfield_deposit(value,1,31,object) 80*4882a593Smuzhiyun #define Deposit_ssignexponent(object,value) Bitfield_deposit(value,0,9,object) 81*4882a593Smuzhiyun #define Deposit_slow(object,value) Bitfield_deposit(value,31,1,object) 82*4882a593Smuzhiyun #define Deposit_shigh4(object,value) Bitfield_deposit(value,0,4,object) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define Is_ssign(object) Bitfield_mask( 0, 1,object) 85*4882a593Smuzhiyun #define Is_ssignaling(object) Bitfield_mask( 9, 1,object) 86*4882a593Smuzhiyun #define Is_shidden(object) Bitfield_mask( 8, 1,object) 87*4882a593Smuzhiyun #define Is_shiddenoverflow(object) Bitfield_mask( 7, 1,object) 88*4882a593Smuzhiyun #define Is_slow(object) Bitfield_mask( 31, 1,object) 89*4882a593Smuzhiyun #define Is_sbit24(object) Bitfield_mask( 24, 1,object) 90*4882a593Smuzhiyun #define Is_sbit28(object) Bitfield_mask( 28, 1,object) 91*4882a593Smuzhiyun #define Is_sbit29(object) Bitfield_mask( 29, 1,object) 92*4882a593Smuzhiyun #define Is_sbit30(object) Bitfield_mask( 30, 1,object) 93*4882a593Smuzhiyun #define Is_sbit31(object) Bitfield_mask( 31, 1,object) 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /* 96*4882a593Smuzhiyun * Double number. 97*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 98*4882a593Smuzhiyun * |s| exponent | mantissa part 1 | 99*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 100*4882a593Smuzhiyun * 101*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 102*4882a593Smuzhiyun * | mantissa part 2 | 103*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 104*4882a593Smuzhiyun */ 105*4882a593Smuzhiyun #define Dallp1(object) (object) 106*4882a593Smuzhiyun #define Dsign(object) Bitfield_extract( 0, 1,object) 107*4882a593Smuzhiyun #define Dsignedsign(object) Bitfield_signed_extract( 0, 1,object) 108*4882a593Smuzhiyun #define Dexponent(object) Bitfield_extract( 1, 11,object) 109*4882a593Smuzhiyun #define Dmantissap1(object) Bitfield_mask( 12, 20,object) 110*4882a593Smuzhiyun #define Dsignaling(object) Bitfield_extract( 12, 1,object) 111*4882a593Smuzhiyun #define Dsignalingnan(object) Bitfield_extract( 1, 12,object) 112*4882a593Smuzhiyun #define Dhigh2mantissa(object) Bitfield_extract( 12, 2,object) 113*4882a593Smuzhiyun #define Dexponentmantissap1(object) Bitfield_mask( 1, 31,object) 114*4882a593Smuzhiyun #define Dsignexponent(object) Bitfield_extract( 0, 12,object) 115*4882a593Smuzhiyun #define Dhidden(object) Bitfield_extract( 11, 1,object) 116*4882a593Smuzhiyun #define Dhiddenoverflow(object) Bitfield_extract( 10, 1,object) 117*4882a593Smuzhiyun #define Dhiddenhigh7mantissa(object) Bitfield_extract( 11, 8,object) 118*4882a593Smuzhiyun #define Dhiddenhigh3mantissa(object) Bitfield_extract( 11, 4,object) 119*4882a593Smuzhiyun #define Dlowp1(object) Bitfield_mask( 31, 1,object) 120*4882a593Smuzhiyun #define Dlow31p1(object) Bitfield_mask( 1, 31,object) 121*4882a593Smuzhiyun #define Dhighp1(object) Bitfield_extract( 0, 1,object) 122*4882a593Smuzhiyun #define Dhigh4p1(object) Bitfield_extract( 0, 4,object) 123*4882a593Smuzhiyun #define Dhigh31p1(object) Bitfield_extract( 0, 31,object) 124*4882a593Smuzhiyun #define Dsignedhigh31p1(object) Bitfield_signed_extract( 0, 31,object) 125*4882a593Smuzhiyun #define Dbit3p1(object) Bitfield_extract( 3, 1,object) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define Deposit_dsign(object,value) Bitfield_deposit(value,0,1,object) 128*4882a593Smuzhiyun #define Deposit_dexponent(object,value) Bitfield_deposit(value,1,11,object) 129*4882a593Smuzhiyun #define Deposit_dmantissap1(object,value) Bitfield_deposit(value,12,20,object) 130*4882a593Smuzhiyun #define Deposit_dhigh2mantissa(object,value) Bitfield_deposit(value,12,2,object) 131*4882a593Smuzhiyun #define Deposit_dexponentmantissap1(object,value) \ 132*4882a593Smuzhiyun Bitfield_deposit(value,1,31,object) 133*4882a593Smuzhiyun #define Deposit_dsignexponent(object,value) Bitfield_deposit(value,0,12,object) 134*4882a593Smuzhiyun #define Deposit_dlowp1(object,value) Bitfield_deposit(value,31,1,object) 135*4882a593Smuzhiyun #define Deposit_dhigh4p1(object,value) Bitfield_deposit(value,0,4,object) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define Is_dsign(object) Bitfield_mask( 0, 1,object) 138*4882a593Smuzhiyun #define Is_dsignaling(object) Bitfield_mask( 12, 1,object) 139*4882a593Smuzhiyun #define Is_dhidden(object) Bitfield_mask( 11, 1,object) 140*4882a593Smuzhiyun #define Is_dhiddenoverflow(object) Bitfield_mask( 10, 1,object) 141*4882a593Smuzhiyun #define Is_dlowp1(object) Bitfield_mask( 31, 1,object) 142*4882a593Smuzhiyun #define Is_dhighp1(object) Bitfield_mask( 0, 1,object) 143*4882a593Smuzhiyun #define Is_dbit3p1(object) Bitfield_mask( 3, 1,object) 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define Dallp2(object) (object) 146*4882a593Smuzhiyun #define Dmantissap2(object) (object) 147*4882a593Smuzhiyun #define Dlowp2(object) Bitfield_mask( 31, 1,object) 148*4882a593Smuzhiyun #define Dlow4p2(object) Bitfield_mask( 28, 4,object) 149*4882a593Smuzhiyun #define Dlow31p2(object) Bitfield_mask( 1, 31,object) 150*4882a593Smuzhiyun #define Dhighp2(object) Bitfield_extract( 0, 1,object) 151*4882a593Smuzhiyun #define Dhigh31p2(object) Bitfield_extract( 0, 31,object) 152*4882a593Smuzhiyun #define Dbit2p2(object) Bitfield_extract( 2, 1,object) 153*4882a593Smuzhiyun #define Dbit3p2(object) Bitfield_extract( 3, 1,object) 154*4882a593Smuzhiyun #define Dbit21p2(object) Bitfield_extract( 21, 1,object) 155*4882a593Smuzhiyun #define Dbit28p2(object) Bitfield_extract( 28, 1,object) 156*4882a593Smuzhiyun #define Dbit29p2(object) Bitfield_extract( 29, 1,object) 157*4882a593Smuzhiyun #define Dbit30p2(object) Bitfield_extract( 30, 1,object) 158*4882a593Smuzhiyun #define Dbit31p2(object) Bitfield_mask( 31, 1,object) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define Deposit_dlowp2(object,value) Bitfield_deposit(value,31,1,object) 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun #define Is_dlowp2(object) Bitfield_mask( 31, 1,object) 163*4882a593Smuzhiyun #define Is_dhighp2(object) Bitfield_mask( 0, 1,object) 164*4882a593Smuzhiyun #define Is_dbit2p2(object) Bitfield_mask( 2, 1,object) 165*4882a593Smuzhiyun #define Is_dbit3p2(object) Bitfield_mask( 3, 1,object) 166*4882a593Smuzhiyun #define Is_dbit21p2(object) Bitfield_mask( 21, 1,object) 167*4882a593Smuzhiyun #define Is_dbit28p2(object) Bitfield_mask( 28, 1,object) 168*4882a593Smuzhiyun #define Is_dbit29p2(object) Bitfield_mask( 29, 1,object) 169*4882a593Smuzhiyun #define Is_dbit30p2(object) Bitfield_mask( 30, 1,object) 170*4882a593Smuzhiyun #define Is_dbit31p2(object) Bitfield_mask( 31, 1,object) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* 173*4882a593Smuzhiyun * Quad number. 174*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 175*4882a593Smuzhiyun * |s| exponent | mantissa part 1 | 176*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 177*4882a593Smuzhiyun * 178*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 179*4882a593Smuzhiyun * | mantissa part 2 | 180*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 181*4882a593Smuzhiyun * 182*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 183*4882a593Smuzhiyun * | mantissa part 3 | 184*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 185*4882a593Smuzhiyun * 186*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 187*4882a593Smuzhiyun * | mantissa part 4 | 188*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 189*4882a593Smuzhiyun */ 190*4882a593Smuzhiyun typedef struct 191*4882a593Smuzhiyun { 192*4882a593Smuzhiyun union 193*4882a593Smuzhiyun { 194*4882a593Smuzhiyun struct { unsigned qallp1; } u_qallp1; 195*4882a593Smuzhiyun /* Not needed for now... 196*4882a593Smuzhiyun Bitfield_extract( 0, 1,u_qsign,qsign) 197*4882a593Smuzhiyun Bitfield_signed_extract( 0, 1,u_qsignedsign,qsignedsign) 198*4882a593Smuzhiyun Bitfield_extract( 1, 15,u_qexponent,qexponent) 199*4882a593Smuzhiyun Bitfield_extract(16, 16,u_qmantissap1,qmantissap1) 200*4882a593Smuzhiyun Bitfield_extract(16, 1,u_qsignaling,qsignaling) 201*4882a593Smuzhiyun Bitfield_extract(1, 16,u_qsignalingnan,qsignalingnan) 202*4882a593Smuzhiyun Bitfield_extract(16, 2,u_qhigh2mantissa,qhigh2mantissa) 203*4882a593Smuzhiyun Bitfield_extract( 1, 31,u_qexponentmantissap1,qexponentmantissap1) 204*4882a593Smuzhiyun Bitfield_extract( 0, 16,u_qsignexponent,qsignexponent) 205*4882a593Smuzhiyun Bitfield_extract(15, 1,u_qhidden,qhidden) 206*4882a593Smuzhiyun Bitfield_extract(14, 1,u_qhiddenoverflow,qhiddenoverflow) 207*4882a593Smuzhiyun Bitfield_extract(15, 8,u_qhiddenhigh7mantissa,qhiddenhigh7mantissa) 208*4882a593Smuzhiyun Bitfield_extract(15, 4,u_qhiddenhigh3mantissa,qhiddenhigh3mantissa) 209*4882a593Smuzhiyun Bitfield_extract(31, 1,u_qlowp1,qlowp1) 210*4882a593Smuzhiyun Bitfield_extract( 1, 31,u_qlow31p1,qlow31p1) 211*4882a593Smuzhiyun Bitfield_extract( 0, 1,u_qhighp1,qhighp1) 212*4882a593Smuzhiyun Bitfield_extract( 0, 4,u_qhigh4p1,qhigh4p1) 213*4882a593Smuzhiyun Bitfield_extract( 0, 31,u_qhigh31p1,qhigh31p1) 214*4882a593Smuzhiyun */ 215*4882a593Smuzhiyun } quad_u1; 216*4882a593Smuzhiyun union 217*4882a593Smuzhiyun { 218*4882a593Smuzhiyun struct { unsigned qallp2; } u_qallp2; 219*4882a593Smuzhiyun /* Not needed for now... 220*4882a593Smuzhiyun Bitfield_extract(31, 1,u_qlowp2,qlowp2) 221*4882a593Smuzhiyun Bitfield_extract( 1, 31,u_qlow31p2,qlow31p2) 222*4882a593Smuzhiyun Bitfield_extract( 0, 1,u_qhighp2,qhighp2) 223*4882a593Smuzhiyun Bitfield_extract( 0, 31,u_qhigh31p2,qhigh31p2) 224*4882a593Smuzhiyun */ 225*4882a593Smuzhiyun } quad_u2; 226*4882a593Smuzhiyun union 227*4882a593Smuzhiyun { 228*4882a593Smuzhiyun struct { unsigned qallp3; } u_qallp3; 229*4882a593Smuzhiyun /* Not needed for now... 230*4882a593Smuzhiyun Bitfield_extract(31, 1,u_qlowp3,qlowp3) 231*4882a593Smuzhiyun Bitfield_extract( 1, 31,u_qlow31p3,qlow31p3) 232*4882a593Smuzhiyun Bitfield_extract( 0, 1,u_qhighp3,qhighp3) 233*4882a593Smuzhiyun Bitfield_extract( 0, 31,u_qhigh31p3,qhigh31p3) 234*4882a593Smuzhiyun */ 235*4882a593Smuzhiyun } quad_u3; 236*4882a593Smuzhiyun union 237*4882a593Smuzhiyun { 238*4882a593Smuzhiyun struct { unsigned qallp4; } u_qallp4; 239*4882a593Smuzhiyun /* Not need for now... 240*4882a593Smuzhiyun Bitfield_extract(31, 1,u_qlowp4,qlowp4) 241*4882a593Smuzhiyun Bitfield_extract( 1, 31,u_qlow31p4,qlow31p4) 242*4882a593Smuzhiyun Bitfield_extract( 0, 1,u_qhighp4,qhighp4) 243*4882a593Smuzhiyun Bitfield_extract( 0, 31,u_qhigh31p4,qhigh31p4) 244*4882a593Smuzhiyun */ 245*4882a593Smuzhiyun } quad_u4; 246*4882a593Smuzhiyun } quad_floating_point; 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /* Extension - An additional structure to hold the guard, round and 249*4882a593Smuzhiyun * sticky bits during computations. 250*4882a593Smuzhiyun */ 251*4882a593Smuzhiyun #define Extall(object) (object) 252*4882a593Smuzhiyun #define Extsign(object) Bitfield_extract( 0, 1,object) 253*4882a593Smuzhiyun #define Exthigh31(object) Bitfield_extract( 0, 31,object) 254*4882a593Smuzhiyun #define Extlow31(object) Bitfield_extract( 1, 31,object) 255*4882a593Smuzhiyun #define Extlow(object) Bitfield_extract( 31, 1,object) 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /* 258*4882a593Smuzhiyun * Single extended - The upper word is just like single precision, 259*4882a593Smuzhiyun * but one additional word of mantissa is needed. 260*4882a593Smuzhiyun */ 261*4882a593Smuzhiyun #define Sextallp1(object) (object) 262*4882a593Smuzhiyun #define Sextallp2(object) (object) 263*4882a593Smuzhiyun #define Sextlowp1(object) Bitfield_extract( 31, 1,object) 264*4882a593Smuzhiyun #define Sexthighp2(object) Bitfield_extract( 0, 1,object) 265*4882a593Smuzhiyun #define Sextlow31p2(object) Bitfield_extract( 1, 31,object) 266*4882a593Smuzhiyun #define Sexthiddenoverflow(object) Bitfield_extract( 4, 1,object) 267*4882a593Smuzhiyun #define Is_sexthiddenoverflow(object) Bitfield_mask( 4, 1,object) 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun /* 270*4882a593Smuzhiyun * Double extended - The upper two words are just like double precision, 271*4882a593Smuzhiyun * but two additional words of mantissa are needed. 272*4882a593Smuzhiyun */ 273*4882a593Smuzhiyun #define Dextallp1(object) (object) 274*4882a593Smuzhiyun #define Dextallp2(object) (object) 275*4882a593Smuzhiyun #define Dextallp3(object) (object) 276*4882a593Smuzhiyun #define Dextallp4(object) (object) 277*4882a593Smuzhiyun #define Dextlowp2(object) Bitfield_extract( 31, 1,object) 278*4882a593Smuzhiyun #define Dexthighp3(object) Bitfield_extract( 0, 1,object) 279*4882a593Smuzhiyun #define Dextlow31p3(object) Bitfield_extract( 1, 31,object) 280*4882a593Smuzhiyun #define Dexthiddenoverflow(object) Bitfield_extract( 10, 1,object) 281*4882a593Smuzhiyun #define Is_dexthiddenoverflow(object) Bitfield_mask( 10, 1,object) 282*4882a593Smuzhiyun #define Deposit_dextlowp4(object,value) Bitfield_deposit(value,31,1,object) 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun /* 285*4882a593Smuzhiyun * Declare the basic structures for the 3 different 286*4882a593Smuzhiyun * fixed-point precisions. 287*4882a593Smuzhiyun * 288*4882a593Smuzhiyun * Single number 289*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 290*4882a593Smuzhiyun * |s| integer | 291*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 292*4882a593Smuzhiyun */ 293*4882a593Smuzhiyun typedef int sgl_integer; 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun /* 296*4882a593Smuzhiyun * Double number. 297*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 298*4882a593Smuzhiyun * |s| high integer | 299*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 300*4882a593Smuzhiyun * 301*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 302*4882a593Smuzhiyun * | low integer | 303*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 304*4882a593Smuzhiyun */ 305*4882a593Smuzhiyun struct dint { 306*4882a593Smuzhiyun int wd0; 307*4882a593Smuzhiyun unsigned int wd1; 308*4882a593Smuzhiyun }; 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun struct dblwd { 311*4882a593Smuzhiyun unsigned int wd0; 312*4882a593Smuzhiyun unsigned int wd1; 313*4882a593Smuzhiyun }; 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun /* 316*4882a593Smuzhiyun * Quad number. 317*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 318*4882a593Smuzhiyun * |s| integer part1 | 319*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 320*4882a593Smuzhiyun * 321*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 322*4882a593Smuzhiyun * | integer part 2 | 323*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 324*4882a593Smuzhiyun * 325*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 326*4882a593Smuzhiyun * | integer part 3 | 327*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 328*4882a593Smuzhiyun * 329*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 330*4882a593Smuzhiyun * | integer part 4 | 331*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 332*4882a593Smuzhiyun */ 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun struct quadwd { 335*4882a593Smuzhiyun int wd0; 336*4882a593Smuzhiyun unsigned int wd1; 337*4882a593Smuzhiyun unsigned int wd2; 338*4882a593Smuzhiyun unsigned int wd3; 339*4882a593Smuzhiyun }; 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun typedef struct quadwd quad_integer; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun /* useful typedefs */ 345*4882a593Smuzhiyun typedef unsigned int sgl_floating_point; 346*4882a593Smuzhiyun typedef struct dblwd dbl_floating_point; 347*4882a593Smuzhiyun typedef struct dint dbl_integer; 348*4882a593Smuzhiyun typedef struct dblwd dbl_unsigned; 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* 351*4882a593Smuzhiyun * Define the different precisions' parameters. 352*4882a593Smuzhiyun */ 353*4882a593Smuzhiyun #define SGL_BITLENGTH 32 354*4882a593Smuzhiyun #define SGL_EMAX 127 355*4882a593Smuzhiyun #define SGL_EMIN (-126) 356*4882a593Smuzhiyun #define SGL_BIAS 127 357*4882a593Smuzhiyun #define SGL_WRAP 192 358*4882a593Smuzhiyun #define SGL_INFINITY_EXPONENT (SGL_EMAX+SGL_BIAS+1) 359*4882a593Smuzhiyun #define SGL_THRESHOLD 32 360*4882a593Smuzhiyun #define SGL_EXP_LENGTH 8 361*4882a593Smuzhiyun #define SGL_P 24 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun #define DBL_BITLENGTH 64 364*4882a593Smuzhiyun #define DBL_EMAX 1023 365*4882a593Smuzhiyun #define DBL_EMIN (-1022) 366*4882a593Smuzhiyun #define DBL_BIAS 1023 367*4882a593Smuzhiyun #define DBL_WRAP 1536 368*4882a593Smuzhiyun #define DBL_INFINITY_EXPONENT (DBL_EMAX+DBL_BIAS+1) 369*4882a593Smuzhiyun #define DBL_THRESHOLD 64 370*4882a593Smuzhiyun #define DBL_EXP_LENGTH 11 371*4882a593Smuzhiyun #define DBL_P 53 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun #define QUAD_BITLENGTH 128 374*4882a593Smuzhiyun #define QUAD_EMAX 16383 375*4882a593Smuzhiyun #define QUAD_EMIN (-16382) 376*4882a593Smuzhiyun #define QUAD_BIAS 16383 377*4882a593Smuzhiyun #define QUAD_WRAP 24576 378*4882a593Smuzhiyun #define QUAD_INFINITY_EXPONENT (QUAD_EMAX+QUAD_BIAS+1) 379*4882a593Smuzhiyun #define QUAD_P 113 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /* Boolean Values etc. */ 382*4882a593Smuzhiyun #define FALSE 0 383*4882a593Smuzhiyun #define TRUE (!FALSE) 384*4882a593Smuzhiyun #define NOT ! 385*4882a593Smuzhiyun #define XOR ^ 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun /* other constants */ 388*4882a593Smuzhiyun #undef NULL 389*4882a593Smuzhiyun #define NULL 0 390*4882a593Smuzhiyun #define NIL 0 391*4882a593Smuzhiyun #define SGL 0 392*4882a593Smuzhiyun #define DBL 1 393*4882a593Smuzhiyun #define BADFMT 2 394*4882a593Smuzhiyun #define QUAD 3 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /* Types */ 398*4882a593Smuzhiyun typedef int boolean; 399*4882a593Smuzhiyun typedef int FORMAT; 400*4882a593Smuzhiyun typedef int VOID; 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /* Declare status register equivalent to FPUs architecture. 404*4882a593Smuzhiyun * 405*4882a593Smuzhiyun * 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*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 407*4882a593Smuzhiyun * |V|Z|O|U|I|C| rsv | model | version |RM |rsv|T|r|V|Z|O|U|I| 408*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 409*4882a593Smuzhiyun */ 410*4882a593Smuzhiyun #define Cbit(object) Bitfield_extract( 5, 1,object) 411*4882a593Smuzhiyun #define Tbit(object) Bitfield_extract( 25, 1,object) 412*4882a593Smuzhiyun #define Roundingmode(object) Bitfield_extract( 21, 2,object) 413*4882a593Smuzhiyun #define Invalidtrap(object) Bitfield_extract( 27, 1,object) 414*4882a593Smuzhiyun #define Divisionbyzerotrap(object) Bitfield_extract( 28, 1,object) 415*4882a593Smuzhiyun #define Overflowtrap(object) Bitfield_extract( 29, 1,object) 416*4882a593Smuzhiyun #define Underflowtrap(object) Bitfield_extract( 30, 1,object) 417*4882a593Smuzhiyun #define Inexacttrap(object) Bitfield_extract( 31, 1,object) 418*4882a593Smuzhiyun #define Invalidflag(object) Bitfield_extract( 0, 1,object) 419*4882a593Smuzhiyun #define Divisionbyzeroflag(object) Bitfield_extract( 1, 1,object) 420*4882a593Smuzhiyun #define Overflowflag(object) Bitfield_extract( 2, 1,object) 421*4882a593Smuzhiyun #define Underflowflag(object) Bitfield_extract( 3, 1,object) 422*4882a593Smuzhiyun #define Inexactflag(object) Bitfield_extract( 4, 1,object) 423*4882a593Smuzhiyun #define Allflags(object) Bitfield_extract( 0, 5,object) 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* Definitions relevant to the status register */ 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun /* Rounding Modes */ 428*4882a593Smuzhiyun #define ROUNDNEAREST 0 429*4882a593Smuzhiyun #define ROUNDZERO 1 430*4882a593Smuzhiyun #define ROUNDPLUS 2 431*4882a593Smuzhiyun #define ROUNDMINUS 3 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun /* Exceptions */ 434*4882a593Smuzhiyun #define NOEXCEPTION 0x0 435*4882a593Smuzhiyun #define INVALIDEXCEPTION 0x20 436*4882a593Smuzhiyun #define DIVISIONBYZEROEXCEPTION 0x10 437*4882a593Smuzhiyun #define OVERFLOWEXCEPTION 0x08 438*4882a593Smuzhiyun #define UNDERFLOWEXCEPTION 0x04 439*4882a593Smuzhiyun #define INEXACTEXCEPTION 0x02 440*4882a593Smuzhiyun #define UNIMPLEMENTEDEXCEPTION 0x01 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun /* New exceptions for the 2E Opcode */ 443*4882a593Smuzhiyun #define OPC_2E_INVALIDEXCEPTION 0x30 444*4882a593Smuzhiyun #define OPC_2E_OVERFLOWEXCEPTION 0x18 445*4882a593Smuzhiyun #define OPC_2E_UNDERFLOWEXCEPTION 0x0c 446*4882a593Smuzhiyun #define OPC_2E_INEXACTEXCEPTION 0x12 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun /* Declare exception registers equivalent to FPUs architecture 449*4882a593Smuzhiyun * 450*4882a593Smuzhiyun * 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 451*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 452*4882a593Smuzhiyun * |excepttype | r1 | r2/ext | operation |parm |n| t/cond | 453*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 454*4882a593Smuzhiyun */ 455*4882a593Smuzhiyun #define Allexception(object) (object) 456*4882a593Smuzhiyun #define Exceptiontype(object) Bitfield_extract( 0, 6,object) 457*4882a593Smuzhiyun #define Instructionfield(object) Bitfield_mask( 6,26,object) 458*4882a593Smuzhiyun #define Parmfield(object) Bitfield_extract( 23, 3,object) 459*4882a593Smuzhiyun #define Rabit(object) Bitfield_extract( 24, 1,object) 460*4882a593Smuzhiyun #define Ibit(object) Bitfield_extract( 25, 1,object) 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun #define Set_exceptiontype(object,value) Bitfield_deposit(value, 0, 6,object) 463*4882a593Smuzhiyun #define Set_parmfield(object,value) Bitfield_deposit(value, 23, 3,object) 464*4882a593Smuzhiyun #define Set_exceptiontype_and_instr_field(exception,instruction,object) \ 465*4882a593Smuzhiyun object = exception << 26 | instruction 466*4882a593Smuzhiyun 467*4882a593Smuzhiyun /* Declare the condition field 468*4882a593Smuzhiyun * 469*4882a593Smuzhiyun * 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 470*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 471*4882a593Smuzhiyun * | |G|L|E|U|X| 472*4882a593Smuzhiyun * +-------+-------+-------+-------+-------+-------+-------+-------+ 473*4882a593Smuzhiyun */ 474*4882a593Smuzhiyun #define Greaterthanbit(object) Bitfield_extract( 27, 1,object) 475*4882a593Smuzhiyun #define Lessthanbit(object) Bitfield_extract( 28, 1,object) 476*4882a593Smuzhiyun #define Equalbit(object) Bitfield_extract( 29, 1,object) 477*4882a593Smuzhiyun #define Unorderedbit(object) Bitfield_extract( 30, 1,object) 478*4882a593Smuzhiyun #define Exceptionbit(object) Bitfield_extract( 31, 1,object) 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun /* An alias name for the status register */ 481*4882a593Smuzhiyun #define Fpustatus_register (*status) 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun /************************************************** 484*4882a593Smuzhiyun * Status register referencing and manipulation. * 485*4882a593Smuzhiyun **************************************************/ 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun /* Rounding mode */ 488*4882a593Smuzhiyun #define Rounding_mode() Roundingmode(Fpustatus_register) 489*4882a593Smuzhiyun #define Is_rounding_mode(rmode) \ 490*4882a593Smuzhiyun (Roundingmode(Fpustatus_register) == rmode) 491*4882a593Smuzhiyun #define Set_rounding_mode(value) \ 492*4882a593Smuzhiyun Bitfield_deposit(value,21,2,Fpustatus_register) 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun /* Boolean testing of the trap enable bits */ 495*4882a593Smuzhiyun #define Is_invalidtrap_enabled() Invalidtrap(Fpustatus_register) 496*4882a593Smuzhiyun #define Is_divisionbyzerotrap_enabled() Divisionbyzerotrap(Fpustatus_register) 497*4882a593Smuzhiyun #define Is_overflowtrap_enabled() Overflowtrap(Fpustatus_register) 498*4882a593Smuzhiyun #define Is_underflowtrap_enabled() Underflowtrap(Fpustatus_register) 499*4882a593Smuzhiyun #define Is_inexacttrap_enabled() Inexacttrap(Fpustatus_register) 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun /* Set the indicated flags in the status register */ 502*4882a593Smuzhiyun #define Set_invalidflag() Bitfield_deposit(1,0,1,Fpustatus_register) 503*4882a593Smuzhiyun #define Set_divisionbyzeroflag() Bitfield_deposit(1,1,1,Fpustatus_register) 504*4882a593Smuzhiyun #define Set_overflowflag() Bitfield_deposit(1,2,1,Fpustatus_register) 505*4882a593Smuzhiyun #define Set_underflowflag() Bitfield_deposit(1,3,1,Fpustatus_register) 506*4882a593Smuzhiyun #define Set_inexactflag() Bitfield_deposit(1,4,1,Fpustatus_register) 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun #define Clear_all_flags() Bitfield_deposit(0,0,5,Fpustatus_register) 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun /* Manipulate the trap and condition code bits (tbit and cbit) */ 511*4882a593Smuzhiyun #define Set_tbit() Bitfield_deposit(1,25,1,Fpustatus_register) 512*4882a593Smuzhiyun #define Clear_tbit() Bitfield_deposit(0,25,1,Fpustatus_register) 513*4882a593Smuzhiyun #define Is_tbit_set() Tbit(Fpustatus_register) 514*4882a593Smuzhiyun #define Is_cbit_set() Cbit(Fpustatus_register) 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun #define Set_status_cbit(value) \ 517*4882a593Smuzhiyun Bitfield_deposit(value,5,1,Fpustatus_register) 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun /******************************* 520*4882a593Smuzhiyun * Condition field referencing * 521*4882a593Smuzhiyun *******************************/ 522*4882a593Smuzhiyun #define Unordered(cond) Unorderedbit(cond) 523*4882a593Smuzhiyun #define Equal(cond) Equalbit(cond) 524*4882a593Smuzhiyun #define Lessthan(cond) Lessthanbit(cond) 525*4882a593Smuzhiyun #define Greaterthan(cond) Greaterthanbit(cond) 526*4882a593Smuzhiyun #define Exception(cond) Exceptionbit(cond) 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun 529*4882a593Smuzhiyun /* Defines for the extension */ 530*4882a593Smuzhiyun #define Ext_isone_sign(extent) (Extsign(extent)) 531*4882a593Smuzhiyun #define Ext_isnotzero(extent) \ 532*4882a593Smuzhiyun (Extall(extent)) 533*4882a593Smuzhiyun #define Ext_isnotzero_lower(extent) \ 534*4882a593Smuzhiyun (Extlow31(extent)) 535*4882a593Smuzhiyun #define Ext_leftshiftby1(extent) \ 536*4882a593Smuzhiyun Extall(extent) <<= 1 537*4882a593Smuzhiyun #define Ext_negate(extent) \ 538*4882a593Smuzhiyun (int )Extall(extent) = 0 - (int )Extall(extent) 539*4882a593Smuzhiyun #define Ext_setone_low(extent) Bitfield_deposit(1,31,1,extent) 540*4882a593Smuzhiyun #define Ext_setzero(extent) Extall(extent) = 0 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun typedef int operation; 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun /* error messages */ 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun #define NONE 0 547*4882a593Smuzhiyun #define UNDEFFPINST 1 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun /* Function definitions: opcode, opclass */ 550*4882a593Smuzhiyun #define FTEST (1<<2) | 0 551*4882a593Smuzhiyun #define FCPY (2<<2) | 0 552*4882a593Smuzhiyun #define FABS (3<<2) | 0 553*4882a593Smuzhiyun #define FSQRT (4<<2) | 0 554*4882a593Smuzhiyun #define FRND (5<<2) | 0 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun #define FCNVFF (0<<2) | 1 557*4882a593Smuzhiyun #define FCNVXF (1<<2) | 1 558*4882a593Smuzhiyun #define FCNVFX (2<<2) | 1 559*4882a593Smuzhiyun #define FCNVFXT (3<<2) | 1 560*4882a593Smuzhiyun 561*4882a593Smuzhiyun #define FCMP (0<<2) | 2 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun #define FADD (0<<2) | 3 564*4882a593Smuzhiyun #define FSUB (1<<2) | 3 565*4882a593Smuzhiyun #define FMPY (2<<2) | 3 566*4882a593Smuzhiyun #define FDIV (3<<2) | 3 567*4882a593Smuzhiyun #define FREM (4<<2) | 3 568*4882a593Smuzhiyun 569