void FrameInfo::popValue(ValueOperand dest) { StackValue *val = peek(-1); switch (val->kind()) { case StackValue::Constant: masm.moveValue(val->constant(), dest); break; case StackValue::LocalSlot: masm.loadValue(addressOfLocal(val->localSlot()), dest); break; case StackValue::ArgSlot: masm.loadValue(addressOfArg(val->argSlot()), dest); break; case StackValue::ThisSlot: masm.loadValue(addressOfThis(), dest); break; case StackValue::Stack: masm.popValue(dest); break; case StackValue::Register: masm.moveValue(val->reg(), dest); break; default: MOZ_ASSUME_UNREACHABLE("Invalid kind"); } // masm.popValue already adjusted the stack pointer, don't do it twice. pop(DontAdjustStack); }
void FrameInfo::popRegsAndSync(uint32_t uses) { // x86 has only 3 Value registers. Only support 2 regs here for now, // so that there's always a scratch Value register for reg -> reg // moves. JS_ASSERT(uses > 0); JS_ASSERT(uses <= 2); JS_ASSERT(uses <= stackDepth()); syncStack(uses); switch (uses) { case 1: popValue(R0); break; case 2: { // If the second value is in R1, move it to R2 so that it's not // clobbered by the first popValue. StackValue *val = peek(-2); if (val->kind() == StackValue::Register && val->reg() == R1) { masm.moveValue(R1, R2); val->setRegister(R2); } popValue(R1); popValue(R0); break; } default: MOZ_ASSUME_UNREACHABLE("Invalid uses"); } }