diff options
author | Richard Biener <rguenther@suse.de> | 2019-05-16 08:01:09 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-05-16 08:01:09 +0000 |
commit | adfe6e4b2f8e7288710eac6bacd6bae8d6ea3c05 (patch) | |
tree | c07b94e927b2b5ceceb95a3521d15fd7e40dd178 /gcc/c/gimple-parser.c | |
parent | f6b2daaf4ea5ab0d5e4c45292c9be102f40060a7 (diff) | |
download | gcc-adfe6e4b2f8e7288710eac6bacd6bae8d6ea3c05.zip gcc-adfe6e4b2f8e7288710eac6bacd6bae8d6ea3c05.tar.gz gcc-adfe6e4b2f8e7288710eac6bacd6bae8d6ea3c05.tar.bz2 |
gimple-parser.c (c_parser_gimple_statement): Handle __BIT_INSERT.
2019-05-16 Richard Biener <rguenther@suse.de>
c/
* gimple-parser.c (c_parser_gimple_statement): Handle __BIT_INSERT.
(c_parser_gimple_unary_expression): Likewise.
* gimple-pretty-print.c (dump_ternary_rhs): Dump BIT_INSERT_EXPR
as __BIT_INSERT with -gimple.
* gcc.dg/gimplefe-40.c: Amend again.
From-SVN: r271278
Diffstat (limited to 'gcc/c/gimple-parser.c')
-rw-r--r-- | gcc/c/gimple-parser.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index 07ec1e4..6a15b99 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -746,6 +746,7 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq) if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0 || strcmp (IDENTIFIER_POINTER (id), "__ABSU") == 0 || strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0 + || strcmp (IDENTIFIER_POINTER (id), "__BIT_INSERT") == 0 || strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0) goto build_unary_expr; break; @@ -1108,6 +1109,37 @@ c_parser_gimple_unary_expression (gimple_parser &parser) return c_parser_gimple_parentized_binary_expression (parser, op_loc, MAX_EXPR); + else if (strcmp (IDENTIFIER_POINTER (id), "__BIT_INSERT") == 0) + { + /* __BIT_INSERT '(' postfix-expression, postfix-expression, + integer ')' */ + location_t loc = c_parser_peek_token (parser)->location; + c_parser_consume_token (parser); + if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) + { + c_expr op0 = c_parser_gimple_postfix_expression (parser); + c_parser_skip_until_found (parser, CPP_COMMA, + "expected %<,%>"); + c_expr op1 = c_parser_gimple_postfix_expression (parser); + c_parser_skip_until_found (parser, CPP_COMMA, + "expected %<,%>"); + c_expr op2 = c_parser_gimple_postfix_expression (parser); + if (TREE_CODE (op2.value) != INTEGER_CST + || !int_fits_type_p (op2.value, bitsizetype)) + c_parser_error (parser, "expected constant offset"); + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, + "expected %<)%>"); + if (op0.value != error_mark_node + && op1.value != error_mark_node + && TREE_CODE (op2.value) == INTEGER_CST) + ret.value = build3_loc (loc, BIT_INSERT_EXPR, + TREE_TYPE (op0.value), + op0.value, op1.value, + fold_convert (bitsizetype, + op2.value)); + } + return ret; + } else return c_parser_gimple_postfix_expression (parser); } |