File tree Expand file tree Collapse file tree 3 files changed +52
-0
lines changed
regression/cbmc/gcc_vector1 Expand file tree Collapse file tree 3 files changed +52
-0
lines changed Original file line number Diff line number Diff line change @@ -18,6 +18,7 @@ int main()
18
18
19
19
vector_u x , y , z ;
20
20
21
+ // vector operator vector
21
22
z .v = x .v + y .v ;
22
23
23
24
assert (z .members [0 ]== x .members [0 ]+ y .members [0 ]);
@@ -46,6 +47,22 @@ int main()
46
47
assert (z .members [2 ]== ~x .members [2 ]);
47
48
assert (z .members [3 ]== ~x .members [3 ]);
48
49
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
+
49
66
// build vector with typecast
50
67
z .v = (v4si ){ 0 , 1 , 2 , 3 };
51
68
assert (z .members [0 ]== 0 && z .members [1 ]== 1 && z .members [2 ]== 2 && z .members [3 ]== 3 );
Original file line number Diff line number Diff line change @@ -2983,6 +2983,24 @@ void c_typecheck_baset::typecheck_expr_binary_arithmetic(exprt &expr)
2983
2983
return ;
2984
2984
}
2985
2985
}
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
+ }
2986
3004
2987
3005
// promote!
2988
3006
Original file line number Diff line number Diff line change @@ -135,6 +135,23 @@ static void remove_vector(exprt &expr)
135
135
{
136
136
expr.id (ID_array);
137
137
}
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
+ }
138
155
}
139
156
140
157
remove_vector (expr.type ());
You can’t perform that action at this time.
0 commit comments