summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/insts/str.isa
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/isa/insts/str.isa')
-rw-r--r--src/arch/arm/isa/insts/str.isa46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/arch/arm/isa/insts/str.isa b/src/arch/arm/isa/insts/str.isa
index f9002a6f7..023ce81ca 100644
--- a/src/arch/arm/isa/insts/str.isa
+++ b/src/arch/arm/isa/insts/str.isa
@@ -116,6 +116,40 @@ let {{
memFlags, [], base, strex=strex,
execTemplateBase = execTemplateBase)
+ def buildSrsStore(mnem, post, add, writeback):
+ name = mnem
+ Name = "SRS_" + storeImmClassName(post, add, writeback, 8)
+
+ offset = 0
+ if post != add:
+ offset += 4
+ if not add:
+ offset -= 8
+
+ eaCode = "EA = SpMode + %d;" % offset
+
+ wbDiff = -8
+ if add:
+ wbDiff = 8
+ accCode = '''
+ CPSR cpsr = Cpsr;
+ Mem.ud = (uint64_t)cSwap(LR.uw, cpsr.e) |
+ ((uint64_t)cSwap(Spsr.uw, cpsr.e) << 32);
+ '''
+ if writeback:
+ accCode += "SpMode = SpMode + %s;\n" % wbDiff
+
+ global header_output, decoder_output, exec_output
+
+ (newHeader,
+ newDecoder,
+ newExec) = SrsBase(name, Name, eaCode, accCode,
+ ["ArmISA::TLB::AlignWord", "ArmISA::TLB::MustBeOne"], [])
+
+ header_output += newHeader
+ decoder_output += newDecoder
+ exec_output += newExec
+
def buildRegStore(mnem, post, add, writeback, \
size=4, sign=False, user=False, strex=False):
name = mnem
@@ -241,6 +275,16 @@ let {{
buildDoubleImmStore(mnem, False, False, False)
buildDoubleRegStore(mnem, False, False, False)
+ def buildSrsStores(mnem):
+ buildSrsStore(mnem, True, True, True)
+ buildSrsStore(mnem, True, True, False)
+ buildSrsStore(mnem, True, False, True)
+ buildSrsStore(mnem, True, False, False)
+ buildSrsStore(mnem, False, True, True)
+ buildSrsStore(mnem, False, True, False)
+ buildSrsStore(mnem, False, False, True)
+ buildSrsStore(mnem, False, False, False)
+
buildStores("str")
buildStores("strt", user=True)
buildStores("strb", size=1)
@@ -248,6 +292,8 @@ let {{
buildStores("strh", size=2)
buildStores("strht", size=2, user=True)
+ buildSrsStores("srs")
+
buildDoubleStores("strd")
buildImmStore("strex", False, True, False, size=4, strex=True)