64,65c64,66
< def emitStore(name, Name, imm, eaCode, accCode, \
< memFlags, instFlags, base, double=False):
---
> def emitStore(name, Name, imm, eaCode, accCode, postAccCode, \
> memFlags, instFlags, base, double=False, strex=False,
> execTemplateBase = 'Store'):
71,73c72,74
< eaCode, accCode,
< memFlags, instFlags, double,
< base, execTemplateBase = 'Store')
---
> eaCode, accCode, postAccCode,
> memFlags, instFlags, double, strex,
> base, execTemplateBase = execTemplateBase)
80c81
< size=4, sign=False, user=False):
---
> size=4, sign=False, user=False, strex=False):
100d100
< base = buildMemBase("MemoryImm", post, writeback)
102,105c102,113
< emitStore(name, Name, True, eaCode, accCode, \
< ["ArmISA::TLB::MustBeOne", \
< "ArmISA::TLB::AllowUnaligned", \
< "%d" % (size - 1)], [], base)
---
> memFlags = ["ArmISA::TLB::MustBeOne", "%d" % (size - 1)]
> if strex:
> memFlags.append("Request::LLSC")
> Name = "%s_%s" % (mnem.upper(), Name)
> base = buildMemBase("MemoryExImm", post, writeback)
> postAccCode = "Result = !writeResult;"
> execTemplateBase = 'StoreEx'
> else:
> memFlags.append("ArmISA::TLB::AllowUnaligned")
> base = buildMemBase("MemoryImm", post, writeback)
> postAccCode = ""
> execTemplateBase = 'Store'
106a115,118
> emitStore(name, Name, True, eaCode, accCode, postAccCode, \
> memFlags, [], base, strex=strex,
> execTemplateBase = execTemplateBase)
>
108c120
< size=4, sign=False, user=False):
---
> size=4, sign=False, user=False, strex=False):
131c143
< emitStore(name, Name, False, eaCode, accCode, \
---
> emitStore(name, Name, False, eaCode, accCode, "",\
136c148
< def buildDoubleImmStore(mnem, post, add, writeback):
---
> def buildDoubleImmStore(mnem, post, add, writeback, strex=False):
158d169
< base = buildMemBase("MemoryDImm", post, writeback)
160,162c171,180
< emitStore(name, Name, True, eaCode, accCode, \
< ["ArmISA::TLB::MustBeOne",
< "ArmISA::TLB::AlignWord"], [], base, double=True)
---
> memFlags = ["ArmISA::TLB::MustBeOne",
> "ArmISA::TLB::AlignWord"]
> if strex:
> memFlags.append("Request::LLSC")
> Name = "%s_%s" % (mnem.upper(), Name)
> base = buildMemBase("MemoryExDImm", post, writeback)
> postAccCode = "Result = !writeResult;"
> else:
> base = buildMemBase("MemoryDImm", post, writeback)
> postAccCode = ""
163a182,184
> emitStore(name, Name, True, eaCode, accCode, postAccCode, \
> memFlags, [], base, double=True, strex=strex)
>
189,191c210,211
< emitStore(name, Name, False, eaCode, accCode, \
< ["ArmISA::TLB::MustBeOne", \
< "ArmISA::TLB::AlignWord"], [], base, double=True)
---
> memFlags = ["ArmISA::TLB::MustBeOne",
> "ArmISA::TLB::AlignWord"]
192a213,215
> emitStore(name, Name, False, eaCode, accCode, "", \
> memFlags, [], base, double=True)
>
228a252,256
>
> buildImmStore("strex", False, True, False, size=4, strex=True)
> buildImmStore("strexh", False, True, False, size=2, strex=True)
> buildImmStore("strexb", False, True, False, size=1, strex=True)
> buildDoubleImmStore("strexd", False, True, False, strex=True)