cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

float.h (21715B)


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