summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/frv/ChangeLog5
-rw-r--r--sim/frv/cache.c15
2 files changed, 17 insertions, 3 deletions
diff --git a/sim/frv/ChangeLog b/sim/frv/ChangeLog
index 2589e0d0ef9..efeb2bcd2e0 100644
--- a/sim/frv/ChangeLog
+++ b/sim/frv/ChangeLog
@@ -1,3 +1,8 @@
+2003-11-03 Dave Brolley <brolley@redhat.com>
+
+ * cache.c (address_interference): Check for higher priority requests
+ in the same pipeline.
+
2003-10-31 Dave Brolley <brolley@redhat.com>
* frv-sim.h (LR_REGNUM): Removed.
diff --git a/sim/frv/cache.c b/sim/frv/cache.c
index bfefa87d68e..7b2635b6d26 100644
--- a/sim/frv/cache.c
+++ b/sim/frv/cache.c
@@ -1109,14 +1109,23 @@ address_interference (FRV_CACHE *cache, SI address, FRV_CACHE_REQUEST *req,
return 1;
}
/* If this is not a WAR request, then yield to any WAR requests in
- either pipeline. */
+ either pipeline or to a higher priority request in the same pipeline.
+ */
if (req->kind != req_WAR)
{
for (j = FIRST_STAGE; j < FRV_CACHE_STAGES; ++j)
{
other_req = cache->pipeline[i].stages[j].request;
- if (other_req != NULL && other_req->kind == req_WAR)
- return 1;
+ if (other_req != NULL)
+ {
+ if (other_req->kind == req_WAR)
+ return 1;
+ if (i == pipe
+ && (address == (other_req->address & line_mask)
+ || address == all_address)
+ && priority > other_req->priority)
+ return 1;
+ }
}
}
}