src/core/model/int64x64-128.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 13 Apr 2011 08:26:47 +0200
changeset 7045 d13fa06886ce
parent 7042 src/core/int64x64-128.h@bf5596b0f127
child 7048 a6d78cb50f6e
permissions -rw-r--r--
merge with HEAD
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
     1
#ifndef INT64X64_128_H
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
     2
#define INT64X64_128_H
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
     4
#include "ns3/core-config.h"
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
#include <stdint.h>
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
#include <math.h>
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
#if defined(HAVE___UINT128_T) and !defined(HAVE_UINT128_T)
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
typedef __uint128_t uint128_t;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
typedef __int128_t int128_t;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
#endif
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
namespace ns3 {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
#define HP128_MAX_64 18446744073709551615.0
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
#define HP128_MASK_LO ((((int128_t)1)<<64)-1)
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
    18
class int64x64_t
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
public:
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
    21
  inline int64x64_t ()
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
    : _v (0)
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
  {}
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    24
  inline int64x64_t (double value)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
    bool is_negative = value < 0;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
    value = is_negative?-value:value;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
    double hi = floor (value);
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
    double lo = (value - hi) * HP128_MAX_64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
    _v = (int128_t)hi;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
    _v <<= 64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
    _v += (int128_t)lo;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
    _v = is_negative?-_v:_v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
  }
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    35
  inline int64x64_t (int v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
    : _v (v)
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
    _v <<= 64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    39
  }
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    40
  inline int64x64_t (long int v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
    : _v (v) 
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
    _v <<= 64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
  }
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    45
  inline int64x64_t (long long int v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
    : _v (v) 
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
    _v <<= 64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
  }
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    50
  inline int64x64_t (unsigned int v)
7035
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    51
    : _v (v)
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    52
  {
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    53
    _v <<= 64;
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    54
  }
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    55
  inline int64x64_t (unsigned long int v)
7035
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    56
    : _v (v) 
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    57
  {
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    58
    _v <<= 64;
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    59
  }
7042
bf5596b0f127 get 64bit build running again
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7041
diff changeset
    60
  inline int64x64_t (unsigned long long int v)
7035
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    61
    : _v (v) 
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    62
  {
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    63
    _v <<= 64;
8446ae042275 add missing constructors
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7032
diff changeset
    64
  }
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
    65
  explicit inline int64x64_t (int64_t hi, uint64_t lo)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
    bool is_negative = hi<0;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
    _v = is_negative?-hi:hi;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
    _v <<= 64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
    _v += lo;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
    _v = is_negative?-_v:_v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
  }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
    74
  inline int64x64_t (const int64x64_t &o)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
    : _v (o._v) {}
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
    76
  inline int64x64_t &operator = (const int64x64_t &o)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
    {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
      _v = o._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
      return *this;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
    }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
  inline double GetDouble (void) const
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
    bool is_negative = _v < 0;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
    uint128_t value = is_negative ? -_v:_v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
    uint64_t hi = value >> 64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
    uint64_t lo = value;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
    double flo = lo;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
    flo /= HP128_MAX_64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
    double retval = hi;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
    retval += flo;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
    retval = is_negative ? -retval : retval;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
    return retval;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
  }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
  inline int64_t GetHigh (void) const
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
    bool negative = _v < 0;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
    int128_t v = negative?-_v:_v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
    v >>= 64;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
    int64_t retval = v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
    return negative?-retval:retval;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
  }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
  inline uint64_t GetLow (void) const
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
  {
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
    bool negative = _v < 0;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
    int128_t v = negative?-_v:_v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
    int128_t low = v & HP128_MASK_LO;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
    uint64_t retval = low;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
    return retval;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
  }
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
#undef HP128_MAX_64
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
#undef HP128_MASK_LO
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   114
  void MulByInvert (const int64x64_t &o);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   116
  static int64x64_t Invert (uint64_t v);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
private:
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   119
  friend bool operator == (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   120
  friend bool operator != (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   121
  friend bool operator <= (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   122
  friend bool operator >= (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   123
  friend bool operator < (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   124
  friend bool operator > (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   125
  friend int64x64_t &operator += (int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   126
  friend int64x64_t &operator -= (int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   127
  friend int64x64_t &operator *= (int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   128
  friend int64x64_t &operator /= (int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   129
  friend int64x64_t operator + (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   130
  friend int64x64_t operator - (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   131
  friend int64x64_t operator * (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   132
  friend int64x64_t operator / (const int64x64_t &lhs, const int64x64_t &rhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   133
  friend int64x64_t operator + (const int64x64_t &lhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   134
  friend int64x64_t operator - (const int64x64_t &lhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   135
  friend int64x64_t operator ! (const int64x64_t &lhs);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   136
  void Mul (const int64x64_t &o);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   137
  void Div (const int64x64_t &o);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
  static uint128_t UmulByInvert (uint128_t a, uint128_t b);
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
  static uint128_t Umul (uint128_t a, uint128_t b);
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
  static uint128_t Divu (uint128_t a, uint128_t b);
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   141
  inline int64x64_t (int128_t v)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
    : _v (v) {}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
  int128_t _v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
};
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   147
inline bool operator == (const int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
  return lhs._v == rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   152
inline bool operator != (const int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   154
  return lhs._v != rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   157
inline bool operator < (const int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
  return lhs._v < rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
}
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   161
inline bool operator <= (const int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
  return lhs._v <= rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   166
inline bool operator >= (const int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
  return lhs._v >= rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   169
}
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   170
inline bool operator > (const int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
  return lhs._v > rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
}
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   174
inline int64x64_t &operator += (int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
  lhs._v += rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
}
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   179
inline int64x64_t &operator -= (int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
  lhs._v -= rhs._v;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
}
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   184
inline int64x64_t &operator *= (int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
  lhs.Mul (rhs);
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
}
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   189
inline int64x64_t &operator /= (int64x64_t &lhs, const int64x64_t &rhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
  lhs.Div (rhs);
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   195
inline int64x64_t operator + (const int64x64_t &lhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
{
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
  return lhs;
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   200
inline int64x64_t operator - (const int64x64_t &lhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
{
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   202
  return int64x64_t (-lhs._v);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   205
inline int64x64_t operator ! (const int64x64_t &lhs)
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
{
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   207
  return int64x64_t (!lhs._v);
7032
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
}
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
} // namespace ns3
17d4c8f349d6 split out uint64x64 type, optimize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
7039
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7035
diff changeset
   212
#endif /* INT64X64_128_H */