diff options
| author | Gabriel Kerneis | 2014-02-14 14:59:00 +0000 |
|---|---|---|
| committer | Gabriel Kerneis | 2014-02-14 14:59:00 +0000 |
| commit | 4562c36b1c9fb8364a2f1482d9649dd4dc50d060 (patch) | |
| tree | 3ff2c261e6cea49b2c9acf7bf51b9bad3ffa65fe /src | |
| parent | a7457c9f6c64930780d078335c8962598b2f256f (diff) | |
Register slice write
Diffstat (limited to 'src')
| -rw-r--r-- | src/lem_interp/run_interp.ml | 7 | ||||
| -rw-r--r-- | src/test/vectors.sail | 4 |
2 files changed, 9 insertions, 2 deletions
diff --git a/src/lem_interp/run_interp.ml b/src/lem_interp/run_interp.ml index 3a20ed47..6ded3294 100644 --- a/src/lem_interp/run_interp.ml +++ b/src/lem_interp/run_interp.ml @@ -100,6 +100,13 @@ let perform_action ((reg, mem) as env) = function slice (Mem.find (id, n) mem) sub, env | Write_reg ((Reg (id, _) | SubReg (id, _, _)), None, value) -> V_lit L_unit, (Reg.add id value reg, mem) + | Write_reg ((Reg (id, _) | SubReg (id, _, _)), Some (start, stop), value) -> + (* XXX if updating a single element, wrap value into a vector - + * should the typechecker do that coercion for us automatically? *) + let value = if eq_big_int start stop then V_vector (zero_big_int, true, [value]) else value in + let old_val = Reg.find id reg in + let new_val = fupdate_vector_slice old_val value start stop in + V_lit L_unit, (Reg.add id new_val reg, mem) | Write_mem (id, V_lit(L_num n), None, value) -> V_lit L_unit, (reg, Mem.add (id, n) value mem) | Call_extern (name, arg) -> eval_external name arg, env diff --git a/src/test/vectors.sail b/src/test/vectors.sail index 244beaff..63e758fa 100644 --- a/src/test/vectors.sail +++ b/src/test/vectors.sail @@ -42,8 +42,8 @@ function bit main _ = { case _ -> match_success := i }; - (* XXX slice access not implemented *) + (* slice update *) i[0] := bitzero; - (* XXX Vector access of non-vector *) + (* slice access of literal *) v[0]; } |
