IDA C++ SDK 9.2
Loading...
Searching...
No Matches
llong.hpp
Go to the documentation of this file.
1/*
2 * Interactive disassembler (IDA).
3 * Copyright (c) 1990-2025 Hex-Rays
4 * ALL RIGHTS RESERVED.
5 *
6 */
7
8#ifndef _LLONG_HPP
9#define _LLONG_HPP
10
11//---------------------------------------------------------------------------
12#if defined(_MSC_VER)
13typedef unsigned __int64 uint64;
14typedef __int64 int64;
15#elif defined(__GNUC__)
16typedef unsigned long long uint64;
17typedef long long int64;
18#endif
19
20//---------------------------------------------------------------------------
21#ifdef __cplusplus
22inline constexpr int64 make_int64(uint32 ll, int32 hh) { return ll | (int64(hh) << 32); }
23inline constexpr uint64 make_uint64(uint32 ll, int32 hh) { return ll | (uint64(hh) << 32); }
24inline constexpr uint32 low(const uint64 &x) { return uint32(x); }
25inline constexpr uint32 high(const uint64 &x) { return uint32(x>>32); }
26inline constexpr uint32 low(const int64 &x) { return uint32(x); }
27inline constexpr int32 high(const int64 &x) { return uint32(x>>32); }
28#else
29#define make_int64(ll,hh) (ll | (int64(hh) << 32))
30#define make_uint64(ll,hh) (ll | (uint64(hh) << 32))
31#endif
32
33idaman THREAD_SAFE int64 ida_export llong_scan(
34 const char *buf,
35 int radix,
36 const char **end);
37#ifndef swap64
38 idaman THREAD_SAFE uint64 ida_export swap64(uint64);
39# ifdef __cplusplus
40 inline int64 swap64(int64 x)
41 {
42 return int64(swap64(uint64(x)));
43 }
44# endif
45#endif
46
47//---------------------------------------------------------------------------
48// 128 BIT NUMBERS
49//---------------------------------------------------------------------------
50#ifdef __HAS_INT128__
51
52typedef unsigned __int128 uint128;
53typedef __int128 int128;
54
55inline int128 make_int128(uint64 ll, int64 hh) { return ll | (int128(hh) << 64); }
56inline uint128 make_uint128(uint64 ll, uint64 hh) { return ll | (uint128(hh) << 64); }
57inline uint64 low(const uint128 &x) { return uint64(x); }
58inline uint64 high(const uint128 &x) { return uint64(x>>64); }
59inline uint64 low(const int128 &x) { return uint64(x); }
60inline int64 high(const int128 &x) { return uint64(x>>64); }
61
62#else
63#ifdef __cplusplus
65{
66 uint64 l;
67 uint64 h;
68 friend class int128;
69public:
70 uint128(void) {}
71 uint128(uint x) { l = x; h = 0; }
72 uint128(int x) { l = x; h = (x < 0)? -1 : 0; }
73 uint128(uint64 x) { l = x; h = 0; }
74 uint128(int64 x) { l = x; h = (x < 0) ? -1 : 0; }
75 uint128(uint64 ll, uint64 hh) { l = ll; h = hh; }
76 friend uint64 low (const uint128 &x) { return x.l; }
77 friend uint64 high(const uint128 &x) { return x.h; }
78 friend uint128 operator+(const uint128 &x, const uint128 &y);
79 friend uint128 operator-(const uint128 &x, const uint128 &y);
80 friend uint128 operator/(const uint128 &x, const uint128 &y);
81 friend uint128 operator%(const uint128 &x, const uint128 &y);
82 friend uint128 operator*(const uint128 &x, const uint128 &y);
83 friend uint128 operator|(const uint128 &x, const uint128 &y);
84 friend uint128 operator&(const uint128 &x, const uint128 &y);
85 friend uint128 operator^(const uint128 &x, const uint128 &y);
86 friend uint128 operator>>(const uint128 &x, int cnt);
87 friend uint128 operator<<(const uint128 &x, int cnt);
88 uint128 &operator+=(const uint128 &y);
89 uint128 &operator-=(const uint128 &y);
90 uint128 &operator/=(const uint128 &y);
91 uint128 &operator%=(const uint128 &y);
92 uint128 &operator*=(const uint128 &y);
93 uint128 &operator|=(const uint128 &y);
94 uint128 &operator&=(const uint128 &y);
95 uint128 &operator^=(const uint128 &y);
96 uint128 &operator>>=(int cnt);
97 uint128 &operator<<=(int cnt);
98 uint128 &operator++(void);
99 uint128 &operator--(void);
100 friend uint128 operator+(const uint128 &x) { return x; }
101 friend uint128 operator-(const uint128 &x);
102 friend uint128 operator~(const uint128 &x) { return uint128(~x.l,~x.h); }
103 friend bool operator==(const uint128 &x, const uint128 &y) { return x.l == y.l && x.h == y.h; }
104 friend bool operator!=(const uint128 &x, const uint128 &y) { return x.l != y.l || x.h != y.h; }
105 friend bool operator> (const uint128 &x, const uint128 &y) { return x.h > y.h || (x.h == y.h && x.l > y.l); }
106 friend bool operator< (const uint128 &x, const uint128 &y) { return x.h < y.h || (x.h == y.h && x.l < y.l); }
107 friend bool operator>=(const uint128 &x, const uint128 &y) { return x.h > y.h || (x.h == y.h && x.l >= y.l); }
108 friend bool operator<=(const uint128 &x, const uint128 &y) { return x.h < y.h || (x.h == y.h && x.l <= y.l); }
109};
110
112{
113 uint64 l;
114 int64 h;
115 friend class uint128;
116public:
117 int128(void) {}
118 int128(uint x) { l = x; h = 0; }
119 int128(int x) { l = x; h = (x < 0) ? -1 : 0; }
120 int128(uint64 x) { l = x; h = 0; }
121 int128(int64 x) { l = x; h = (x < 0) ? -1 : 0; }
122 int128(uint64 ll, uint64 hh) { l=ll; h=hh; }
123 int128(const uint128 &x) { l=x.l; h=x.h; }
124 friend uint64 low (const int128 &x) { return x.l; }
125 friend uint64 high(const int128 &x) { return x.h; }
126 friend int128 operator+(const int128 &x, const int128 &y);
127 friend int128 operator-(const int128 &x, const int128 &y);
128 friend int128 operator/(const int128 &x, const int128 &y);
129 friend int128 operator%(const int128 &x, const int128 &y);
130 friend int128 operator*(const int128 &x, const int128 &y);
131 friend int128 operator|(const int128 &x, const int128 &y);
132 friend int128 operator&(const int128 &x, const int128 &y);
133 friend int128 operator^(const int128 &x, const int128 &y);
134 friend int128 operator>>(const int128 &x, int cnt);
135 friend int128 operator<<(const int128 &x, int cnt);
148 friend int128 operator+(const int128 &x) { return x; }
149 friend int128 operator-(const int128 &x);
150 friend int128 operator~(const int128 &x) { return int128(~x.l,~x.h); }
151 friend bool operator==(const int128 &x, const int128 &y) { return x.l == y.l && x.h == y.h; }
152 friend bool operator!=(const int128 &x, const int128 &y) { return x.l != y.l || x.h != y.h; }
153 friend bool operator> (const int128 &x, const int128 &y) { return x.h > y.h || (x.h == y.h && x.l > y.l); }
154 friend bool operator< (const int128 &x, const int128 &y) { return x.h < y.h || (x.h == y.h && x.l < y.l); }
155 friend bool operator>=(const int128 &x, const int128 &y) { return x.h > y.h || (x.h == y.h && x.l >= y.l); }
156 friend bool operator<=(const int128 &x, const int128 &y) { return x.h < y.h || (x.h == y.h && x.l <= y.l); }
157};
158
159inline int128 make_int128(uint64 ll, int64 hh) { return int128(ll, hh); }
160inline uint128 make_uint128(uint64 ll, int64 hh) { return uint128(ll, hh); }
161idaman THREAD_SAFE void ida_export swap128(uint128 *x);
162
163//---------------------------------------------------------------------------
164inline uint128 operator+(const uint128 &x, const uint128 &y)
165{
166 uint64 h = x.h + y.h;
167 uint64 l = x.l + y.l;
168 if ( l < x.l )
169 h = h + 1;
170 return uint128(l,h);
171}
172
173//---------------------------------------------------------------------------
174inline uint128 operator-(const uint128 &x, const uint128 &y)
175{
176 uint64 h = x.h - y.h;
177 uint64 l = x.l - y.l;
178 if ( l > x.l )
179 h = h - 1;
180 return uint128(l,h);
181}
182
183//---------------------------------------------------------------------------
184inline uint128 operator|(const uint128 &x, const uint128 &y)
185{
186 return uint128(x.l | y.l, x.h | y.h);
187}
188
189//---------------------------------------------------------------------------
190inline uint128 operator&(const uint128 &x, const uint128 &y)
191{
192 return uint128(x.l & y.l, x.h & y.h);
193}
194
195//---------------------------------------------------------------------------
196inline uint128 operator^(const uint128 &x, const uint128 &y)
197{
198 return uint128(x.l ^ y.l, x.h ^ y.h);
199}
200
201//---------------------------------------------------------------------------
203{
204 return *this = *this + y;
205}
206
207//---------------------------------------------------------------------------
209{
210 return *this = *this - y;
211}
212
213//---------------------------------------------------------------------------
215{
216 return *this = *this | y;
217}
218
219//---------------------------------------------------------------------------
221{
222 return *this = *this & y;
223}
224
225//---------------------------------------------------------------------------
227{
228 return *this = *this ^ y;
229}
230
231//---------------------------------------------------------------------------
233{
234 return *this = *this / y;
235}
236
237//---------------------------------------------------------------------------
239{
240 return *this = *this % y;
241}
242
243//---------------------------------------------------------------------------
245{
246 return *this = *this * y;
247}
248
249//---------------------------------------------------------------------------
251{
252 return *this = *this << cnt;
253}
254
255//---------------------------------------------------------------------------
257{
258 return *this = *this >> cnt;
259}
260
261//---------------------------------------------------------------------------
263{
264 if ( ++l == 0 )
265 ++h;
266 return *this;
267}
268
269//---------------------------------------------------------------------------
271{
272 if ( l == 0 )
273 --h;
274 --l;
275 return *this;
276}
277
278//---------------------------------------------------------------------------
279inline uint128 operator-(const uint128 &x)
280{
281 return ~x + 1;
282}
283
284#ifndef NO_OBSOLETE_FUNCS
287#endif
288
289#endif // ifdef __cplusplus
290#endif // ifdef __HAS_INT128__
291
292#endif // define _LLONG_HPP
Definition llong.hpp:112
int128(uint x)
Definition llong.hpp:118
int128(void)
Definition llong.hpp:117
friend int128 operator^(const int128 &x, const int128 &y)
friend bool operator<=(const int128 &x, const int128 &y)
Definition llong.hpp:156
int128 & operator&=(const int128 &y)
friend int128 operator~(const int128 &x)
Definition llong.hpp:150
friend int128 operator|(const int128 &x, const int128 &y)
friend int128 operator+(const int128 &x, const int128 &y)
friend int128 operator+(const int128 &x)
Definition llong.hpp:148
friend bool operator!=(const int128 &x, const int128 &y)
Definition llong.hpp:152
friend bool operator>=(const int128 &x, const int128 &y)
Definition llong.hpp:155
int128 & operator/=(const int128 &y)
int128 & operator*=(const int128 &y)
friend class uint128
Definition llong.hpp:115
int128 & operator>>=(int cnt)
friend uint64 high(const int128 &x)
Definition llong.hpp:125
int128 & operator--(void)
int128 & operator<<=(int cnt)
int128 & operator+=(const int128 &y)
friend uint64 low(const int128 &x)
Definition llong.hpp:124
friend bool operator<(const int128 &x, const int128 &y)
Definition llong.hpp:154
friend int128 operator%(const int128 &x, const int128 &y)
int128 & operator++(void)
int128 & operator%=(const int128 &y)
friend bool operator==(const int128 &x, const int128 &y)
Definition llong.hpp:151
int128 & operator|=(const int128 &y)
friend bool operator>(const int128 &x, const int128 &y)
Definition llong.hpp:153
friend int128 operator&(const int128 &x, const int128 &y)
int128 & operator^=(const int128 &y)
int128(uint64 ll, uint64 hh)
Definition llong.hpp:122
friend int128 operator>>(const int128 &x, int cnt)
friend int128 operator/(const int128 &x, const int128 &y)
int128(const uint128 &x)
Definition llong.hpp:123
int128(int x)
Definition llong.hpp:119
friend int128 operator<<(const int128 &x, int cnt)
int128(uint64 x)
Definition llong.hpp:120
int128 & operator-=(const int128 &y)
friend int128 operator-(const int128 &x)
int128(int64 x)
Definition llong.hpp:121
friend int128 operator-(const int128 &x, const int128 &y)
friend int128 operator*(const int128 &x, const int128 &y)
Definition llong.hpp:65
uint128 & operator^=(const uint128 &y)
Definition llong.hpp:226
friend uint128 operator/(const uint128 &x, const uint128 &y)
uint128 & operator-=(const uint128 &y)
Definition llong.hpp:208
uint128(int64 x)
Definition llong.hpp:74
friend bool operator>=(const uint128 &x, const uint128 &y)
Definition llong.hpp:107
friend uint128 operator*(const uint128 &x, const uint128 &y)
uint128(int x)
Definition llong.hpp:72
friend uint128 operator|(const uint128 &x, const uint128 &y)
Definition llong.hpp:184
friend uint128 operator%(const uint128 &x, const uint128 &y)
uint128(void)
Definition llong.hpp:70
friend uint128 operator~(const uint128 &x)
Definition llong.hpp:102
friend bool operator<(const uint128 &x, const uint128 &y)
Definition llong.hpp:106
uint128 & operator%=(const uint128 &y)
Definition llong.hpp:238
friend uint64 low(const uint128 &x)
Definition llong.hpp:76
friend uint128 operator+(const uint128 &x)
Definition llong.hpp:100
friend bool operator!=(const uint128 &x, const uint128 &y)
Definition llong.hpp:104
uint128 & operator+=(const uint128 &y)
Definition llong.hpp:202
uint128(uint64 ll, uint64 hh)
Definition llong.hpp:75
friend class int128
Definition llong.hpp:68
uint128 & operator|=(const uint128 &y)
Definition llong.hpp:214
uint128 & operator<<=(int cnt)
Definition llong.hpp:250
uint128 & operator&=(const uint128 &y)
Definition llong.hpp:220
uint128(uint x)
Definition llong.hpp:71
friend bool operator<=(const uint128 &x, const uint128 &y)
Definition llong.hpp:108
friend uint128 operator+(const uint128 &x, const uint128 &y)
Definition llong.hpp:164
uint128(uint64 x)
Definition llong.hpp:73
uint128 & operator++(void)
Definition llong.hpp:262
friend uint128 operator^(const uint128 &x, const uint128 &y)
Definition llong.hpp:196
friend uint128 operator<<(const uint128 &x, int cnt)
friend bool operator==(const uint128 &x, const uint128 &y)
Definition llong.hpp:103
friend uint128 operator&(const uint128 &x, const uint128 &y)
Definition llong.hpp:190
friend uint128 operator>>(const uint128 &x, int cnt)
friend uint128 operator-(const uint128 &x, const uint128 &y)
Definition llong.hpp:174
uint128 & operator*=(const uint128 &y)
Definition llong.hpp:244
uint128 & operator--(void)
Definition llong.hpp:270
friend uint64 high(const uint128 &x)
Definition llong.hpp:77
friend bool operator>(const uint128 &x, const uint128 &y)
Definition llong.hpp:105
uint128 & operator/=(const uint128 &y)
Definition llong.hpp:232
uint128 & operator>>=(int cnt)
Definition llong.hpp:256
idaman const char * end
Definition pro.h:1001
constexpr uint32 low(const uint64 &x)
Definition llong.hpp:24
idaman THREAD_SAFE uint64 ida_export swap64(uint64)
uint64 ulonglong
Definition llong.hpp:285
uint128 operator|(const uint128 &x, const uint128 &y)
Definition llong.hpp:184
unsigned __int64 uint64
Definition llong.hpp:13
unsigned __int128 uint128
Definition llong.hpp:52
uint128 make_uint128(uint64 ll, uint64 hh)
Definition llong.hpp:56
constexpr uint64 make_uint64(uint32 ll, int32 hh)
Definition llong.hpp:23
uint128 operator+(const uint128 &x, const uint128 &y)
Definition llong.hpp:164
uint128 operator^(const uint128 &x, const uint128 &y)
Definition llong.hpp:196
__int128 int128
Definition llong.hpp:53
constexpr uint32 high(const uint64 &x)
Definition llong.hpp:25
uint128 operator&(const uint128 &x, const uint128 &y)
Definition llong.hpp:190
uint128 operator-(const uint128 &x, const uint128 &y)
Definition llong.hpp:174
constexpr int64 make_int64(uint32 ll, int32 hh)
Definition llong.hpp:22
int64 longlong
Definition llong.hpp:286
idaman THREAD_SAFE void ida_export swap128(uint128 *x)
__int64 int64
Definition llong.hpp:14
idaman THREAD_SAFE int64 ida_export llong_scan(const char *buf, int radix, const char **end)
int128 make_int128(uint64 ll, int64 hh)
Definition llong.hpp:55
unsigned int uint32
unsigned 32 bit value
Definition pro.h:348
int int32
signed 32 bit value
Definition pro.h:347
unsigned int uint
unsigned 32 bit value
Definition pro.h:339