本文整理汇总了C++中dstLoc函数的典型用法代码示例。如果您正苦于以下问题:C++ dstLoc函数的具体用法?C++ dstLoc怎么用?C++ dstLoc使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dstLoc函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: cgLdRDSAddr
void cgLdRDSAddr(IRLS& env, const IRInstruction* inst) {
ldRDSAddrImpl(
vmain(env),
inst->extra<LdRDSAddr>()->handle,
dstLoc(env, inst, 0).reg()
);
}
示例2: cgLookupClsMethodCache
void cgLookupClsMethodCache(IRLS& env, const IRInstruction* inst) {
auto const extra = inst->extra<ClsMethodData>();
auto const dst = dstLoc(env, inst, 0).reg();
auto const fp = srcLoc(env, inst, 0).reg();
auto& v = vmain(env);
auto const ch = StaticMethodCache::alloc(
extra->clsName,
extra->methodName,
ctxName(inst->marker())
);
if (false) { // typecheck
UNUSED TypedValue* fake_fp = nullptr;
const UNUSED Func* f = StaticMethodCache::lookup(
ch,
extra->namedEntity,
extra->clsName,
extra->methodName,
fake_fp
);
}
auto const args = argGroup(env, inst)
.imm(ch)
.immPtr(extra->namedEntity)
.immPtr(extra->clsName)
.immPtr(extra->methodName)
.reg(fp);
// May raise an error if the class is undefined.
cgCallHelper(v, env, CallSpec::direct(StaticMethodCache::lookup),
callDest(dst), SyncOptions::Sync, args);
}
示例3: cgCallArray
void cgCallArray(IRLS& env, const IRInstruction* inst) {
auto const extra = inst->extra<CallArray>();
auto const sp = srcLoc(env, inst, 0).reg();
auto& v = vmain(env);
auto const syncSP = v.makeReg();
v << lea{sp[cellsToBytes(extra->spOffset.offset)], syncSP};
v << syncvmsp{syncSP};
auto const target = extra->numParams == 0
? mcg->ustubs().fcallArrayHelper
: mcg->ustubs().fcallUnpackHelper;
auto const pc = v.cns(extra->pc);
auto const after = v.cns(extra->after);
auto const args = extra->numParams == 0
? v.makeTuple({pc, after})
: v.makeTuple({pc, after, v.cns(extra->numParams)});
auto const done = v.makeBlock();
v << vcallarray{target, fcall_array_regs(), args,
{done, label(env, inst->taken())}};
env.catch_calls[inst->taken()] = CatchCall::PHP;
v = done;
auto const dst = dstLoc(env, inst, 0);
v << defvmret{dst.reg(0), dst.reg(1)};
}
示例4: cgOrdStrIdx
void cgOrdStrIdx(IRLS& env, const IRInstruction* inst) {
auto const sd = srcLoc(env, inst, 0).reg();
auto const idx = srcLoc(env, inst, 1).reg();
auto& v = vmain(env);
auto const sf = v.makeReg();
auto const length = v.makeReg();
v << loadzlq{sd[StringData::sizeOff()], length};
v << cmpq{idx, length, sf};
unlikelyCond(v, vcold(env), CC_B, sf, dstLoc(env, inst, 0).reg(),
[&] (Vout& v) {
auto const args = argGroup(env, inst).ssa(0).ssa(1);
cgCallHelper(v, env, CallSpec::direct(MInstrHelpers::stringGetI),
kVoidDest, SyncOptions::Sync, args);
return v.cns(0);
},
[&] (Vout& v) {
auto const dst = v.makeReg();
auto const data = v.makeReg();
#ifdef NO_M_DATA
v << lea{sd[sizeof(StringData)], data};
#else
v << load{sd[StringData::dataOff()], data};
#endif
v << loadzbq{data[idx], dst};
return dst;
}
);
}
示例5: cgLookupClsMethodFCache
void cgLookupClsMethodFCache(IRLS& env, const IRInstruction* inst) {
auto const extra = inst->extra<ClsMethodData>();
auto const dst = dstLoc(env, inst, 0).reg(0);
auto const cls = inst->src(0)->clsVal();
auto const fp = srcLoc(env, inst, 1).reg();
auto& v = vmain(env);
auto const ch = StaticMethodFCache::alloc(
cls->name(),
extra->methodName,
ctxName(inst->marker())
);
assertx(rds::isNormalHandle(ch));
const Func* (*lookup)(rds::Handle, const Class*,
const StringData*, TypedValue*) =
StaticMethodFCache::lookup;
auto const args = argGroup(env, inst)
.imm(ch)
.immPtr(cls)
.immPtr(extra->methodName)
.reg(fp);
cgCallHelper(v, env, CallSpec::direct(lookup),
callDest(dst), SyncOptions::Sync, args);
}
示例6: cgInstanceOfIfaceVtable
void cgInstanceOfIfaceVtable(IRLS& env, const IRInstruction* inst) {
auto const iface = inst->extra<InstanceOfIfaceVtable>()->cls;
auto const slot = iface->preClass()->ifaceVtableSlot();
auto const dst = dstLoc(env, inst, 0).reg();
auto const rcls = srcLoc(env, inst, 0).reg();
auto& v = vmain(env);
auto const sf = v.makeReg();
emitCmpVecLen(v, sf, static_cast<int32_t>(slot),
rcls[Class::vtableVecLenOff()]);
cond(
v, CC_A, sf, dst,
[&] (Vout& v) {
auto const vtableVec = v.makeReg();
emitLdLowPtr(v, rcls[Class::vtableVecOff()], vtableVec,
sizeof(LowPtr<Class::VtableVecSlot>));
auto const ifaceOff = slot * sizeof(Class::VtableVecSlot) +
offsetof(Class::VtableVecSlot, iface);
auto const sf = v.makeReg();
emitCmpLowPtr<Class>(v, sf, iface, vtableVec[ifaceOff]);
auto tmp = v.makeReg();
v << setcc{CC_E, sf, tmp};
return tmp;
},
[&] (Vout& v) { return v.cns(false); }
);
}
示例7: cgFwdCtxStaticCall
void cgFwdCtxStaticCall(IRLS& env, const IRInstruction* inst) {
auto const dstCtx = dstLoc(env, inst, 0).reg();
auto const srcCtx = srcLoc(env, inst, 0).reg();
auto const ty = inst->src(0)->type();
auto& v = vmain(env);
auto ctx_from_this = [] (Vout& v, Vreg rthis, Vreg dst) {
// Load (this->m_cls | 0x1) into `dst'.
auto const cls = emitLdObjClass(v, rthis, v.makeReg());
v << orqi{ActRec::kHasClassBit, cls, dst, v.makeReg()};
return dst;
};
if (ty <= TCctx) {
v << copy{srcCtx, dstCtx};
} else if (ty <= TObj) {
ctx_from_this(v, srcCtx, dstCtx);
} else {
// If we don't know whether we have a $this, we need to check dynamically.
auto const sf = v.makeReg();
v << testqi{ActRec::kHasClassBit, srcCtx, sf};
unlikelyCond(v, vcold(env), CC_NZ, sf, dstCtx,
[&] (Vout& v) { return srcCtx; },
[&] (Vout& v) { return ctx_from_this(v, srcCtx, v.makeReg()); }
);
}
}
示例8: cgLdContActRec
void cgLdContActRec(IRLS& env, const IRInstruction* inst) {
auto const dst = dstLoc(env, inst, 0).reg();
auto const cont = srcLoc(env, inst, 0).reg();
auto const isAsync = inst->extra<IsAsyncData>()->isAsync;
auto const arOff = BaseGenerator::arOff() - genOffset(isAsync);
vmain(env) << lea{cont[arOff], dst};
}
示例9: cgLdStaticLoc
void cgLdStaticLoc(IRLS& env, const IRInstruction* inst) {
auto const extra = inst->extra<LdStaticLoc>();
auto const link = rds::bindStaticLocal(extra->func, extra->name);
auto const dst = dstLoc(env, inst, 0).reg();
auto& v = vmain(env);
v << lea{rvmtl()[link.handle() + rds::StaticLocalData::ref_offset()], dst};
}
示例10: cgConstructInstance
void cgConstructInstance(IRLS& env, const IRInstruction* inst) {
auto const dst = dstLoc(env, inst, 0).reg();
auto const cls = inst->extra<ConstructInstance>()->cls;
auto const args = argGroup(env, inst).immPtr(cls);
cgCallHelper(vmain(env), env, CallSpec::direct(cls->instanceCtor().get()),
callDest(dst), SyncOptions::Sync, args);
}
示例11: cgMod
void cgMod(IRLS& env, const IRInstruction* inst) {
auto const d = dstLoc(env, inst, 0).reg();
auto const dividend = srcLoc(env, inst, 0).reg();
auto const divisor = srcLoc(env, inst, 1).reg();
auto& v = vmain(env);
v << srem{dividend, divisor, d};
}
示例12: printDsts
void printDsts(std::ostream& os, const IRInstruction* inst,
const RegAllocInfo* regs) {
const char* sep = "";
for (unsigned i = 0, n = inst->numDsts(); i < n; i++) {
os << punc(sep);
print(os, inst->dst(i), dstLoc(regs, inst, i));
sep = ", ";
}
}
示例13: cgLdLocPseudoMain
void cgLdLocPseudoMain(IRLS& env, const IRInstruction* inst) {
auto const fp = srcLoc(env, inst, 0).reg();
auto const off = localOffset(inst->extra<LdLocPseudoMain>()->locId);
auto& v = vmain(env);
irlower::emitTypeCheck(v, env, inst->typeParam(), fp[off + TVOFF(m_type)],
fp[off + TVOFF(m_data)], inst->taken());
loadTV(v, inst->dst(), dstLoc(env, inst, 0), fp[off]);
}
示例14: cgLdClsRef
void cgLdClsRef(IRLS& env, const IRInstruction* inst) {
auto const fp = srcLoc(env, inst, 0).reg();
auto const dst = dstLoc(env, inst, 0).reg();
auto const off = frame_clsref_offset(
funcFromFp(inst->src(0)),
inst->extra<ClsRefSlotData>()->slot
);
emitLdLowPtr(vmain(env), fp[off], dst, sizeof(LowPtr<Class>));
}
示例15: cgLdWHState
void cgLdWHState(IRLS& env, const IRInstruction* inst) {
auto const dst = dstLoc(env, inst, 0).reg();
auto const obj = srcLoc(env, inst, 0).reg();
auto& v = vmain(env);
auto const state = v.makeReg();
v << loadzbq{obj[WH::stateOff()], state};
v << andqi{0x0F, state, dst, v.makeReg()};
}