@@ -20,76 +20,145 @@ exprt float_bvt::convert(const exprt &expr) const
20
20
else if (expr.id ()==ID_unary_minus)
21
21
return negation (to_unary_minus_expr (expr).op (), get_spec (expr));
22
22
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
+ }
24
28
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
+ }
26
34
else if (expr.id ()==ID_floatbv_typecast)
27
35
{
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 ();
30
41
31
42
if (dest_type.id ()==ID_signedbv &&
32
43
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));
39
49
else if (dest_type.id ()==ID_unsignedbv &&
40
50
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));
47
56
else if (src_type.id ()==ID_signedbv &&
48
57
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));
51
59
else if (src_type.id ()==ID_unsignedbv &&
52
60
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
+ }
55
64
else if (dest_type.id ()==ID_floatbv &&
56
65
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
+ }
60
69
else
61
70
return nil_exprt ();
62
71
}
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
+ }
67
78
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
+ }
69
88
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
+ }
71
98
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
+ }
73
107
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
+ }
75
116
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
+ }
77
121
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
+ }
79
126
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
+ }
81
131
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
+ }
83
136
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
+ }
85
142
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
+ }
87
148
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
+ }
89
154
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
+ }
91
160
else if (expr.id ()==ID_sign)
92
- return sign_bit (expr. op0 ());
161
+ return sign_bit (to_unary_expr ( expr). op ());
93
162
94
163
return nil_exprt ();
95
164
}
0 commit comments