112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  scfx_ieee.h -
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Martin Janssen, Synopsys, Inc.
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de *****************************************************************************/
2712027Sjungma@eit.uni-kl.de
2812027Sjungma@eit.uni-kl.de/*****************************************************************************
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3112027Sjungma@eit.uni-kl.de  changes you are making here.
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
3412027Sjungma@eit.uni-kl.de  Description of Modification:
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de *****************************************************************************/
3712027Sjungma@eit.uni-kl.de
3812027Sjungma@eit.uni-kl.de// $Log: scfx_ieee.h,v $
3912027Sjungma@eit.uni-kl.de// Revision 1.3  2011/08/24 22:05:43  acg
4012027Sjungma@eit.uni-kl.de//  Torsten Maehne: initialization changes to remove warnings.
4112027Sjungma@eit.uni-kl.de//
4212027Sjungma@eit.uni-kl.de// Revision 1.2  2011/08/07 18:55:24  acg
4312027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: added guard for __clang__ to get the clang platform
4412027Sjungma@eit.uni-kl.de//  working.
4512027Sjungma@eit.uni-kl.de//
4612027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:04  acg
4712027Sjungma@eit.uni-kl.de// SystemC 2.3
4812027Sjungma@eit.uni-kl.de//
4912027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:53:58  acg
5012027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in
5112027Sjungma@eit.uni-kl.de// the source.
5212027Sjungma@eit.uni-kl.de//
5312027Sjungma@eit.uni-kl.de
5412027Sjungma@eit.uni-kl.de#ifndef SCFX_IEEE_H
5512027Sjungma@eit.uni-kl.de#define SCFX_IEEE_H
5612027Sjungma@eit.uni-kl.de
5712027Sjungma@eit.uni-kl.de
5812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_fxdefs.h"
5912027Sjungma@eit.uni-kl.de
6012027Sjungma@eit.uni-kl.de
6112027Sjungma@eit.uni-kl.denamespace sc_dt
6212027Sjungma@eit.uni-kl.de{
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.de// classes defined in this module
6512027Sjungma@eit.uni-kl.deunion ieee_double;
6612027Sjungma@eit.uni-kl.declass scfx_ieee_double;
6712027Sjungma@eit.uni-kl.deunion ieee_float;
6812027Sjungma@eit.uni-kl.declass scfx_ieee_float;
6912027Sjungma@eit.uni-kl.de
7012027Sjungma@eit.uni-kl.de#define SCFX_MASK_(Size) \
7112027Sjungma@eit.uni-kl.de   ((1u << (Size))-1u)
7212027Sjungma@eit.uni-kl.de
7312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
7412027Sjungma@eit.uni-kl.de//  UNION : ieee_double
7512027Sjungma@eit.uni-kl.de//
7612027Sjungma@eit.uni-kl.de//  IEEE 754 double-precision format.
7712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
7812027Sjungma@eit.uni-kl.de
7912027Sjungma@eit.uni-kl.deunion ieee_double
8012027Sjungma@eit.uni-kl.de{
8112027Sjungma@eit.uni-kl.de
8212027Sjungma@eit.uni-kl.de    double d;
8312027Sjungma@eit.uni-kl.de
8412027Sjungma@eit.uni-kl.de    struct
8512027Sjungma@eit.uni-kl.de    {
8612027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN )
8712027Sjungma@eit.uni-kl.de        unsigned negative:1;
8812027Sjungma@eit.uni-kl.de        unsigned exponent:11;
8912027Sjungma@eit.uni-kl.de        unsigned mantissa0:20;
9012027Sjungma@eit.uni-kl.de        unsigned mantissa1:32;
9112027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN )
9212027Sjungma@eit.uni-kl.de        unsigned mantissa1:32;
9312027Sjungma@eit.uni-kl.de        unsigned mantissa0:20;
9412027Sjungma@eit.uni-kl.de        unsigned exponent:11;
9512027Sjungma@eit.uni-kl.de        unsigned negative:1;
9612027Sjungma@eit.uni-kl.de#endif
9712027Sjungma@eit.uni-kl.de    } s;
9812027Sjungma@eit.uni-kl.de
9912027Sjungma@eit.uni-kl.de};
10012027Sjungma@eit.uni-kl.de
10112027Sjungma@eit.uni-kl.de
10212027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_DOUBLE_BIAS   =  1023U;
10312027Sjungma@eit.uni-kl.de
10412027Sjungma@eit.uni-kl.deconst int          SCFX_IEEE_DOUBLE_E_MAX  =  1023;
10512027Sjungma@eit.uni-kl.deconst int          SCFX_IEEE_DOUBLE_E_MIN  = -1022;
10612027Sjungma@eit.uni-kl.de
10712027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_DOUBLE_M_SIZE  =    52;
10812027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_DOUBLE_M0_SIZE =    20;
10912027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_DOUBLE_M1_SIZE =    32;
11012027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_DOUBLE_E_SIZE  =    11;
11112027Sjungma@eit.uni-kl.de
11212027Sjungma@eit.uni-kl.de
11312027Sjungma@eit.uni-kl.de
11412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
11512027Sjungma@eit.uni-kl.de//  CLASS : scfx_ieee_double
11612027Sjungma@eit.uni-kl.de//
11712027Sjungma@eit.uni-kl.de//  Convenient interface to union ieee_double.
11812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.declass scfx_ieee_double
12112027Sjungma@eit.uni-kl.de{
12212027Sjungma@eit.uni-kl.de
12312027Sjungma@eit.uni-kl.de    ieee_double m_id;
12412027Sjungma@eit.uni-kl.de
12512027Sjungma@eit.uni-kl.depublic:
12612027Sjungma@eit.uni-kl.de
12712027Sjungma@eit.uni-kl.de    scfx_ieee_double();
12812027Sjungma@eit.uni-kl.de    scfx_ieee_double( double );
12912027Sjungma@eit.uni-kl.de    scfx_ieee_double( const scfx_ieee_double& );
13012027Sjungma@eit.uni-kl.de
13112027Sjungma@eit.uni-kl.de    scfx_ieee_double& operator = ( double );
13212027Sjungma@eit.uni-kl.de    scfx_ieee_double& operator = ( const scfx_ieee_double& );
13312027Sjungma@eit.uni-kl.de
13412027Sjungma@eit.uni-kl.de    operator double() const;
13512027Sjungma@eit.uni-kl.de
13612027Sjungma@eit.uni-kl.de    unsigned int negative() const;
13712027Sjungma@eit.uni-kl.de    void negative( unsigned int );
13812027Sjungma@eit.uni-kl.de    int exponent() const;
13912027Sjungma@eit.uni-kl.de    void exponent( int );
14012027Sjungma@eit.uni-kl.de    unsigned int mantissa0() const;
14112027Sjungma@eit.uni-kl.de    void mantissa0( unsigned int );
14212027Sjungma@eit.uni-kl.de    unsigned int mantissa1() const;
14312027Sjungma@eit.uni-kl.de    void mantissa1( unsigned int );
14412027Sjungma@eit.uni-kl.de
14512027Sjungma@eit.uni-kl.de    bool is_zero() const;
14612027Sjungma@eit.uni-kl.de    bool is_subnormal() const;
14712027Sjungma@eit.uni-kl.de    bool is_normal() const;
14812027Sjungma@eit.uni-kl.de    bool is_inf() const;
14912027Sjungma@eit.uni-kl.de    bool is_nan() const;
15012027Sjungma@eit.uni-kl.de
15112027Sjungma@eit.uni-kl.de    void set_inf();
15212027Sjungma@eit.uni-kl.de    void set_nan();
15312027Sjungma@eit.uni-kl.de
15412027Sjungma@eit.uni-kl.de    int msb() const;            // most significant non-zero bit
15512027Sjungma@eit.uni-kl.de    int lsb() const;            // least significant non-zero bit
15612027Sjungma@eit.uni-kl.de
15712027Sjungma@eit.uni-kl.de    static const scfx_ieee_double nan();
15812027Sjungma@eit.uni-kl.de    static const scfx_ieee_double inf( int );
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de};
16112027Sjungma@eit.uni-kl.de
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
16412027Sjungma@eit.uni-kl.de
16512027Sjungma@eit.uni-kl.deinline
16612027Sjungma@eit.uni-kl.descfx_ieee_double::scfx_ieee_double() : m_id()
16712027Sjungma@eit.uni-kl.de{
16812027Sjungma@eit.uni-kl.de    m_id.d = 0.0;
16912027Sjungma@eit.uni-kl.de}
17012027Sjungma@eit.uni-kl.de
17112027Sjungma@eit.uni-kl.deinline
17212027Sjungma@eit.uni-kl.descfx_ieee_double::scfx_ieee_double( double d ) : m_id()
17312027Sjungma@eit.uni-kl.de{
17412027Sjungma@eit.uni-kl.de    m_id.d = d;
17512027Sjungma@eit.uni-kl.de}
17612027Sjungma@eit.uni-kl.de
17712027Sjungma@eit.uni-kl.deinline
17812027Sjungma@eit.uni-kl.descfx_ieee_double::scfx_ieee_double( const scfx_ieee_double& a ) : m_id(a.m_id)
17912027Sjungma@eit.uni-kl.de{
18012027Sjungma@eit.uni-kl.de    // m_id.d = a.m_id.d;
18112027Sjungma@eit.uni-kl.de}
18212027Sjungma@eit.uni-kl.de
18312027Sjungma@eit.uni-kl.de
18412027Sjungma@eit.uni-kl.deinline
18512027Sjungma@eit.uni-kl.descfx_ieee_double&
18612027Sjungma@eit.uni-kl.descfx_ieee_double::operator = ( double d )
18712027Sjungma@eit.uni-kl.de{
18812027Sjungma@eit.uni-kl.de    m_id.d = d;
18912027Sjungma@eit.uni-kl.de    return *this;
19012027Sjungma@eit.uni-kl.de}
19112027Sjungma@eit.uni-kl.de
19212027Sjungma@eit.uni-kl.deinline
19312027Sjungma@eit.uni-kl.descfx_ieee_double&
19412027Sjungma@eit.uni-kl.descfx_ieee_double::operator = ( const scfx_ieee_double& a )
19512027Sjungma@eit.uni-kl.de{
19612027Sjungma@eit.uni-kl.de    m_id.d = a.m_id.d;
19712027Sjungma@eit.uni-kl.de    return *this;
19812027Sjungma@eit.uni-kl.de}
19912027Sjungma@eit.uni-kl.de
20012027Sjungma@eit.uni-kl.de
20112027Sjungma@eit.uni-kl.deinline
20212027Sjungma@eit.uni-kl.descfx_ieee_double::operator double() const
20312027Sjungma@eit.uni-kl.de{
20412027Sjungma@eit.uni-kl.de    return m_id.d;
20512027Sjungma@eit.uni-kl.de}
20612027Sjungma@eit.uni-kl.de
20712027Sjungma@eit.uni-kl.de
20812027Sjungma@eit.uni-kl.deinline
20912027Sjungma@eit.uni-kl.deunsigned int
21012027Sjungma@eit.uni-kl.descfx_ieee_double::negative() const
21112027Sjungma@eit.uni-kl.de{
21212027Sjungma@eit.uni-kl.de    return m_id.s.negative;
21312027Sjungma@eit.uni-kl.de}
21412027Sjungma@eit.uni-kl.de
21512027Sjungma@eit.uni-kl.deinline
21612027Sjungma@eit.uni-kl.devoid
21712027Sjungma@eit.uni-kl.descfx_ieee_double::negative( unsigned int a )
21812027Sjungma@eit.uni-kl.de{
21912027Sjungma@eit.uni-kl.de    m_id.s.negative = a & SCFX_MASK_(1);
22012027Sjungma@eit.uni-kl.de}
22112027Sjungma@eit.uni-kl.de
22212027Sjungma@eit.uni-kl.deinline
22312027Sjungma@eit.uni-kl.deint
22412027Sjungma@eit.uni-kl.descfx_ieee_double::exponent() const
22512027Sjungma@eit.uni-kl.de{
22612027Sjungma@eit.uni-kl.de    return m_id.s.exponent - SCFX_IEEE_DOUBLE_BIAS;
22712027Sjungma@eit.uni-kl.de}
22812027Sjungma@eit.uni-kl.de
22912027Sjungma@eit.uni-kl.deinline
23012027Sjungma@eit.uni-kl.devoid
23112027Sjungma@eit.uni-kl.descfx_ieee_double::exponent( int a )
23212027Sjungma@eit.uni-kl.de{
23312027Sjungma@eit.uni-kl.de    m_id.s.exponent = (SCFX_IEEE_DOUBLE_BIAS + a)
23412027Sjungma@eit.uni-kl.de                      & SCFX_MASK_(SCFX_IEEE_DOUBLE_E_SIZE);
23512027Sjungma@eit.uni-kl.de}
23612027Sjungma@eit.uni-kl.de
23712027Sjungma@eit.uni-kl.deinline
23812027Sjungma@eit.uni-kl.deunsigned int
23912027Sjungma@eit.uni-kl.descfx_ieee_double::mantissa0() const
24012027Sjungma@eit.uni-kl.de{
24112027Sjungma@eit.uni-kl.de    return m_id.s.mantissa0;
24212027Sjungma@eit.uni-kl.de}
24312027Sjungma@eit.uni-kl.de
24412027Sjungma@eit.uni-kl.deinline
24512027Sjungma@eit.uni-kl.devoid
24612027Sjungma@eit.uni-kl.descfx_ieee_double::mantissa0( unsigned int a )
24712027Sjungma@eit.uni-kl.de{
24812027Sjungma@eit.uni-kl.de    m_id.s.mantissa0 = a & SCFX_MASK_(SCFX_IEEE_DOUBLE_M0_SIZE);
24912027Sjungma@eit.uni-kl.de}
25012027Sjungma@eit.uni-kl.de
25112027Sjungma@eit.uni-kl.deinline
25212027Sjungma@eit.uni-kl.deunsigned int
25312027Sjungma@eit.uni-kl.descfx_ieee_double::mantissa1() const
25412027Sjungma@eit.uni-kl.de{
25512027Sjungma@eit.uni-kl.de    return m_id.s.mantissa1;
25612027Sjungma@eit.uni-kl.de}
25712027Sjungma@eit.uni-kl.de
25812027Sjungma@eit.uni-kl.deinline
25912027Sjungma@eit.uni-kl.devoid
26012027Sjungma@eit.uni-kl.descfx_ieee_double::mantissa1( unsigned int a )
26112027Sjungma@eit.uni-kl.de{
26212027Sjungma@eit.uni-kl.de    m_id.s.mantissa1 = a; // & SCFX_MASK_(SCFX_IEEE_DOUBLE_M1_SIZE);
26312027Sjungma@eit.uni-kl.de}
26412027Sjungma@eit.uni-kl.de
26512027Sjungma@eit.uni-kl.de
26612027Sjungma@eit.uni-kl.deinline
26712027Sjungma@eit.uni-kl.debool
26812027Sjungma@eit.uni-kl.descfx_ieee_double::is_zero() const
26912027Sjungma@eit.uni-kl.de{
27012027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_DOUBLE_E_MIN - 1 &&
27112027Sjungma@eit.uni-kl.de             mantissa0() == 0U && mantissa1() == 0U );
27212027Sjungma@eit.uni-kl.de}
27312027Sjungma@eit.uni-kl.de
27412027Sjungma@eit.uni-kl.deinline
27512027Sjungma@eit.uni-kl.debool
27612027Sjungma@eit.uni-kl.descfx_ieee_double::is_subnormal() const
27712027Sjungma@eit.uni-kl.de{
27812027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_DOUBLE_E_MIN - 1 &&
27912027Sjungma@eit.uni-kl.de             ( mantissa0() != 0U || mantissa1() != 0U ) );
28012027Sjungma@eit.uni-kl.de}
28112027Sjungma@eit.uni-kl.de
28212027Sjungma@eit.uni-kl.deinline
28312027Sjungma@eit.uni-kl.debool
28412027Sjungma@eit.uni-kl.descfx_ieee_double::is_normal() const
28512027Sjungma@eit.uni-kl.de{
28612027Sjungma@eit.uni-kl.de    return ( exponent() >= SCFX_IEEE_DOUBLE_E_MIN &&
28712027Sjungma@eit.uni-kl.de             exponent() <= SCFX_IEEE_DOUBLE_E_MAX );
28812027Sjungma@eit.uni-kl.de}
28912027Sjungma@eit.uni-kl.de
29012027Sjungma@eit.uni-kl.deinline
29112027Sjungma@eit.uni-kl.debool
29212027Sjungma@eit.uni-kl.descfx_ieee_double::is_inf() const
29312027Sjungma@eit.uni-kl.de{
29412027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_DOUBLE_E_MAX + 1 &&
29512027Sjungma@eit.uni-kl.de             mantissa0() == 0U && mantissa1() == 0U );
29612027Sjungma@eit.uni-kl.de}
29712027Sjungma@eit.uni-kl.de
29812027Sjungma@eit.uni-kl.deinline
29912027Sjungma@eit.uni-kl.debool
30012027Sjungma@eit.uni-kl.descfx_ieee_double::is_nan() const
30112027Sjungma@eit.uni-kl.de{
30212027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_DOUBLE_E_MAX + 1 &&
30312027Sjungma@eit.uni-kl.de             ( mantissa0() != 0U || mantissa1() != 0U ) );
30412027Sjungma@eit.uni-kl.de}
30512027Sjungma@eit.uni-kl.de
30612027Sjungma@eit.uni-kl.de
30712027Sjungma@eit.uni-kl.deinline
30812027Sjungma@eit.uni-kl.devoid
30912027Sjungma@eit.uni-kl.descfx_ieee_double::set_inf()
31012027Sjungma@eit.uni-kl.de{
31112027Sjungma@eit.uni-kl.de    exponent( SCFX_IEEE_DOUBLE_E_MAX + 1 );
31212027Sjungma@eit.uni-kl.de    mantissa0( 0U );
31312027Sjungma@eit.uni-kl.de    mantissa1( 0U );
31412027Sjungma@eit.uni-kl.de}
31512027Sjungma@eit.uni-kl.de
31612027Sjungma@eit.uni-kl.deinline
31712027Sjungma@eit.uni-kl.devoid
31812027Sjungma@eit.uni-kl.descfx_ieee_double::set_nan()
31912027Sjungma@eit.uni-kl.de{
32012027Sjungma@eit.uni-kl.de    exponent( SCFX_IEEE_DOUBLE_E_MAX + 1 );
32112027Sjungma@eit.uni-kl.de    mantissa0( (unsigned int) -1 );
32212027Sjungma@eit.uni-kl.de    mantissa1( (unsigned int) -1 );
32312027Sjungma@eit.uni-kl.de}
32412027Sjungma@eit.uni-kl.de
32512027Sjungma@eit.uni-kl.de
32612027Sjungma@eit.uni-kl.de#define MSB_STATEMENT(x,n) if( x >> n ) { x >>= n; i += n; }
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.deinline
32912027Sjungma@eit.uni-kl.deint
33012027Sjungma@eit.uni-kl.descfx_ieee_double::msb() const
33112027Sjungma@eit.uni-kl.de{
33212027Sjungma@eit.uni-kl.de    unsigned int m0 = mantissa0();
33312027Sjungma@eit.uni-kl.de    unsigned int m1 = mantissa1();
33412027Sjungma@eit.uni-kl.de    if( m0 != 0 )
33512027Sjungma@eit.uni-kl.de    {
33612027Sjungma@eit.uni-kl.de        int i = 0;
33712027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m0,16);
33812027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m0,8);
33912027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m0,4);
34012027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m0,2);
34112027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m0,1);
34212027Sjungma@eit.uni-kl.de        return ( i - 20 );
34312027Sjungma@eit.uni-kl.de    }
34412027Sjungma@eit.uni-kl.de    else if( m1 != 0 )
34512027Sjungma@eit.uni-kl.de    {
34612027Sjungma@eit.uni-kl.de        int i = 0;
34712027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m1,16);
34812027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m1,8);
34912027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m1,4);
35012027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m1,2);
35112027Sjungma@eit.uni-kl.de        MSB_STATEMENT(m1,1);
35212027Sjungma@eit.uni-kl.de        return ( i - 52 );
35312027Sjungma@eit.uni-kl.de    }
35412027Sjungma@eit.uni-kl.de    else
35512027Sjungma@eit.uni-kl.de    {
35612027Sjungma@eit.uni-kl.de        return 0;
35712027Sjungma@eit.uni-kl.de    }
35812027Sjungma@eit.uni-kl.de}
35912027Sjungma@eit.uni-kl.de
36012027Sjungma@eit.uni-kl.de#undef MSB_STATEMENT
36112027Sjungma@eit.uni-kl.de
36212027Sjungma@eit.uni-kl.de#define LSB_STATEMENT(x,n) if( x << n ) { x <<= n; i -= n; }
36312027Sjungma@eit.uni-kl.de
36412027Sjungma@eit.uni-kl.deinline
36512027Sjungma@eit.uni-kl.deint
36612027Sjungma@eit.uni-kl.descfx_ieee_double::lsb() const
36712027Sjungma@eit.uni-kl.de{
36812027Sjungma@eit.uni-kl.de    unsigned int m0 = mantissa0();
36912027Sjungma@eit.uni-kl.de    unsigned int m1 = mantissa1();
37012027Sjungma@eit.uni-kl.de    if( m1 != 0 )
37112027Sjungma@eit.uni-kl.de    {
37212027Sjungma@eit.uni-kl.de        int i = 31;
37312027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m1,16);
37412027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m1,8);
37512027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m1,4);
37612027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m1,2);
37712027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m1,1);
37812027Sjungma@eit.uni-kl.de        return ( i - 52 );
37912027Sjungma@eit.uni-kl.de    }
38012027Sjungma@eit.uni-kl.de    else if( m0 != 0 )
38112027Sjungma@eit.uni-kl.de    {
38212027Sjungma@eit.uni-kl.de        int i = 31;
38312027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m0,16);
38412027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m0,8);
38512027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m0,4);
38612027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m0,2);
38712027Sjungma@eit.uni-kl.de        LSB_STATEMENT(m0,1);
38812027Sjungma@eit.uni-kl.de        return ( i - 20 );
38912027Sjungma@eit.uni-kl.de    }
39012027Sjungma@eit.uni-kl.de    else
39112027Sjungma@eit.uni-kl.de    {
39212027Sjungma@eit.uni-kl.de        return 0;
39312027Sjungma@eit.uni-kl.de    }
39412027Sjungma@eit.uni-kl.de}
39512027Sjungma@eit.uni-kl.de
39612027Sjungma@eit.uni-kl.de#undef LSB_STATEMENT
39712027Sjungma@eit.uni-kl.de
39812027Sjungma@eit.uni-kl.de
39912027Sjungma@eit.uni-kl.deinline
40012027Sjungma@eit.uni-kl.deconst scfx_ieee_double
40112027Sjungma@eit.uni-kl.descfx_ieee_double::nan()
40212027Sjungma@eit.uni-kl.de{
40312027Sjungma@eit.uni-kl.de    scfx_ieee_double id;
40412027Sjungma@eit.uni-kl.de    id.set_nan();
40512027Sjungma@eit.uni-kl.de    return id;
40612027Sjungma@eit.uni-kl.de}
40712027Sjungma@eit.uni-kl.de
40812027Sjungma@eit.uni-kl.deinline
40912027Sjungma@eit.uni-kl.deconst scfx_ieee_double
41012027Sjungma@eit.uni-kl.descfx_ieee_double::inf( int sign )
41112027Sjungma@eit.uni-kl.de{
41212027Sjungma@eit.uni-kl.de    scfx_ieee_double id( sign );
41312027Sjungma@eit.uni-kl.de    id.set_inf();
41412027Sjungma@eit.uni-kl.de    return id;
41512027Sjungma@eit.uni-kl.de}
41612027Sjungma@eit.uni-kl.de
41712027Sjungma@eit.uni-kl.de
41812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
41912027Sjungma@eit.uni-kl.de//  UNION : ieee_float
42012027Sjungma@eit.uni-kl.de//
42112027Sjungma@eit.uni-kl.de//  IEEE 754 single-precision format.
42212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
42312027Sjungma@eit.uni-kl.de
42412027Sjungma@eit.uni-kl.deunion ieee_float
42512027Sjungma@eit.uni-kl.de{
42612027Sjungma@eit.uni-kl.de
42712027Sjungma@eit.uni-kl.de    float f;
42812027Sjungma@eit.uni-kl.de
42912027Sjungma@eit.uni-kl.de    struct
43012027Sjungma@eit.uni-kl.de    {
43112027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN )
43212027Sjungma@eit.uni-kl.de        unsigned negative:1;
43312027Sjungma@eit.uni-kl.de        unsigned exponent:8;
43412027Sjungma@eit.uni-kl.de        unsigned mantissa:23;
43512027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN )
43612027Sjungma@eit.uni-kl.de        unsigned mantissa:23;
43712027Sjungma@eit.uni-kl.de        unsigned exponent:8;
43812027Sjungma@eit.uni-kl.de        unsigned negative:1;
43912027Sjungma@eit.uni-kl.de#endif
44012027Sjungma@eit.uni-kl.de    } s;
44112027Sjungma@eit.uni-kl.de
44212027Sjungma@eit.uni-kl.de};
44312027Sjungma@eit.uni-kl.de
44412027Sjungma@eit.uni-kl.de
44512027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_FLOAT_BIAS   =  127U;
44612027Sjungma@eit.uni-kl.de
44712027Sjungma@eit.uni-kl.deconst int          SCFX_IEEE_FLOAT_E_MAX  =  127;
44812027Sjungma@eit.uni-kl.deconst int          SCFX_IEEE_FLOAT_E_MIN  = -126;
44912027Sjungma@eit.uni-kl.de
45012027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_FLOAT_M_SIZE =   23;
45112027Sjungma@eit.uni-kl.deconst unsigned int SCFX_IEEE_FLOAT_E_SIZE =    8;
45212027Sjungma@eit.uni-kl.de
45312027Sjungma@eit.uni-kl.de
45412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
45512027Sjungma@eit.uni-kl.de//  CLASS : scfx_ieee_float
45612027Sjungma@eit.uni-kl.de//
45712027Sjungma@eit.uni-kl.de// Convenient wrapper to union ieee_float.
45812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
45912027Sjungma@eit.uni-kl.de
46012027Sjungma@eit.uni-kl.declass scfx_ieee_float
46112027Sjungma@eit.uni-kl.de{
46212027Sjungma@eit.uni-kl.de
46312027Sjungma@eit.uni-kl.de    ieee_float m_if;
46412027Sjungma@eit.uni-kl.de
46512027Sjungma@eit.uni-kl.depublic:
46612027Sjungma@eit.uni-kl.de
46712027Sjungma@eit.uni-kl.de    scfx_ieee_float();
46812027Sjungma@eit.uni-kl.de    scfx_ieee_float( float );
46912027Sjungma@eit.uni-kl.de    scfx_ieee_float( const scfx_ieee_float& );
47012027Sjungma@eit.uni-kl.de
47112027Sjungma@eit.uni-kl.de    scfx_ieee_float& operator = ( float );
47212027Sjungma@eit.uni-kl.de    scfx_ieee_float& operator = ( const scfx_ieee_float& );
47312027Sjungma@eit.uni-kl.de
47412027Sjungma@eit.uni-kl.de    operator float() const;
47512027Sjungma@eit.uni-kl.de
47612027Sjungma@eit.uni-kl.de    unsigned int negative() const;
47712027Sjungma@eit.uni-kl.de    void negative( unsigned int );
47812027Sjungma@eit.uni-kl.de    int exponent() const;
47912027Sjungma@eit.uni-kl.de    void exponent( int );
48012027Sjungma@eit.uni-kl.de    unsigned int mantissa() const;
48112027Sjungma@eit.uni-kl.de    void mantissa( unsigned int );
48212027Sjungma@eit.uni-kl.de
48312027Sjungma@eit.uni-kl.de    bool is_zero() const;
48412027Sjungma@eit.uni-kl.de    bool is_subnormal() const;
48512027Sjungma@eit.uni-kl.de    bool is_normal() const;
48612027Sjungma@eit.uni-kl.de    bool is_inf() const;
48712027Sjungma@eit.uni-kl.de    bool is_nan() const;
48812027Sjungma@eit.uni-kl.de
48912027Sjungma@eit.uni-kl.de    void set_inf();
49012027Sjungma@eit.uni-kl.de    void set_nan();
49112027Sjungma@eit.uni-kl.de
49212027Sjungma@eit.uni-kl.de};
49312027Sjungma@eit.uni-kl.de
49412027Sjungma@eit.uni-kl.de
49512027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
49612027Sjungma@eit.uni-kl.de
49712027Sjungma@eit.uni-kl.deinline
49812027Sjungma@eit.uni-kl.descfx_ieee_float::scfx_ieee_float() : m_if()
49912027Sjungma@eit.uni-kl.de{
50012027Sjungma@eit.uni-kl.de    m_if.f = 0.0;
50112027Sjungma@eit.uni-kl.de}
50212027Sjungma@eit.uni-kl.de
50312027Sjungma@eit.uni-kl.deinline
50412027Sjungma@eit.uni-kl.descfx_ieee_float::scfx_ieee_float( float f ) : m_if()
50512027Sjungma@eit.uni-kl.de{
50612027Sjungma@eit.uni-kl.de    m_if.f = f;
50712027Sjungma@eit.uni-kl.de}
50812027Sjungma@eit.uni-kl.de
50912027Sjungma@eit.uni-kl.deinline
51012027Sjungma@eit.uni-kl.descfx_ieee_float::scfx_ieee_float( const scfx_ieee_float& a ) : m_if(a.m_if)
51112027Sjungma@eit.uni-kl.de{
51212027Sjungma@eit.uni-kl.de    // m_if.f = a.m_if.f;
51312027Sjungma@eit.uni-kl.de}
51412027Sjungma@eit.uni-kl.de
51512027Sjungma@eit.uni-kl.de
51612027Sjungma@eit.uni-kl.deinline
51712027Sjungma@eit.uni-kl.descfx_ieee_float&
51812027Sjungma@eit.uni-kl.descfx_ieee_float::operator = ( float f )
51912027Sjungma@eit.uni-kl.de{
52012027Sjungma@eit.uni-kl.de    m_if.f = f;
52112027Sjungma@eit.uni-kl.de    return *this;
52212027Sjungma@eit.uni-kl.de}
52312027Sjungma@eit.uni-kl.de
52412027Sjungma@eit.uni-kl.deinline
52512027Sjungma@eit.uni-kl.descfx_ieee_float&
52612027Sjungma@eit.uni-kl.descfx_ieee_float::operator = ( const scfx_ieee_float& a )
52712027Sjungma@eit.uni-kl.de{
52812027Sjungma@eit.uni-kl.de    m_if.f = a.m_if.f;
52912027Sjungma@eit.uni-kl.de    return *this;
53012027Sjungma@eit.uni-kl.de}
53112027Sjungma@eit.uni-kl.de
53212027Sjungma@eit.uni-kl.de
53312027Sjungma@eit.uni-kl.deinline
53412027Sjungma@eit.uni-kl.descfx_ieee_float::operator float() const
53512027Sjungma@eit.uni-kl.de{
53612027Sjungma@eit.uni-kl.de    return m_if.f;
53712027Sjungma@eit.uni-kl.de}
53812027Sjungma@eit.uni-kl.de
53912027Sjungma@eit.uni-kl.de
54012027Sjungma@eit.uni-kl.deinline
54112027Sjungma@eit.uni-kl.deunsigned int
54212027Sjungma@eit.uni-kl.descfx_ieee_float::negative() const
54312027Sjungma@eit.uni-kl.de{
54412027Sjungma@eit.uni-kl.de    return m_if.s.negative;
54512027Sjungma@eit.uni-kl.de}
54612027Sjungma@eit.uni-kl.de
54712027Sjungma@eit.uni-kl.deinline
54812027Sjungma@eit.uni-kl.devoid
54912027Sjungma@eit.uni-kl.descfx_ieee_float::negative( unsigned int a )
55012027Sjungma@eit.uni-kl.de{
55112027Sjungma@eit.uni-kl.de    m_if.s.negative = a & SCFX_MASK_(1);
55212027Sjungma@eit.uni-kl.de}
55312027Sjungma@eit.uni-kl.de
55412027Sjungma@eit.uni-kl.deinline
55512027Sjungma@eit.uni-kl.deint
55612027Sjungma@eit.uni-kl.descfx_ieee_float::exponent() const
55712027Sjungma@eit.uni-kl.de{
55812027Sjungma@eit.uni-kl.de    return m_if.s.exponent - SCFX_IEEE_FLOAT_BIAS;
55912027Sjungma@eit.uni-kl.de}
56012027Sjungma@eit.uni-kl.de
56112027Sjungma@eit.uni-kl.deinline
56212027Sjungma@eit.uni-kl.devoid
56312027Sjungma@eit.uni-kl.descfx_ieee_float::exponent( int a )
56412027Sjungma@eit.uni-kl.de{
56512027Sjungma@eit.uni-kl.de    m_if.s.exponent = (SCFX_IEEE_FLOAT_BIAS + a)
56612027Sjungma@eit.uni-kl.de                      & SCFX_MASK_(SCFX_IEEE_FLOAT_E_SIZE);
56712027Sjungma@eit.uni-kl.de}
56812027Sjungma@eit.uni-kl.de
56912027Sjungma@eit.uni-kl.deinline
57012027Sjungma@eit.uni-kl.deunsigned int
57112027Sjungma@eit.uni-kl.descfx_ieee_float::mantissa() const
57212027Sjungma@eit.uni-kl.de{
57312027Sjungma@eit.uni-kl.de    return m_if.s.mantissa;
57412027Sjungma@eit.uni-kl.de}
57512027Sjungma@eit.uni-kl.de
57612027Sjungma@eit.uni-kl.deinline
57712027Sjungma@eit.uni-kl.devoid
57812027Sjungma@eit.uni-kl.descfx_ieee_float::mantissa( unsigned int a )
57912027Sjungma@eit.uni-kl.de{
58012027Sjungma@eit.uni-kl.de    m_if.s.mantissa = a & SCFX_MASK_(SCFX_IEEE_FLOAT_M_SIZE);
58112027Sjungma@eit.uni-kl.de}
58212027Sjungma@eit.uni-kl.de
58312027Sjungma@eit.uni-kl.de
58412027Sjungma@eit.uni-kl.deinline
58512027Sjungma@eit.uni-kl.debool
58612027Sjungma@eit.uni-kl.descfx_ieee_float::is_zero() const
58712027Sjungma@eit.uni-kl.de{
58812027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_FLOAT_E_MIN - 1 && mantissa() == 0U );
58912027Sjungma@eit.uni-kl.de}
59012027Sjungma@eit.uni-kl.de
59112027Sjungma@eit.uni-kl.deinline
59212027Sjungma@eit.uni-kl.debool
59312027Sjungma@eit.uni-kl.descfx_ieee_float::is_subnormal() const
59412027Sjungma@eit.uni-kl.de{
59512027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_FLOAT_E_MIN - 1 && mantissa() != 0U );
59612027Sjungma@eit.uni-kl.de}
59712027Sjungma@eit.uni-kl.de
59812027Sjungma@eit.uni-kl.deinline
59912027Sjungma@eit.uni-kl.debool
60012027Sjungma@eit.uni-kl.descfx_ieee_float::is_normal() const
60112027Sjungma@eit.uni-kl.de{
60212027Sjungma@eit.uni-kl.de    return ( exponent() >= SCFX_IEEE_FLOAT_E_MIN &&
60312027Sjungma@eit.uni-kl.de             exponent() <= SCFX_IEEE_FLOAT_E_MAX );
60412027Sjungma@eit.uni-kl.de}
60512027Sjungma@eit.uni-kl.de
60612027Sjungma@eit.uni-kl.deinline
60712027Sjungma@eit.uni-kl.debool
60812027Sjungma@eit.uni-kl.descfx_ieee_float::is_inf() const
60912027Sjungma@eit.uni-kl.de{
61012027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_FLOAT_E_MAX + 1 && mantissa() == 0U );
61112027Sjungma@eit.uni-kl.de}
61212027Sjungma@eit.uni-kl.de
61312027Sjungma@eit.uni-kl.deinline
61412027Sjungma@eit.uni-kl.debool
61512027Sjungma@eit.uni-kl.descfx_ieee_float::is_nan() const
61612027Sjungma@eit.uni-kl.de{
61712027Sjungma@eit.uni-kl.de    return ( exponent() == SCFX_IEEE_FLOAT_E_MAX + 1 && mantissa() != 0U );
61812027Sjungma@eit.uni-kl.de}
61912027Sjungma@eit.uni-kl.de
62012027Sjungma@eit.uni-kl.de
62112027Sjungma@eit.uni-kl.deinline
62212027Sjungma@eit.uni-kl.devoid
62312027Sjungma@eit.uni-kl.descfx_ieee_float::set_inf()
62412027Sjungma@eit.uni-kl.de{
62512027Sjungma@eit.uni-kl.de    exponent( SCFX_IEEE_FLOAT_E_MAX + 1 );
62612027Sjungma@eit.uni-kl.de    mantissa( 0U );
62712027Sjungma@eit.uni-kl.de}
62812027Sjungma@eit.uni-kl.de
62912027Sjungma@eit.uni-kl.deinline
63012027Sjungma@eit.uni-kl.devoid
63112027Sjungma@eit.uni-kl.descfx_ieee_float::set_nan()
63212027Sjungma@eit.uni-kl.de{
63312027Sjungma@eit.uni-kl.de    exponent( SCFX_IEEE_FLOAT_E_MAX + 1 );
63412027Sjungma@eit.uni-kl.de    mantissa( (unsigned int) -1 );
63512027Sjungma@eit.uni-kl.de}
63612027Sjungma@eit.uni-kl.de
63712027Sjungma@eit.uni-kl.de
63812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
63912027Sjungma@eit.uni-kl.de//  FUNCTION : scfx_pow2
64012027Sjungma@eit.uni-kl.de//
64112027Sjungma@eit.uni-kl.de//  Computes 2.0**exp in double-precision.
64212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
64312027Sjungma@eit.uni-kl.de
64412027Sjungma@eit.uni-kl.deinline
64512027Sjungma@eit.uni-kl.dedouble scfx_pow2( int exp )
64612027Sjungma@eit.uni-kl.de{
64712027Sjungma@eit.uni-kl.de    scfx_ieee_double r;
64812027Sjungma@eit.uni-kl.de    if( exp < SCFX_IEEE_DOUBLE_E_MIN )
64912027Sjungma@eit.uni-kl.de    {
65012027Sjungma@eit.uni-kl.de        r = 0.0;
65112027Sjungma@eit.uni-kl.de        // handle subnormal case
65212027Sjungma@eit.uni-kl.de        exp -= SCFX_IEEE_DOUBLE_E_MIN;
65312027Sjungma@eit.uni-kl.de        if( ( exp += 20 ) >= 0 )
65412027Sjungma@eit.uni-kl.de	{
65512027Sjungma@eit.uni-kl.de            r.mantissa0( 1U << exp );
65612027Sjungma@eit.uni-kl.de        }
65712027Sjungma@eit.uni-kl.de	else if( ( exp += 32 ) >= 0 )
65812027Sjungma@eit.uni-kl.de	{
65912027Sjungma@eit.uni-kl.de            r.mantissa1( 1U << exp );
66012027Sjungma@eit.uni-kl.de        }
66112027Sjungma@eit.uni-kl.de    }
66212027Sjungma@eit.uni-kl.de    else if( exp > SCFX_IEEE_DOUBLE_E_MAX )
66312027Sjungma@eit.uni-kl.de    {
66412027Sjungma@eit.uni-kl.de        r.set_inf();
66512027Sjungma@eit.uni-kl.de    }
66612027Sjungma@eit.uni-kl.de    else
66712027Sjungma@eit.uni-kl.de    {
66812027Sjungma@eit.uni-kl.de        r = 1.0;
66912027Sjungma@eit.uni-kl.de        r.exponent( exp );
67012027Sjungma@eit.uni-kl.de    }
67112027Sjungma@eit.uni-kl.de    return r;
67212027Sjungma@eit.uni-kl.de}
67312027Sjungma@eit.uni-kl.de
67412027Sjungma@eit.uni-kl.de
67512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
67612027Sjungma@eit.uni-kl.de//  FUNCTION : uint64_to_double
67712027Sjungma@eit.uni-kl.de//
67812027Sjungma@eit.uni-kl.de//  Platform independent conversion from double uint64 to double.
67912027Sjungma@eit.uni-kl.de//  Needed because VC++6 doesn't support this conversion.
68012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
68112027Sjungma@eit.uni-kl.de
68212027Sjungma@eit.uni-kl.deinline
68312027Sjungma@eit.uni-kl.dedouble
68412027Sjungma@eit.uni-kl.deuint64_to_double( uint64 a )
68512027Sjungma@eit.uni-kl.de{
68612027Sjungma@eit.uni-kl.de#if defined( _MSC_VER ) || defined( __clang__ )
68712027Sjungma@eit.uni-kl.de    // conversion from uint64 to double not implemented; use int64
68812027Sjungma@eit.uni-kl.de    double tmp = static_cast<double>( static_cast<int64>( a ) );
68912027Sjungma@eit.uni-kl.de    return ( tmp >= 0 ) ? tmp : tmp + sc_dt::scfx_pow2( 64 );
69012027Sjungma@eit.uni-kl.de#else
69112027Sjungma@eit.uni-kl.de    return static_cast<double>( a );
69212027Sjungma@eit.uni-kl.de#endif
69312027Sjungma@eit.uni-kl.de}
69412027Sjungma@eit.uni-kl.de
69512027Sjungma@eit.uni-kl.de} // namespace sc_dt
69612027Sjungma@eit.uni-kl.de
69712027Sjungma@eit.uni-kl.de#undef SCFX_MASK_
69812027Sjungma@eit.uni-kl.de
69912027Sjungma@eit.uni-kl.de#endif
70012027Sjungma@eit.uni-kl.de
70112027Sjungma@eit.uni-kl.de// Taf!
702