summaryrefslogtreecommitdiff
path: root/src/arch/arm/insts/mem.cc
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:11 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:11 -0500
commitdbee6e0c5406200066b8185fd38fa47dae7cdd2f (patch)
treecc1cb169d8a215010d2adbf1b4eea82d70fa695a /src/arch/arm/insts/mem.cc
parent239c9af90d61b2877a8cee8b91f162e7a0bf1e72 (diff)
downloadgem5-dbee6e0c5406200066b8185fd38fa47dae7cdd2f.tar.xz
ARM: Add a base class for SRS.
Diffstat (limited to 'src/arch/arm/insts/mem.cc')
-rw-r--r--src/arch/arm/insts/mem.cc55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/arch/arm/insts/mem.cc b/src/arch/arm/insts/mem.cc
index 394c159d1..eb16e42d0 100644
--- a/src/arch/arm/insts/mem.cc
+++ b/src/arch/arm/insts/mem.cc
@@ -87,6 +87,61 @@ RfeOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
return ss.str();
}
+string
+SrsOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+{
+ stringstream ss;
+ switch (mode) {
+ case DecrementAfter:
+ printMnemonic(ss, "da");
+ break;
+ case DecrementBefore:
+ printMnemonic(ss, "db");
+ break;
+ case IncrementAfter:
+ printMnemonic(ss, "ia");
+ break;
+ case IncrementBefore:
+ printMnemonic(ss, "ib");
+ break;
+ }
+ printReg(ss, INTREG_SP);
+ if (wb) {
+ ss << "!";
+ }
+ ss << ", #";
+ switch (mode) {
+ case MODE_USER:
+ ss << "user";
+ break;
+ case MODE_FIQ:
+ ss << "fiq";
+ break;
+ case MODE_IRQ:
+ ss << "irq";
+ break;
+ case MODE_SVC:
+ ss << "supervisor";
+ break;
+ case MODE_MON:
+ ss << "monitor";
+ break;
+ case MODE_ABORT:
+ ss << "abort";
+ break;
+ case MODE_UNDEFINED:
+ ss << "undefined";
+ break;
+ case MODE_SYSTEM:
+ ss << "system";
+ break;
+ default:
+ ss << "unrecognized";
+ break;
+ }
+ return ss.str();
+}
+
void
Memory::printInst(std::ostream &os, AddrMode addrMode) const
{