summaryrefslogtreecommitdiff
path: root/mips/mips_extras_ml.ml
diff options
context:
space:
mode:
Diffstat (limited to 'mips/mips_extras_ml.ml')
-rw-r--r--mips/mips_extras_ml.ml36
1 files changed, 35 insertions, 1 deletions
diff --git a/mips/mips_extras_ml.ml b/mips/mips_extras_ml.ml
index 2a624523..760ef5ed 100644
--- a/mips/mips_extras_ml.ml
+++ b/mips/mips_extras_ml.ml
@@ -12,12 +12,15 @@ module Mem = struct
end
let mips_mem = (ref Mem.empty : (int Mem.t) ref);;
+let tag_mem = (ref Mem.empty : (bool Mem.t) ref);;
let _MEMea (addr, size) = ()
let _MEMea_conditional = _MEMea
+let _MEMea_tag = _MEMea
+let _MEMea_tag_conditional = _MEMea
let _MEMval (addr, size, data) =
- (* assumes data is decreasing vector to be stored in big-endian byte order in mem *)
+ (* assumes data is decreasing vector to be stored in little-endian byte order in mem *)
let s = int_of_big_int size in
let a = unsigned_big(addr) in
for i = 0 to (s - 1) do
@@ -29,11 +32,25 @@ let _MEMval (addr, size, data) =
mips_mem := Mem.add byte_addr byte !mips_mem;
end
done
+
+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 addr_bi = (unsigned_big(addr)) in
+ begin
+ _MEMval (addr, size, data);
+ tag_mem := Mem.add addr_bi (to_bool tag) !tag_mem;
+ end
+
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
+ Vone
+
let _MEMr (addr, size) = begin
let s = int_of_big_int size in
let a = unsigned_big(addr) in
@@ -54,4 +71,21 @@ let _MEMr (addr, size) = begin
end
let _MEMr_reserve = _MEMr
+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
+ 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
+
+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 _ = ()