CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
boolbv_shift.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module:
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
9#include "boolbv.h"
10
11#include <limits>
12
13#include <util/arith_tools.h>
14
16{
17 const irep_idt &type_id=expr.type().id();
18
23 type_id!=ID_bv &&
26 return conversion_failed(expr);
27
28 std::size_t width=boolbv_width(expr.type());
29
30 const bvt &op = convert_bv(expr.op0(), width);
31
33
34 if(expr.id()==ID_shl)
36 else if(expr.id()==ID_ashr)
38 else if(expr.id()==ID_lshr)
40 else if(expr.id()==ID_rol)
42 else if(expr.id()==ID_ror)
44 else
46
47 // we optimise for the special case where the shift distance
48 // is a constant
49
50 if(expr.op1().is_constant())
51 {
53
54 std::size_t distance;
55
56 if(i<0 || i>std::numeric_limits<signed>::max())
57 distance=0;
58 else
59 distance = numeric_cast_v<std::size_t>(i);
60
63 distance*=2;
64
65 return bv_utils.shift(op, shift, distance);
66 }
67 else
68 {
69 const bvt &distance=convert_bv(expr.op1());
70 return bv_utils.shift(op, shift, distance);
71 }
72}
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
A base class for binary expressions.
Definition std_expr.h:638
exprt & op0()
Definition expr.h:133
exprt & op1()
Definition expr.h:136
virtual const bvt & convert_bv(const exprt &expr, const std::optional< std::size_t > expected_width={})
Convert expression to vector of literalts, using an internal cache to speed up conversion if availabl...
Definition boolbv.cpp:39
virtual bvt convert_shift(const binary_exprt &expr)
bv_utilst bv_utils
Definition boolbv.h:118
bvt conversion_failed(const exprt &expr)
Print that the expression of x has failed conversion, then return a vector of x's width.
Definition boolbv.cpp:94
virtual std::size_t boolbv_width(const typet &type) const
Definition boolbv.h:103
static bvt shift(const bvt &op, const shiftt shift, std::size_t distance)
Definition bv_utils.cpp:537
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition dstring.h:38
bool is_constant() const
Return whether the expression is a constant.
Definition expr.h:212
typet & type()
Return the type of the expression.
Definition expr.h:84
const irep_idt & id() const
Definition irep.h:388
std::vector< literalt > bvt
Definition literal.h:201
BigInt mp_integer
Definition smt_terms.h:17
#define UNREACHABLE
This should be used to mark dead code.
Definition invariant.h:525
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
Definition std_expr.h:3172