diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 39af97921..c4bf19225 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -388,6 +388,7 @@ typedef struct { const expr_t *opcode; const type_t *res_type; ex_list_t operands; + const expr_t *extra; } ex_intrinsic_t; typedef struct { diff --git a/tools/qfcc/source/dot_expr.c b/tools/qfcc/source/dot_expr.c index 65356748d..40b873ef5 100644 --- a/tools/qfcc/source/dot_expr.c +++ b/tools/qfcc/source/dot_expr.c @@ -473,6 +473,11 @@ print_intrinsic (dstring_t *dstr, const expr_t *e, int level, int id, { int indent = level * 2 + 2; + if (e->intrinsic.extra) { + _print_expr (dstr, e->intrinsic.extra, level, id, next); + dasprintf (dstr, "%*se_%p -> \"e_%p\" [label=\"extra\"];\n", + indent, "", e, e->intrinsic.extra); + } _print_expr (dstr, e->intrinsic.opcode, level, id, next); for (auto l = e->intrinsic.operands.head; l; l = l->next) { _print_expr (dstr, l->expr, level, id, next); diff --git a/tools/qfcc/source/qc-parse.y b/tools/qfcc/source/qc-parse.y index a36e0f6c1..66aa9550d 100644 --- a/tools/qfcc/source/qc-parse.y +++ b/tools/qfcc/source/qc-parse.y @@ -1253,6 +1253,12 @@ function_body intrinsic : INTRINSIC '(' expr_list ')' { $$ = new_intrinsic_expr ($3); } + | INTRINSIC '(' expr_list ')' vector_expr + { + auto e = new_intrinsic_expr ($3); + e->intrinsic.extra = $5; + $$ = e; + } ; storage_class