diff options
| author | Robert Norton | 2016-01-29 11:41:21 +0000 |
|---|---|---|
| committer | Robert Norton | 2016-01-29 11:58:46 +0000 |
| commit | 6fb8b00409a9ad834eb1a644f29b5557e800cefd (patch) | |
| tree | 82af60be0a7d0919d7f386dab2ea4639d3046951 /mips/mips.sail | |
| parent | 18b5be634007e84ce93b3de0bd5a07b5bbb64160 (diff) | |
mips.sail: it turns out that all sail comparisons are signed contrary to manual so emulate unsigned comparisons by prepending a zero bit, as in mips spec.
Diffstat (limited to 'mips/mips.sail')
| -rw-r--r-- | mips/mips.sail | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/mips/mips.sail b/mips/mips.sail index 4df6f72c..e37d0a8a 100644 --- a/mips/mips.sail +++ b/mips/mips.sail @@ -214,15 +214,17 @@ typedef Comparison = enumerate { LTU;(* unsigned less than or qual *) } function bool compare ((Comparison)cmp, (bit[64]) valA, (bit[64]) valB) = + let valA65 = (0b0 : valA) in (* sail comparisons are signed so extend to 65 bits for unsigned comparisons *) + let valB65 = (0b0 : valB) in switch(cmp) { case EQ -> valA == valB case NE -> valA != valB - case GE -> valA >=_s valB - case GEU -> valA >= valB + case GE -> valA >= valB + case GEU -> valA65 >= valB65 case GT -> valA > valB - case LE -> valA <=_s valB - case LT -> valA <_s valB - case LTU -> valA < valB + case LE -> valA <= valB + case LT -> valA < valB + case LTU -> valA65 < valB65 } typedef WordType = enumerate { B; H; W; D} @@ -768,7 +770,9 @@ function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b0000 Some(SLTU(rs, rt, rd)) function clause execute (SLTU(rs, rt, rd)) = { - wGPR(rd) := if (rGPR(rs) < rGPR(rt)) then 1 else 0 + let rs_val = (0b0 : (rGPR(rs))) in + let rt_val = (0b0 : (rGPR(rt))) in + wGPR(rd) := (if (rs_val < rt_val) then 1 else 0) } (* SLTIU set if less than immediate unsigned *) @@ -778,7 +782,9 @@ function clause decode (0b001011 : (regno) rs : (regno) rt : (imm16) imm) = Some(SLTIU(rs, rt, imm)) function clause execute (SLTIU(rs, rt, imm)) = { - wGPR(rt) := if (rGPR(rs) < EXTS(imm)) then 1 else 0 + let rs_val = (0b0 : (rGPR(rs))) in + let imm_val = (0b0 : ((bit[64])(EXTS(imm)))) in + wGPR(rt) := (if (rs_val < imm_val) then 1 else 0) } (* MOVN move if non-zero *) |
