Skip to content

Commit 3e0dc68

Browse files
author
Patric Hedlin
committed
8248901: Signed immediate support in .../share/assembler.hpp is broken
Reviewed-by: neliasso, kvn, thartmann
1 parent ba2caf0 commit 3e0dc68

2 files changed

Lines changed: 24 additions & 23 deletions

File tree

src/hotspot/cpu/arm/arm.ad

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ int ConstantTable::calculate_table_base_offset() const {
216216
// flds, fldd: 8-bit offset multiplied by 4: +/- 1024
217217
// ldr, ldrb : 12-bit offset: +/- 4096
218218
if (!Assembler::is_simm10(offset)) {
219-
offset = Assembler::min_simm10();
219+
offset = Assembler::min_simm10;
220220
}
221221
return offset;
222222
}

src/hotspot/share/asm/assembler.hpp

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -299,28 +299,29 @@ class AbstractAssembler : public ResourceObj {
299299
void emit_double( jdouble x) { code_section()->emit_double(x); }
300300
void emit_address(address x) { code_section()->emit_address(x); }
301301

302-
// min and max values for signed immediate ranges
303-
static int min_simm(int nbits) { return -(intptr_t(1) << (nbits - 1)) ; }
304-
static int max_simm(int nbits) { return (intptr_t(1) << (nbits - 1)) - 1; }
305-
306-
// Define some:
307-
static int min_simm10() { return min_simm(10); }
308-
static int min_simm13() { return min_simm(13); }
309-
static int min_simm16() { return min_simm(16); }
310-
311-
// Test if x is within signed immediate range for nbits
312-
static bool is_simm(intptr_t x, int nbits) { return min_simm(nbits) <= x && x <= max_simm(nbits); }
313-
314-
// Define some:
315-
static bool is_simm5( intptr_t x) { return is_simm(x, 5 ); }
316-
static bool is_simm8( intptr_t x) { return is_simm(x, 8 ); }
317-
static bool is_simm10(intptr_t x) { return is_simm(x, 10); }
318-
static bool is_simm11(intptr_t x) { return is_simm(x, 11); }
319-
static bool is_simm12(intptr_t x) { return is_simm(x, 12); }
320-
static bool is_simm13(intptr_t x) { return is_simm(x, 13); }
321-
static bool is_simm16(intptr_t x) { return is_simm(x, 16); }
322-
static bool is_simm26(intptr_t x) { return is_simm(x, 26); }
323-
static bool is_simm32(intptr_t x) { return is_simm(x, 32); }
302+
enum { min_simm10 = -512 };
303+
304+
// Test if x is within signed immediate range for width.
305+
static bool is_simm(int64_t x, uint w) {
306+
precond(1 < w && w < 64);
307+
int64_t limes = INT64_C(1) << (w - 1);
308+
return -limes <= x && x < limes;
309+
}
310+
311+
static bool is_simm8(int64_t x) { return is_simm(x, 8); }
312+
static bool is_simm9(int64_t x) { return is_simm(x, 9); }
313+
static bool is_simm10(int64_t x) { return is_simm(x, 10); }
314+
static bool is_simm16(int64_t x) { return is_simm(x, 16); }
315+
static bool is_simm32(int64_t x) { return is_simm(x, 32); }
316+
317+
// Test if x is within unsigned immediate range for width.
318+
static bool is_uimm(uint64_t x, uint w) {
319+
precond(0 < w && w < 64);
320+
uint64_t limes = UINT64_C(1) << w;
321+
return x < limes;
322+
}
323+
324+
static bool is_uimm12(uint64_t x) { return is_uimm(x, 12); }
324325

325326
// Accessors
326327
CodeSection* code_section() const { return _code_section; }

0 commit comments

Comments
 (0)