@@ -65,6 +65,7 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
6565 | Ty_bitv n -> M.Types. bitv n
6666 | Ty_fp 32 -> f32
6767 | Ty_fp 64 -> f64
68+ | Ty_roundingMode -> M.Types. roundingMode
6869 | (Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none | Ty_regexp ) as ty ->
6970 Fmt. failwith " Unsupported theory: %a@." Ty. pp ty
7071
@@ -598,7 +599,8 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
598599 | Ty. Ty_bitv 64 -> I64. unop
599600 | Ty. Ty_fp 32 -> Float32_impl. unop
600601 | Ty. Ty_fp 64 -> Float64_impl. unop
601- | Ty. Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none ->
602+ | Ty. Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none
603+ | Ty_roundingMode ->
602604 assert false
603605
604606 let binop = function
@@ -612,7 +614,8 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
612614 | Ty. Ty_bitv 64 -> I64. binop
613615 | Ty. Ty_fp 32 -> Float32_impl. binop
614616 | Ty. Ty_fp 64 -> Float64_impl. binop
615- | Ty. Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none ->
617+ | Ty. Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none
618+ | Ty_roundingMode ->
616619 assert false
617620
618621 let triop = function
@@ -625,7 +628,7 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
625628 | Ty. Ty_fp 32 -> Float32_impl. triop
626629 | Ty. Ty_fp 64 -> Float64_impl. triop
627630 | Ty. Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none
628- | Ty_regexp ->
631+ | Ty_regexp | Ty_roundingMode ->
629632 assert false
630633
631634 let relop = function
@@ -639,7 +642,7 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
639642 | Ty. Ty_fp 32 -> Float32_impl. relop
640643 | Ty. Ty_fp 64 -> Float64_impl. relop
641644 | Ty. Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none
642- | Ty_regexp ->
645+ | Ty_regexp | Ty_roundingMode ->
643646 assert false
644647
645648 let cvtop = function
@@ -653,7 +656,7 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
653656 | Ty. Ty_fp 32 -> Float32_impl. cvtop
654657 | Ty. Ty_fp 64 -> Float64_impl. cvtop
655658 | Ty. Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none
656- | Ty_regexp ->
659+ | Ty_regexp | Ty_roundingMode ->
657660 assert false
658661
659662 let naryop = function
@@ -662,18 +665,19 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
662665 | Ty. Ty_regexp -> Regexp_impl. naryop
663666 | ty -> Fmt. failwith " Naryop for type \" %a\" not implemented" Ty. pp ty
664667
665- let get_rounding_mode rm =
668+ let get_rounding_mode ctx rm =
666669 match Expr. view rm with
667670 | Symbol { name = Simple ("roundNearestTiesToEven" | "RNE" ); _ } ->
668- M.Float.Rounding_mode. rne
671+ (ctx, M.Float.Rounding_mode. rne)
669672 | Symbol { name = Simple ("roundNearestTiesToAway" | "RNA" ); _ } ->
670- M.Float.Rounding_mode. rna
673+ (ctx, M.Float.Rounding_mode. rna)
671674 | Symbol { name = Simple ("roundTowardPositive" | "RTP" ); _ } ->
672- M.Float.Rounding_mode. rtp
675+ (ctx, M.Float.Rounding_mode. rtp)
673676 | Symbol { name = Simple ("roundTowardNegative" | "RTN" ); _ } ->
674- M.Float.Rounding_mode. rtn
677+ (ctx, M.Float.Rounding_mode. rtn)
675678 | Symbol { name = Simple ("roundTowardZero" | "RTZ" ); _ } ->
676- M.Float.Rounding_mode. rtz
679+ (ctx, M.Float.Rounding_mode. rtz)
680+ | Symbol rm -> make_symbol ctx rm
677681 | _ -> Fmt. failwith " unknown rouding mode: %a" Expr. pp rm
678682
679683 let rec encode_expr ctx (hte : Expr.t ) : symbol_ctx * M.term =
@@ -688,36 +692,36 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
688692 | App ({ name = Simple "fp.add" ; _ } , [ rm ; a ; b ]) ->
689693 let ctx, a = encode_expr ctx a in
690694 let ctx, b = encode_expr ctx b in
691- let rm = get_rounding_mode rm in
695+ let ctx, rm = get_rounding_mode ctx rm in
692696 (ctx, M.Float. add ~rm a b)
693697 | App ({ name = Simple "fp.sub" ; _ } , [ rm ; a ; b ]) ->
694698 let ctx, a = encode_expr ctx a in
695699 let ctx, b = encode_expr ctx b in
696- let rm = get_rounding_mode rm in
700+ let ctx, rm = get_rounding_mode ctx rm in
697701 (ctx, M.Float. sub ~rm a b)
698702 | App ({ name = Simple "fp.mul" ; _ } , [ rm ; a ; b ]) ->
699703 let ctx, a = encode_expr ctx a in
700704 let ctx, b = encode_expr ctx b in
701- let rm = get_rounding_mode rm in
705+ let ctx, rm = get_rounding_mode ctx rm in
702706 (ctx, M.Float. mul ~rm a b)
703707 | App ({ name = Simple "fp.div" ; _ } , [ rm ; a ; b ]) ->
704708 let ctx, a = encode_expr ctx a in
705709 let ctx, b = encode_expr ctx b in
706- let rm = get_rounding_mode rm in
710+ let ctx, rm = get_rounding_mode ctx rm in
707711 (ctx, M.Float. div ~rm a b)
708712 | App ({ name = Simple "fp.fma" ; _ } , [ rm ; a ; b ; c ]) ->
709713 let ctx, a = encode_expr ctx a in
710714 let ctx, b = encode_expr ctx b in
711715 let ctx, c = encode_expr ctx c in
712- let rm = get_rounding_mode rm in
716+ let ctx, rm = get_rounding_mode ctx rm in
713717 (ctx, M.Float. fma ~rm a b c)
714718 | App ({ name = Simple "fp.sqrt" ; _ } , [ rm ; a ]) ->
715719 let ctx, a = encode_expr ctx a in
716- let rm = get_rounding_mode rm in
720+ let ctx, rm = get_rounding_mode ctx rm in
717721 (ctx, M.Float. sqrt ~rm a)
718722 | App ({ name = Simple "fp.roundToIntegral" ; _ } , [ rm ; a ]) ->
719723 let ctx, a = encode_expr ctx a in
720- let rm = get_rounding_mode rm in
724+ let ctx, rm = get_rounding_mode ctx rm in
721725 (ctx, M.Float. round_to_integral ~rm a)
722726 | App (sym , args ) ->
723727 let name =
@@ -822,7 +826,7 @@ module Make (M_with_make : M_with_make) : S_with_fresh = struct
822826 let float = M.Interp. to_float v 11 53 in
823827 Value. Num (F64 (Int64. bits_of_float float ))
824828 | Ty_bitv _ | Ty_fp _ | Ty_list | Ty_app | Ty_unit | Ty_none | Ty_regexp
825- ->
829+ | Ty_roundingMode ->
826830 assert false
827831
828832 let value ({ model = m ; ctx } : model ) (c : Expr.t ) : Value.t =
0 commit comments