Have box_value callers pass the AccSet to use

This commit is contained in:
Luke Wagner 2010-06-23 17:50:53 -07:00
parent d474e4bd4a
commit 561b9386c9
2 changed files with 19 additions and 18 deletions

View File

@ -8571,7 +8571,7 @@ TraceRecorder::incElem(jsint incr, bool pre)
if (!addr_ins) // if we read a hole, abort if (!addr_ins) // if we read a hole, abort
return RECORD_STOP; return RECORD_STOP;
CHECK_STATUS(inc(*vp, v_ins, incr, pre)); CHECK_STATUS(inc(*vp, v_ins, incr, pre));
box_value(*vp, v_ins, addr_ins, 0); box_value(*vp, v_ins, addr_ins, 0, ACC_OTHER);
return RECORD_CONTINUE; return RECORD_CONTINUE;
} }
@ -9296,7 +9296,7 @@ TraceRecorder::guardPropertyCacheHit(LIns* obj_ins,
void void
TraceRecorder::stobj_set_fslot(LIns *obj_ins, unsigned slot, const Value &v, LIns* v_ins) TraceRecorder::stobj_set_fslot(LIns *obj_ins, unsigned slot, const Value &v, LIns* v_ins)
{ {
box_value(v, v_ins, obj_ins, offsetof(JSObject, fslots) + slot * sizeof(Value)); box_value(v, v_ins, obj_ins, offsetof(JSObject, fslots) + slot * sizeof(Value), ACC_OTHER);
} }
void void
@ -9305,7 +9305,7 @@ TraceRecorder::stobj_set_dslot(LIns *obj_ins, unsigned slot, LIns*& dslots_ins,
{ {
if (!dslots_ins) if (!dslots_ins)
dslots_ins = lir->insLoad(LIR_ldp, obj_ins, offsetof(JSObject, dslots), ACC_OTHER); dslots_ins = lir->insLoad(LIR_ldp, obj_ins, offsetof(JSObject, dslots), ACC_OTHER);
box_value(v, v_ins, dslots_ins, slot * sizeof(Value)); box_value(v, v_ins, dslots_ins, slot * sizeof(Value), ACC_OTHER);
} }
void void
@ -9481,24 +9481,24 @@ TraceRecorder::unbox_int_id(LIns *id_ins)
JS_REQUIRES_STACK void JS_REQUIRES_STACK void
TraceRecorder::box_value(const Value &v, nanojit::LIns* v_ins, TraceRecorder::box_value(const Value &v, nanojit::LIns* v_ins,
nanojit::LIns *dstaddr_ins, ptrdiff_t offset) LIns *dstaddr_ins, ptrdiff_t offset, AccSet accSet)
{ {
if (v.isNumber()) { if (v.isNumber()) {
if (isPromoteInt(v_ins)) { if (isPromoteInt(v_ins)) {
LIns *int_ins = demote(lir, v_ins); LIns *int_ins = demote(lir, v_ins);
lir->insStore(INS_CONSTU(JSVAL_TAG_INT32), dstaddr_ins, lir->insStore(INS_CONSTU(JSVAL_TAG_INT32), dstaddr_ins,
offset + sTagOffset, ACC_OTHER); offset + sTagOffset, accSet);
lir->insStore(int_ins, dstaddr_ins, lir->insStore(int_ins, dstaddr_ins,
offset + sPayloadOffset, ACC_OTHER); offset + sPayloadOffset, accSet);
} else { } else {
lir->insStore(v_ins, dstaddr_ins, offset, ACC_OTHER); lir->insStore(v_ins, dstaddr_ins, offset, accSet);
} }
} else { } else {
JSValueTag mask = v.extractNonDoubleTag(); JSValueTag mask = v.extractNonDoubleTag();
lir->insStore(INS_CONSTU(mask), dstaddr_ins, lir->insStore(INS_CONSTU(mask), dstaddr_ins,
offset + sTagOffset, ACC_OTHER); offset + sTagOffset, accSet);
lir->insStore(v_ins, dstaddr_ins, lir->insStore(v_ins, dstaddr_ins,
offset + sPayloadOffset, ACC_OTHER); offset + sPayloadOffset, accSet);
} }
} }
@ -9506,7 +9506,7 @@ JS_REQUIRES_STACK nanojit::LIns*
TraceRecorder::box_value(const Value &v, nanojit::LIns* v_ins) TraceRecorder::box_value(const Value &v, nanojit::LIns* v_ins)
{ {
LIns *boxed_ins = lir->insAlloc(sizeof(Value)); LIns *boxed_ins = lir->insAlloc(sizeof(Value));
box_value(v, v_ins, boxed_ins, 0); box_value(v, v_ins, boxed_ins, 0, ACC_OTHER);
return boxed_ins; return boxed_ins;
} }
@ -9767,7 +9767,7 @@ TraceRecorder::putActivationObjects()
if (nargs) { if (nargs) {
args_ins = lir->insAlloc(sizeof(Value) * nargs); args_ins = lir->insAlloc(sizeof(Value) * nargs);
for (int i = 0; i < nargs; ++i) { for (int i = 0; i < nargs; ++i) {
box_value(cx->fp->argv[i], get(&cx->fp->argv[i]), args_ins, i * sizeof(Value)); box_value(cx->fp->argv[i], get(&cx->fp->argv[i]), args_ins, i * sizeof(Value), ACC_OTHER);
} }
} else { } else {
args_ins = INS_CONSTPTR(0); args_ins = INS_CONSTPTR(0);
@ -9785,7 +9785,7 @@ TraceRecorder::putActivationObjects()
if (nslots) { if (nslots) {
slots_ins = lir->insAlloc(sizeof(Value) * nslots); slots_ins = lir->insAlloc(sizeof(Value) * nslots);
for (int i = 0; i < nslots; ++i) { for (int i = 0; i < nslots; ++i) {
box_value(cx->fp->slots()[i], get(&cx->fp->slots()[i]), slots_ins, i * sizeof(Value)); box_value(cx->fp->slots()[i], get(&cx->fp->slots()[i]), slots_ins, i * sizeof(Value), ACC_OTHER);
} }
} else { } else {
slots_ins = INS_CONSTPTR(0); slots_ins = INS_CONSTPTR(0);
@ -10003,7 +10003,7 @@ TraceRecorder::record_JSOP_POPV()
// frame because POPV appears only in global and eval code and we don't // frame because POPV appears only in global and eval code and we don't
// trace JSOP_EVAL or leaving the frame where tracing started. // trace JSOP_EVAL or leaving the frame where tracing started.
LIns *fp_ins = lir->insLoad(LIR_ldp, cx_ins, offsetof(JSContext, fp), ACC_OTHER); LIns *fp_ins = lir->insLoad(LIR_ldp, cx_ins, offsetof(JSContext, fp), ACC_OTHER);
box_value(rval, get(&rval), fp_ins, offsetof(JSStackFrame, rval)); box_value(rval, get(&rval), fp_ins, offsetof(JSStackFrame, rval), ACC_OTHER);
return ARECORD_CONTINUE; return ARECORD_CONTINUE;
} }
@ -10885,7 +10885,7 @@ TraceRecorder::callNative(uintN argc, JSOp mode)
LIns* invokevp_ins = lir->insAlloc(vplen * sizeof(Value)); LIns* invokevp_ins = lir->insAlloc(vplen * sizeof(Value));
// vp[0] is the callee. // vp[0] is the callee.
box_value(vp[0], INS_CONSTOBJ(funobj), invokevp_ins, 0); box_value(vp[0], INS_CONSTOBJ(funobj), invokevp_ins, 0, ACC_OTHER);
// Calculate |this|. // Calculate |this|.
LIns* this_ins; LIns* this_ins;
@ -10941,11 +10941,11 @@ TraceRecorder::callNative(uintN argc, JSOp mode)
} }
} }
} }
box_value(vp[1], this_ins, invokevp_ins, 1 * sizeof(Value)); box_value(vp[1], this_ins, invokevp_ins, 1 * sizeof(Value), ACC_OTHER);
// Populate argv. // Populate argv.
for (uintN n = 2; n < 2 + argc; n++) { for (uintN n = 2; n < 2 + argc; n++) {
box_value(vp[n], get(&vp[n]), invokevp_ins, n * sizeof(Value)); box_value(vp[n], get(&vp[n]), invokevp_ins, n * sizeof(Value), ACC_OTHER);
// For a very long argument list we might run out of LIR space, so // For a very long argument list we might run out of LIR space, so
// check inside the loop. // check inside the loop.
if (outOfMemory()) if (outOfMemory())
@ -11545,7 +11545,7 @@ TraceRecorder::setCallProp(JSObject *callobj, LIns *callobj_ins, JSScopeProperty
JS_ASSERT(sprop->hasShortID()); JS_ASSERT(sprop->hasShortID());
LIns* base = lir->insLoad(LIR_ldp, callobj_ins, offsetof(JSObject, dslots), ACC_OTHER); LIns* base = lir->insLoad(LIR_ldp, callobj_ins, offsetof(JSObject, dslots), ACC_OTHER);
box_value(v, v_ins, base, dslot_index * sizeof(Value)); box_value(v, v_ins, base, dslot_index * sizeof(Value), ACC_OTHER);
return RECORD_CONTINUE; return RECORD_CONTINUE;
} }

View File

@ -1295,7 +1295,8 @@ class TraceRecorder
JS_REQUIRES_STACK nanojit::LIns* unbox_int_id(nanojit::LIns *id_ins); JS_REQUIRES_STACK nanojit::LIns* unbox_int_id(nanojit::LIns *id_ins);
JS_REQUIRES_STACK void box_value(const Value &v, nanojit::LIns* v_ins, JS_REQUIRES_STACK void box_value(const Value &v, nanojit::LIns* v_ins,
nanojit::LIns *dstaddr_ins, ptrdiff_t offset); nanojit::LIns *dstaddr_ins, ptrdiff_t offset,
nanojit::AccSet accSet);
JS_REQUIRES_STACK nanojit::LIns* box_value(const Value &v, nanojit::LIns* v_ins); JS_REQUIRES_STACK nanojit::LIns* box_value(const Value &v, nanojit::LIns* v_ins);
JS_REQUIRES_STACK void guardClassHelper(bool cond, nanojit::LIns* obj_ins, Class* clasp, JS_REQUIRES_STACK void guardClassHelper(bool cond, nanojit::LIns* obj_ins, Class* clasp,