NoOperation::IndexIntervals NoOperation::findNoopSubsequences(const std::vector<SgAsmInstruction*> &insns) const { IndexIntervals retval; Sawyer::Message::Stream debug(mlog[DEBUG]); if (debug) { debug <<"findNoopSubsequences(\n"; BOOST_FOREACH (SgAsmInstruction *insn, insns) debug <<" " <<unparseInstructionWithAddress(insn) <<"\n"; debug <<")\n"; } // If we have no instruction semantics then assume that all instructions have an effect. if (!cpu_ || insns.empty()) return retval; // Process each instruction as if insns were a basic block. Store insns[i]'s initial state in states[i] and its final state // in states[i+1]. States don't generally have a way to compare them for equality, so use a simple string-based comparison // for now. FIXME[Robb P. Matzke 2015-05-11] std::vector<std::string> states; bool hadError = false; cpu_->get_operators()->currentState(initialState(insns.front())); const RegisterDescriptor regIP = cpu_->instructionPointerRegister(); try { BOOST_FOREACH (SgAsmInstruction *insn, insns) { cpu_->get_operators()->writeRegister(regIP, cpu_->get_operators()->number_(regIP.get_nbits(), insn->get_address())); states.push_back(normalizeState(cpu_->currentState())); if (debug) { debug <<" normalized state #" <<states.size()-1 <<":\n" <<StringUtility::prefixLines(states.back(), " "); debug <<" instruction: " <<unparseInstructionWithAddress(insn) <<"\n"; } cpu_->processInstruction(insn); } } catch (const BaseSemantics::Exception &e) { hadError = true; SAWYER_MESG(debug) <<" semantic exception: " <<e <<"\n"; } if (!hadError) { states.push_back(normalizeState(cpu_->currentState())); if (debug) debug <<" normalized state #" <<states.size()-1 <<":\n" <<StringUtility::prefixLines(states.back(), " "); } // Look for pairs of states that are the same, and call that sequence of instructions a no-op for (size_t i=0; i+1<states.size(); ++i) { for (size_t j=i+1; j<states.size(); ++j) { if (states[i]==states[j]) { retval.push_back(IndexInterval::hull(i, j-1)); SAWYER_MESG(debug) <<" no-op: " <<i <<".." <<(j-1) <<"\n"; } } } return retval; }
bool NoOperation::isNoop(const std::vector<SgAsmInstruction*> &insns) const { if (!cpu_) return false; // assume sequence has effect if we can't prove otherwise if (insns.empty()) return true; cpu_->get_operators()->currentState(initialState(insns.front())); std::string startState = normalizeState(cpu_->currentState()); try { BOOST_FOREACH (SgAsmInstruction *insn, insns) cpu_->processInstruction(insn); } catch (const BaseSemantics::Exception&) { return false; } std::string endState = normalizeState(cpu_->currentState()); SAWYER_MESG(mlog[DEBUG]) <<"== startState ==\n" <<startState <<"\n"; SAWYER_MESG(mlog[DEBUG]) <<"== endState ==\n" <<endState <<"\n"; SAWYER_MESG(mlog[DEBUG]) <<"start and end states " <<(startState==endState ? "are equal":"differ") <<"\n"; return startState == endState; }
void DoublePoleBalancing::stateTransition(const Action& action) { OPENANN_CHECK_MATRIX_BROKEN(action); step++; this->action = action; double force = action(0, 0); if(fabs(force) > maxForce) force = force / fabs(force) * maxForce; State s = state; for(int i = 0; i < 2; i++) { State der = derivative(s, force); s = rk4(s, force, der); } state = s; normalizeState(); }
void DoublePoleBalancing::restart() { step = 0; state << 0.0, 0.0, initialPoleAngularPosition1, 0.0, 0.0, 0.0; normalizeState(); }