compile if expressions into conditional branches

This commit is contained in:
tali 2023-11-29 23:06:12 -05:00
parent 58827f230d
commit 22b0ce775d
2 changed files with 18 additions and 1 deletions

View File

@ -5,7 +5,7 @@ let[@warning "-26"] () =
Logs.set_level (Some Logs.Debug); Logs.set_level (Some Logs.Debug);
try try
let ast = parse "val ret = 1 + 1 == 2" in let ast = parse "val x = 3 val y = 5 val output = 2 * (if(9 < 8) x else 1 + y)" in
let prog = compile ast in let prog = compile ast in
let ret = run prog in let ret = run prog in
Fmt.pr "{\"program\":%a,\"output\":%a}" Code.pp_program prog Value.pp ret Fmt.pr "{\"program\":%a,\"output\":%a}" Code.pp_program prog Value.pp ret

View File

@ -50,6 +50,23 @@ let compile modl =
emit (NOT ret) emit (NOT ret)
| _ -> Fmt.failwith "Bcc.compile_exp: TODO: %S" (Ast.string_of_binop op)); | _ -> Fmt.failwith "Bcc.compile_exp: TODO: %S" (Ast.string_of_binop op));
Reg ret Reg ret
| Ast.If (cnd, e1, e2) ->
let l1 = Code.make_basic_block [] in
let l2 = Code.make_basic_block [] in
let jp = Code.make_basic_block [] in
let tmp = !sp in
emit (CBR (compile_exp env cnd, l1, l2));
sp := tmp;
bb := l1;
emit_mov tmp (compile_exp env e1);
emit (JMP jp);
sp := tmp;
bb := l2;
emit_mov tmp (compile_exp env e2);
emit (JMP jp);
sp := tmp + 1;
bb := jp;
Reg tmp
| Ast.Obj body -> compile_obj env body | Ast.Obj body -> compile_obj env body
| _ -> failwith "Bcc.compile_exp: TODO" | _ -> failwith "Bcc.compile_exp: TODO"
and compile_obj env items = and compile_obj env items =