bool StackmapSpecial::isArgValidForRep(Air::Code& code, const Air::Arg& arg, const ValueRep& rep) { switch (rep.kind()) { case ValueRep::WarmAny: case ValueRep::ColdAny: case ValueRep::LateColdAny: // We already verified by isArgValidForValue(). return true; case ValueRep::SomeRegister: return arg.isTmp(); case ValueRep::Register: return arg == Tmp(rep.reg()); case ValueRep::StackArgument: if (arg == Arg::callArg(rep.offsetFromSP())) return true; if (arg.isAddr() && code.frameSize()) { if (arg.base() == Tmp(GPRInfo::callFrameRegister) && arg.offset() == rep.offsetFromSP() - code.frameSize()) return true; if (arg.base() == Tmp(MacroAssembler::stackPointerRegister) && arg.offset() == rep.offsetFromSP()) return true; } return false; default: RELEASE_ASSERT_NOT_REACHED(); return false; } }
Location Location::forValueRep(const ValueRep& rep) { switch (rep.kind()) { case ValueRep::Register: return forRegister(rep.reg(), 0); case ValueRep::Stack: return forIndirect(GPRInfo::callFrameRegister, rep.offsetFromFP()); case ValueRep::Constant: return forConstant(rep.value()); default: RELEASE_ASSERT_NOT_REACHED(); return Location(); } }