summaryrefslogtreecommitdiff
path: root/mips/mips.sail
diff options
context:
space:
mode:
authorRobert Norton2016-02-04 17:26:57 +0000
committerRobert Norton2016-02-04 17:26:57 +0000
commita9c9ebaf06ea86af4f8540ff27b6b645138fb150 (patch)
tree338f9ab30d8c619b7e145ddd2dca7947281226b5 /mips/mips.sail
parentf278ec8ca85ee5f757081509929ef9ae574ee437 (diff)
Cast to int in DIV instructions to avoid weird undefined results from vector quot and mod. mod still not quite doing what we want in signed case.
Diffstat (limited to 'mips/mips.sail')
-rw-r--r--mips/mips.sail37
1 files changed, 26 insertions, 11 deletions
diff --git a/mips/mips.sail b/mips/mips.sail
index 6cfc7e75..b476c68d 100644
--- a/mips/mips.sail
+++ b/mips/mips.sail
@@ -1010,10 +1010,15 @@ function clause execute (DIV(rs, rt)) =
{
rsVal := rGPR(rs);
rtVal := rGPR(rt);
- let ((bit[32]) q, (bit[32])r) = (if (NotWordVal(rsVal) | NotWordVal(rtVal) | (rtVal == 0)) then
+ let ((bit[32]) q, (bit[32])r) = (
+ if (NotWordVal(rsVal) | NotWordVal(rtVal) | (rtVal == 0)) then
(undefined, undefined)
else
- ((rsVal[31..0]) quot_s (rtVal[31..0]), (rsVal[31..0]) mod (rtVal[31..0])))
+ let si = (signed((rsVal[31..0]))) in
+ let ti = (signed((rtVal[31..0]))) in
+ let qi = (si quot_s ti) in
+ let ri = (si mod_s ti) in
+ ((bit[32]) qi, (bit[32]) ri))
in
{
HI := EXTS(r);
@@ -1029,10 +1034,15 @@ function clause execute (DIVU(rs, rt)) =
{
rsVal := rGPR(rs);
rtVal := rGPR(rt);
- let ((bit[32]) q, (bit[32])r) = (if (NotWordVal(rsVal) | NotWordVal(rtVal) | rtVal == 0) then
+ let ((bit[32]) q, (bit[32])r) = (
+ if (NotWordVal(rsVal) | NotWordVal(rtVal) | rtVal == 0) then
(undefined, undefined)
else
- ((rsVal[31..0]) quot (rtVal[31..0]), (rsVal[31..0]) mod (rtVal[31..0])))
+ let si = ((int)(rsVal[31..0])) in
+ let ti = ((int)(rtVal[31..0])) in
+ let qi = (si quot ti) in
+ let ri = (si mod ti) in
+ ((bit[32]) qi, (bit[32]) ri))
in
{
HI := EXTS(r);
@@ -1046,14 +1056,17 @@ function clause decode (0b000000 : (regno) rs : (regno) rt : 0b00000 : 0b00000 :
Some(DDIV(rs, rt))
function clause execute (DDIV(rs, rt)) =
{
- rsVal := rGPR(rs);
- rtVal := rGPR(rt);
+ rsVal := signed(rGPR(rs));
+ rtVal := signed(rGPR(rt));
let ((bit[64])q, (bit[64])r) = (if (rtVal == 0)
then (undefined, undefined)
- else (rsVal quot_s rtVal, rsVal mod rtVal)) in
+ else
+ let qi = (rsVal quot_s rtVal) in
+ let ri = (rsVal mod_s rtVal) in
+ ((bit[64]) qi, (bit[64]) ri)) in
{
LO := q;
- HI := r; (* signed? *)
+ HI := r;
}
}
@@ -1063,11 +1076,13 @@ function clause decode (0b000000 : (regno) rs : (regno) rt : 0b00000 : 0b00000 :
Some(DDIVU(rs, rt))
function clause execute (DDIVU(rs, rt)) =
{
- rsVal := rGPR(rs);
- rtVal := rGPR(rt);
+ (int) rsVal := rGPR(rs);
+ (int) rtVal := rGPR(rt);
let ((bit[64])q, (bit[64])r) = (if (rtVal == 0)
then (undefined, undefined)
- else (rsVal quot rtVal, rsVal mod rtVal)) in
+ else let qi = (rsVal quot rtVal) in
+ let ri = (rsVal mod rtVal) in
+ ((bit[64]) qi, (bit[64]) ri)) in
{
LO := q;
HI := r;