summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/insts/str.isa
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:01 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:01 -0500
commit36b6ca2ce3a70c5e8df506e7afcaf80ef0597a48 (patch)
tree21e497a2c68a7809945e15791b66992d5f789321 /src/arch/arm/isa/insts/str.isa
parent79b288f7b5c81f37d1b33470a1144d52efafb496 (diff)
downloadgem5-36b6ca2ce3a70c5e8df506e7afcaf80ef0597a48.tar.xz
ARM: Pull double memory instructions out of the decoder.
Diffstat (limited to 'src/arch/arm/isa/insts/str.isa')
-rw-r--r--src/arch/arm/isa/insts/str.isa69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/arch/arm/isa/insts/str.isa b/src/arch/arm/isa/insts/str.isa
index a051b0e72..e72ca6e41 100644
--- a/src/arch/arm/isa/insts/str.isa
+++ b/src/arch/arm/isa/insts/str.isa
@@ -53,6 +53,14 @@ let {{
return memClassName("STORE_REG", post, add, writeback,
size, sign, user)
+ def storeDoubleImmClassName(post, add, writeback):
+ return memClassName("STORE_IMMD", post, add, writeback,
+ 4, False, False)
+
+ def storeDoubleRegClassName(post, add, writeback):
+ return memClassName("STORE_REGD", post, add, writeback,
+ 4, False, False)
+
def emitStore(name, Name, imm, eaCode, accCode, memFlags, instFlags, base):
global header_output, decoder_output, exec_output
@@ -116,6 +124,51 @@ let {{
emitStore(name, Name, False, eaCode, accCode, [], [], base)
+ def buildDoubleImmStore(mnem, post, add, writeback):
+ name = mnem
+ Name = storeDoubleImmClassName(post, add, writeback)
+
+ if add:
+ op = " +"
+ else:
+ op = " -"
+
+ offset = op + " imm"
+ eaCode = "EA = Base"
+ if not post:
+ eaCode += offset
+ eaCode += ";"
+
+ accCode = 'Mem.ud = (Rdo.ud & mask(32)) | (Rde.ud << 32);'
+ if writeback:
+ accCode += "Base = Base %s;\n" % offset
+ base = buildMemBase("MemoryNewImm", post, writeback)
+
+ emitStore(name, Name, True, eaCode, accCode, [], [], base)
+
+ def buildDoubleRegStore(mnem, post, add, writeback):
+ name = mnem
+ Name = storeDoubleRegClassName(post, add, writeback)
+
+ if add:
+ op = " +"
+ else:
+ op = " -"
+
+ offset = op + " shift_rm_imm(Index, shiftAmt," + \
+ " shiftType, CondCodes<29:>)"
+ eaCode = "EA = Base"
+ if not post:
+ eaCode += offset
+ eaCode += ";"
+
+ accCode = 'Mem.ud = (Rdo.ud & mask(32)) | (Rde.ud << 32);'
+ if writeback:
+ accCode += "Base = Base %s;\n" % offset
+ base = buildMemBase("MemoryNewReg", post, writeback)
+
+ emitStore(name, Name, False, eaCode, accCode, [], [], base)
+
def buildStores(mnem, size=4, sign=False, user=False):
buildImmStore(mnem, True, True, True, size, sign, user)
buildRegStore(mnem, True, True, True, size, sign, user)
@@ -130,10 +183,26 @@ let {{
buildImmStore(mnem, False, False, False, size, sign, user)
buildRegStore(mnem, False, False, False, size, sign, user)
+ def buildDoubleStores(mnem):
+ buildDoubleImmStore(mnem, True, True, True)
+ buildDoubleRegStore(mnem, True, True, True)
+ buildDoubleImmStore(mnem, True, False, True)
+ buildDoubleRegStore(mnem, True, False, True)
+ buildDoubleImmStore(mnem, False, True, True)
+ buildDoubleRegStore(mnem, False, True, True)
+ buildDoubleImmStore(mnem, False, False, True)
+ buildDoubleRegStore(mnem, False, False, True)
+ buildDoubleImmStore(mnem, False, True, False)
+ buildDoubleRegStore(mnem, False, True, False)
+ buildDoubleImmStore(mnem, False, False, False)
+ buildDoubleRegStore(mnem, False, False, False)
+
buildStores("str")
buildStores("strt", user=True)
buildStores("strb", size=1)
buildStores("strbt", size=1, user=True)
buildStores("strh", size=2)
buildStores("strht", size=2, user=True)
+
+ buildDoubleStores("strd")
}};