@@ -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