arch-power: Fix branch instructions
[gem5.git] / src / arch / power / insts / branch.cc
index 4b75997bc373a3b72963a54c89c88db9c8e5986b..fce3d3f64827706fb570354327e77cb548416a0d 100644 (file)
@@ -34,7 +34,8 @@
 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)
@@ -51,119 +52,114 @@ PCDependentDisassembly::disassemble(Addr pc, const SymbolTable *symtab) const
     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();
 }