in vm/jitrino/src/codegenerator/ia32/Ia32InternalProfiler.cpp [712:954]
bool InternalProfiler::passFilter(Inst * inst, Filter& filter) {
if(!filter.isInitialized)
return false;
bool res = false;
if(filter.mnemonic.isInitialized) {
res = (filter.mnemonic.value == inst->getMnemonic()) || (filter.mnemonic.value == Mnemonic_Null);
if(filter.mnemonic.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.operandNumber.isInitialized) {
res = filter.operandNumber.value == (int)inst->getOpndCount();
if(filter.operandNumber.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.operandFilters.size()) {
for(StlMap<int, OpndFilter>::const_iterator it = filter.operandFilters.begin(); it !=filter.operandFilters.end(); it++) {
OpndFilter opndFltr = it->second;
if(!opndFltr.isInitialized)
continue;
if(opndFltr.opNum == -1) {
for(U_32 i = 0; i < inst->getOpndCount(Inst::OpndRole_All) ; i++) {
Opnd * opnd = inst->getOpnd(i);
res = passOpndFilter(inst, opnd, filter, opndFltr);
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
} else if (opndFltr.opNum >= 0) {
Opnd * opnd = opndFltr.opNum<(int)inst->getOpndCount(Inst::OpndRole_All) ? inst->getOpnd(opndFltr.opNum) : NULL;
if(!opnd)
return false;
res = passOpndFilter(inst, opnd, filter, opndFltr);
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
} else {
return false;
}
}
}
Opnd::RuntimeInfo * rt = NULL;
if (inst->getMnemonic() == Mnemonic_CALL) {
rt = inst->getOpnd(((ControlTransferInst*)inst)->getTargetOpndIndex())->getRuntimeInfo();
}
if(filter.rtKind.isInitialized) {
if(!rt)
return false;
res = filter.rtKind.value == rt->getKind();
if(filter.rtKind.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.rtHelperID.isInitialized) {
if(!rt)
return false;
res = filter.rtHelperID.value == (VM_RT_SUPPORT)(POINTER_SIZE_INT)rt->getValue(0);
if(filter.rtHelperID.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.rtIntHelperName.isInitialized) {
if(!rt)
return false;
res = filter.rtIntHelperName.value == (char*)irManager->getInternalHelperInfo((const char*)rt->getValue(0))->pfn;
if(filter.rtIntHelperName.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isNative.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isNative.value == ((MethodDesc *)rt->getValue(0))->isNative();
if(filter.isNative.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isStatic.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isStatic.value == ((MethodDesc *)rt->getValue(0))->isStatic();
if(filter.isStatic.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isSynchronized.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isSynchronized.value == ((MethodDesc *)rt->getValue(0))->isSynchronized();
if(filter.isSynchronized.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isNoInlining.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isNoInlining.value == ((MethodDesc *)rt->getValue(0))->isNoInlining();
if(filter.isNoInlining.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isInstance.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isInstance.value == ((MethodDesc *)rt->getValue(0))->isInstance();
if(filter.isInstance.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isFinal.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isFinal.value == ((MethodDesc *)rt->getValue(0))->isFinal();
if(filter.isFinal.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isVirtual.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isVirtual.value == ((MethodDesc *)rt->getValue(0))->isVirtual();
if(filter.isVirtual.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isAbstract.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isAbstract.value == ((MethodDesc *)rt->getValue(0))->isAbstract();
if(filter.isAbstract.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isClassInitializer.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isClassInitializer.value == ((MethodDesc *)rt->getValue(0))->isClassInitializer();
if(filter.isClassInitializer.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isInstanceInitializer.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isInstanceInitializer.value == ((MethodDesc *)rt->getValue(0))->isInstanceInitializer();
if(filter.isInstanceInitializer.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isStrict.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isStrict.value == ((MethodDesc *)rt->getValue(0))->isStrict();
if(filter.isStrict.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
if(filter.isInitLocals.isInitialized) {
if(!rt || ((rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr) && (rt->getKind() != Opnd::RuntimeInfo::Kind_MethodDirectAddr)))
return false;
res = filter.isInitLocals.value == false;
if(filter.isInitLocals.isNegative)
res = !res;
if(filter.isOR && res)
return true;
if(!(filter.isOR || res))
return false;
}
return filter.isOR ? false : true;
}