using namespace PowerISA;
const std::string &
-PCDependentDisassembly::disassemble(Addr pc, const SymbolTable *symtab) const
+PCDependentDisassembly::disassemble(
+ Addr pc, const Loader::SymbolTable *symtab) const
{
if (!cachedDisassembly ||
pc != cachedPC || symtab != cachedSymtab)
return *cachedDisassembly;
}
-PowerISA::PCState
-BranchPCRel::branchTarget(const PowerISA::PCState &pc) const
-{
- return (uint32_t)(pc.pc() + disp);
-}
-
-std::string
-BranchPCRel::generateDisassembly(Addr pc, const SymbolTable *symtab) const
-{
- std::stringstream ss;
-
- ccprintf(ss, "%-10s ", mnemonic);
-
- Addr target = pc + disp;
-
- std::string str;
- if (symtab && symtab->findSymbol(target, str))
- ss << str;
- else
- ccprintf(ss, "0x%x", target);
-
- return ss.str();
-}
PowerISA::PCState
-BranchNonPCRel::branchTarget(const PowerISA::PCState &pc) const
-{
- return targetAddr;
-}
-
-std::string
-BranchNonPCRel::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+BranchOp::branchTarget(const PowerISA::PCState &pc) const
{
- std::stringstream ss;
-
- ccprintf(ss, "%-10s ", mnemonic);
-
- std::string str;
- if (symtab && symtab->findSymbol(targetAddr, str))
- ss << str;
- else
- ccprintf(ss, "0x%x", targetAddr);
-
- return ss.str();
+ if (aaSet) {
+ return disp;
+ } else {
+ return pc.pc() + disp;
+ }
}
-PowerISA::PCState
-BranchPCRelCond::branchTarget(const PowerISA::PCState &pc) const
-{
- return (uint32_t)(pc.pc() + disp);
-}
std::string
-BranchPCRelCond::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+BranchOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
{
std::stringstream ss;
+ Addr target;
- ccprintf(ss, "%-10s ", mnemonic);
+ // Generate correct mnemonic
+ std::string myMnemonic(mnemonic);
- ss << bo << ", " << bi << ", ";
+ // Additional characters depending on isa bits being set
+ if (lkSet) myMnemonic = myMnemonic + "l";
+ if (aaSet) myMnemonic = myMnemonic + "a";
+ ccprintf(ss, "%-10s ", myMnemonic);
- Addr target = pc + disp;
+ if (aaSet) {
+ target = disp;
+ } else {
+ target = pc + disp;
+ }
- std::string str;
- if (symtab && symtab->findSymbol(target, str))
- ss << str;
+ Loader::SymbolTable::const_iterator it;
+ if (symtab && (it = symtab->find(target)) != symtab->end())
+ ss << it->name;
else
- ccprintf(ss, "0x%x", target);
+ ccprintf(ss, "%#x", target);
return ss.str();
}
+
PowerISA::PCState
-BranchNonPCRelCond::branchTarget(const PowerISA::PCState &pc) const
+BranchDispCondOp::branchTarget(const PowerISA::PCState &pc) const
{
- return targetAddr;
+ if (aaSet) {
+ return disp;
+ } else {
+ return pc.pc() + disp;
+ }
}
+
std::string
-BranchNonPCRelCond::generateDisassembly(Addr pc,
- const SymbolTable *symtab) const
+BranchDispCondOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
{
std::stringstream ss;
+ Addr target;
- ccprintf(ss, "%-10s ", mnemonic);
+ // Generate the correct mnemonic
+ std::string myMnemonic(mnemonic);
+
+ // Additional characters depending on isa bits being set
+ if (lkSet) myMnemonic = myMnemonic + "l";
+ if (aaSet) myMnemonic = myMnemonic + "a";
+ ccprintf(ss, "%-10s ", myMnemonic);
- ss << bo << ", " << bi << ", ";
+ // Print BI and BO fields
+ ss << crBit << ", " << opts << ", ";
- std::string str;
- if (symtab && symtab->findSymbol(targetAddr, str))
- ss << str;
+ if (aaSet) {
+ target = disp;
+ } else {
+ target = pc + disp;
+ }
+
+ Loader::SymbolTable::const_iterator it;
+ if (symtab && (it = symtab->find(target)) != symtab->end())
+ ss << it->name;
else
- ccprintf(ss, "0x%x", targetAddr);
+ ccprintf(ss, "%#x", target);
return ss.str();
}
+
PowerISA::PCState
-BranchRegCond::branchTarget(ThreadContext *tc) const
+BranchRegCondOp::branchTarget(ThreadContext *tc) const
{
- uint32_t regVal = tc->readIntReg(_srcRegIdx[_numSrcRegs - 1].index());
- return regVal & 0xfffffffc;
+ Addr addr = tc->readIntReg(_srcRegIdx[_numSrcRegs - 1].index());
+ return addr & -4ULL;
}
+
std::string
-BranchRegCond::generateDisassembly(Addr pc,
- const SymbolTable *symtab) const
+BranchRegCondOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
{
std::stringstream ss;
+ // Generate the correct mnemonic
+ std::string myMnemonic(mnemonic);
+
+ // Additional characters depending on isa bits being set
+ if (lkSet) myMnemonic = myMnemonic + "l";
ccprintf(ss, "%-10s ", mnemonic);
- ss << bo << ", " << bi << ", ";
+ // Print the BI and BO fields
+ ss << crBit << ", " << opts;
return ss.str();
}