Esempio n. 1
0
uint32_t BaseCompiler::getPriority(BaseVar& var) const {
  if (var.getId() == kInvalidValue)
    return kInvalidValue;

  VarData* vd = getVdById(var.getId());
  return vd->getPriority();
}
Esempio n. 2
0
void Context::cleanup() {
  VarData** array = _contextVd.getData();
  size_t length = _contextVd.getLength();

  for (size_t i = 0; i < length; i++) {
    VarData* vd = array[i];
    vd->resetContextId();
    vd->resetRegIndex();
  }

  _contextVd.reset(false);
  _extraBlock = NULL;
}
Esempio n. 3
0
Error X86Compiler::_newVar(Var* var, uint32_t vType, const char* name, va_list ap) {
  ASMJIT_ASSERT(vType < kX86VarTypeCount);
  vType = _targetVarMapping[vType];
  ASMJIT_ASSERT(vType != kInvalidVar);

  // The assertion won't be compiled in release build, however, we want to check
  // this anyway.
  if (vType == kInvalidVar) {
    static_cast<X86Var*>(var)->reset();
    return kErrorInvalidArgument;
  }

  const X86VarInfo& vInfo = _x86VarInfo[vType];
  char buf[64];

  // Format the name if `ap` is given.
  if (ap) {
    vsnprintf(buf, ASMJIT_ARRAY_SIZE(buf), name, ap);
    buf[ASMJIT_ARRAY_SIZE(buf) - 1] = '\0';
    name = buf;
  }

  VarData* vd = _newVd(vType, vInfo.getSize(), vInfo.getClass(), name);
  if (vd == NULL) {
    static_cast<X86Var*>(var)->reset();
    return getLastError();
  }

  var->_init_packed_op_sz_w0_id(kOperandTypeVar, vInfo.getSize(), vInfo.getReg() << 8, vd->getId());
  var->_vreg.vType = vType;
  return kErrorOk;
}
Esempio n. 4
0
Error X86Compiler::_newStack(BaseMem* mem, uint32_t size, uint32_t alignment, const char* name) {
  if (size == 0)
    return kErrorInvalidArgument;

  if (alignment > 64)
    alignment = 64;

  VarData* vd = _newVd(kInvalidVar, size, kInvalidReg, name);
  if (vd == NULL) {
    static_cast<X86Mem*>(mem)->reset();
    return getLastError();
  }

  vd->_isStack = true;
  vd->_alignment = static_cast<uint8_t>(alignment);

  static_cast<X86Mem*>(mem)->_init(kMemTypeStackIndex, vd->getId(), 0, 0);
  return kErrorOk;
}
Esempio n. 5
0
Error X86Compiler::_newVar(Var* var, uint32_t vType, const char* name) noexcept {
  ASMJIT_ASSERT(vType < kX86VarTypeCount);
  vType = _targetVarMapping[vType];
  ASMJIT_ASSERT(vType != kInvalidVar);

  // The assertion won't be compiled in release build, however, we want to check
  // this anyway.
  if (vType == kInvalidVar) {
    static_cast<X86Var*>(var)->reset();
    return kErrorInvalidArgument;
  }

  const VarInfo& vInfo = _x86VarInfo[vType];
  VarData* vd = _newVd(vInfo, name);

  if (vd == nullptr) {
    static_cast<X86Var*>(var)->reset();
    return getLastError();
  }

  var->_init_packed_op_sz_w0_id(Operand::kTypeVar, vInfo.getSize(), vInfo.getRegType() << 8, vd->getId());
  var->_vreg.vType = vType;
  return kErrorOk;
}
Esempio n. 6
0
Error Context::livenessAnalysis() {
  FuncNode* func = getFunc();
  JumpNode* from = NULL;

  Node* node = func->getEnd();
  uint32_t bLen = static_cast<uint32_t>(
    ((_contextVd.getLength() + VarBits::kEntityBits - 1) / VarBits::kEntityBits));

  LivenessTarget* ltCur = NULL;
  LivenessTarget* ltUnused = NULL;

  size_t varMapToVaListOffset = _varMapToVaListOffset;

  // No variables.
  if (bLen == 0)
    return kErrorOk;

  VarBits* bCur = newBits(bLen);
  if (bCur == NULL)
    goto _NoMemory;

  // Allocate bits for code visited first time.
_OnVisit:
  for (;;) {
    if (node->hasLiveness()) {
      if (bCur->_addBitsDelSource(node->getLiveness(), bCur, bLen))
        goto _OnPatch;
      else
        goto _OnDone;
    }

    VarBits* bTmp = copyBits(bCur, bLen);
    if (bTmp == NULL)
      goto _NoMemory;

    node->setLiveness(bTmp);
    VarMap* map = node->getMap();

    if (map != NULL) {
      uint32_t vaCount = map->getVaCount();
      VarAttr* vaList = reinterpret_cast<VarAttr*>(((uint8_t*)map) + varMapToVaListOffset);

      for (uint32_t i = 0; i < vaCount; i++) {
        VarAttr* va = &vaList[i];
        VarData* vd = va->getVd();

        uint32_t flags = va->getFlags();
        uint32_t ctxId = vd->getContextId();

        if ((flags & kVarAttrOutAll) && !(flags & kVarAttrInAll)) {
          // Write-Only.
          bTmp->setBit(ctxId);
          bCur->delBit(ctxId);
        }
        else {
          // Read-Only or Read/Write.
          bTmp->setBit(ctxId);
          bCur->setBit(ctxId);
        }
      }
    }

    if (node->getType() == kNodeTypeTarget)
      goto _OnTarget;

    if (node == func)
      goto _OnDone;

    ASMJIT_ASSERT(node->getPrev());
    node = node->getPrev();
  }

  // Patch already generated liveness bits.
_OnPatch:
  for (;;) {
    ASMJIT_ASSERT(node->hasLiveness());
    VarBits* bNode = node->getLiveness();

    if (!bNode->_addBitsDelSource(bCur, bLen))
      goto _OnDone;

    if (node->getType() == kNodeTypeTarget)
      goto _OnTarget;

    if (node == func)
      goto _OnDone;

    node = node->getPrev();
  }

_OnTarget:
  if (static_cast<TargetNode*>(node)->getNumRefs() != 0) {
    // Push a new LivenessTarget onto the stack if needed.
    if (ltCur == NULL || ltCur->node != node) {
      // Allocate a new LivenessTarget object (from pool or zone).
      LivenessTarget* ltTmp = ltUnused;

      if (ltTmp != NULL) {
        ltUnused = ltUnused->prev;
      }
      else {
        ltTmp = _baseZone.allocT<LivenessTarget>(
          sizeof(LivenessTarget) - sizeof(VarBits) + bLen * sizeof(uintptr_t));

        if (ltTmp == NULL)
          goto _NoMemory;
      }

      // Initialize and make current - ltTmp->from will be set later on.
      ltTmp->prev = ltCur;
      ltTmp->node = static_cast<TargetNode*>(node);
      ltCur = ltTmp;

      from = static_cast<TargetNode*>(node)->getFrom();
      ASMJIT_ASSERT(from != NULL);
    }
    else {
      from = ltCur->from;
      goto _OnJumpNext;
    }

    // Visit/Patch.
    do {
      ltCur->from = from;
      bCur->copyBits(node->getLiveness(), bLen);

      if (!from->hasLiveness()) {
        node = from;
        goto _OnVisit;
      }

      // Issue #25: Moved '_OnJumpNext' here since it's important to patch
      // code again if there are more live variables than before.
_OnJumpNext:
      if (bCur->delBits(from->getLiveness(), bLen)) {
        node = from;
        goto _OnPatch;
      }

      from = from->getJumpNext();
    } while (from != NULL);

    // Pop the current LivenessTarget from the stack.
    {
      LivenessTarget* ltTmp = ltCur;

      ltCur = ltCur->prev;
      ltTmp->prev = ltUnused;
      ltUnused = ltTmp;
    }
  }

  bCur->copyBits(node->getLiveness(), bLen);
  node = node->getPrev();

  if (node->isJmp() || !node->isFetched())
    goto _OnDone;

  if (!node->hasLiveness())
    goto _OnVisit;

  if (bCur->delBits(node->getLiveness(), bLen))
    goto _OnPatch;

_OnDone:
  if (ltCur != NULL) {
    node = ltCur->node;
    from = ltCur->from;

    goto _OnJumpNext;
  }
  return kErrorOk;

_NoMemory:
  return setError(kErrorNoHeapMemory);
}
Esempio n. 7
0
  void dfgEm(DfgInfo & dfgInfo, string const & varDataFile, string const & facDataFile, string const & subVarDataFile, number_t minDeltaLogLik, unsigned maxIter, 
	     string const & logStateMapsFile, string const & logFactorPotentialsFile, string const & logVariablesFile, string const & logFactorGraphFile, string const & logFile)
  {
    DFG & dfg = dfgInfo.dfg;     // convenient
    AbstractBaseFactorSet & factorSet = dfgInfo.facSet;

    unsigned iter = 0;
    number_t logLik = 0;
    number_t prevLogLik = 0;
    number_t deltaLogLik = 0;

    // setup input data structures
    VarData varData(varDataFile, dfgInfo.varNames);
    FacData * facDataPtr = NULL;
    VarData * subVarDataPtr = NULL;
    if (facDataFile.size() != 0) {
      facDataPtr = new FacData(facDataFile, dfgInfo.facNames);
    }
    if (subVarDataFile.size() != 0) {
      subVarDataPtr = new VarData(subVarDataFile, dfgInfo.subNames);
    }
    else if( dfgInfo.subNames.size() > 0 ){
      errorAbort("DfgDataWrap.cpp::164::main There are subscribed factors but no subscribed variable file were provided");
    }

    // init variables
    // input data variables
    string idVar;
    vector<symbol_t> varVec( varData.count() ); // for input data
    // dfg variables    
    stateMaskVec_t stateMaskVec( dfgInfo.varNames.size() );
    vector<matrix_t> facExpCounts; // Expectation counts
    initAccFactorMarginals(facExpCounts, dfg);
    vector<xmatrix_t> tmpFacMar;  // workspace
    dfg.initFactorMarginals(tmpFacMar);
    xnumber_t normConst;

    // open log file
    ofstream f;
    if ( logFile.size() ) {
      f.open(logFile.c_str(), ios::out);
      if (!f)
	errorAbort("Cannot open file: " + logFile + "\n");
      
      f << "minDeltaLogLik: " << minDeltaLogLik << endl;
      f << "maxIter:        " << maxIter << endl;
      f << endl;
      f << "iter" << "\t" << "logLik" << "\t" << "deltaLogLik" << endl;
    }

    while ( ( (deltaLogLik > minDeltaLogLik) or iter == 0) and iter < maxIter) {
      logLik = 0;
      reset(facExpCounts);

      // reset varData and facData
      varData.reset(varDataFile, dfgInfo.varNames);
      if (facDataFile.size() != 0) {
	facDataPtr->reset(facDataFile, dfgInfo.facNames);
      }
      if (subVarDataFile.size() != 0) {
	subVarDataPtr->reset(subVarDataFile, dfgInfo.subNames);
      }
      unsigned lineCount = 0;
      while ( varData.next(idVar, varVec) ) {
	lineCount++;
	resetFactorPotential(facDataPtr, idVar, lineCount, dfgInfo.dfg);
	updateFactorPotentials(subVarDataPtr, idVar, lineCount, dfgInfo);
	dfgInfo.stateMaskMapSet.symbols2StateMasks( stateMaskVec, varVec, varData.map() );

	//	//debug begin
	//	string facName("CpG_P_1.likelihood");
	//	unsigned facIdx = find(dfgInfo.facNames.begin(), dfgInfo.facNames.end(), facName) - dfgInfo.facNames.begin();
	//	cout << "factor name: " << facName << "; facIdx: " << facIdx << "; potential " << dfg.getFactor(facIdx).potential <<  endl;
	//	//debug end

	calcFacAccMarAndNormConst(facExpCounts, tmpFacMar, normConst, stateMaskVec, dfg);

	logLik += - log(normConst);
      }

      factorSet.submitCounts(facExpCounts);
      factorSet.optimizeParameters();
      dfg.resetFactorPotentials( factorSet.mkFactorVec() );
      factorSet.clearCounts();

      deltaLogLik = abs(prevLogLik - logLik); // set at abs(-logLik) in iter 0

      if ( logFile.size() )
	f << iter << "\t" << logLik << "\t" << deltaLogLik << endl;


      if ( logStateMapsFile.size() )
	writeDfgInfo(dfgInfo, logStateMapsFile, logFactorPotentialsFile, logVariablesFile, logFactorGraphFile);

      //
      //      // debug
      //      cout << "from dfgEm:" << endl;
      //      cout << "iter:        " << iter << endl;
      //      cout << "logLik:      " << logLik << endl;
      //      cout << "prevLogLik:  " << prevLogLik << endl;
      //      cout << "deltaLogLik: " << deltaLogLik << endl;
      //      cout << "minDeltaLogLik: " << minDeltaLogLik << endl;
      //      cout << "maxIter: " << maxIter << endl;
      //      cout << "( ( (deltaLogLik > minDeltaLogLik) or iter == 0) and iter < maxIter): " << ( ( (deltaLogLik > minDeltaLogLik) or iter == 0) and iter < maxIter) << endl;
      //

      //      //debug begin
      //      cout << endl << "iteration #: " << iter << endl << endl;
      //      //debug end

      prevLogLik = logLik;
      iter++;
    }

    // clean up
    if (facDataPtr != NULL)
      delete facDataPtr;
  }