diff options
| author | Robert Norton | 2017-02-08 11:00:17 +0000 |
|---|---|---|
| committer | Robert Norton | 2017-02-08 11:00:17 +0000 |
| commit | 5bca59c3e2c3c1fd07b1240cb2ea17936d8f3465 (patch) | |
| tree | f3f7220697c0d4bb6d895a24eacddb03651346be /cheri | |
| parent | 1017b0d89a4a2727ac51806defe104a4cbfcaa7d (diff) | |
Implement fast representable bounds check as used on FPGA (cincoffset only so far).
Diffstat (limited to 'cheri')
| -rw-r--r-- | cheri/cheri_prelude_128.sail | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/cheri/cheri_prelude_128.sail b/cheri/cheri_prelude_128.sail index 8e0e6970..08fd8cf3 100644 --- a/cheri/cheri_prelude_128.sail +++ b/cheri/cheri_prelude_128.sail @@ -224,14 +224,24 @@ function (bool, CapStruct) setCapOffset((CapStruct) c, (bit[64]) offset) = let representable = (oldBase == newBase) & (oldTop == newTop) in (representable, newCap) +function bool fastRepCheck((CapStruct) c, (bit[64]) i) = + let E = min(unsigned(c.E), 45) in + let i_top = signed(i[63..E+20]) in + let (bit[20]) i_mid = i[E+19..E] in + let (bit[20]) a_mid = (c.address)[E+19..E] in + let (bit[20]) R = (c.B) - 0x01000 in + let (bit[20]) diff = R - a_mid in + let (bit[20]) diff1 = diff - 1 in + switch(i_top) { + case 0 -> i_mid <_u diff1 + case -1 -> unsigned(i_mid) >= unsigned(diff) & (R != a_mid) + case _ -> false + } | (E >= 44) + function (bool, CapStruct) incCapOffset((CapStruct) c, (bit[64]) delta) = - let oldBase = getCapBase(c) in - let oldTop = getCapTop(c) in let (bit[64]) newAddress = c.address + delta in let newCap = { c with address = newAddress } in - let newBase = getCapBase(newCap) in - let newTop = getCapTop(newCap) in - let representable = (oldBase == newBase) & (oldTop == newTop) in + let representable = fastRepCheck(c, delta) in (representable, newCap) (** FUNCTION:integer HighestSetBit(bits(N) x) *) |
