Skip to content

Commit

Permalink
Generate OCaml functions corresponding to M binary and unary operators
Browse files Browse the repository at this point in the history
  • Loading branch information
mdurero committed Jun 9, 2022
1 parent e151f76 commit 8ed20a7
Showing 1 changed file with 82 additions and 1 deletion.
83 changes: 82 additions & 1 deletion src/mlang/backend_compilers/bir_to_ocaml.ml
Original file line number Diff line number Diff line change
Expand Up @@ -206,11 +206,92 @@ let generate_header (locals_size : int) (oc : Format.formatter)
"@[<v 0>type m_value = {undefined : bool; value : float}@,\
type m_array = m_value array@,\
type m_context = m_value list@,\
let m_undef : m_value = {undefined = true ; value = 0.0}@,\
let m_undef : m_value = {undefined = true ; value = 0.0} (*Ajouter contrainte value doit être 0*) @,\
let m_zero : m_value = {undefined = false; value = 0.0}@,\
let m_one : m_value = {undefined = false; value = 1.0}@,\
let tgv : m_array = Array.make %i m_undef@,\
let local_variables : m_array = Array.make %i m_undef@,\
@,@,\
let m_add (x : m_value) (y : m_value) : m_value = \
if (x.undefined && y.undefined) \
then m_undef \
else {undefined = false; value = x.value +. y.value}\
@,\
let m_multiply (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else {undefined = false; value = x.value *. y.value}\
@,\
let m_subtract (x : m_value) (y : m_value) : m_value = \
if (x.undefined && y.undefined) \
then m_undef \
else {undefined = false; value = x.value -. y.value}\
@,\
let m_divide (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else {undefined = false; value = if (y.value = 0.0) then 0.0 else x.value /. y.value}\
@,\
let m_and (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else if (x.value <> 0.0 && y.value <> 0.0) then m_one else m_zero\
@,\
let m_or (x : m_value) (y : m_value) : m_value = \
if (x.undefined && y.undefined) \
then m_undef \
else if (x.value <> 0.0 || y.value <> 0.0) then m_one else m_zero\
@,\
let m_cond (condition : m_value) (true_value : m_value) (false_value : m_value) : m_value =\
match condition with \
| {undefined=true; value =_} -> m_undef \
| {undefined=false; value = 0.0} -> false_value \
| _ -> true_value\
@,(*ou de la forme m_value(true,_)-> ?*)@,\
let m_cond_2 (condition : m_value) (true_value : m_value) (false_value : m_value) : m_value =\
if condition.undefined then m_undef \
else if condition.value = 0.0 then false_value else true_value \
@,
let m_greater_than (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else if x.value > y.value then m_one else m_zero\
@,\
let m_greater_than_equal (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else if x.value >= y.value then m_one else m_zero\
@,\
let m_less_than (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else if x.value < y.value then m_one else m_zero\
@,\
let m_less_than_equal (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else if x.value <= y.value then m_one else m_zero\
@,\
let m_equal (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else if x.value = y.value then m_one else m_zero\
@,\
let m_not_equal (x : m_value) (y : m_value) : m_value = \
if (x.undefined || y.undefined) \
then m_undef \
else if x.value <> y.value then m_one else m_zero\
@,\
let m_not (x : m_value) : m_value = \
if x.undefined \
then m_undef \
else if x.value = 0.0 then m_one else m_zero\
@,\
let m_neg (x : m_value) : m_value = \
if x.undefined \
then m_undef \
else {undefined = true ; value = Float.neg x.value}\
@,\
@]"
var_table_size locals_size

Expand Down

0 comments on commit 8ed20a7

Please sign in to comment.