summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/insts/mem.isa
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:10 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:10 -0500
commit54ab07e636a0e83527a87c5d88406e3b443b2e99 (patch)
tree328ec84643a3a0149b39c49b893a9ccc4f8d9729 /src/arch/arm/isa/insts/mem.isa
parent524a8195e18f17ee6e57bfbcb2752ac6bfa2d8ee (diff)
downloadgem5-54ab07e636a0e83527a87c5d88406e3b443b2e99.tar.xz
ARM: Implement the strex instructions.
Diffstat (limited to 'src/arch/arm/isa/insts/mem.isa')
-rw-r--r--src/arch/arm/isa/insts/mem.isa21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/arch/arm/isa/insts/mem.isa b/src/arch/arm/isa/insts/mem.isa
index db3665a54..e17235c81 100644
--- a/src/arch/arm/isa/insts/mem.isa
+++ b/src/arch/arm/isa/insts/mem.isa
@@ -39,7 +39,7 @@
let {{
def loadStoreBaseWork(name, Name, imm, swp, rfe, codeBlobs, memFlags,
- instFlags, double, base = 'Memory',
+ instFlags, double, strex, base = 'Memory',
execTemplateBase = ''):
# Make sure flags are in lists (convert to lists if not).
memFlags = makeList(memFlags)
@@ -70,6 +70,12 @@ let {{
if double:
declareTemplate = LoadStoreDImmDeclare
constructTemplate = LoadStoreDImmConstructor
+ if strex:
+ declareTemplate = StoreExDImmDeclare
+ constructTemplate = StoreExDImmConstructor
+ elif strex:
+ declareTemplate = StoreExImmDeclare
+ constructTemplate = StoreExImmConstructor
else:
declareTemplate = LoadStoreImmDeclare
constructTemplate = LoadStoreImmConstructor
@@ -88,14 +94,15 @@ let {{
+ initiateAccTemplate.subst(iop)
+ completeAccTemplate.subst(iop))
- def loadStoreBase(name, Name, imm, eaCode, accCode, memFlags,
- instFlags, double, base = 'Memory',
+ def loadStoreBase(name, Name, imm, eaCode, accCode, postAccCode,
+ memFlags, instFlags, double, strex, base = 'Memory',
execTemplateBase = ''):
codeBlobs = { "ea_code": eaCode,
"memacc_code": accCode,
+ "postacc_code": postAccCode,
"predicate_test": predicateTest }
return loadStoreBaseWork(name, Name, imm, False, False, codeBlobs,
- memFlags, instFlags, double, base,
+ memFlags, instFlags, double, strex, base,
execTemplateBase)
def RfeBase(name, Name, eaCode, accCode, memFlags, instFlags):
@@ -103,7 +110,8 @@ let {{
"memacc_code": accCode,
"predicate_test": predicateTest }
return loadStoreBaseWork(name, Name, False, False, True, codeBlobs,
- memFlags, instFlags, False, 'RfeOp', 'Load')
+ memFlags, instFlags, False, False,
+ 'RfeOp', 'Load')
def SwapBase(name, Name, eaCode, preAccCode, postAccCode, memFlags,
instFlags):
@@ -112,7 +120,8 @@ let {{
"postacc_code": postAccCode,
"predicate_test": predicateTest }
return loadStoreBaseWork(name, Name, False, True, False, codeBlobs,
- memFlags, instFlags, False, 'Swap', 'Swap')
+ memFlags, instFlags, False, False,
+ 'Swap', 'Swap')
def memClassName(base, post, add, writeback, \
size=4, sign=False, user=False):