Skip to content

Commit 92efd4c

Browse files
authored
Merge pull request #3077 from diffblue/vector_plus_scalar
allow binary arithmetic of a vector type and a scalar type
2 parents 5c62ca9 + bc7fa6b commit 92efd4c

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

regression/cbmc/gcc_vector1/main.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ int main()
1818

1919
vector_u x, y, z;
2020

21+
// vector operator vector
2122
z.v=x.v+y.v;
2223

2324
assert(z.members[0]==x.members[0]+y.members[0]);
@@ -46,6 +47,22 @@ int main()
4647
assert(z.members[2]==~x.members[2]);
4748
assert(z.members[3]==~x.members[3]);
4849

50+
// vector operator scalar
51+
z=x;
52+
z.v=z.v+1;
53+
assert(z.members[0]==x.members[0]+1);
54+
assert(z.members[1]==x.members[1]+1);
55+
assert(z.members[2]==x.members[2]+1);
56+
assert(z.members[3]==x.members[3]+1);
57+
58+
// unary operators on vectors
59+
z=x;
60+
z.v=-z.v;
61+
assert(z.members[0]==-x.members[0]);
62+
assert(z.members[1]==-x.members[1]);
63+
assert(z.members[2]==-x.members[2]);
64+
assert(z.members[3]==-x.members[3]);
65+
4966
// build vector with typecast
5067
z.v=(v4si){ 0, 1, 2, 3 };
5168
assert(z.members[0]==0 && z.members[1]==1 && z.members[2]==2 && z.members[3]==3);

src/ansi-c/c_typecheck_expr.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,6 +2983,24 @@ void c_typecheck_baset::typecheck_expr_binary_arithmetic(exprt &expr)
29832983
return;
29842984
}
29852985
}
2986+
else if(
2987+
o_type0.id() == ID_vector && o_type1.id() != ID_vector &&
2988+
is_number(o_type1))
2989+
{
2990+
// convert op1 to the vector type
2991+
op1.make_typecast(o_type0);
2992+
expr.type() = o_type0;
2993+
return;
2994+
}
2995+
else if(
2996+
o_type0.id() != ID_vector && o_type1.id() == ID_vector &&
2997+
is_number(o_type0))
2998+
{
2999+
// convert op0 to the vector type
3000+
op0.make_typecast(o_type1);
3001+
expr.type() = o_type1;
3002+
return;
3003+
}
29863004

29873005
// promote!
29883006

src/goto-programs/remove_vector.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,23 @@ static void remove_vector(exprt &expr)
135135
{
136136
expr.id(ID_array);
137137
}
138+
else if(expr.id() == ID_typecast)
139+
{
140+
const auto &op = to_typecast_expr(expr).op();
141+
142+
if(op.type().id() != ID_array)
143+
{
144+
// (vector-type) x ==> { x, x, ..., x }
145+
remove_vector(expr.type());
146+
array_typet array_type = to_array_type(expr.type());
147+
const auto dimension = numeric_cast_v<std::size_t>(array_type.size());
148+
exprt casted_op =
149+
typecast_exprt::conditional_cast(op, array_type.subtype());
150+
array_exprt array_expr(array_type);
151+
array_expr.operands().resize(dimension, op);
152+
expr = array_expr;
153+
}
154+
}
138155
}
139156

140157
remove_vector(expr.type());

0 commit comments

Comments
 (0)