@@ -20,76 +20,145 @@ exprt float_bvt::convert(const exprt &expr) const
2020 else if (expr.id ()==ID_unary_minus)
2121 return negation (to_unary_minus_expr (expr).op (), get_spec (expr));
2222 else if (expr.id ()==ID_ieee_float_equal)
23- return is_equal (expr.op0 (), expr.op1 (), get_spec (expr.op0 ()));
23+ {
24+ const auto &equal_expr = to_ieee_float_equal_expr (expr);
25+ return is_equal (
26+ equal_expr.lhs (), equal_expr.rhs (), get_spec (equal_expr.lhs ()));
27+ }
2428 else if (expr.id ()==ID_ieee_float_notequal)
25- return not_exprt (is_equal (expr.op0 (), expr.op1 (), get_spec (expr.op0 ())));
29+ {
30+ const auto ¬equal_expr = to_ieee_float_notequal_expr (expr);
31+ return not_exprt (is_equal (
32+ notequal_expr.lhs (), notequal_expr.rhs (), get_spec (notequal_expr.lhs ())));
33+ }
2634 else if (expr.id ()==ID_floatbv_typecast)
2735 {
28- const typet &src_type=expr.op0 ().type ();
29- const typet &dest_type=expr.type ();
36+ const auto &floatbv_typecast_expr = to_floatbv_typecast_expr (expr);
37+ const auto &op = floatbv_typecast_expr.op ();
38+ const typet &src_type = floatbv_typecast_expr.op ().type ();
39+ const typet &dest_type = floatbv_typecast_expr.type ();
40+ const auto &rounding_mode = floatbv_typecast_expr.rounding_mode ();
3041
3142 if (dest_type.id ()==ID_signedbv &&
3243 src_type.id ()==ID_floatbv) // float -> signed
33- return
34- to_signed_integer (
35- expr.op0 (),
36- to_signedbv_type (dest_type).get_width (),
37- expr.op1 (),
38- get_spec (expr.op0 ()));
44+ return to_signed_integer (
45+ op,
46+ to_signedbv_type (dest_type).get_width (),
47+ rounding_mode,
48+ get_spec (op));
3949 else if (dest_type.id ()==ID_unsignedbv &&
4050 src_type.id ()==ID_floatbv) // float -> unsigned
41- return
42- to_unsigned_integer (
43- expr.op0 (),
44- to_unsignedbv_type (dest_type).get_width (),
45- expr.op1 (),
46- get_spec (expr.op0 ()));
51+ return to_unsigned_integer (
52+ op,
53+ to_unsignedbv_type (dest_type).get_width (),
54+ rounding_mode,
55+ get_spec (op));
4756 else if (src_type.id ()==ID_signedbv &&
4857 dest_type.id ()==ID_floatbv) // signed -> float
49- return from_signed_integer (
50- expr.op0 (), expr.op1 (), get_spec (expr));
58+ return from_signed_integer (op, rounding_mode, get_spec (expr));
5159 else if (src_type.id ()==ID_unsignedbv &&
5260 dest_type.id ()==ID_floatbv) // unsigned -> float
53- return from_unsigned_integer (
54- expr.op0 (), expr.op1 (), get_spec (expr));
61+ {
62+ return from_unsigned_integer (op, rounding_mode, get_spec (expr));
63+ }
5564 else if (dest_type.id ()==ID_floatbv &&
5665 src_type.id ()==ID_floatbv) // float -> float
57- return
58- conversion (
59- expr. op0 (), expr. op1 (), get_spec (expr. op0 ()), get_spec (expr));
66+ {
67+ return conversion (op, rounding_mode, get_spec (op), get_spec (expr));
68+ }
6069 else
6170 return nil_exprt ();
6271 }
63- else if (expr.id ()==ID_typecast &&
64- expr.type ().id ()==ID_bool &&
65- expr.op0 ().type ().id ()==ID_floatbv) // float -> bool
66- return not_exprt (is_zero (expr.op0 ()));
72+ else if (
73+ expr.id () == ID_typecast && expr.type ().id () == ID_bool &&
74+ to_typecast_expr (expr).op ().type ().id () == ID_floatbv) // float -> bool
75+ {
76+ return not_exprt (is_zero (to_typecast_expr (expr).op ()));
77+ }
6778 else if (expr.id ()==ID_floatbv_plus)
68- return add_sub (false , expr.op0 (), expr.op1 (), expr.op2 (), get_spec (expr));
79+ {
80+ const auto &float_expr = to_ieee_float_op_expr (expr);
81+ return add_sub (
82+ false ,
83+ float_expr.lhs (),
84+ float_expr.rhs (),
85+ float_expr.rounding_mode (),
86+ get_spec (expr));
87+ }
6988 else if (expr.id ()==ID_floatbv_minus)
70- return add_sub (true , expr.op0 (), expr.op1 (), expr.op2 (), get_spec (expr));
89+ {
90+ const auto &float_expr = to_ieee_float_op_expr (expr);
91+ return add_sub (
92+ true ,
93+ float_expr.lhs (),
94+ float_expr.rhs (),
95+ float_expr.rounding_mode (),
96+ get_spec (expr));
97+ }
7198 else if (expr.id ()==ID_floatbv_mult)
72- return mul (expr.op0 (), expr.op1 (), expr.op2 (), get_spec (expr));
99+ {
100+ const auto &float_expr = to_ieee_float_op_expr (expr);
101+ return mul (
102+ float_expr.lhs (),
103+ float_expr.rhs (),
104+ float_expr.rounding_mode (),
105+ get_spec (expr));
106+ }
73107 else if (expr.id ()==ID_floatbv_div)
74- return div (expr.op0 (), expr.op1 (), expr.op2 (), get_spec (expr));
108+ {
109+ const auto &float_expr = to_ieee_float_op_expr (expr);
110+ return div (
111+ float_expr.lhs (),
112+ float_expr.rhs (),
113+ float_expr.rounding_mode (),
114+ get_spec (expr));
115+ }
75116 else if (expr.id ()==ID_isnan)
76- return isnan (expr.op0 (), get_spec (expr.op0 ()));
117+ {
118+ const auto &op = to_unary_expr (expr).op ();
119+ return isnan (op, get_spec (op));
120+ }
77121 else if (expr.id ()==ID_isfinite)
78- return isfinite (expr.op0 (), get_spec (expr.op0 ()));
122+ {
123+ const auto &op = to_unary_expr (expr).op ();
124+ return isfinite (op, get_spec (op));
125+ }
79126 else if (expr.id ()==ID_isinf)
80- return isinf (expr.op0 (), get_spec (expr.op0 ()));
127+ {
128+ const auto &op = to_unary_expr (expr).op ();
129+ return isinf (op, get_spec (op));
130+ }
81131 else if (expr.id ()==ID_isnormal)
82- return isnormal (expr.op0 (), get_spec (expr.op0 ()));
132+ {
133+ const auto &op = to_unary_expr (expr).op ();
134+ return isnormal (op, get_spec (op));
135+ }
83136 else if (expr.id ()==ID_lt)
84- return relation (expr.op0 (), relt::LT, expr.op1 (), get_spec (expr.op0 ()));
137+ {
138+ const auto &rel_expr = to_binary_relation_expr (expr);
139+ return relation (
140+ rel_expr.lhs (), relt::LT, rel_expr.rhs (), get_spec (rel_expr.lhs ()));
141+ }
85142 else if (expr.id ()==ID_gt)
86- return relation (expr.op0 (), relt::GT, expr.op1 (), get_spec (expr.op0 ()));
143+ {
144+ const auto &rel_expr = to_binary_relation_expr (expr);
145+ return relation (
146+ rel_expr.lhs (), relt::GT, rel_expr.rhs (), get_spec (rel_expr.lhs ()));
147+ }
87148 else if (expr.id ()==ID_le)
88- return relation (expr.op0 (), relt::LE, expr.op1 (), get_spec (expr.op0 ()));
149+ {
150+ const auto &rel_expr = to_binary_relation_expr (expr);
151+ return relation (
152+ rel_expr.lhs (), relt::LE, rel_expr.rhs (), get_spec (rel_expr.lhs ()));
153+ }
89154 else if (expr.id ()==ID_ge)
90- return relation (expr.op0 (), relt::GE, expr.op1 (), get_spec (expr.op0 ()));
155+ {
156+ const auto &rel_expr = to_binary_relation_expr (expr);
157+ return relation (
158+ rel_expr.lhs (), relt::GE, rel_expr.rhs (), get_spec (rel_expr.lhs ()));
159+ }
91160 else if (expr.id ()==ID_sign)
92- return sign_bit (expr. op0 ());
161+ return sign_bit (to_unary_expr ( expr). op ());
93162
94163 return nil_exprt ();
95164}
0 commit comments