Bug 716068 - de-OptimizeSpanDeps (r=waldo)
This commit is contained in:
@@ -83,9 +83,6 @@ typedef enum JSOp {
|
||||
#define JOF_QARG 6 /* quickened get/set function argument ops */
|
||||
#define JOF_LOCAL 7 /* var or block-local variable */
|
||||
#define JOF_SLOTATOM 8 /* uint16_t slot + constant index */
|
||||
#define JOF_JUMPX 9 /* signed 32-bit jump offset immediate */
|
||||
#define JOF_TABLESWITCHX 10 /* extended (32-bit offset) table switch */
|
||||
#define JOF_LOOKUPSWITCHX 11 /* extended (32-bit offset) lookup switch */
|
||||
#define JOF_UINT24 12 /* extended unsigned 24-bit literal (index) */
|
||||
#define JOF_UINT8 13 /* uint8_t immediate, e.g. top 8 bits of 24-bit
|
||||
atom index */
|
||||
@@ -148,7 +145,7 @@ typedef enum JSOp {
|
||||
#define JOF_OPMODE(op) JOF_MODE(js_CodeSpec[op].format)
|
||||
|
||||
#define JOF_TYPE_IS_EXTENDED_JUMP(t) \
|
||||
((unsigned)((t) - JOF_JUMPX) <= (unsigned)(JOF_LOOKUPSWITCHX - JOF_JUMPX))
|
||||
((unsigned)((t) - JOF_JUMP) <= (unsigned)(JOF_LOOKUPSWITCH - JOF_JUMP))
|
||||
|
||||
/*
|
||||
* Immediate operand getters, setters, and bounds.
|
||||
@@ -162,48 +159,25 @@ typedef enum JSOp {
|
||||
#define SET_UINT16(pc,i) ((pc)[1] = UINT16_HI(i), (pc)[2] = UINT16_LO(i))
|
||||
#define UINT16_LIMIT ((uintN)1 << 16)
|
||||
|
||||
/* Short (2-byte signed offset) relative jump macros. */
|
||||
#define JUMP_OFFSET_LEN 2
|
||||
#define JUMP_OFFSET_HI(off) ((jsbytecode)((off) >> 8))
|
||||
#define JUMP_OFFSET_LO(off) ((jsbytecode)(off))
|
||||
#define GET_JUMP_OFFSET(pc) (int16_t(GET_UINT16(pc)))
|
||||
#define SET_JUMP_OFFSET(pc,off) ((pc)[1] = JUMP_OFFSET_HI(off), \
|
||||
(pc)[2] = JUMP_OFFSET_LO(off))
|
||||
#define JUMP_OFFSET_MIN ((int16_t)0x8000)
|
||||
#define JUMP_OFFSET_MAX ((int16_t)0x7fff)
|
||||
/* Helpers for accessing the offsets of jump opcodes. */
|
||||
#define JUMP_OFFSET_LEN 4
|
||||
#define JUMP_OFFSET_MIN INT32_MIN
|
||||
#define JUMP_OFFSET_MAX INT32_MAX
|
||||
|
||||
/*
|
||||
* When a short jump won't hold a relative offset, its 2-byte immediate offset
|
||||
* operand is an unsigned index of a span-dependency record, maintained until
|
||||
* code generation finishes -- after which some (but we hope not nearly all)
|
||||
* span-dependent jumps must be extended (see js::frontend::OptimizeSpanDeps in
|
||||
* frontend/BytecodeEmitter.cpp).
|
||||
*
|
||||
* If the span-dependency record index overflows SPANDEP_INDEX_MAX, the jump
|
||||
* offset will contain SPANDEP_INDEX_HUGE, indicating that the record must be
|
||||
* found (via binary search) by its "before span-dependency optimization" pc
|
||||
* offset (from script main entry point).
|
||||
*/
|
||||
#define GET_SPANDEP_INDEX(pc) (uint16_t(GET_UINT16(pc)))
|
||||
#define SET_SPANDEP_INDEX(pc,i) ((pc)[1] = JUMP_OFFSET_HI(i), \
|
||||
(pc)[2] = JUMP_OFFSET_LO(i))
|
||||
#define SPANDEP_INDEX_MAX ((uint16_t)0xfffe)
|
||||
#define SPANDEP_INDEX_HUGE ((uint16_t)0xffff)
|
||||
static JS_ALWAYS_INLINE int32_t
|
||||
GET_JUMP_OFFSET(jsbytecode *pc)
|
||||
{
|
||||
return (pc[1] << 24) | (pc[2] << 16) | (pc[3] << 8) | pc[4];
|
||||
}
|
||||
|
||||
/* Ultimately, if short jumps won't do, emit long (4-byte signed) offsets. */
|
||||
#define JUMPX_OFFSET_LEN 4
|
||||
#define JUMPX_OFFSET_B3(off) ((jsbytecode)((off) >> 24))
|
||||
#define JUMPX_OFFSET_B2(off) ((jsbytecode)((off) >> 16))
|
||||
#define JUMPX_OFFSET_B1(off) ((jsbytecode)((off) >> 8))
|
||||
#define JUMPX_OFFSET_B0(off) ((jsbytecode)(off))
|
||||
#define GET_JUMPX_OFFSET(pc) (int32_t(((pc)[1] << 24) | ((pc)[2] << 16) \
|
||||
| ((pc)[3] << 8) | (pc)[4]))
|
||||
#define SET_JUMPX_OFFSET(pc,off)((pc)[1] = JUMPX_OFFSET_B3(off), \
|
||||
(pc)[2] = JUMPX_OFFSET_B2(off), \
|
||||
(pc)[3] = JUMPX_OFFSET_B1(off), \
|
||||
(pc)[4] = JUMPX_OFFSET_B0(off))
|
||||
#define JUMPX_OFFSET_MIN (int32_t(0x80000000))
|
||||
#define JUMPX_OFFSET_MAX (int32_t(0x7fffffff))
|
||||
static JS_ALWAYS_INLINE void
|
||||
SET_JUMP_OFFSET(jsbytecode *pc, int32_t off)
|
||||
{
|
||||
pc[1] = (jsbytecode)(off >> 24);
|
||||
pc[2] = (jsbytecode)(off >> 16);
|
||||
pc[3] = (jsbytecode)(off >> 8);
|
||||
pc[4] = (jsbytecode)off;
|
||||
}
|
||||
|
||||
/*
|
||||
* A literal is indexed by a per-script atom or object maps. Most scripts
|
||||
@@ -532,7 +506,7 @@ FlowsIntoNext(JSOp op)
|
||||
{
|
||||
/* JSOP_YIELD is considered to flow into the next instruction, like JSOP_CALL. */
|
||||
return op != JSOP_STOP && op != JSOP_RETURN && op != JSOP_RETRVAL && op != JSOP_THROW &&
|
||||
op != JSOP_GOTO && op != JSOP_GOTOX && op != JSOP_RETSUB;
|
||||
op != JSOP_GOTO && op != JSOP_RETSUB;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user