diff options
Diffstat (limited to 'mips/mips_extras_ml.ml')
| -rw-r--r-- | mips/mips_extras_ml.ml | 22 |
1 files changed, 7 insertions, 15 deletions
diff --git a/mips/mips_extras_ml.ml b/mips/mips_extras_ml.ml index 61f34425..d4ea0681 100644 --- a/mips/mips_extras_ml.ml +++ b/mips/mips_extras_ml.ml @@ -11,6 +11,7 @@ module Mem = struct end) end +let cap_size_shift = ref 5;; (* caps every 2**5 = 32 bytes *) let mem_pages = (ref Mem.empty : (Bytes.t Mem.t) ref);; let tag_mem = (ref Mem.empty : (bool Mem.t) ref);; @@ -74,13 +75,11 @@ let _MEMval (addr, size, data) = tracef "MEM[%s] <- %s\n" (big_int_to_hex a) (string_of_value data); add_mem_bytes a buf 0 s -let _MEMval_tag (addr, size, data) = - let tag = bit_vector_access_int data 0 in - let data = vector_subrange_int data (8*(int_of_big_int size) + 7) 8 in +let _MEMval_tag (addr, size, tag, data) = let addr_bi = (unsigned_big(addr)) in begin _MEMval (addr, size, data); - tag_mem := Mem.add addr_bi (to_bool tag) !tag_mem; + tag_mem := Mem.add (shift_right_big_int addr_bi !cap_size_shift) (to_bool tag) !tag_mem; end @@ -88,8 +87,8 @@ let _MEMval_conditional (addr, size, data) = let _ = _MEMval (addr, size, data) in Vone -let _MEMval_tag_conditional (addr, size, data) = - let _ = _MEMval_tag (addr, size, data) in +let _MEMval_tag_conditional (addr, size, tag, data) = + let _ = _MEMval_tag (addr, size, tag, data) in Vone let _MEMr (addr, size) = begin @@ -112,17 +111,10 @@ let _MEMr_tag (addr, size) = let data = _MEMr(addr, size) in let addr_bi = unsigned_big(addr) in let tag = try - Mem.find addr_bi !tag_mem + Mem.find (shift_right_big_int addr_bi !cap_size_shift) !tag_mem with Not_found -> false in - begin - set_start_to_length (vector_concat data (to_vec_dec_int (8, if tag then 1 else 0))) - end + (bool_to_bit tag, data) let _MEMr_tag_reserve = _MEMr_tag -let _TAGw (addr, tag) = - begin - tag_mem := Mem.add (unsigned_big addr) (to_bool (bit_vector_access_int tag 0)) !tag_mem - end - let _MEM_sync _ = () |
