From 5bca59c3e2c3c1fd07b1240cb2ea17936d8f3465 Mon Sep 17 00:00:00 2001 From: Robert Norton Date: Wed, 8 Feb 2017 11:00:17 +0000 Subject: Implement fast representable bounds check as used on FPGA (cincoffset only so far). --- cheri/cheri_prelude_128.sail | 20 +++++++++++++++----- 1 file 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) *) -- cgit v1.2.3