summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlasdair Armstrong2018-06-21 16:06:21 +0100
committerAlasdair Armstrong2018-06-21 16:06:21 +0100
commit3658789d204eb100e901a2adb67b6bf8a30157bf (patch)
tree65eb0255c01214cc044ef88f3e15c8b6641901ec /src
parent5489108f054fb51aa190e1fda847d8ab59ee915b (diff)
Fix MIPS wrt changes to C runtime
This plus changes to bitfield internals is enough to run some MIPS tests at 1Mhz.
Diffstat (limited to 'src')
-rw-r--r--src/c_backend.ml12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/c_backend.ml b/src/c_backend.ml
index 0a9bede0..f14fdace 100644
--- a/src/c_backend.ml
+++ b/src/c_backend.ml
@@ -963,6 +963,8 @@ let c_fragment = function
| AV_C_fragment (frag, _) -> frag
| _ -> assert false
+let v_mask_lower i = F_lit (V_bits (Util.list_init i (fun _ -> Sail_values.B1)))
+
let analyze_primop' ctx env l id args typ =
let ctx = { ctx with local_env = env } in
let no_change = AE_app (id, args, typ) in
@@ -993,10 +995,12 @@ let analyze_primop' ctx env l id args typ =
| "and_bits", [AV_C_fragment (v1, typ1); AV_C_fragment (v2, typ2)] ->
AE_val (AV_C_fragment (F_op (v1, "&", v2), typ))
- (*
| "not_bits", [AV_C_fragment (v, _)] ->
- AE_val (AV_C_fragment (F_unary ("~", v), typ))
- *)
+ begin match destruct_vector ctx.tc_env typ with
+ | Some (Nexp_aux (Nexp_constant n, _), _, Typ_aux (Typ_id id, _))
+ when string_of_id id = "bit" && Big_int.less_equal n (Big_int.of_int 64) ->
+ AE_val (AV_C_fragment (F_op (F_unary ("~", v), "&", v_mask_lower (Big_int.to_int n)), typ))
+ end
| "vector_subrange", [AV_C_fragment (vec, _); AV_C_fragment (f, _); AV_C_fragment (t, _)] ->
let len = F_op (f, "-", F_op (t, "-", v_one)) in
@@ -3370,7 +3374,7 @@ let compile_ast ctx (Defs defs) =
let postamble = separate hardline (List.map string
( [ "int main(int argc, char *argv[])";
"{";
- " if (argc > 1) { loadELF(argv[1]); }";
+ " if (argc > 1) { load_image(argv[1]); }";
" setup_rts();" ]
@ fst exn_boilerplate
@ startup cdefs