summaryrefslogtreecommitdiff
path: root/src/arch/riscv/isa/formats/mem.isa
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/riscv/isa/formats/mem.isa')
-rw-r--r--src/arch/riscv/isa/formats/mem.isa41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/arch/riscv/isa/formats/mem.isa b/src/arch/riscv/isa/formats/mem.isa
index 4ae8eb41a..9b6bc9eb5 100644
--- a/src/arch/riscv/isa/formats/mem.isa
+++ b/src/arch/riscv/isa/formats/mem.isa
@@ -46,11 +46,8 @@ output header {{
/// Constructor
Load(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
- : RiscvStaticInst(mnem, _machInst, __opClass), ldisp(IMM12)
- {
- if (IMMSIGN > 0)
- ldisp |= ~((uint64_t)0xFFF);
- }
+ : RiscvStaticInst(mnem, _machInst, __opClass), ldisp(0)
+ {}
std::string
generateDisassembly(Addr pc, const SymbolTable *symtab) const;
@@ -68,9 +65,9 @@ output header {{
/// Constructor
Store(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
- : RiscvStaticInst(mnem, _machInst, __opClass), sdisp(IMM5)
+ : RiscvStaticInst(mnem, _machInst, __opClass), sdisp(0)
{
- sdisp |= IMM7 << 5;
+ sdisp = IMM5 | (IMM7 << 5);
if (IMMSIGN > 0)
sdisp |= ~((uint64_t)0xFFF);
}
@@ -143,6 +140,7 @@ def template LoadStoreConstructor {{
%(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
{
%(constructor)s;
+ %(offset_code)s;
}
}};
@@ -168,16 +166,17 @@ def template EACompExecute {{
}};
let {{
-def LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,
- base_class, postacc_code='', decode_template=BasicDecode,
+def LoadStoreBase(name, Name, offset_code, ea_code, memacc_code, mem_flags,
+ inst_flags, base_class, postacc_code='', decode_template=BasicDecode,
exec_template_base=''):
# Make sure flags are in lists (convert to lists if not).
mem_flags = makeList(mem_flags)
- inst_flags = makeList(inst_flags) # + ['IsNonSpeculative']
+ inst_flags = makeList(inst_flags)
iop = InstObjParams(name, Name, base_class,
- { 'ea_code':ea_code, 'memacc_code':memacc_code,
- 'postacc_code':postacc_code }, inst_flags)
+ {'offset_code': offset_code, 'ea_code': ea_code,
+ 'memacc_code': memacc_code, 'postacc_code': postacc_code },
+ inst_flags)
if mem_flags:
mem_flags = [ 'Request::%s' % flag for flag in mem_flags ]
@@ -342,14 +341,24 @@ def template StoreCompleteAcc {{
def format Load(memacc_code, ea_code = {{EA = Rs1 + ldisp;}}, mem_flags=[],
inst_flags=[]) {{
+ offset_code = """
+ ldisp = IMM12;
+ if (IMMSIGN > 0)
+ ldisp |= ~((uint64_t)0xFFF);
+ """
(header_output, decoder_output, decode_block, exec_output) = \
- LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,
- 'Load', exec_template_base='Load')
+ LoadStoreBase(name, Name, offset_code, ea_code, memacc_code, mem_flags,
+ inst_flags, 'Load', exec_template_base='Load')
}};
def format Store(memacc_code, ea_code={{EA = Rs1 + sdisp;}}, mem_flags=[],
inst_flags=[]) {{
+ offset_code = """
+ sdisp = IMM5 | (IMM7 << 5);
+ if (IMMSIGN > 0)
+ sdisp |= ~((uint64_t)0xFFF);
+ """
(header_output, decoder_output, decode_block, exec_output) = \
- LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,
- 'Store', exec_template_base='Store')
+ LoadStoreBase(name, Name, offset_code, ea_code, memacc_code, mem_flags,
+ inst_flags, 'Store', exec_template_base='Store')
}};