https://gcc.gnu.org/g:ab785f9a3901ca29710592a2d5480b5a44328bf2
commit r15-68-gab785f9a3901ca29710592a2d5480b5a44328bf2 Author: Richard Biener <rguent...@suse.de> Date: Wed Apr 17 11:22:00 2024 +0200 Support {CEIL,FLOOR,ROUND}_{DIV,MOD}_EXPR and EXACT_DIV_EXPR in GIMPLE FE The following adds support for the various division and modulo operators to the GIMPLE frontend via __{CEIL,FLOOR,ROUND}_{DIV,MOD} and __EXACT_DIV operators. gcc/c/ * gimple-parser.cc (c_parser_gimple_binary_expression): Parse __{CEIL,FLOOR,ROUND}_{DIV,MOD} and __EXACT_DIV. gcc/testsuite/ * gcc.dg/gimplefe-53.c: New testcase. Diff: --- gcc/c/gimple-parser.cc | 35 +++++++++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/gimplefe-53.c | 16 ++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc index 2dac41a335a..d156d83cd37 100644 --- a/gcc/c/gimple-parser.cc +++ b/gcc/c/gimple-parser.cc @@ -1055,6 +1055,41 @@ c_parser_gimple_binary_expression (gimple_parser &parser, tree ret_type) code = LTGT_EXPR; break; } + else if (strcmp (IDENTIFIER_POINTER (id), "__FLOOR_DIV") == 0) + { + code = FLOOR_DIV_EXPR; + break; + } + else if (strcmp (IDENTIFIER_POINTER (id), "__ROUND_DIV") == 0) + { + code = ROUND_DIV_EXPR; + break; + } + else if (strcmp (IDENTIFIER_POINTER (id), "__EXACT_DIV") == 0) + { + code = EXACT_DIV_EXPR; + break; + } + else if (strcmp (IDENTIFIER_POINTER (id), "__CEIL_DIV") == 0) + { + code = CEIL_DIV_EXPR; + break; + } + else if (strcmp (IDENTIFIER_POINTER (id), "__FLOOR_MOD") == 0) + { + code = FLOOR_MOD_EXPR; + break; + } + else if (strcmp (IDENTIFIER_POINTER (id), "__ROUND_MOD") == 0) + { + code = ROUND_MOD_EXPR; + break; + } + else if (strcmp (IDENTIFIER_POINTER (id), "__CEIL_MOD") == 0) + { + code = CEIL_MOD_EXPR; + break; + } } /* Fallthru. */ default: diff --git a/gcc/testsuite/gcc.dg/gimplefe-53.c b/gcc/testsuite/gcc.dg/gimplefe-53.c new file mode 100644 index 00000000000..926c77c74d4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gimplefe-53.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple" } */ + +int __GIMPLE +foo (int a, int b) +{ + int tem; + tem = a __EXACT_DIV b; + tem = tem __CEIL_DIV b; + tem = tem __FLOOR_DIV b; + tem = tem __ROUND_DIV b; + tem = tem __FLOOR_MOD b; + tem = tem __CEIL_MOD b; + tem = tem __ROUND_MOD b; + return tem; +}