diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2010-06-02 12:58:05 -0500 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2010-06-02 12:58:05 -0500 |
commit | e157b1f52ab17a24de885ee211e36c6374170a4c (patch) | |
tree | 570512ea9ca2a3f5310f1113c35c19d1131e1bab /src/arch/arm/isa/insts/mem.isa | |
parent | 1884ed65bd7791315d111835888d4a83d78e204a (diff) | |
download | gem5-e157b1f52ab17a24de885ee211e36c6374170a4c.tar.xz |
ARM: Implement the swp and swpb instructions.
Diffstat (limited to 'src/arch/arm/isa/insts/mem.isa')
-rw-r--r-- | src/arch/arm/isa/insts/mem.isa | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/src/arch/arm/isa/insts/mem.isa b/src/arch/arm/isa/insts/mem.isa index 1bd70e54b..21687b225 100644 --- a/src/arch/arm/isa/insts/mem.isa +++ b/src/arch/arm/isa/insts/mem.isa @@ -38,12 +38,14 @@ // Authors: Gabe Black let {{ - def loadStoreBase(name, Name, imm, eaCode, accCode, memFlags, - instFlags, base = 'Memory', execTemplateBase = ''): + def loadStoreBaseWork(name, Name, imm, swp, codeBlobs, memFlags, + instFlags, base = 'Memory', execTemplateBase = ''): # Make sure flags are in lists (convert to lists if not). memFlags = makeList(memFlags) instFlags = makeList(instFlags) + eaCode = codeBlobs["ea_code"] + # This shouldn't be part of the eaCode, but until the exec templates # are converted over it's the easiest place to put it. eaCode += '\n unsigned memAccessFlags = ' @@ -52,17 +54,18 @@ let {{ else: eaCode += '0;' - iop = InstObjParams(name, Name, base, - {'ea_code': eaCode, - 'memacc_code': accCode, - 'predicate_test': predicateTest}, - instFlags) + codeBlobs["ea_code"] = eaCode + + iop = InstObjParams(name, Name, base, codeBlobs, instFlags) fullExecTemplate = eval(execTemplateBase + 'Execute') initiateAccTemplate = eval(execTemplateBase + 'InitiateAcc') completeAccTemplate = eval(execTemplateBase + 'CompleteAcc') - if imm: + if swp: + declareTemplate = SwapDeclare + constructTemplate = SwapConstructor + elif imm: declareTemplate = LoadStoreImmDeclare constructTemplate = LoadStoreImmConstructor else: @@ -76,6 +79,23 @@ let {{ + initiateAccTemplate.subst(iop) + completeAccTemplate.subst(iop)) + def loadStoreBase(name, Name, imm, eaCode, accCode, memFlags, + instFlags, base = 'Memory', execTemplateBase = ''): + codeBlobs = { "ea_code": eaCode, + "memacc_code": accCode, + "predicate_test": predicateTest } + return loadStoreBaseWork(name, Name, imm, False, codeBlobs, memFlags, + instFlags, base, execTemplateBase) + + def SwapBase(name, Name, eaCode, preAccCode, postAccCode, memFlags, + instFlags): + codeBlobs = { "ea_code": eaCode, + "preacc_code": preAccCode, + "postacc_code": postAccCode, + "predicate_test": predicateTest } + return loadStoreBaseWork(name, Name, False, True, codeBlobs, memFlags, + instFlags, 'Swap', 'Swap') + def memClassName(base, post, add, writeback, \ size=4, sign=False, user=False): Name = base |