@@ -204,7 +204,7 @@ class Instruction_aarch64 {
204
204
static inline uint32_t extract (uint32_t val, int msb, int lsb) {
205
205
int nbits = msb - lsb + 1 ;
206
206
assert_cond (msb >= lsb);
207
- uint32_t mask = ( 1U << nbits) - 1 ;
207
+ uint32_t mask = checked_cast< uint32_t >( right_n_bits ( nbits)) ;
208
208
uint32_t result = val >> lsb;
209
209
result &= mask;
210
210
return result;
@@ -219,7 +219,7 @@ class Instruction_aarch64 {
219
219
int nbits = msb - lsb + 1 ;
220
220
guarantee (val < (1ULL << nbits), " Field too big for insn" );
221
221
assert_cond (msb >= lsb);
222
- unsigned mask = ( 1U << nbits) - 1 ;
222
+ unsigned mask = checked_cast< unsigned >( right_n_bits ( nbits)) ;
223
223
val <<= lsb;
224
224
mask <<= lsb;
225
225
unsigned target = *(unsigned *)a;
@@ -233,7 +233,7 @@ class Instruction_aarch64 {
233
233
int64_t chk = val >> (nbits - 1 );
234
234
guarantee (chk == -1 || chk == 0 , " Field too big for insn" );
235
235
unsigned uval = val;
236
- unsigned mask = ( 1U << nbits) - 1 ;
236
+ unsigned mask = checked_cast< unsigned >( right_n_bits ( nbits)) ;
237
237
uval &= mask;
238
238
uval <<= lsb;
239
239
mask <<= lsb;
@@ -245,9 +245,9 @@ class Instruction_aarch64 {
245
245
246
246
void f (unsigned val, int msb, int lsb) {
247
247
int nbits = msb - lsb + 1 ;
248
- guarantee (val < (1U << nbits), " Field too big for insn" );
248
+ guarantee (val < (1ULL << nbits), " Field too big for insn" );
249
249
assert_cond (msb >= lsb);
250
- unsigned mask = ( 1U << nbits) - 1 ;
250
+ unsigned mask = checked_cast< unsigned >( right_n_bits ( nbits)) ;
251
251
val <<= lsb;
252
252
mask <<= lsb;
253
253
insn |= val;
@@ -266,7 +266,7 @@ class Instruction_aarch64 {
266
266
int64_t chk = val >> (nbits - 1 );
267
267
guarantee (chk == -1 || chk == 0 , " Field too big for insn" );
268
268
unsigned uval = val;
269
- unsigned mask = ( 1U << nbits) - 1 ;
269
+ unsigned mask = checked_cast< unsigned >( right_n_bits ( nbits)) ;
270
270
uval &= mask;
271
271
f (uval, lsb + nbits - 1 , lsb);
272
272
}
@@ -299,7 +299,7 @@ class Instruction_aarch64 {
299
299
300
300
unsigned get (int msb = 31 , int lsb = 0 ) {
301
301
int nbits = msb - lsb + 1 ;
302
- unsigned mask = (( 1U << nbits) - 1 ) << lsb;
302
+ unsigned mask = checked_cast< unsigned >( right_n_bits ( nbits)) << lsb;
303
303
assert_cond ((bits & mask) == mask);
304
304
return (insn & mask) >> lsb;
305
305
}
0 commit comments