mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
C++: add class and test for a GNU vector fill operation
This commit is contained in:
@@ -369,3 +369,10 @@ class BuiltInOperationIsFinal extends BuiltInOperation, @isfinalexpr {
|
||||
class BuiltInChooseExpr extends BuiltInOperation, @builtinchooseexpr {
|
||||
override string toString() { result = "__builtin_choose_expr" }
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill operation on a GNU vector.
|
||||
*/
|
||||
class VectorFillOperation extends UnaryOperation, @vec_fill {
|
||||
override string getOperator() { result = "(vector fill)" }
|
||||
}
|
||||
|
||||
1
cpp/ql/test/library-tests/vector_types/fill.expected
Normal file
1
cpp/ql/test/library-tests/vector_types/fill.expected
Normal file
@@ -0,0 +1 @@
|
||||
| vector_types.cpp:51:18:51:18 | (vector fill) ... | file://:0:0:0:0 | __attribute((vector_size(16))) int | vector_types.cpp:51:18:51:18 | n | file://:0:0:0:0 | int |
|
||||
5
cpp/ql/test/library-tests/vector_types/fill.ql
Normal file
5
cpp/ql/test/library-tests/vector_types/fill.ql
Normal file
@@ -0,0 +1,5 @@
|
||||
import cpp
|
||||
|
||||
from VectorFillOperation vf, Expr operand
|
||||
where operand = vf.getOperand()
|
||||
select vf, vf.getType(), operand, operand.getType()
|
||||
@@ -14,3 +14,6 @@
|
||||
| vector_types.cpp:33:8:33:9 | v5 | v5 | file://:0:0:0:0 | __attribute((vector_size(16))) double | 16 |
|
||||
| vector_types.cpp:34:10:34:16 | doubles | doubles | file://:0:0:0:0 | double[2] | 16 |
|
||||
| vector_types.cpp:41:14:41:16 | arg | arg | vector_types.cpp:7:14:7:17 | v16c | 16 |
|
||||
| vector_types.cpp:47:23:47:25 | dst | dst | file://:0:0:0:0 | v16i * | 8 |
|
||||
| vector_types.cpp:47:34:47:36 | src | src | file://:0:0:0:0 | v16i * | 8 |
|
||||
| vector_types.cpp:47:43:47:43 | n | n | file://:0:0:0:0 | int | 4 |
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
| vector_types.cpp:16:16:16:41 | ... == ... | == | file://:0:0:0:0 | __attribute((vector_size(16))) char |
|
||||
| vector_types.cpp:21:10:21:18 | ... < ... | < | file://:0:0:0:0 | __attribute((vector_size(16))) int |
|
||||
| vector_types.cpp:51:10:51:18 | ... << ... | << | file://:0:0:0:0 | __attribute((vector_size(16))) int |
|
||||
| vector_types.cpp:51:18:51:18 | (vector fill) ... | (vector fill) | file://:0:0:0:0 | __attribute((vector_size(16))) int |
|
||||
|
||||
@@ -41,3 +41,12 @@ int main() {
|
||||
v4f lax(v16c arg) {
|
||||
return arg;
|
||||
}
|
||||
|
||||
typedef int v16i __attribute__((vector_size(16)));
|
||||
|
||||
void shift_left(v16i *dst, v16i *src, int n) {
|
||||
// We represent this shift as an operation on vector types, and the
|
||||
// right-hand side is a vector fill expression (i.e. a vector filled with n in
|
||||
// each element).
|
||||
*dst = *src << n;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user