2323 */
2424
2525#include < stdlib.h>
26+ #include < stdint.h>
2627#include " immediate_aarch64.hpp"
2728
2829// there are at most 2^13 possible logical immediate encodings
@@ -34,14 +35,14 @@ static int li_table_entry_count;
3435// for forward lookup we just use a direct array lookup
3536// and assume that the cient has supplied a valid encoding
3637// table[encoding] = immediate
37- static u_int64_t LITable[LI_TABLE_SIZE];
38+ static uint64_t LITable[LI_TABLE_SIZE];
3839
3940// for reverse lookup we need a sparse map so we store a table of
4041// immediate and encoding pairs sorted by immediate value
4142
4243struct li_pair {
43- u_int64_t immediate;
44- u_int32_t encoding;
44+ uint64_t immediate;
45+ uint32_t encoding;
4546};
4647
4748static struct li_pair InverseLITable[LI_TABLE_SIZE];
@@ -63,71 +64,71 @@ int compare_immediate_pair(const void *i1, const void *i2)
6364// helper functions used by expandLogicalImmediate
6465
6566// for i = 1, ... N result<i-1> = 1 other bits are zero
66- static inline u_int64_t ones (int N)
67+ static inline uint64_t ones (int N)
6768{
68- return (N == 64 ? (u_int64_t )-1UL : ((1UL << N) - 1 ));
69+ return (N == 64 ? (uint64_t )-1UL : ((1UL << N) - 1 ));
6970}
7071
7172/*
7273 * bit twiddling helpers for instruction decode
7374 */
7475
7576// 32 bit mask with bits [hi,...,lo] set
76- static inline u_int32_t mask32 (int hi = 31 , int lo = 0 )
77+ static inline uint32_t mask32 (int hi = 31 , int lo = 0 )
7778{
7879 int nbits = (hi + 1 ) - lo;
7980 return ((1 << nbits) - 1 ) << lo;
8081}
8182
82- static inline u_int64_t mask64 (int hi = 63 , int lo = 0 )
83+ static inline uint64_t mask64 (int hi = 63 , int lo = 0 )
8384{
8485 int nbits = (hi + 1 ) - lo;
8586 return ((1L << nbits) - 1 ) << lo;
8687}
8788
8889// pick bits [hi,...,lo] from val
89- static inline u_int32_t pick32 (u_int32_t val, int hi = 31 , int lo = 0 )
90+ static inline uint32_t pick32 (uint32_t val, int hi = 31 , int lo = 0 )
9091{
9192 return (val & mask32 (hi, lo));
9293}
9394
9495// pick bits [hi,...,lo] from val
95- static inline u_int64_t pick64 (u_int64_t val, int hi = 31 , int lo = 0 )
96+ static inline uint64_t pick64 (uint64_t val, int hi = 31 , int lo = 0 )
9697{
9798 return (val & mask64 (hi, lo));
9899}
99100
100101// mask [hi,lo] and shift down to start at bit 0
101- static inline u_int32_t pickbits32 (u_int32_t val, int hi = 31 , int lo = 0 )
102+ static inline uint32_t pickbits32 (uint32_t val, int hi = 31 , int lo = 0 )
102103{
103104 return (pick32 (val, hi, lo) >> lo);
104105}
105106
106107// mask [hi,lo] and shift down to start at bit 0
107- static inline u_int64_t pickbits64 (u_int64_t val, int hi = 63 , int lo = 0 )
108+ static inline uint64_t pickbits64 (uint64_t val, int hi = 63 , int lo = 0 )
108109{
109110 return (pick64 (val, hi, lo) >> lo);
110111}
111112
112113// result<0> to val<N>
113- static inline u_int64_t pickbit (u_int64_t val, int N)
114+ static inline uint64_t pickbit (uint64_t val, int N)
114115{
115116 return pickbits64 (val, N, N);
116117}
117118
118- static inline u_int32_t uimm (u_int32_t val, int hi, int lo)
119+ static inline uint32_t uimm (uint32_t val, int hi, int lo)
119120{
120121 return pickbits32 (val, hi, lo);
121122}
122123
123124// SPEC bits(M*N) Replicate(bits(M) x, integer N);
124125// this is just an educated guess
125126
126- u_int64_t replicate (u_int64_t bits, int nbits, int count)
127+ uint64_t replicate (uint64_t bits, int nbits, int count)
127128{
128- u_int64_t result = 0 ;
129+ uint64_t result = 0 ;
129130 // nbits may be 64 in which case we want mask to be -1
130- u_int64_t mask = ones (nbits);
131+ uint64_t mask = ones (nbits);
131132 for (int i = 0 ; i < count ; i++) {
132133 result <<= nbits;
133134 result |= (bits & mask);
@@ -140,24 +141,24 @@ u_int64_t replicate(u_int64_t bits, int nbits, int count)
140141// encoding must be treated as an UNALLOC instruction
141142
142143// construct a 32 bit immediate value for a logical immediate operation
143- int expandLogicalImmediate (u_int32_t immN, u_int32_t immr,
144- u_int32_t imms, u_int64_t &bimm)
144+ int expandLogicalImmediate (uint32_t immN, uint32_t immr,
145+ uint32_t imms, uint64_t &bimm)
145146{
146- int len; // ought to be <= 6
147- u_int32_t levels; // 6 bits
148- u_int32_t tmask_and; // 6 bits
149- u_int32_t wmask_and; // 6 bits
150- u_int32_t tmask_or; // 6 bits
151- u_int32_t wmask_or; // 6 bits
152- u_int64_t imm64; // 64 bits
153- u_int64_t tmask, wmask; // 64 bits
154- u_int32_t S, R, diff; // 6 bits?
147+ int len; // ought to be <= 6
148+ uint32_t levels; // 6 bits
149+ uint32_t tmask_and; // 6 bits
150+ uint32_t wmask_and; // 6 bits
151+ uint32_t tmask_or; // 6 bits
152+ uint32_t wmask_or; // 6 bits
153+ uint64_t imm64; // 64 bits
154+ uint64_t tmask, wmask; // 64 bits
155+ uint32_t S, R, diff; // 6 bits?
155156
156157 if (immN == 1 ) {
157158 len = 6 ; // looks like 7 given the spec above but this cannot be!
158159 } else {
159160 len = 0 ;
160- u_int32_t val = (~imms & 0x3f );
161+ uint32_t val = (~imms & 0x3f );
161162 for (int i = 5 ; i > 0 ; i--) {
162163 if (val & (1 << i)) {
163164 len = i;
@@ -170,7 +171,7 @@ int expandLogicalImmediate(u_int32_t immN, u_int32_t immr,
170171 // for valid inputs leading 1s in immr must be less than leading
171172 // zeros in imms
172173 int len2 = 0 ; // ought to be < len
173- u_int32_t val2 = (~immr & 0x3f );
174+ uint32_t val2 = (~immr & 0x3f );
174175 for (int i = 5 ; i > 0 ; i--) {
175176 if (!(val2 & (1 << i))) {
176177 len2 = i;
@@ -199,12 +200,12 @@ int expandLogicalImmediate(u_int32_t immN, u_int32_t immr,
199200
200201 for (int i = 0 ; i < 6 ; i++) {
201202 int nbits = 1 << i;
202- u_int64_t and_bit = pickbit (tmask_and, i);
203- u_int64_t or_bit = pickbit (tmask_or, i);
204- u_int64_t and_bits_sub = replicate (and_bit, 1 , nbits);
205- u_int64_t or_bits_sub = replicate (or_bit, 1 , nbits);
206- u_int64_t and_bits_top = (and_bits_sub << nbits) | ones (nbits);
207- u_int64_t or_bits_top = (0 << nbits) | or_bits_sub;
203+ uint64_t and_bit = pickbit (tmask_and, i);
204+ uint64_t or_bit = pickbit (tmask_or, i);
205+ uint64_t and_bits_sub = replicate (and_bit, 1 , nbits);
206+ uint64_t or_bits_sub = replicate (or_bit, 1 , nbits);
207+ uint64_t and_bits_top = (and_bits_sub << nbits) | ones (nbits);
208+ uint64_t or_bits_top = (0 << nbits) | or_bits_sub;
208209
209210 tmask = ((tmask
210211 & (replicate (and_bits_top, 2 * nbits, 32 / nbits)))
@@ -218,12 +219,12 @@ int expandLogicalImmediate(u_int32_t immN, u_int32_t immr,
218219
219220 for (int i = 0 ; i < 6 ; i++) {
220221 int nbits = 1 << i;
221- u_int64_t and_bit = pickbit (wmask_and, i);
222- u_int64_t or_bit = pickbit (wmask_or, i);
223- u_int64_t and_bits_sub = replicate (and_bit, 1 , nbits);
224- u_int64_t or_bits_sub = replicate (or_bit, 1 , nbits);
225- u_int64_t and_bits_top = (ones (nbits) << nbits) | and_bits_sub;
226- u_int64_t or_bits_top = (or_bits_sub << nbits) | 0 ;
222+ uint64_t and_bit = pickbit (wmask_and, i);
223+ uint64_t or_bit = pickbit (wmask_or, i);
224+ uint64_t and_bits_sub = replicate (and_bit, 1 , nbits);
225+ uint64_t or_bits_sub = replicate (or_bit, 1 , nbits);
226+ uint64_t and_bits_top = (ones (nbits) << nbits) | and_bits_sub;
227+ uint64_t or_bits_top = (or_bits_sub << nbits) | 0 ;
227228
228229 wmask = ((wmask
229230 & (replicate (and_bits_top, 2 * nbits, 32 / nbits)))
@@ -248,9 +249,9 @@ static void initLITables()
248249{
249250 li_table_entry_count = 0 ;
250251 for (unsigned index = 0 ; index < LI_TABLE_SIZE; index++) {
251- u_int32_t N = uimm (index, 12 , 12 );
252- u_int32_t immr = uimm (index, 11 , 6 );
253- u_int32_t imms = uimm (index, 5 , 0 );
252+ uint32_t N = uimm (index, 12 , 12 );
253+ uint32_t immr = uimm (index, 11 , 6 );
254+ uint32_t imms = uimm (index, 5 , 0 );
254255 if (expandLogicalImmediate (N, immr, imms, LITable[index])) {
255256 InverseLITable[li_table_entry_count].immediate = LITable[index];
256257 InverseLITable[li_table_entry_count].encoding = index;
@@ -264,12 +265,12 @@ static void initLITables()
264265
265266// public APIs provided for logical immediate lookup and reverse lookup
266267
267- u_int64_t logical_immediate_for_encoding (u_int32_t encoding)
268+ uint64_t logical_immediate_for_encoding (uint32_t encoding)
268269{
269270 return LITable[encoding];
270271}
271272
272- u_int32_t encoding_for_logical_immediate (u_int64_t immediate)
273+ uint32_t encoding_for_logical_immediate (uint64_t immediate)
273274{
274275 struct li_pair pair;
275276 struct li_pair *result;
@@ -293,15 +294,15 @@ u_int32_t encoding_for_logical_immediate(u_int64_t immediate)
293294// fpimm[3:0] = fraction (assuming leading 1)
294295// i.e. F = s * 1.f * 2^(e - b)
295296
296- u_int64_t fp_immediate_for_encoding (u_int32_t imm8, int is_dp)
297+ uint64_t fp_immediate_for_encoding (uint32_t imm8, int is_dp)
297298{
298299 union {
299300 float fpval;
300301 double dpval;
301- u_int64_t val;
302+ uint64_t val;
302303 };
303304
304- u_int32_t s, e, f;
305+ uint32_t s, e, f;
305306 s = (imm8 >> 7 ) & 0x1 ;
306307 e = (imm8 >> 4 ) & 0x7 ;
307308 f = imm8 & 0xf ;
@@ -329,7 +330,7 @@ u_int64_t fp_immediate_for_encoding(u_int32_t imm8, int is_dp)
329330 return val;
330331}
331332
332- u_int32_t encoding_for_fp_immediate (float immediate)
333+ uint32_t encoding_for_fp_immediate (float immediate)
333334{
334335 // given a float which is of the form
335336 //
@@ -341,10 +342,10 @@ u_int32_t encoding_for_fp_immediate(float immediate)
341342
342343 union {
343344 float fpval;
344- u_int32_t val;
345+ uint32_t val;
345346 };
346347 fpval = immediate;
347- u_int32_t s, r, f, res;
348+ uint32_t s, r, f, res;
348349 // sign bit is 31
349350 s = (val >> 31 ) & 0x1 ;
350351 // exponent is bits 30-23 but we only want the bottom 3 bits
0 commit comments