Skip to content

Commit 8ed20a7

Browse files
committed
Generate OCaml functions corresponding to M binary and unary operators
1 parent e151f76 commit 8ed20a7

1 file changed

Lines changed: 82 additions & 1 deletion

File tree

src/mlang/backend_compilers/bir_to_ocaml.ml

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,11 +206,92 @@ let generate_header (locals_size : int) (oc : Format.formatter)
206206
"@[<v 0>type m_value = {undefined : bool; value : float}@,\
207207
type m_array = m_value array@,\
208208
type m_context = m_value list@,\
209-
let m_undef : m_value = {undefined = true ; value = 0.0}@,\
209+
let m_undef : m_value = {undefined = true ; value = 0.0} (*Ajouter contrainte value doit être 0*) @,\
210210
let m_zero : m_value = {undefined = false; value = 0.0}@,\
211211
let m_one : m_value = {undefined = false; value = 1.0}@,\
212212
let tgv : m_array = Array.make %i m_undef@,\
213213
let local_variables : m_array = Array.make %i m_undef@,\
214+
@,@,\
215+
let m_add (x : m_value) (y : m_value) : m_value = \
216+
if (x.undefined && y.undefined) \
217+
then m_undef \
218+
else {undefined = false; value = x.value +. y.value}\
219+
@,\
220+
let m_multiply (x : m_value) (y : m_value) : m_value = \
221+
if (x.undefined || y.undefined) \
222+
then m_undef \
223+
else {undefined = false; value = x.value *. y.value}\
224+
@,\
225+
let m_subtract (x : m_value) (y : m_value) : m_value = \
226+
if (x.undefined && y.undefined) \
227+
then m_undef \
228+
else {undefined = false; value = x.value -. y.value}\
229+
@,\
230+
let m_divide (x : m_value) (y : m_value) : m_value = \
231+
if (x.undefined || y.undefined) \
232+
then m_undef \
233+
else {undefined = false; value = if (y.value = 0.0) then 0.0 else x.value /. y.value}\
234+
@,\
235+
let m_and (x : m_value) (y : m_value) : m_value = \
236+
if (x.undefined || y.undefined) \
237+
then m_undef \
238+
else if (x.value <> 0.0 && y.value <> 0.0) then m_one else m_zero\
239+
@,\
240+
let m_or (x : m_value) (y : m_value) : m_value = \
241+
if (x.undefined && y.undefined) \
242+
then m_undef \
243+
else if (x.value <> 0.0 || y.value <> 0.0) then m_one else m_zero\
244+
@,\
245+
let m_cond (condition : m_value) (true_value : m_value) (false_value : m_value) : m_value =\
246+
match condition with \
247+
| {undefined=true; value =_} -> m_undef \
248+
| {undefined=false; value = 0.0} -> false_value \
249+
| _ -> true_value\
250+
@,(*ou de la forme m_value(true,_)-> ?*)@,\
251+
let m_cond_2 (condition : m_value) (true_value : m_value) (false_value : m_value) : m_value =\
252+
if condition.undefined then m_undef \
253+
else if condition.value = 0.0 then false_value else true_value \
254+
@,
255+
let m_greater_than (x : m_value) (y : m_value) : m_value = \
256+
if (x.undefined || y.undefined) \
257+
then m_undef \
258+
else if x.value > y.value then m_one else m_zero\
259+
@,\
260+
let m_greater_than_equal (x : m_value) (y : m_value) : m_value = \
261+
if (x.undefined || y.undefined) \
262+
then m_undef \
263+
else if x.value >= y.value then m_one else m_zero\
264+
@,\
265+
let m_less_than (x : m_value) (y : m_value) : m_value = \
266+
if (x.undefined || y.undefined) \
267+
then m_undef \
268+
else if x.value < y.value then m_one else m_zero\
269+
@,\
270+
let m_less_than_equal (x : m_value) (y : m_value) : m_value = \
271+
if (x.undefined || y.undefined) \
272+
then m_undef \
273+
else if x.value <= y.value then m_one else m_zero\
274+
@,\
275+
let m_equal (x : m_value) (y : m_value) : m_value = \
276+
if (x.undefined || y.undefined) \
277+
then m_undef \
278+
else if x.value = y.value then m_one else m_zero\
279+
@,\
280+
let m_not_equal (x : m_value) (y : m_value) : m_value = \
281+
if (x.undefined || y.undefined) \
282+
then m_undef \
283+
else if x.value <> y.value then m_one else m_zero\
284+
@,\
285+
let m_not (x : m_value) : m_value = \
286+
if x.undefined \
287+
then m_undef \
288+
else if x.value = 0.0 then m_one else m_zero\
289+
@,\
290+
let m_neg (x : m_value) : m_value = \
291+
if x.undefined \
292+
then m_undef \
293+
else {undefined = true ; value = Float.neg x.value}\
294+
@,\
214295
@]"
215296
var_table_size locals_size
216297

0 commit comments

Comments
 (0)