Skip to content

Commit f1d6e8d

Browse files
Eric Liushipilev
Eric Liu
authored andcommittedNov 24, 2020
8256387: Unexpected result if patching an entire instruction on AArch64
Reviewed-by: shade, aph
1 parent bd14274 commit f1d6e8d

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed
 

‎src/hotspot/cpu/aarch64/assembler_aarch64.hpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ class Instruction_aarch64 {
204204
static inline uint32_t extract(uint32_t val, int msb, int lsb) {
205205
int nbits = msb - lsb + 1;
206206
assert_cond(msb >= lsb);
207-
uint32_t mask = (1U << nbits) - 1;
207+
uint32_t mask = checked_cast<uint32_t>(right_n_bits(nbits));
208208
uint32_t result = val >> lsb;
209209
result &= mask;
210210
return result;
@@ -219,7 +219,7 @@ class Instruction_aarch64 {
219219
int nbits = msb - lsb + 1;
220220
guarantee(val < (1ULL << nbits), "Field too big for insn");
221221
assert_cond(msb >= lsb);
222-
unsigned mask = (1U << nbits) - 1;
222+
unsigned mask = checked_cast<unsigned>(right_n_bits(nbits));
223223
val <<= lsb;
224224
mask <<= lsb;
225225
unsigned target = *(unsigned *)a;
@@ -233,7 +233,7 @@ class Instruction_aarch64 {
233233
int64_t chk = val >> (nbits - 1);
234234
guarantee (chk == -1 || chk == 0, "Field too big for insn");
235235
unsigned uval = val;
236-
unsigned mask = (1U << nbits) - 1;
236+
unsigned mask = checked_cast<unsigned>(right_n_bits(nbits));
237237
uval &= mask;
238238
uval <<= lsb;
239239
mask <<= lsb;
@@ -245,9 +245,9 @@ class Instruction_aarch64 {
245245

246246
void f(unsigned val, int msb, int lsb) {
247247
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");
249249
assert_cond(msb >= lsb);
250-
unsigned mask = (1U << nbits) - 1;
250+
unsigned mask = checked_cast<unsigned>(right_n_bits(nbits));
251251
val <<= lsb;
252252
mask <<= lsb;
253253
insn |= val;
@@ -266,7 +266,7 @@ class Instruction_aarch64 {
266266
int64_t chk = val >> (nbits - 1);
267267
guarantee (chk == -1 || chk == 0, "Field too big for insn");
268268
unsigned uval = val;
269-
unsigned mask = (1U << nbits) - 1;
269+
unsigned mask = checked_cast<unsigned>(right_n_bits(nbits));
270270
uval &= mask;
271271
f(uval, lsb + nbits - 1, lsb);
272272
}
@@ -299,7 +299,7 @@ class Instruction_aarch64 {
299299

300300
unsigned get(int msb = 31, int lsb = 0) {
301301
int nbits = msb - lsb + 1;
302-
unsigned mask = ((1U << nbits) - 1) << lsb;
302+
unsigned mask = checked_cast<unsigned>(right_n_bits(nbits)) << lsb;
303303
assert_cond((bits & mask) == mask);
304304
return (insn & mask) >> lsb;
305305
}

0 commit comments

Comments
 (0)
Please sign in to comment.