diff options
| author | Robert Norton | 2016-02-04 17:26:57 +0000 |
|---|---|---|
| committer | Robert Norton | 2016-02-04 17:26:57 +0000 |
| commit | a9c9ebaf06ea86af4f8540ff27b6b645138fb150 (patch) | |
| tree | 338f9ab30d8c619b7e145ddd2dca7947281226b5 /mips/mips.sail | |
| parent | f278ec8ca85ee5f757081509929ef9ae574ee437 (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.sail | 37 |
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; |
