@@ -135,6 +135,12 @@ module Term = struct
135135 let exponent_shifted = Int32. shift_left exponent 23 in
136136 Int32. logor sign_shifted (Int32. logor exponent_shifted mantissa)
137137
138+ let make_fp_binop symbol (op : Ty.Binop.t ) rm a b =
139+ match Expr. view rm with
140+ | Symbol { name = Simple "roundNearestTiesToEven" ; _ } ->
141+ Expr. raw_binop Ty_none op a b
142+ | _ -> Expr. app symbol [ rm; a; b ]
143+
138144 let apply ?loc (id : t ) (args : t list ) : t =
139145 match Expr. view id with
140146 | Symbol ({ namespace = Term ; name = Simple name ; _ } as symbol ) -> (
@@ -237,63 +243,38 @@ module Term = struct
237243 Expr. pp eb Expr. pp i )
238244 | "fp.abs" , [ a ] -> Expr. raw_unop Ty_none Abs a
239245 | "fp.neg" , [ a ] -> Expr. raw_unop Ty_none Neg a
240- | ( " fp.add"
241- , [ { node = Symbol { name = Simple " roundNearestTiesToEven" ; _ }; _ }
242- ; a
243- ; b
244- ] ) ->
245- Expr. raw_binop Ty_none Add a b
246- | ( " fp.sub"
247- , [ { node = Symbol { name = Simple " roundNearestTiesToEven" ; _ }; _ }
248- ; a
249- ; b
250- ] ) ->
251- Expr. raw_binop Ty_none Sub a b
252- | ( " fp.mul"
253- , [ { node = Symbol { name = Simple " roundNearestTiesToEven" ; _ }; _ }
254- ; a
255- ; b
256- ] ) ->
257- Expr. raw_binop Ty_none Mul a b
258- | ( " fp.div"
259- , [ { node = Symbol { name = Simple " roundNearestTiesToEven" ; _ }; _ }
260- ; a
261- ; b
262- ] ) ->
263- Expr. raw_binop Ty_none Div a b
246+ | "fp.add" , [ rm; a; b ] -> make_fp_binop symbol Add rm a b
247+ | "fp.sub" , [ rm; a; b ] -> make_fp_binop symbol Sub rm a b
248+ | "fp.mul" , [ rm; a; b ] -> make_fp_binop symbol Mul rm a b
249+ | "fp.div" , [ rm; a; b ] -> make_fp_binop symbol Div rm a b
264250 | ( " fp.sqrt"
265251 , [ { node = Symbol { name = Simple " roundNearestTiesToEven" ; _ }; _ }
266252 ; a
267253 ] ) ->
268254 Expr. raw_unop Ty_none Sqrt a
269255 | "fp.rem" , [ a; b ] -> Expr. raw_binop Ty_none Rem a b
270- | ( " fp.roundToIntegral"
271- , [ { node = Symbol { name = Simple " roundNearestTiesToEven" ; _ }; _ }
272- ; a
273- ] ) ->
274- Expr. raw_unop Ty_none Nearest a
275- | ( " fp.roundToIntegral"
276- , [ { node = Symbol { name = Simple " roundTowardPositive" ; _ }; _ }; a ]
277- ) ->
278- Expr. raw_unop Ty_none Ceil a
279- | ( " fp.roundToIntegral"
280- , [ { node = Symbol { name = Simple " roundTowardNegative" ; _ }; _ }; a ]
281- ) ->
282- Expr. raw_unop Ty_none Floor a
283- | ( " fp.roundToIntegral"
284- , [ { node = Symbol { name = Simple " roundTowardZero" ; _ }; _ }; a ] )
285- ->
286- Expr. raw_unop Ty_none Trunc a
256+ | "fp.roundToIntegral" , [ rm; a ] -> begin
257+ match Expr. view rm with
258+ | Symbol { name = Simple "roundNearestTiesToEven" ; _ } ->
259+ Expr. raw_unop Ty_none Nearest a
260+ | Symbol { name = Simple "roundTowardPositive" ; _ } ->
261+ Expr. raw_unop Ty_none Ceil a
262+ | Symbol { name = Simple "roundTowardNegative" ; _ } ->
263+ Expr. raw_unop Ty_none Floor a
264+ | Symbol { name = Simple "roundTowardZero" ; _ } ->
265+ Expr. raw_unop Ty_none Trunc a
266+ | _ -> Expr. app symbol args
267+ end
287268 | "fp.min" , [ a; b ] -> Expr. raw_binop Ty_none Min a b
288269 | "fp.max" , [ a; b ] -> Expr. raw_binop Ty_none Max a b
289270 | "fp.leq" , [ a; b ] -> Expr. raw_relop Ty_none Le a b
290271 | "fp.lt" , [ a; b ] -> Expr. raw_relop Ty_none Lt a b
291272 | "fp.geq" , [ a; b ] -> Expr. raw_relop Ty_none Ge a b
292273 | "fp.gt" , [ a; b ] -> Expr. raw_relop Ty_none Gt a b
293274 | "fp.eq" , [ a; b ] -> Expr. raw_relop Ty_none Eq a b
294- | _ , l ->
275+ | _ ->
295276 Log. debug (fun k -> k " apply: unknown %a making app" Symbol. pp symbol);
296- Expr. app symbol l )
277+ Expr. app symbol args )
297278 | Symbol ({ name = Simple _ ; namespace = Attr ; _ } as attr ) ->
298279 Log. debug (fun k -> k " apply: unknown %a making app" Symbol. pp attr);
299280 Expr. app attr args
0 commit comments