summaryrefslogtreecommitdiff
path: root/mips
diff options
context:
space:
mode:
Diffstat (limited to 'mips')
-rw-r--r--mips/mips_insts.sail24
-rw-r--r--mips/mips_prelude.sail1
-rw-r--r--mips/mips_wrappers.sail4
3 files changed, 13 insertions, 16 deletions
diff --git a/mips/mips_insts.sail b/mips/mips_insts.sail
index 2f6b0153..84136e66 100644
--- a/mips/mips_insts.sail
+++ b/mips/mips_insts.sail
@@ -1210,8 +1210,7 @@ function clause decode(0b100010 @ base : regno @ rt : regno @ offset : imm16) =
Some(LWL(base, rt, offset))
function clause execute(LWL(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), LoadData, W);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), LoadData, WL);
let pAddr = (TLBTranslate(vAddr, LoadData)) in
{
mem_val = MEMr_wrapper (pAddr[63..2] @ 0b00, 4); /* read word of interest */
@@ -1231,8 +1230,7 @@ function clause decode(0b100110 @ base : regno @ rt : regno @ offset : imm16) =
Some(LWR(base, rt, offset))
function clause execute(LWR(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), LoadData, W);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), LoadData, WR);
let pAddr = (TLBTranslate(vAddr, LoadData)) in
{
mem_val = MEMr_wrapper(pAddr[63..2] @ 0b00, 4); /* read word of interest */
@@ -1254,8 +1252,7 @@ function clause decode(0b101010 @ base : regno @ rt : regno @ offset : imm16) =
Some(SWL(base, rt, offset))
function clause execute(SWL(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), StoreData, W);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), StoreData, WL);
let pAddr = TLBTranslate(vAddr, StoreData) in
{
reg_val = rGPR(rt);
@@ -1274,8 +1271,7 @@ function clause decode(0b101110 @ base : regno @ rt : regno @ offset : imm16) =
Some(SWR(base, rt, offset))
function clause execute(SWR(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), StoreData, W);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), StoreData, WR);
let pAddr = TLBTranslate(vAddr, StoreData) in
{
wordAddr = pAddr[63..2] @ 0b00;
@@ -1296,8 +1292,7 @@ function clause decode(0b011010 @ base : regno @ rt : regno @ offset : imm16) =
Some(LDL(base, rt, offset))
function clause execute(LDL(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), LoadData, D);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), LoadData, DL);
let pAddr = TLBTranslate(vAddr, LoadData) in
{
mem_val = MEMr_wrapper(pAddr[63..3] @ 0b000, 8); /* read double of interest */
@@ -1322,8 +1317,7 @@ function clause decode(0b011011 @ base : regno @ rt : regno @ offset : imm16) =
Some(LDR(base, rt, offset))
function clause execute(LDR(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), LoadData, D);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), LoadData, DR);
let pAddr = TLBTranslate(vAddr, LoadData) in
{
mem_val = MEMr_wrapper(pAddr[63..3] @ 0b000, 8); /* read double of interest */
@@ -1348,8 +1342,7 @@ function clause decode(0b101100 @ base : regno @ rt : regno @ offset : imm16) =
Some(SDL(base, rt, offset))
function clause execute(SDL(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), StoreData, D);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), StoreData, DL);
let pAddr = TLBTranslate(vAddr, StoreData) in
{
reg_val = rGPR(rt);
@@ -1374,8 +1367,7 @@ function clause decode(0b101101 @ base : regno @ rt : regno @ offset : imm16) =
Some(SDR(base, rt, offset))
function clause execute(SDR(base, rt, offset)) =
{
- /* XXX length check not quite right, but conservative */
- vAddr = addrWrapper(sign_extend(offset) + rGPR(base), StoreData, D);
+ vAddr = addrWrapperUnaligned(sign_extend(offset) + rGPR(base), StoreData, DR);
let pAddr = TLBTranslate(vAddr, StoreData) in
{
reg_val = rGPR(rt);
diff --git a/mips/mips_prelude.sail b/mips/mips_prelude.sail
index fbbe74ee..76a05791 100644
--- a/mips/mips_prelude.sail
+++ b/mips/mips_prelude.sail
@@ -565,6 +565,7 @@ function compare (cmp, valA, valB) =
LTU => valA <_u valB
}
enum WordType = { B, H, W, D}
+enum WordTypeUnaligned = { WL, WR, DL, DR }
val wordWidthBytes : WordType -> range(1, 8)
function wordWidthBytes(w) =
diff --git a/mips/mips_wrappers.sail b/mips/mips_wrappers.sail
index 0cc098a5..43e759b9 100644
--- a/mips/mips_wrappers.sail
+++ b/mips/mips_wrappers.sail
@@ -60,6 +60,10 @@ val addrWrapper : (bits(64), MemAccessType, WordType) -> bits(64)
function addrWrapper(addr, accessType, width) =
addr
+val addrWrapperUnaligned : (bits(64), MemAccessType, WordTypeUnaligned) -> bits(64)
+function addrWrapperUnaligned(addr, accessType, width) =
+ addr
+
$ifdef _MIPS_TLB_STUB
val TranslatePC : bits(64) -> bits(64) effect {rreg, wreg, escape}
$else