From: Richard Biener Date: Wed, 17 Apr 2024 09:22:00 +0000 (+0200) Subject: Support {CEIL,FLOOR,ROUND}_{DIV,MOD}_EXPR and EXACT_DIV_EXPR in GIMPLE FE X-Git-Tag: basepoints/gcc-16~9485 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab785f9a3901ca29710592a2d5480b5a44328bf2;p=thirdparty%2Fgcc.git 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 --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc index 2dac41a335ad..d156d83cd378 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 000000000000..926c77c74d42 --- /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; +}