Rename RuntimeType/DynLocation::isVariant() -> isRef()

Esse commit está contido em:
smith
2013-04-13 18:22:53 -07:00
commit de Sara Golemon
commit 8cd07ce9f6
7 arquivos alterados com 81 adições e 85 exclusões
@@ -307,9 +307,7 @@ TranslatorX64::irTranslatePopC(const Tracelet& t,
void
TranslatorX64::irTranslatePopV(const Tracelet& t,
const NormalizedInstruction& i) {
assert(i.inputs[0]->rtt.isVagueValue() ||
i.inputs[0]->isVariant());
assert(i.inputs[0]->rtt.isVagueValue() || i.inputs[0]->isRef());
HHIR_EMIT(PopV);
}
+1 -1
Ver Arquivo
@@ -241,7 +241,7 @@ bool RuntimeType::isIter() const {
return m_kind == ITER;
}
bool RuntimeType::isVariant() const {
bool RuntimeType::isRef() const {
assert(m_kind == VALUE);
return outerType() == KindOfRef;
}
+1 -1
Ver Arquivo
@@ -266,7 +266,7 @@ class RuntimeType {
bool isIter() const;
bool isVagueValue() const;
bool isVariant() const;
bool isRef() const;
bool isRefCounted() const;
bool isUninit() const;
@@ -91,7 +91,7 @@ static const PhysReg unsafe_rsp = rsp;
// Takes a location and a condition. If the condition is true the value of the
// location will be passed in a register
#define VALML(dl, cond) \
IE((cond) && !dl.isVariant(), \
IE((cond) && !dl.isRef(), \
(Stats::emitInc(a, Stats::Tx64_MRegKey), \
m_regMap.allocInputReg(dl), \
V(dl.location)), \
@@ -215,7 +215,7 @@ inline unsigned buildBitmask(T c, Args... args) {
// both, respectively.
static KeyType getKeyType(const DynLocation& dl, bool nonLitStr,
bool nonLitInt) {
if (dl.isVariant()) {
if (dl.isRef()) {
// Variants can change types at arbitrary times, so don't try to
// pass them in registers.
return AnyKey;
@@ -409,7 +409,7 @@ void TranslatorX64::emitBaseLCR(const Tracelet& t,
rBase.alloc();
m_regMap.cleanSmashLoc(base.location);
if (base.isVariant()) {
if (base.isRef()) {
// Get inner value.
a. loadq(pr[disp + TVOFF(m_data)], r(rBase));
if (auto offset = RefData::tvOffset()) a.addq (offset, r(rBase));
@@ -768,7 +768,7 @@ void TranslatorX64::emitElem(const Tracelet& t,
typedef TypedValue* (*OpFunc)(TypedValue*, TypedValue*,
MInstrState*);
BUILD_OPTABH(getKeyTypeIS(memb), memb.isVariant(), mia);
BUILD_OPTABH(getKeyTypeIS(memb), memb.isRef(), mia);
EMIT_RCALL(a, ni, opFunc, R(rBase), ISML(memb), R(mis_rsp));
rBase.realloc(rax);
}
@@ -849,7 +849,7 @@ void TranslatorX64::emitPropGeneric(const Tracelet& t,
Stats::emitInc(a, Stats::PropAsm_Generic);
typedef TypedValue* (*OpFunc)(Class*, TypedValue*, TypedValue*,
MInstrState*);
BUILD_OPTAB(getKeyTypeS(memb), memb.isVariant(), mia, m_vecState->isObj());
BUILD_OPTAB(getKeyTypeS(memb), memb.isRef(), mia, m_vecState->isObj());
EMIT_RCALL(a, ni, opFunc, CTX(),
R(rBase),
SML(memb),
@@ -1288,7 +1288,7 @@ void TranslatorX64::emitCGetProp(const Tracelet& t,
// Emit the appropriate helper call.
typedef void (*OpFunc)(Class*, TypedValue*, TypedValue*, TypedValue*,
MInstrState*);
BUILD_OPTABH(getKeyTypeS(memb), memb.isVariant(), m_vecState->isObj());
BUILD_OPTABH(getKeyTypeS(memb), memb.isRef(), m_vecState->isObj());
EMIT_RCALL(a, ni, opFunc,
CTX(), R(rBase), SML(memb), RESULT(useTvR), R(mis_rsp));
if (!useTvR) invalidateOutStack(ni);
@@ -1342,7 +1342,7 @@ void TranslatorX64::emitVGetElem(const Tracelet& t,
bool useTvR = useTvResult(t, ni, mii);
PREP_RESULT(useTvR);
typedef void (*OpFunc)(TypedValue*, TypedValue*, TypedValue*, MInstrState*);
BUILD_OPTABH(getKeyTypeIS(memb), memb.isVariant());
BUILD_OPTABH(getKeyTypeIS(memb), memb.isRef());
cleanOutLocal(ni);
EMIT_RCALL(a, ni, opFunc, R(rBase), ISML(memb), RESULT(useTvR), R(mis_rsp));
invalidateOutLocal(ni);
@@ -1405,7 +1405,7 @@ void TranslatorX64::emitVGetProp(const Tracelet& t,
// Emit the appropriate helper call.
typedef void (*OpFunc)(Class*, TypedValue*, TypedValue*, TypedValue*,
MInstrState*);
BUILD_OPTABH(getKeyTypeS(memb), memb.isVariant(), m_vecState->isObj());
BUILD_OPTABH(getKeyTypeS(memb), memb.isRef(), m_vecState->isObj());
cleanOutLocal(ni);
EMIT_RCALL(a, ni, opFunc,
CTX(), R(rBase), SML(memb), RESULT(useTvR), R(mis_rsp));
@@ -1453,7 +1453,7 @@ void TranslatorX64::emitIssetEmptyElem(const Tracelet& t,
unsigned iInd, PhysReg rBase) {
const DynLocation& memb = *ni.inputs[iInd];
typedef bool (*OpFunc)(TypedValue*, TypedValue*, MInstrState*);
BUILD_OPTABH(getKeyTypeIS(memb), memb.isVariant(), useEmpty);
BUILD_OPTABH(getKeyTypeIS(memb), memb.isRef(), useEmpty);
EMIT_RCALL(a, ni, opFunc, R(rBase), ISML(memb), R(mis_rsp));
a. and_imm32_reg64(1, rax); // Mask garbage bits.
ScratchReg rIssetEmpty(m_regMap, rax);
@@ -1532,7 +1532,7 @@ void TranslatorX64::emitIssetEmptyProp(const Tracelet& t,
PREP_CTX(argNumToRegName[0]);
// Emit the appropriate helper call.
typedef bool (*OpFunc)(Class* ctx, TypedValue*, TypedValue*, MInstrState*);
BUILD_OPTABH(getKeyTypeS(memb), memb.isVariant(), useEmpty,
BUILD_OPTABH(getKeyTypeS(memb), memb.isRef(), useEmpty,
m_vecState->isObj());
EMIT_RCALL(a, ni, opFunc, CTX(), R(rBase), SML(memb));
a. andq(1, rax); // Mask garbage bits.
@@ -1609,11 +1609,11 @@ void TranslatorX64::emitSetElem(const Tracelet& t,
SKTRACE(2, ni.source, "%s setResult=%s\n",
__func__, setResult ? "true" : "false");
m_regMap.cleanSmashLoc(val.location);
bool useRVal = (!forceMValIncDec(t, ni, mii) && val.isVariant());
bool useRVal = (!forceMValIncDec(t, ni, mii) && val.isRef());
PREP_VAL(useRVal, argNumToRegName[2]);
// Emit the appropriate helper call.
typedef void (*OpFunc)(TypedValue*, TypedValue*, Cell*);
BUILD_OPTABH(getKeyTypeIS(key), key.isVariant(), setResult);
BUILD_OPTABH(getKeyTypeIS(key), key.isRef(), setResult);
cleanOutLocal(ni);
EMIT_RCALL(a, ni, opFunc,
R(rBase),
@@ -1682,7 +1682,7 @@ void TranslatorX64::emitSetProp(const Tracelet& t,
m_regMap.allocInputReg(*m_curNI, kRhsIdx);
PhysReg rhsReg = getReg(val.location);
LazyScratchReg tmp(m_regMap);
if (val.isVariant() && !IS_NULL_TYPE(val.rtt.valueType())) {
if (val.isRef() && !IS_NULL_TYPE(val.rtt.valueType())) {
tmp.alloc();
emitDerefRef(a, rhsReg, r(tmp));
rhsReg = r(tmp);
@@ -1701,12 +1701,12 @@ void TranslatorX64::emitSetProp(const Tracelet& t,
const DynLocation& key = *ni.inputs[iInd];
m_regMap.cleanSmashLoc(val.location);
PREP_CTX(argNumToRegName[0]);
bool useRVal = val.isVariant();
bool useRVal = val.isRef();
PREP_VAL(useRVal, argNumToRegName[3]);
// Emit the appropriate helper call.
typedef void (*OpFunc)(Class*, TypedValue*, TypedValue*, Cell*);
cleanOutLocal(ni);
BUILD_OPTAB(getKeyTypeS(key), key.isVariant(), setResult,
BUILD_OPTAB(getKeyTypeS(key), key.isRef(), setResult,
m_vecState->isObj());
EMIT_RCALL(a, ni, opFunc, CTX(), R(rBase), SML(key), VAL(useRVal));
invalidateOutLocal(ni);
@@ -1765,12 +1765,12 @@ void TranslatorX64::emitSetOpElem(const Tracelet& t,
SKTRACE(2, ni.source, "%s setResult=%s\n",
__func__, setResult ? "true" : "false");
m_regMap.cleanSmashLoc(val.location);
bool useRVal = (!forceMValIncDec(t, ni, mii) && val.isVariant());
bool useRVal = (!forceMValIncDec(t, ni, mii) && val.isRef());
PREP_VAL(useRVal, argNumToRegName[2]);
typedef void (*OpFunc)(TypedValue*, TypedValue*, Cell*, MInstrState*,
TypedValue*);
# define SETOP_OP(op, bcOp) HELPER_TABLE(FILL_ROW, op)
BUILD_OPTAB_ARG(SETOP_OPS, getKeyTypeIS(key), key.isVariant(), op, setResult);
BUILD_OPTAB_ARG(SETOP_OPS, getKeyTypeIS(key), key.isRef(), op, setResult);
# undef SETOP_OP
// Emit the appropriate helper call.
cleanOutLocal(ni);
@@ -1859,14 +1859,14 @@ void TranslatorX64::emitSetOpProp(const Tracelet& t,
__func__, setResult ? "true" : "false");
m_regMap.cleanSmashLoc(val.location);
PREP_CTX(argNumToRegName[0]);
bool useRVal = val.isVariant();
bool useRVal = val.isRef();
bool isObj = m_vecState->isObj();
PREP_VAL(useRVal, argNumToRegName[3]);
typedef void (*OpFunc)(Class*, TypedValue*, TypedValue*, Cell*, MInstrState*,
TypedValue*);
# define SETOP_OP(op, bcOp) HELPER_TABLE(FILL_ROW, op)
BUILD_OPTAB_ARG(SETOP_OPS,
getKeyTypeS(key), key.isVariant(), op, setResult, isObj);
getKeyTypeS(key), key.isRef(), op, setResult, isObj);
# undef SETOP_OP
// Emit the appropriate helper call.
cleanOutLocal(ni);
@@ -1924,7 +1924,7 @@ void TranslatorX64::emitIncDecElem(const Tracelet& t,
__func__, setResult ? "true" : "false");
typedef void (*OpFunc)(TypedValue*, TypedValue*, MInstrState*, TypedValue*);
# define INCDEC_OP(op) HELPER_TABLE(FILL_ROW, op)
BUILD_OPTAB_ARG(INCDEC_OPS, getKeyTypeIS(key), key.isVariant(), op, setResult);
BUILD_OPTAB_ARG(INCDEC_OPS, getKeyTypeIS(key), key.isRef(), op, setResult);
# undef INCDEC_OP
// Emit the appropriate helper call.
cleanOutLocal(ni);
@@ -1981,7 +1981,7 @@ void TranslatorX64::emitIncDecProp(const Tracelet& t,
TypedValue*);
# define INCDEC_OP(op) HELPER_TABLE(FILL_ROW, op)
BUILD_OPTAB_ARG(INCDEC_OPS,
getKeyTypeS(key), key.isVariant(), op, setResult, isObj);
getKeyTypeS(key), key.isRef(), op, setResult, isObj);
# undef INCDEC_OP
// Emit the appropriate helper call.
cleanOutLocal(ni);
@@ -2044,9 +2044,9 @@ void TranslatorX64::emitBindElem(const Tracelet& t,
m_regMap.cleanSmashLoc(val.location);
cleanOutLocal(ni);
assert(!forceMValIncDec(t, ni, mii));
assert(val.isVariant());
assert(val.isRef());
typedef void (*OpFunc)(TypedValue*, TypedValue*, TypedValue*, MInstrState*);
BUILD_OPTAB(getKeyTypeIS(key), key.isVariant());
BUILD_OPTAB(getKeyTypeIS(key), key.isRef());
EMIT_RCALL(a, ni, opFunc, R(rBase), ISML(key), A(val.location), R(mis_rsp));
invalidateOutLocal(ni);
}
@@ -2094,7 +2094,7 @@ void TranslatorX64::emitBindProp(const Tracelet& t,
const DynLocation& val = *ni.inputs[0];
m_regMap.cleanSmashLoc(val.location);
assert(val.isVariant());
assert(val.isRef());
assert(generateMVal(t, ni, mii));
const DynLocation& key = *ni.inputs[iInd];
cleanOutLocal(ni);
@@ -2103,7 +2103,7 @@ void TranslatorX64::emitBindProp(const Tracelet& t,
assert(!forceMValIncDec(t, ni, mii));
typedef void (*OpFunc)(Class*, TypedValue*, TypedValue*, TypedValue*,
MInstrState*);
BUILD_OPTAB(getKeyTypeS(key), key.isVariant(), m_vecState->isObj());
BUILD_OPTAB(getKeyTypeS(key), key.isRef(), m_vecState->isObj());
EMIT_RCALL(a, ni, opFunc,
CTX(), R(rBase), SML(key), A(val.location), R(mis_rsp));
invalidateOutLocal(ni);
@@ -2144,7 +2144,7 @@ void TranslatorX64::emitUnsetElem(const Tracelet& t,
m_regMap.cleanSmashLoc(key.location);
m_regMap.cleanSmashLoc(val.location);
typedef void (*OpFunc)(TypedValue*, TypedValue*);
BUILD_OPTABH(getKeyTypeIS(key), key.isVariant());
BUILD_OPTABH(getKeyTypeIS(key), key.isRef());
EMIT_RCALL(a, ni, opFunc, R(rBase), ISML(key));
assert(!ni.outLocal && !ni.outStack);
}
@@ -2189,7 +2189,7 @@ void TranslatorX64::emitUnsetProp(const Tracelet& t,
PREP_CTX(argNumToRegName[0]);
// Emit the appropriate helper call.
typedef void (*OpFunc)(Class*, TypedValue*, TypedValue*);
BUILD_OPTAB(getKeyTypeS(key), key.isVariant(), m_vecState->isObj());
BUILD_OPTAB(getKeyTypeS(key), key.isRef(), m_vecState->isObj());
EMIT_RCALL(a, ni, opFunc, CTX(), R(rBase), SML(key));
assert(!ni.outLocal && !ni.outStack);
}
@@ -2249,7 +2249,7 @@ void TranslatorX64::emitSetNewElem(const Tracelet& t,
// Emit the appropriate helper call.
void (*setNewElemOp)(TypedValue*, Cell*) =
setResult ? setNewElemR : setNewElemNR;
bool useRVal = val.isVariant();
bool useRVal = val.isRef();
PREP_VAL(useRVal, argNumToRegName[1]);
EMIT_RCALL(a, ni, setNewElemOp,
R(rBase),
@@ -2294,7 +2294,7 @@ void TranslatorX64::emitSetOpNewElem(const Tracelet& t,
SKTRACE(2, ni.source, "%s setResult=%s\n",
__func__, setResult ? "true" : "false");
m_regMap.cleanSmashLoc(val.location);
bool useRVal = val.isVariant();
bool useRVal = val.isRef();
PREP_VAL(useRVal, argNumToRegName[3]);
// Emit the appropriate helper call.
if (setResult) {
@@ -2409,7 +2409,7 @@ void TranslatorX64::emitBindNewElem(const Tracelet& t,
assert(generateMVal(t, ni, mii));
const DynLocation& val = *ni.inputs[0];
m_regMap.cleanSmashLoc(val.location);
assert(val.isVariant());
assert(val.isRef());
EMIT_RCALL(a, ni, bindNewElem, R(rBase), A(val.location), R(mis_rsp));
}
@@ -2548,7 +2548,7 @@ void TranslatorX64::emitMPre(const Tracelet& t,
? m_regMap.getReg(val.location)
: m_regMap.allocReg(val.location, val.outerType(),
RegInfo::CLEAN);
if (val.isVariant()) {
if (val.isRef()) {
tmp.alloc();
emitDerefRef(a, rVal, r(tmp));
rVal = r(tmp);
@@ -2700,7 +2700,7 @@ void TranslatorX64::emitCGetElem(const Tracelet& t,
bool useTvR = useTvResult(t, ni, mii);
PREP_RESULT(useTvR);
typedef void (*OpFunc)(TypedValue*, TypedValue*, TypedValue*, MInstrState*);
BUILD_OPTABH(getKeyTypeIS(memb), memb.isVariant());
BUILD_OPTABH(getKeyTypeIS(memb), memb.isRef());
EMIT_RCALL(a, ni, opFunc, R(rBase), ISML(memb), RESULT(useTvR), R(mis_rsp));
assert(!ni.outLocal);
invalidateOutStack(ni);
@@ -2792,7 +2792,7 @@ TranslatorX64::emitArrayElem(const NormalizedInstruction& i,
if (decRefBase) {
// We'll need to decref the base after the call. Make sure we hold
// on to the value if it's a variant or from a global.
if (baseInput->isVariant()) {
if (baseInput->isRef()) {
decRefReg = getReg(baseInput->location);
}
if (decRefReg != noreg && kCallerSaved.contains(decRefReg)) {
@@ -2851,13 +2851,13 @@ TranslatorX64::translateCGetM(const Tracelet& t,
const DynLocation& base = *i.inputs[0];
const DynLocation& key = *i.inputs[1];
int args[2];
args[0] = base.isVariant() ? ArgAnyReg : 0;
args[0] = base.isRef() ? ArgAnyReg : 0;
args[1] = 1;
allocInputsForCall(i, args);
PhysReg baseReg = getReg(base.location);
LazyScratchReg baseScratch(m_regMap);
if (base.isVariant()) {
if (base.isRef()) {
baseScratch.alloc();
emitDerefRef(a, baseReg, r(baseScratch));
baseReg = r(baseScratch);
@@ -2915,7 +2915,7 @@ void TranslatorX64::translateIssetMFast(const Tracelet& t,
PhysReg arrReg = getReg(base.location);
LazyScratchReg scratch(m_regMap);
if (base.isVariant()) {
if (base.isRef()) {
scratch.alloc();
emitDerefRef(a, arrReg, r(scratch));
arrReg = r(scratch);
@@ -3017,7 +3017,7 @@ bool TranslatorX64::forceMValIncDec(const NormalizedInstruction& ni,
assert(base.valueType() == KindOfArray || val.valueType() == KindOfArray);
if (val.isLocal() &&
(val.location == base.location ||
(val.isVariant() && base.isVariant() &&
(val.isRef() && base.isRef() &&
val.valueType() == base.valueType()))) {
// We don't allow a local input unless we also folded a following pop.
assert(!ni.outStack);
@@ -3068,7 +3068,7 @@ TranslatorX64::translateSetMArray(const Tracelet& t,
const DynLocation& key = *i.inputs[2];
assert(arr.isLocal());
assert(val.isLocal() || !val.isVariant());
assert(val.isLocal() || !val.isRef());
assert(!i.outStack || !val.isLocal());
bool forceIncDec = forceMValIncDec(i, arr, val);
@@ -3083,7 +3083,7 @@ TranslatorX64::translateSetMArray(const Tracelet& t,
// some of the array_setm helpers will decRef the key if it is a
// string (for cases where the key is not a local), while others do
// not (for cases where the key is a local).
bool useBoxedForm = arr.isVariant();
bool useBoxedForm = arr.isRef();
void* fptr;
if (false) { // helper type-checks
RefData* ref = nullptr;
@@ -3103,13 +3103,13 @@ TranslatorX64::translateSetMArray(const Tracelet& t,
/*
* The value can be passed as A or V according to:
*
* | val.isVariant() | !val.isVariant()
* | val.isRef() | !val.isRef()
* ----------------------+-----------------+-----------------------------
* value | V(valLoc) | A(valLoc)
*/
bool valIsVariant = val.isVariant();
bool valIsRef = val.isRef();
int args[3];
args[0] = valIsVariant ? 3 : ArgDontAllocate;
args[0] = valIsRef ? 3 : ArgDontAllocate;
args[1] = useBoxedForm ? 0 : 1;
args[2] = 2;
allocInputsForCall(i, args);
@@ -3133,7 +3133,7 @@ TranslatorX64::translateSetMArray(const Tracelet& t,
if (forceIncDec) {
LazyScratchReg tmp(m_regMap);
PhysReg rhsReg = getReg(valLoc);
if (valIsVariant) {
if (valIsRef) {
tmp.alloc();
emitDerefRef(a, rhsReg, r(tmp));
rhsReg = r(tmp);
@@ -3144,7 +3144,7 @@ TranslatorX64::translateSetMArray(const Tracelet& t,
useBoxedForm ? V(arrLoc) : IMM(0),
useBoxedForm ? DEREF(arrLoc) : V(arrLoc),
V(keyLoc),
valIsVariant ? VREF(valLoc) : A(valLoc));
valIsRef ? VREF(valLoc) : A(valLoc));
recordReentrantCall(i);
// If we did not used boxed form, we need to tell the register allocator
@@ -3157,7 +3157,7 @@ TranslatorX64::translateSetMArray(const Tracelet& t,
}
if (i.outStack) {
assert(!val.isVariant());
assert(!val.isRef());
// Bring the output value into its correct location on the stack.
// Note that this has to happen after all of the above, since it
// needs to read the key from this location.
+25 -25
Ver Arquivo
@@ -4839,7 +4839,7 @@ TranslatorX64::translateCGetL(const Tracelet& t,
PhysReg localReg = getReg(inputs[0]->location);
emitMovRegReg(a, localReg, dest);
}
if (inputs[0]->isVariant()) {
if (inputs[0]->isRef()) {
emitDerefRef(a, dest, dest);
}
assert(outType != KindOfStaticString);
@@ -4890,7 +4890,7 @@ TranslatorX64::translateCGetL2(const Tracelet& t,
m_regMap.swapRegisters(stackIn, stackOut);
const PhysReg cellOut = getReg(ni.outStack->location);
assert(cellOut != stackIn);
if (ni.inputs[locIdx]->isVariant()) {
if (ni.inputs[locIdx]->isRef()) {
emitDerefRef(a, localIn, cellOut);
} else if (!undefinedLocal) {
emitMovRegReg(a, localIn, cellOut);
@@ -4958,7 +4958,7 @@ TranslatorX64::translateVGetG(const Tracelet& t,
const NormalizedInstruction& i) {
assert(i.inputs.size() == 1);
assert(i.outStack);
assert(i.outStack->isVariant());
assert(i.outStack->isRef());
assert(i.inputs[0]->location == i.outStack->location);
using namespace TargetCache;
@@ -5163,7 +5163,7 @@ void
TranslatorX64::translatePopV(const Tracelet& t,
const NormalizedInstruction& i) {
assert(i.inputs[0]->rtt.isVagueValue() ||
i.inputs[0]->isVariant());
i.inputs[0]->isRef());
translatePopC(t, i);
}
@@ -5180,7 +5180,7 @@ TranslatorX64::translateUnboxR(const Tracelet& t,
// If the value on the top of a stack is a var, unbox it and
// leave it on the top of the stack.
if (i.inputs[0]->isVariant()) {
if (i.inputs[0]->isRef()) {
emitUnboxTopOfStack(i);
}
}
@@ -5411,9 +5411,9 @@ TranslatorX64::translateAddElemC(const Tracelet& t,
const DynLocation& arr = *i.inputs[2];
const DynLocation& key = *i.inputs[1];
const DynLocation& val = *i.inputs[0];
assert(!arr.isVariant()); // not handling variants.
assert(!key.isVariant());
assert(!val.isVariant());
assert(!arr.isRef()); // not handling variants.
assert(!key.isRef());
assert(!val.isRef());
const Location& arrLoc = arr.location;
const Location& keyLoc = key.location;
@@ -5548,9 +5548,9 @@ TranslatorX64::translateColAddElemC(const Tracelet& t,
const DynLocation& coll = *i.inputs[2];
const DynLocation& key = *i.inputs[1];
const DynLocation& val = *i.inputs[0];
assert(!coll.isVariant()); // not handling variants.
assert(!key.isVariant());
assert(!val.isVariant());
assert(!coll.isRef()); // not handling variants.
assert(!key.isRef());
assert(!val.isRef());
const Location& collLoc = coll.location;
const Location& keyLoc = key.location;
const Location& valLoc = val.location;
@@ -6004,7 +6004,7 @@ TranslatorX64::translateNot(const Tracelet& t,
const NormalizedInstruction& i) {
assert(i.isNative());
assert(i.outStack && !i.outLocal);
assert(!i.inputs[0]->isVariant());
assert(!i.inputs[0]->isRef());
m_regMap.allocOutputRegs(i);
PhysReg srcdest = m_regMap.getReg(i.outStack->location);
ScratchReg scr(m_regMap);
@@ -6523,7 +6523,7 @@ TranslatorX64::translateSSwitch(const Tracelet& t,
bindAddr(*def, strvec[targets-1].dest);
EMIT_RCALL(a, ni, sswitchHelperFast,
input.isVariant() ? DEREF(inLoc) : V(inLoc),
input.isRef() ? DEREF(inLoc) : V(inLoc),
IMM(int64_t(table)), IMM(int64_t(def)));
} else {
Stats::emitInc(a, Stats::Tx64_StringSwitchSlow);
@@ -7116,7 +7116,7 @@ TranslatorX64::emitStringToClass(const NormalizedInstruction& i) {
const UNUSED Class* cls = ClassCache::lookup(ch, name);
}
TRACE(1, "ClassCache @ %d\n", int(ch));
if (i.inputs[kEmitClsLocalIdx]->rtt.isVariant()) {
if (i.inputs[kEmitClsLocalIdx]->rtt.isRef()) {
EMIT_CALL(a, ClassCache::lookup,
IMM(ch),
DEREF(in));
@@ -7142,7 +7142,7 @@ TranslatorX64::emitObjToClass(const NormalizedInstruction& i) {
const Location& out = i.outStack->location;
PhysReg src = getReg(in);
ScratchReg tmp(m_regMap);
if (i.inputs[kEmitClsLocalIdx]->rtt.isVariant()) {
if (i.inputs[kEmitClsLocalIdx]->rtt.isRef()) {
emitDerefRef(a, src, r(tmp));
src = r(tmp);
}
@@ -7165,7 +7165,7 @@ TranslatorX64::analyzeAGetC(Tracelet& t, NormalizedInstruction& i) {
assert(i.outStack && !i.outLocal);
assert(i.outStack->valueType() == KindOfClass);
const RuntimeType& rtt = i.inputs[0]->rtt;
assert(!rtt.isVariant());
assert(!rtt.isRef());
i.m_txFlags = supportedPlan(rtt.isString() ||
rtt.valueType() == KindOfObject);
if (rtt.isString() && rtt.valueString()) i.manuallyAllocInputs = true;
@@ -7235,7 +7235,7 @@ void TranslatorX64::translateDup(const Tracelet& t,
const NormalizedInstruction& ni) {
assert(ni.inputs.size() == 1);
assert(ni.outStack);
assert(!ni.inputs[0]->rtt.isVariant());
assert(!ni.inputs[0]->rtt.isRef());
m_regMap.allocOutputRegs(ni);
PhysReg outR = getReg(ni.outStack->location);
emitMovRegReg(a, getReg(ni.inputs[0]->location), outR);
@@ -7716,7 +7716,7 @@ void TranslatorX64::translateIncStat(const Tracelet& t,
static void analyzeClassExistsImpl(NormalizedInstruction& i) {
const int nameIdx = 1;
const int autoIdx = 0;
assert(!i.inputs[nameIdx]->isVariant() && !i.inputs[autoIdx]->isVariant());
assert(!i.inputs[nameIdx]->isRef() && !i.inputs[autoIdx]->isRef());
i.m_txFlags = supportedPlan(i.inputs[nameIdx]->isString() &&
i.inputs[autoIdx]->isBoolean());
i.fuseBranch = (i.m_txFlags & Supported) &&
@@ -7955,7 +7955,7 @@ void TranslatorX64::translateSetS(const Tracelet& t,
emitStaticPropInlineLookup(i, kClassIdx, *i.inputs[2], r(sprop));
assert(m_regMap.getInfo(r(sprop))->m_state == RegInfo::SCRATCH);
assert(!rhsType.isVariant());
assert(!rhsType.isRef());
m_regMap.allocInputReg(i, 0);
m_regMap.allocOutputRegs(i);
@@ -7970,7 +7970,7 @@ void TranslatorX64::analyzeSetG(Tracelet& t, NormalizedInstruction& i) {
assert(i.inputs.size() == 2);
i.m_txFlags = supportedPlan(
i.inputs[1]->isString() &&
!i.inputs[0]->isVariant()
!i.inputs[0]->isRef()
);
if (i.m_txFlags) i.manuallyAllocInputs = true;
}
@@ -9868,7 +9868,7 @@ TranslatorX64::translateFPassR(const Tracelet& t,
assert(i.inputs.size() == 1);
const RuntimeType& inRtt = i.inputs[0]->rtt;
if (inRtt.isVariant() && !i.preppedByRef) {
if (inRtt.isRef() && !i.preppedByRef) {
emitUnboxTopOfStack(i);
}
}
@@ -10293,7 +10293,7 @@ TranslatorX64::translateVerifyParamType(const Tracelet& t,
const Location& in = i.inputs[0]->location;
PhysReg src = getReg(in);
ScratchReg inCls(m_regMap);
if (i.inputs[0]->rtt.isVariant()) {
if (i.inputs[0]->rtt.isRef()) {
emitDerefRef(a, src, r(inCls));
src = r(inCls);
}
@@ -10439,7 +10439,7 @@ TranslatorX64::translateInstanceOfD(const Tracelet& t,
Stats::emitInc(a, Stats::Tx64_InstanceOfDBypass);
// All non-object inputs are not instances
if (!input0IsLoc) {
assert(!input0->isVariant());
assert(!input0->isRef());
emitDecRef(i, srcReg, type);
}
if (i.changesPC) {
@@ -10453,7 +10453,7 @@ TranslatorX64::translateInstanceOfD(const Tracelet& t,
// Get the input's class from ObjectData->m_cls
ScratchReg inCls(m_regMap);
PhysReg baseReg = srcReg;
if (input0->rtt.isVariant()) {
if (input0->rtt.isRef()) {
assert(input0IsLoc);
emitDerefRef(a, srcReg, r(inCls));
baseReg = r(inCls);
@@ -10978,7 +10978,7 @@ TranslatorX64::emitVariantGuards(const Tracelet& t,
for (size_t in = 0; in < i.inputs.size(); ++in) {
DynLocation* input = i.inputs[in];
if (!input->isValue()) continue;
bool isRef = input->isVariant() &&
bool isRef = input->isRef() &&
!i.ignoreInnerType &&
input->rtt.innerType() != KindOfInvalid;
bool modifiableLocal = pseudoMain && input->isLocal() &&
+6 -8
Ver Arquivo
@@ -835,8 +835,7 @@ getDynLocType(const vector<DynLocation*>& inputs,
if (!inputs[idx]->rtt.isVagueValue()) {
if (op == OpBindG || op == OpBindN || op == OpBindS ||
op == OpBindM || op == OpBindL) {
assert(inputs[idx]->rtt.isVariant() &&
!inputs[idx]->isLocal());
assert(inputs[idx]->rtt.isRef() && !inputs[idx]->isLocal());
} else {
assert(inputs[idx]->rtt.valueType() ==
inputs[idx]->rtt.outerType());
@@ -1751,7 +1750,7 @@ bool Translator::applyInputMetaData(Unit::MetaHandle& metaHand,
SKTRACE(1, ni->source, "replacing input %d with a MetaInfo-supplied "
"class of %s; old type = %s\n",
arg, metaName->data(), dl->pretty().c_str());
if (dl->rtt.isVariant()) {
if (dl->rtt.isRef()) {
dl->rtt = RuntimeType(KindOfRef, KindOfObject, metaCls);
} else {
dl->rtt = RuntimeType(KindOfObject, KindOfInvalid, metaCls);
@@ -2295,7 +2294,7 @@ void Translator::getOutputs(/*inout*/ Tracelet& t,
DynLocation* dl = t.newDynLocation();
dl->location = inLoc->location;
dl->rtt = setOpOutputType(ni, ni->inputs);
if (inLoc->isVariant()) {
if (inLoc->isRef()) {
dl->rtt = dl->rtt.box();
}
SKTRACE(2, ni->source, "(%s, %d) <- type %d\n",
@@ -2486,8 +2485,7 @@ Translator::requestResetHighLevelTranslator() {
bool DynLocation::canBeAliased() const {
return isValue() &&
((Translator::liveFrameIsPseudoMain() && isLocal()) ||
isVariant());
((Translator::liveFrameIsPseudoMain() && isLocal()) || isRef());
}
// Test the type of a location without recording it as a read yet.
@@ -2529,7 +2527,7 @@ DynLocation* TraceletContext::recordRead(const InputInfo& ii,
if (m_varEnvTaint && dl->isValue() && dl->isLocal()) {
dl->rtt = RuntimeType(KindOfInvalid);
} else if ((m_aliasTaint && dl->canBeAliased()) ||
(rtt.isValue() && rtt.isVariant() && ii.dontGuardInner)) {
(rtt.isValue() && rtt.isRef() && ii.dontGuardInner)) {
dl->rtt = rtt.setValueType(KindOfInvalid);
}
// Record that we depend on the live type of the specified location
@@ -3072,7 +3070,7 @@ std::unique_ptr<Tracelet> Translator::analyze(SrcKey sk) {
throwUnknownInput();
}
if (!ni->ignoreInnerType && !ii.dontGuardInner) {
if (rtt.isValue() && rtt.isVariant() &&
if (rtt.isValue() && rtt.isRef() &&
rtt.innerType() == KindOfInvalid) {
throwUnknownInput();
}
+2 -2
Ver Arquivo
@@ -203,8 +203,8 @@ struct DynLocation {
bool isBoolean() const {
return rtt.isBoolean();
}
bool isVariant() const {
return rtt.isVariant();
bool isRef() const {
return rtt.isRef();
}
bool isValue() const {
return rtt.isValue();