src/simulator/high-precision-128.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Tue, 06 Nov 2007 16:16:18 +0100
changeset 2084 24cfc21bda99
parent 1696 0de65f4c8c43
child 4396 7d096e399d77
permissions -rw-r--r--
use the holland set of modes.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2006 INRIA
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
#ifndef HIGH_PRECISION_128_H
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#define HIGH_PRECISION_128_H
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include <stdint.h>
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    24
#include "cairo-wideint-private.h"
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
216
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    26
/**
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    27
 * This file contains an implementation of the HighPrecision class.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    28
 * Each instance of the Time class also contains an instance of this
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    29
 * class which is used to perform all the arithmetic operations of
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    30
 * the Time class.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    31
 *
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    32
 * This code is a bit ugly with a lot of inline methods for speed:
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    33
 * profiling this code on anything but the simplest scenarios shows
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    34
 * that it is a big bottleneck if great care in its implementation
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    35
 * is not performed. My observations are that what dominates are 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    36
 * Division operations (there are really really super costly)
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    37
 * and Comparison operations (because there are typically a lot of
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    38
 * these in any complex timekeeping code).
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    39
 *
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    40
 * So, the code tries really hard to perform any of these 128 bit 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    41
 * operations by doing all arithmetic on 64 bit integers when possible
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    42
 * (i.e., when there is no fractional part. This is a very common case).
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    43
 * Hence, the following code has a m_fastValue (64 bits) and a 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    44
 * m_slowValue (128 bits). m_fastValue is used by default and the code
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    45
 * converts it to a m_slowValue when needed.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    46
 *
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    47
 * If you want to monitor the efficiency of this strategy, you can 
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    48
 * enable the macro HP128INC below and call the HighPrecision::PrintStats
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    49
 * method at the end of the simulation.
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    50
 */
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    51
27c5e5be4607 add implementation comment
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 214
diff changeset
    52
