bool Liveness::SrcRegisterIs(const Registers& regs, myTemp reg) const { assert (reg != nullptr); assert (regs.size() >= 0 && regs.size() <= 1); if (regs.size() == 1) return regs.at(0) == reg; else return false; }
// Compare register sets by name static inline bool compareRegisterSet(const Registers &r1, const Registers &r2) { if (r1.size() != r2.size()) return false; const int size = r1.size(); for (int r = 0; r < size; r++) if (r1.at(r).name != r2.at(r).name) return false; return true; }
// NOTE: // This function also recognize conditions when either of the destination // register or the source register is used as a memory location: // mov [reg], reg | mov [reg], [reg] | mov reg, [reg] // On these conditions, the move instructions are not treated as move pairs. bool Liveness::IsTwoContentRegOperandMove( Node node, Registers& leftOperand, Registers& rightOperand) const { if (!cfGraph.IsMoveIns(node) || leftOperand.size() != 1 || rightOperand.size() != 1) return false; // check memory operand type from "[]" characters string insStr = cfGraph.GetNodeIns(node)->ToString(); return insStr.find('[') == string::npos; }
std::string gdbmiRegisters(CIDebugRegisters *regs, CIDebugControl *control, bool humanReadable, unsigned flags, std::string *errorMessage) { if (regs == 0 || control == 0) { *errorMessage = "Required interfaces missing for registers dump."; return std::string(); } const Registers registers = getRegisters(regs, flags, errorMessage); if (registers.empty()) return std::string(); std::ostringstream str; str << '['; if (humanReadable) str << '\n'; const Registers::size_type size = registers.size(); for (Registers::size_type r = 0; r < size; ++r) { const Register ® = registers.at(r); if (r) str << ','; str << "{number=\"" << r << "\",name=\"" << gdbmiWStringFormat(reg.name) << '"'; if (!reg.description.empty()) str << ",description=\"" << gdbmiWStringFormat(reg.description) << '"'; if (reg.subRegister) str << ",subregister=\"true\""; if (reg.pseudoRegister) str << ",pseudoregister=\"true\""; str << ",value=\""; formatDebugValue(str, reg.value, control); str << "\"}"; if (humanReadable) str << '\n'; } str << ']'; if (humanReadable) str << '\n'; return str.str(); }
bool Liveness::IsSelfMove(Registers& leftOperand, Registers& rightOperand) const { assert (leftOperand.size() == 1 && rightOperand.size() == 1); return leftOperand.at(0) == rightOperand.at(0); }