diff options
Diffstat (limited to 'mips/mips.sail')
| -rw-r--r-- | mips/mips.sail | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/mips/mips.sail b/mips/mips.sail index f0085f89..fd69a9f8 100644 --- a/mips/mips.sail +++ b/mips/mips.sail @@ -1265,6 +1265,7 @@ function clause decode (0b111100 : (regno) base : (regno) rt : (imm16) offset) = function clause execute (Store(width, conditional, base, rt, offset)) = { (bit[64]) vAddr := EXTS(offset) + rGPR(base); + (bit[64]) rt_val := rGPR(rt); if ~ (isAddressAligned(vAddr, width)) then SignalException(AdES) (* unaligned access *) else @@ -1274,11 +1275,23 @@ function clause execute (Store(width, conditional, base, rt, offset)) = { if (conditional) then { - success := (MEMw_conditional(vAddr, wordWidthBytes(width), rGPR(rt))); + success := switch(width) + { + case B -> MEMw_conditional(vAddr, 1, rt_val[7..0]) + case H -> MEMw_conditional(vAddr, 2, rt_val[15..0]) + case W -> MEMw_conditional(vAddr, 4, rt_val[31..0]) + case D -> MEMw_conditional(vAddr, 8, rt_val) + }; wGPR(rt) := EXTZ([success]) } else - MEMw(vAddr, wordWidthBytes(width)) := rGPR(rt) + switch(width) + { + case B -> MEMw(vAddr, 1) := rt_val[7..0] + case H -> MEMw(vAddr, 2) := rt_val[15..0] + case W -> MEMw(vAddr, 4) := rt_val[31..0] + case D -> MEMw(vAddr, 8) := rt_val + } } } } |
