@@ -70,12 +70,16 @@ static bool sum_expr(
70
70
71
71
const irep_idt &type_id=dest.type ().id ();
72
72
73
- if (type_id==ID_integer || type_id==ID_natural)
73
+ if (
74
+ type_id == ID_integer || type_id == ID_natural ||
75
+ type_id == ID_unsignedbv || type_id == ID_signedbv)
74
76
{
75
- dest.set_value (integer2string (
76
- string2integer (id2string (dest.get_value ()))+
77
- string2integer (id2string (expr.get_value ()))));
78
- return false ;
77
+ mp_integer a, b;
78
+ if (!to_integer (dest, a) && !to_integer (expr, b))
79
+ {
80
+ dest = from_integer (a + b, dest.type ());
81
+ return false ;
82
+ }
79
83
}
80
84
else if (type_id==ID_rational)
81
85
{
@@ -86,26 +90,17 @@ static bool sum_expr(
86
90
return false ;
87
91
}
88
92
}
89
- else if (type_id==ID_unsignedbv || type_id==ID_signedbv)
90
- {
91
- dest.set_value (integer2binary (
92
- binary2integer (id2string (dest.get_value ()), false )+
93
- binary2integer (id2string (expr.get_value ()), false ),
94
- to_bitvector_type (dest.type ()).get_width ()));
95
- return false ;
96
- }
97
93
else if (type_id==ID_fixedbv)
98
94
{
99
- dest.set_value (integer2binary (
100
- binary2integer (id2string (dest.get_value ()), false )+
101
- binary2integer (id2string (expr.get_value ()), false ),
102
- to_bitvector_type (dest.type ()).get_width ()));
95
+ fixedbvt f (dest);
96
+ f += fixedbvt (expr);
97
+ dest = f.to_expr ();
103
98
return false ;
104
99
}
105
100
else if (type_id==ID_floatbv)
106
101
{
107
- ieee_floatt f (to_constant_expr ( dest) );
108
- f+= ieee_floatt (to_constant_expr ( expr) );
102
+ ieee_floatt f (dest);
103
+ f += ieee_floatt (expr);
109
104
dest=f.to_expr ();
110
105
return false ;
111
106
}
@@ -124,12 +119,16 @@ static bool mul_expr(
124
119
125
120
const irep_idt &type_id=dest.type ().id ();
126
121
127
- if (type_id==ID_integer || type_id==ID_natural)
122
+ if (
123
+ type_id == ID_integer || type_id == ID_natural ||
124
+ type_id == ID_unsignedbv || type_id == ID_signedbv)
128
125
{
129
- dest.set_value (integer2string (
130
- string2integer (id2string (dest.get_value ()))*
131
- string2integer (id2string (expr.get_value ()))));
132
- return false ;
126
+ mp_integer a, b;
127
+ if (!to_integer (dest, a) && !to_integer (expr, b))
128
+ {
129
+ dest = from_integer (a * b, dest.type ());
130
+ return false ;
131
+ }
133
132
}
134
133
else if (type_id==ID_rational)
135
134
{
@@ -140,15 +139,6 @@ static bool mul_expr(
140
139
return false ;
141
140
}
142
141
}
143
- else if (type_id==ID_unsignedbv || type_id==ID_signedbv)
144
- {
145
- // the following works for signed and unsigned integers
146
- dest.set_value (integer2binary (
147
- binary2integer (id2string (dest.get_value ()), false )*
148
- binary2integer (id2string (expr.get_value ()), false ),
149
- to_bitvector_type (dest.type ()).get_width ()));
150
- return false ;
151
- }
152
142
else if (type_id==ID_fixedbv)
153
143
{
154
144
fixedbvt f (to_constant_expr (dest));
0 commit comments