@@ -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