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-2026 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
33#ifndef swap64
34 idaman THREAD_SAFE uint64 ida_export swap64(uint64);
35# ifdef __cplusplus
36 inline int64 swap64(int64 x)
37 {
38 return int64(swap64(uint64(x)));
39 }
40# endif
41#endif
42
43//---------------------------------------------------------------------------
44// 128 BIT NUMBERS
45//---------------------------------------------------------------------------
46#ifndef __HAS_INT128__
47#ifdef __SIZEOF_INT128__
48# define __HAS_INT128__ 1
49#else
50# define __HAS_INT128__ 0
51#endif // __SIZEOF_INT128__
52#endif // __HAS_INT128__
53
54#if __HAS_INT128__
55typedef unsigned __int128 uint128;
56typedef __int128 int128;
57
58inline int128 make_int128(uint64 ll, int64 hh) { return ll | (int128(hh) << 64); }
59inline uint128 make_uint128(uint64 ll, uint64 hh) { return ll | (uint128(hh) << 64); }
60inline uint64 low(const uint128 &x) { return uint64(x); }
61inline uint64 high(const uint128 &x) { return uint64(x>>64); }
62inline uint64 low(const int128 &x) { return uint64(x); }
63inline int64 high(const int128 &x) { return uint64(x>>64); }
64
65#else
66#ifdef __cplusplus
68{
69 uint64 l;
70 uint64 h;
71 friend class int128;
72public:
73 uint128(void) {}
74 uint128(uint x) { l = x; h = 0; }
75 uint128(int x) { l = x; h = (x < 0)? -1 : 0; }
76 uint128(uint64 x) { l = x; h = 0; }
77 uint128(int64 x) { l = x; h = (x < 0) ? -1 : 0; }
78 uint128(uint64 ll, uint64 hh) { l = ll; h = hh; }
79 friend uint64 low (const uint128 &x) { return x.l; }
80 friend uint64 high(const uint128 &x) { return x.h; }
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, const uint128 &y);
87 friend uint128 operator&(const uint128 &x, const uint128 &y);
88 friend uint128 operator^(const uint128 &x, const uint128 &y);
89 friend uint128 operator>>(const uint128 &x, int cnt);
90 friend uint128 operator<<(const uint128 &x, int cnt);
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|=(const uint128 &y);
97 uint128 &operator&=(const uint128 &y);
98 uint128 &operator^=(const uint128 &y);
99 uint128 &operator>>=(int cnt);
100 uint128 &operator<<=(int cnt);
101 uint128 &operator++(void);
102 uint128 &operator--(void);
103 friend uint128 operator+(const uint128 &x) { return x; }
104 friend uint128 operator-(const uint128 &x);
105 friend uint128 operator~(const uint128 &x) { return uint128(~x.l,~x.h); }
106 friend bool operator==(const uint128 &x, const uint128 &y) { return x.l == y.l && x.h == y.h; }
107 friend bool operator!=(const uint128 &x, const uint128 &y) { return x.l != y.l || x.h != y.h; }
108 friend bool operator> (const uint128 &x, const uint128 &y) { return x.h > y.h || (x.h == y.h && x.l > y.l); }
109 friend bool operator< (const uint128 &x, const uint128 &y) { return x.h < y.h || (x.h == y.h && x.l < y.l); }
110 friend bool operator>=(const uint128 &x, const uint128 &y) { return x.h > y.h || (x.h == y.h && x.l >= y.l); }
111 friend bool operator<=(const uint128 &x, const uint128 &y) { return x.h < y.h || (x.h == y.h && x.l <= y.l); }
112};
113
115{
116 uint64 l;
117 int64 h;
118 friend class uint128;
119public:
120 int128(void) {}
121 int128(uint x) { l = x; h = 0; }
122 int128(int x) { l = x; h = (x < 0) ? -1 : 0; }
123 int128(uint64 x) { l = x; h = 0; }
124 int128(int64 x) { l = x; h = (x < 0) ? -1 : 0; }
125 int128(uint64 ll, uint64 hh) { l=ll; h=hh; }
126 int128(const uint128 &x) { l=x.l; h=x.h; }
127 friend uint64 low (const int128 &x) { return x.l; }
128 friend uint64 high(const int128 &x) { return x.h; }
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, const int128 &y);
135 friend int128 operator&(const int128 &x, const int128 &y);
136 friend int128 operator^(const int128 &x, const int128 &y);
137 friend int128 operator>>(const int128 &x, int cnt);
138 friend int128 operator<<(const int128 &x, int cnt);
151 friend int128 operator+(const int128 &x) { return x; }
152 friend int128 operator-(const int128 &x);
153 friend int128 operator~(const int128 &x) { return int128(~x.l,~x.h); }
154 friend bool operator==(const int128 &x, const int128 &y) { return x.l == y.l && x.h == y.h; }
155 friend bool operator!=(const int128 &x, const int128 &y) { return x.l != y.l || x.h != y.h; }
156 friend bool operator> (const int128 &x, const int128 &y) { return x.h > y.h || (x.h == y.h && x.l > y.l); }
157 friend bool operator< (const int128 &x, const int128 &y) { return x.h < y.h || (x.h == y.h && x.l < y.l); }
158 friend bool operator>=(const int128 &x, const int128 &y) { return x.h > y.h || (x.h == y.h && x.l >= y.l); }
159 friend bool operator<=(const int128 &x, const int128 &y) { return x.h < y.h || (x.h == y.h && x.l <= y.l); }
160};
161
162inline int128 make_int128(uint64 ll, int64 hh) { return int128(ll, hh); }
163inline uint128 make_uint128(uint64 ll, int64 hh) { return uint128(ll, hh); }
164
165//---------------------------------------------------------------------------
166inline uint128 operator+(const uint128 &x, const uint128 &y)
167{
168 uint64 h = x.h + y.h;
169 uint64 l = x.l + y.l;
170 if ( l < x.l )
171 h = h + 1;
172 return uint128(l,h);
173}
174
175//---------------------------------------------------------------------------
176inline uint128 operator-(const uint128 &x, const uint128 &y)
177{
178 uint64 h = x.h - y.h;
179 uint64 l = x.l - y.l;
180 if ( l > x.l )
181 h = h - 1;
182 return uint128(l,h);
183}
184
185//---------------------------------------------------------------------------
186inline uint128 operator|(const uint128 &x, const uint128 &y)
187{
188 return uint128(x.l | y.l, x.h | y.h);
189}
190
191//---------------------------------------------------------------------------
192inline uint128 operator&(const uint128 &x, const uint128 &y)
193{
194 return uint128(x.l & y.l, x.h & y.h);
195}
196
197//---------------------------------------------------------------------------
198inline uint128 operator^(const uint128 &x, const uint128 &y)
199{
200 return uint128(x.l ^ y.l, x.h ^ y.h);
201}
202
203//---------------------------------------------------------------------------
205{
206 return *this = *this + y;
207}
208
209//---------------------------------------------------------------------------
211{
212 return *this = *this - y;
213}
214
215//---------------------------------------------------------------------------
217{
218 return *this = *this | y;
219}
220
221//---------------------------------------------------------------------------
223{
224 return *this = *this & y;
225}
226
227//---------------------------------------------------------------------------
229{
230 return *this = *this ^ y;
231}
232
233//---------------------------------------------------------------------------
235{
236 return *this = *this / y;
237}
238
239//---------------------------------------------------------------------------
241{
242 return *this = *this % y;
243}
244
245//---------------------------------------------------------------------------
247{
248 return *this = *this * y;
249}
250
251//---------------------------------------------------------------------------
253{
254 return *this = *this << cnt;
255}
256
257//---------------------------------------------------------------------------
259{
260 return *this = *this >> cnt;
261}
262
263//---------------------------------------------------------------------------
265{
266 if ( ++l == 0 )
267 ++h;
268 return *this;
269}
270
271//---------------------------------------------------------------------------
273{
274 if ( l == 0 )
275 --h;
276 --l;
277 return *this;
278}
279
280//---------------------------------------------------------------------------
281inline uint128 operator-(const uint128 &x)
282{
283 return ~x + 1;
284}
285
286#endif // ifdef __cplusplus
287#endif // if __HAS_INT128__
288
289idaman THREAD_SAFE void ida_export swap128(uint128 *x);
290
291#ifndef NO_OBSOLETE_FUNCS
292idaman DEPRECATED THREAD_SAFE int64 ida_export llong_scan(
293 const char *buf,
294 int radix,
295 const char **end);
296#endif
297
298#endif // define _LLONG_HPP
Definition llong.hpp:115
int128(uint x)
Definition llong.hpp:121
int128(void)
Definition llong.hpp:120
friend int128 operator^(const int128 &x, const int128 &y)
friend bool operator<=(const int128 &x, const int128 &y)
Definition llong.hpp:159
int128 & operator&=(const int128 &y)
friend int128 operator~(const int128 &x)
Definition llong.hpp:153
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:151
friend bool operator!=(const int128 &x, const int128 &y)
Definition llong.hpp:155
friend bool operator>=(const int128 &x, const int128 &y)
Definition llong.hpp:158
int128 & operator/=(const int128 &y)
int128 & operator*=(const int128 &y)
friend class uint128
Definition llong.hpp:118
int128 & operator>>=(int cnt)
friend uint64 high(const int128 &x)
Definition llong.hpp:128
int128 & operator--(void)
int128 & operator<<=(int cnt)
int128 & operator+=(const int128 &y)
friend uint64 low(const int128 &x)
Definition llong.hpp:127
friend bool operator<(const int128 &x, const int128 &y)
Definition llong.hpp:157
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:154
int128 & operator|=(const int128 &y)
friend bool operator>(const int128 &x, const int128 &y)
Definition llong.hpp:156
friend int128 operator&(const int128 &x, const int128 &y)
int128 & operator^=(const int128 &y)
int128(uint64 ll, uint64 hh)
Definition llong.hpp:125
friend int128 operator>>(const int128 &x, int cnt)
friend int128 operator/(const int128 &x, const int128 &y)
int128(const uint128 &x)
Definition llong.hpp:126
int128(int x)
Definition llong.hpp:122
friend int128 operator<<(const int128 &x, int cnt)
int128(uint64 x)
Definition llong.hpp:123
int128 & operator-=(const int128 &y)
friend int128 operator-(const int128 &x)
int128(int64 x)
Definition llong.hpp:124
friend int128 operator-(const int128 &x, const int128 &y)
friend int128 operator*(const int128 &x, const int128 &y)
Definition llong.hpp:68
uint128 & operator^=(const uint128 &y)
Definition llong.hpp:228
friend uint128 operator/(const uint128 &x, const uint128 &y)
uint128 & operator-=(const uint128 &y)
Definition llong.hpp:210
uint128(int64 x)
Definition llong.hpp:77
friend bool operator>=(const uint128 &x, const uint128 &y)
Definition llong.hpp:110
friend uint128 operator*(const uint128 &x, const uint128 &y)
uint128(int x)
Definition llong.hpp:75
friend uint128 operator|(const uint128 &x, const uint128 &y)
Definition llong.hpp:186
friend uint128 operator%(const uint128 &x, const uint128 &y)
uint128(void)
Definition llong.hpp:73
friend uint128 operator~(const uint128 &x)
Definition llong.hpp:105
friend bool operator<(const uint128 &x, const uint128 &y)
Definition llong.hpp:109
uint128 & operator%=(const uint128 &y)
Definition llong.hpp:240
friend uint64 low(const uint128 &x)
Definition llong.hpp:79
friend uint128 operator+(const uint128 &x)
Definition llong.hpp:103
friend bool operator!=(const uint128 &x, const uint128 &y)
Definition llong.hpp:107
uint128 & operator+=(const uint128 &y)
Definition llong.hpp:204
uint128(uint64 ll, uint64 hh)
Definition llong.hpp:78
friend class int128
Definition llong.hpp:71
uint128 & operator|=(const uint128 &y)
Definition llong.hpp:216
uint128 & operator<<=(int cnt)
Definition llong.hpp:252
uint128 & operator&=(const uint128 &y)
Definition llong.hpp:222
uint128(uint x)
Definition llong.hpp:74
friend bool operator<=(const uint128 &x, const uint128 &y)
Definition llong.hpp:111
friend uint128 operator+(const uint128 &x, const uint128 &y)
Definition llong.hpp:166
uint128(uint64 x)
Definition llong.hpp:76
uint128 & operator++(void)
Definition llong.hpp:264
friend uint128 operator^(const uint128 &x, const uint128 &y)
Definition llong.hpp:198
friend uint128 operator<<(const uint128 &x, int cnt)
friend bool operator==(const uint128 &x, const uint128 &y)
Definition llong.hpp:106
friend uint128 operator&(const uint128 &x, const uint128 &y)
Definition llong.hpp:192
friend uint128 operator>>(const uint128 &x, int cnt)
friend uint128 operator-(const uint128 &x, const uint128 &y)
Definition llong.hpp:176
uint128 & operator*=(const uint128 &y)
Definition llong.hpp:246
uint128 & operator--(void)
Definition llong.hpp:272
friend uint64 high(const uint128 &x)
Definition llong.hpp:80
friend bool operator>(const uint128 &x, const uint128 &y)
Definition llong.hpp:108
uint128 & operator/=(const uint128 &y)
Definition llong.hpp:234
uint128 & operator>>=(int cnt)
Definition llong.hpp:258
idaman const char * end
Definition pro.h:1004
constexpr uint32 low(const uint64 &x)
Definition llong.hpp:24
idaman THREAD_SAFE uint64 ida_export swap64(uint64)
uint128 operator|(const uint128 &x, const uint128 &y)
Definition llong.hpp:186
unsigned __int64 uint64
Definition llong.hpp:13
unsigned __int128 uint128
Definition llong.hpp:55
uint128 make_uint128(uint64 ll, uint64 hh)
Definition llong.hpp:59
constexpr uint64 make_uint64(uint32 ll, int32 hh)
Definition llong.hpp:23
uint128 operator+(const uint128 &x, const uint128 &y)
Definition llong.hpp:166
uint128 operator^(const uint128 &x, const uint128 &y)
Definition llong.hpp:198
__int128 int128
Definition llong.hpp:56
constexpr uint32 high(const uint64 &x)
Definition llong.hpp:25
uint128 operator&(const uint128 &x, const uint128 &y)
Definition llong.hpp:192
uint128 operator-(const uint128 &x, const uint128 &y)
Definition llong.hpp:176
constexpr int64 make_int64(uint32 ll, int32 hh)
Definition llong.hpp:22
idaman THREAD_SAFE void ida_export swap128(uint128 *x)
__int64 int64
Definition llong.hpp:14
int128 make_int128(uint64 ll, int64 hh)
Definition llong.hpp:58
idaman DEPRECATED THREAD_SAFE int64 ida_export llong_scan(const char *buf, int radix, const char **end)
unsigned int uint32
unsigned 32 bit value
Definition pro.h:352
int int32
signed 32 bit value
Definition pro.h:351
unsigned int uint
unsigned 32 bit value
Definition pro.h:343