Implement Cns in hhir

Thats it
Esse commit está contido em:
Mark Williams
2013-04-23 08:04:49 -07:00
commit de Sara Golemon
commit d0e1d78cd5
3 arquivos alterados com 100 adições e 1 exclusões
+53
Ver Arquivo
@@ -4255,6 +4255,59 @@ void CodeGenerator::cgLookupClsCns(IRInstruction* inst) {
inst->getDst(), kSyncPoint, args, DestType::TV);
}
void CodeGenerator::cgLdCns(IRInstruction* inst) {
const StringData* cnsName = inst->getSrc(0)->getValStr();
TargetCache::CacheHandle ch = StringData::DefCnsHandle(cnsName, false);
// Has an unlikely branch to a LookupCns
cgLoad(rVmTl, ch, inst);
}
static TypedValue lookupCnsHelper(const TypedValue* tv, StringData* nm) {
assert(tv->m_type == KindOfUninit);
TypedValue *cns = nullptr;
TypedValue c1;
if (UNLIKELY(tv->m_data.pref != nullptr)) {
ClassInfo::ConstantInfo* ci =
(ClassInfo::ConstantInfo*)(void*)tv->m_data.pref;
cns = const_cast<Variant&>(ci->getDeferredValue()).asTypedValue();
tvReadCell(cns, &c1);
} else {
if (UNLIKELY(TargetCache::s_constants != nullptr)) {
cns = TargetCache::s_constants->HphpArray::nvGet(nm);
}
if (!cns) {
cns = Unit::loadCns(const_cast<StringData*>(nm));
}
if (UNLIKELY(!cns)) {
raise_notice(Strings::UNDEFINED_CONSTANT, nm->data(), nm->data());
c1.m_data.pstr = const_cast<StringData*>(nm);
c1.m_type = KindOfStaticString;
} else {
c1.m_type = cns->m_type;
c1.m_data = cns->m_data;
}
}
return c1;
}
void CodeGenerator::cgLookupCns(IRInstruction* inst) {
SSATmp* cnsNameTmp = inst->getSrc(0);
assert(inst->getTypeParam() == Type::Cell);
assert(cnsNameTmp->isConst() && cnsNameTmp->getType() == Type::StaticStr);
const StringData* cnsName = cnsNameTmp->getValStr();
TargetCache::CacheHandle ch = StringData::DefCnsHandle(cnsName, false);
ArgGroup args;
args.addr(rVmTl, ch)
.immPtr(cnsName);
cgCallHelper(m_as, TCA(lookupCnsHelper),
inst->getDst(), kSyncPoint, args, DestType::TV);
}
HOT_FUNC_VM
static inline int64_t ak_exist_string_helper(StringData* key, ArrayData* arr) {
int64_t n;
@@ -341,7 +341,51 @@ void HhbcTranslator::emitColAddNewElemC() {
}
void HhbcTranslator::emitCns(uint32_t id) {
emitInterpOneOrPunt(Type::Cell, 0);
StringData* name = curUnit()->lookupLitstrId(id);
SSATmp* cnsNameTmp = m_tb->genDefConst(name);
const TypedValue* tv = Unit::lookupPersistentCns(name);
SSATmp* result = nullptr;
Type cnsType = Type::Cell;
if (tv) {
switch (tv->m_type) {
case KindOfUninit:
// a dynamic system constant. always a slow lookup
result = m_tb->gen(LookupCns, cnsType, cnsNameTmp);
break;
case KindOfBoolean:
result = m_tb->genDefConst((bool)tv->m_data.num);
break;
case KindOfInt64:
result = m_tb->genDefConst(tv->m_data.num);
break;
case KindOfDouble:
result = m_tb->genDefConst(tv->m_data.dbl);
break;
case KindOfString:
case KindOfStaticString:
result = m_tb->genDefConst(tv->m_data.pstr);
break;
default:
not_reached();
}
} else {
spillStack(); // do this on main trace so we update stack tracking once.
SSATmp* c1 = m_tb->gen(LdCns, cnsType, cnsNameTmp);
result = m_tb->cond(
getCurFunc(),
[&] (Block* taken) { // branch
m_tb->gen(CheckInit, taken, c1);
},
[&] { // Next: LdCns hit in TC
return c1;
},
[&] { // Taken: miss in TC, do lookup & init
m_tb->hint(Block::Unlikely);
return m_tb->gen(LookupCns, cnsType, cnsNameTmp);
}
);
}
push(result);
}
void HhbcTranslator::emitDefCns(uint32_t id) {
+2
Ver Arquivo
@@ -277,6 +277,8 @@ O(LdClsCtx, D(Cls), S(Ctx), C) \
O(LdClsCctx, D(Cls), S(Cctx), C) \
O(LdClsCns, DParam, CStr CStr, C) \
O(LookupClsCns, DParam, CStr CStr, E|Refs|Er|N|Mem) \
O(LdCns, DParam, CStr, C) \
O(LookupCns, DParam, CStr, E|Refs|Er|N|Mem) \
O(LdClsMethodCache, D(FuncCls), SUnk, N|C|E|Refs|Er|Mem) \
O(LdClsMethodFCache, D(FuncCtx), C(Cls) CStr S(Obj,Cls,Ctx), N|C|E|Er) \
O(GetCtxFwdCall, D(Ctx), S(Ctx) S(Func), C) \