477
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    53
#define noGATHER_STATISTICS 1
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    54
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    55
#ifdef GATHER_STATISTICS
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    56
#define HP128INC(x) x++
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    57
#else
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    58
#define HP128INC(x)
477
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    59
#endif
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    60
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
namespace ns3 {
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
class HighPrecision 
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
{
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
public:
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    66
  inline HighPrecision ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    67
  inline HighPrecision (int64_t value, bool dummy);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
  HighPrecision (double value);
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    69
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    70
  static void PrintStats (void);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
  
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    72
  inline int64_t GetInteger (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    73
  inline double GetDouble (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    74
  inline bool Add (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    75
  inline bool Sub (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    76
  inline bool Mul (HighPrecision const &o);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
  bool Div (HighPrecision const &o);
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    79
  inline int Compare (HighPrecision const &o) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    80
  inline static HighPrecision Zero (void);
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
private:
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    82
  int64_t SlowGetInteger (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    83
  double SlowGetDouble (void) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    84
  bool SlowAdd (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    85
  bool SlowSub (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    86
  bool SlowMul (HighPrecision const &o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    87
  int SlowCompare (HighPrecision const &o) const;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    88
  inline void EnsureSlow (void);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    89
170
9f68cb694f40 implement 128 bit arithmetic with cairo's internal types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 168
diff changeset
    90
  static const double MAX_64;
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    91
  bool m_isFast;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    92
  int64_t m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    93
  cairo_int128_t m_slowValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    94
477
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
    95
#ifdef GATHER_STATISTICS
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    96
  static int m_nfastadds;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    97
  static int m_nfastsubs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    98
  static int m_nfastmuls;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
    99
  static int m_nfastcmps;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   100
  static int m_nfastgets;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   101
  static int m_nslowadds;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   102
  static int m_nslowsubs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   103
  static int m_nslowmuls;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   104
  static int m_nslowcmps;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   105
  static int m_nslowgets;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   106
  static int m_ndivs;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   107
  static int m_nconversions;
477
18482543e248 improve debugger output for time variables when we do not need the 128 bit statistics
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 216
diff changeset
   108
#endif /* GATHER_STATISTICS */
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
};
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
}; // namespace ns3
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   113
namespace ns3 {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   114
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   115
HighPrecision::HighPrecision ()
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   116
  : m_isFast (true),
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   117
    m_fastValue (0)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   118
{}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   119
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   120
HighPrecision::HighPrecision (int64_t value, bool dummy)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   121
  : m_isFast (true),
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   122
    m_fastValue (value)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   123
{}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   124
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   125
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   126
int64_t 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   127
HighPrecision::GetInteger (void) const
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   128
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   129
  if (m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   130
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   131
      HP128INC (m_nfastgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   132
      return m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   133
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   134
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   135
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   136
      HP128INC (m_nslowgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   137
      return SlowGetInteger ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   138
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   139
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   140
double HighPrecision::GetDouble (void) const
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   141
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   142
  if (m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   143
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   144
      HP128INC (m_nfastgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   145
      double retval = m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   146
      return retval;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   147
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   148
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   149
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   150
      HP128INC (m_nslowgets);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   151
      return SlowGetDouble ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   152
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   153
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   154
bool 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   155
HighPrecision::Add (HighPrecision const &o)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   156
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   157
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   158
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   159
      HP128INC (m_nfastadds);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   160
      m_fastValue += o.m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   161
      return false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   162
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   163
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   164
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   165
      HP128INC (m_nslowadds);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   166
      return SlowAdd (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   167
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   168
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   169
bool 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   170
HighPrecision::Sub (HighPrecision const &o)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   171
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   172
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   173
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   174
      HP128INC (m_nfastsubs);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   175
      m_fastValue -= o.m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   176
      return false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   177
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   178
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   179
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   180
      HP128INC (m_nslowsubs);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   181
      return SlowSub (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   182
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   183
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   184
bool 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   185
HighPrecision::Mul (HighPrecision const &o)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   186
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   187
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   188
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   189
      HP128INC (m_nfastmuls);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   190
      m_fastValue *= o.m_fastValue;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   191
      return false;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   192
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   193
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   194
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   195
      HP128INC (m_nslowmuls);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   196
      return SlowMul (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   197
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   198
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   199
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   200
int 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   201
HighPrecision::Compare (HighPrecision const &o) const
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   202
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   203
  if (m_isFast && o.m_isFast)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   204
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   205
      HP128INC (m_nfastcmps);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   206
      if (m_fastValue < o.m_fastValue)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   207
        {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   208
          return -1;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   209
        }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   210
      else if (m_fastValue == o.m_fastValue)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   211
        {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   212
          return 0;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   213
        }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   214
      else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   215
        {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   216
          return +1;
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   217
        }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   218
    }
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   219
  else
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   220
    {
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   221
      HP128INC (m_nslowcmps);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   222
      return SlowCompare (o);
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   223
    }
1212
02d60ab49490 add unreachable statement to solve gcc-4.0.x compiler bug for optimized builds on os x
Tom Henderson <tomh@tomh.org>
parents: 477
diff changeset
   224
  // The below statement is unreachable but necessary for optimized
02d60ab49490 add unreachable statement to solve gcc-4.0.x compiler bug for optimized builds on os x
Tom Henderson <tomh@tomh.org>
parents: 477
diff changeset
   225
  // builds with gcc-4.0.x due to a compiler bug.
02d60ab49490 add unreachable statement to solve gcc-4.0.x compiler bug for optimized builds on os x
Tom Henderson <tomh@tomh.org>
parents: 477
diff changeset
   226
  return 0;  
214
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   227
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   228
HighPrecision 
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   229
HighPrecision::Zero (void)
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   230
{
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   231
  return HighPrecision ();
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   232
}
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   233
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   234
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   235
}; // namespace ns3
ac309a63f850 optimize Time arithmetic operations.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 170
diff changeset
   236
168
037cd2b37c67 split high precision implementations in different files
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
#endif /* HIGH_PRECISION_128_H */