void ValueRep::dump(PrintStream& out) const { out.print(m_kind); switch (m_kind) { case WarmAny: case ColdAny: case LateColdAny: case SomeRegister: case SomeRegisterWithClobber: case SomeEarlyRegister: return; case LateRegister: case Register: out.print("(", reg(), ")"); return; case Stack: out.print("(", offsetFromFP(), ")"); return; case StackArgument: out.print("(", offsetFromSP(), ")"); return; case Constant: out.print("(", value(), ")"); return; } RELEASE_ASSERT_NOT_REACHED(); }
ValueRecovery ValueRep::recoveryForJSValue() const { switch (kind()) { case Register: return ValueRecovery::inGPR(gpr(), DataFormatJS); case Stack: RELEASE_ASSERT(!(offsetFromFP() % sizeof(EncodedJSValue))); return ValueRecovery::displacedInJSStack( VirtualRegister(offsetFromFP() / sizeof(EncodedJSValue)), DataFormatJS); case Constant: return ValueRecovery::constant(JSValue::decode(value())); default: RELEASE_ASSERT_NOT_REACHED(); return { }; } }
void ValueRep::emitRestore(AssemblyHelpers& jit, Reg reg) const { if (reg.isGPR()) { switch (kind()) { case LateRegister: case Register: if (isGPR()) jit.move(gpr(), reg.gpr()); else jit.moveDoubleTo64(fpr(), reg.gpr()); break; case Stack: jit.load64(AssemblyHelpers::Address(GPRInfo::callFrameRegister, offsetFromFP()), reg.gpr()); break; case Constant: jit.move(AssemblyHelpers::TrustedImm64(value()), reg.gpr()); break; default: RELEASE_ASSERT_NOT_REACHED(); break; } return; } switch (kind()) { case LateRegister: case Register: if (isGPR()) jit.move64ToDouble(gpr(), reg.fpr()); else jit.moveDouble(fpr(), reg.fpr()); break; case Stack: jit.loadDouble(AssemblyHelpers::Address(GPRInfo::callFrameRegister, offsetFromFP()), reg.fpr()); break; case Constant: jit.move(AssemblyHelpers::TrustedImm64(value()), jit.scratchRegister()); jit.move64ToDouble(jit.scratchRegister(), reg.fpr()); break; default: RELEASE_ASSERT_NOT_REACHED(); break; } }