Hello. I have added fadd variants in builtins.def. For fadd and faddl variants, I had to introduce builtin function types in builtin-types.def :
+DEF_FUNCTION_TYPE_2 (BT_FN_FLOAT_DOUBLE_DOUBLE, + BT_FLOAT, BT_DOUBLE, BT_DOUBLE) +DEF_FUNCTION_TYPE_2 (BT_FN_FLOAT_LONGDOUBLE_LONGDOUBLE, + BT_FLOAT, BT_LONGDOUBLE, BT_LONGDOUBLE) and used them to define function in builtins.def. At this point, only faddf variant is getting called by test program : int main () { double z = __builtin_faddf (3.5, 1.4); } faddf variant is using BT_FN_FLOAT_FLOAT_FLOAT which is already defined in builtin-types.def means I need not to introduce it. Why fadd and faddl are not getting called in this patch? I don't find any other place where these function types needs to be added. Thanks, -Tejas On Sat, 6 Jul 2019 at 18:29, Tejas Joshi <tejasjoshi9...@gmail.com> wrote: > > Hello. > I am trying to add fadd function variants and as fadd takes two > arguments, the function should be called from fold_const_call_sss (). > The function is closely modeled on function calls and cases according > to real_nextafter (), also used gdb to look at backtrace. Although I > have made changes according to real_nextafter, the function real_fadd > is not called by the test program but real_nextafter does get called. > I cant find any other places to add calls for fadd. What is missing? > The patch is attached herewith. > > int > main () > { > float x; > x = __builtin_fadd (3.5,1.4); > } > > Also, fadd function should not have faddf variant, but is introduced > only for the sake. > > Thanks, > -Tejas > > On Wed, 3 Jul 2019 at 18:29, Tejas Joshi <tejasjoshi9...@gmail.com> wrote: > > > > Hello. > > Functions like fadd, faddl take two arguments, do the addition and > > return the answer in narrower precision than the argument type. The > > thing that might be helpful is using the do_add function directly, if > > appropriate? > > The thing to consider about narrowed down return type is how it can be > > achieved. The functions that operate on real numbers like real_round > > and so on, do not consider the return type and do calculations on the > > entire real number representation. So just defining these functions > > and their return type in builtins.def and other appropriate places > > would do the trick? > > like: > > BT_FN_FLOAT_DOUBLE_DOUBLE as return and argument type for FADD > > > > Or it has to be narrowed down by zeroing down the trailing > > out-of-precision bits? > > Also, if the addition or any one of the argument exceeds the return > > size, the integer part of the addition would not fit in the narrowed > > type. Like, 2^32 would easily fit in double but will lose its least > > significant bit in float and become 2^31. How these types are supposed > > to be handled? > > > > Thanks, > > -Tejas
diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def index e5c9e063c48..87ecd2e9218 100644 --- a/gcc/builtin-types.def +++ b/gcc/builtin-types.def @@ -387,6 +387,10 @@ DEF_FUNCTION_TYPE_2 (BT_FN_VOID_UINT_PTR, BT_VOID, BT_UINT, BT_PTR) DEF_FUNCTION_TYPE_2 (BT_FN_FLOAT_FLOAT_FLOAT, BT_FLOAT, BT_FLOAT, BT_FLOAT) +DEF_FUNCTION_TYPE_2 (BT_FN_FLOAT_DOUBLE_DOUBLE, + BT_FLOAT, BT_DOUBLE, BT_DOUBLE) +DEF_FUNCTION_TYPE_2 (BT_FN_FLOAT_LONGDOUBLE_LONGDOUBLE, + BT_FLOAT, BT_LONGDOUBLE, BT_LONGDOUBLE) DEF_FUNCTION_TYPE_2 (BT_FN_DOUBLE_DOUBLE_DOUBLE, BT_DOUBLE, BT_DOUBLE, BT_DOUBLE) DEF_FUNCTION_TYPE_2 (BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, diff --git a/gcc/builtins.c b/gcc/builtins.c index f61f10422fd..471c7918abb 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -2006,6 +2006,7 @@ mathfn_built_in_2 (tree type, combined_fn fn) CASE_MATHFN (EXP2) CASE_MATHFN (EXPM1) CASE_MATHFN (FABS) + CASE_MATHFN (FADD) CASE_MATHFN (FDIM) CASE_MATHFN_FLOATN (FLOOR) CASE_MATHFN_FLOATN (FMA) diff --git a/gcc/builtins.def b/gcc/builtins.def index 8bb7027aac7..afc482f38dc 100644 --- a/gcc/builtins.def +++ b/gcc/builtins.def @@ -352,6 +352,9 @@ DEF_C99_C90RES_BUILTIN (BUILT_IN_FABSL, "fabsl", BT_FN_LONGDOUBLE_LONGDOUBLE, AT #define FABS_TYPE(F) BT_FN_##F##_##F DEF_EXT_LIB_FLOATN_NX_BUILTINS (BUILT_IN_FABS, "fabs", FABS_TYPE, ATTR_CONST_NOTHROW_LEAF_LIST) #undef FABS_TYPE +DEF_EXT_LIB_BUILTIN (BUILT_IN_FADD, "fadd", BT_FN_FLOAT_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST) +DEF_EXT_LIB_BUILTIN (BUILT_IN_FADDF, "faddf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST) +DEF_EXT_LIB_BUILTIN (BUILT_IN_FADDL, "faddl", BT_FN_FLOAT_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST) DEF_GCC_BUILTIN (BUILT_IN_FABSD32, "fabsd32", BT_FN_DFLOAT32_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST) DEF_GCC_BUILTIN (BUILT_IN_FABSD64, "fabsd64", BT_FN_DFLOAT64_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST) DEF_GCC_BUILTIN (BUILT_IN_FABSD128, "fabsd128", BT_FN_DFLOAT128_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST) diff --git a/gcc/fold-const-call.c b/gcc/fold-const-call.c index d9b546e6803..ee939f85005 100644 --- a/gcc/fold-const-call.c +++ b/gcc/fold-const-call.c @@ -570,6 +570,16 @@ fold_const_nextafter (real_value *result, const real_value *arg0, return true; } +static bool +fold_const_fadd (real_value* result, const real_value *arg0, + const real_value *arg1, const real_format *format) +{ + if (!real_fadd(result, format, arg0, arg1)) + return true; + else + return false; +} + /* Try to evaluate: *RESULT = ldexp (*ARG0, ARG1) @@ -1366,6 +1376,9 @@ fold_const_call_sss (real_value *result, combined_fn fn, CASE_CFN_NEXTTOWARD: return fold_const_nextafter (result, arg0, arg1, format); + CASE_CFN_FADD: + return fold_const_fadd (result, arg0, arg1, format); + default: return false; } diff --git a/gcc/real.c b/gcc/real.c index ab71430709f..6379cd0bcdc 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -5093,6 +5093,17 @@ real_roundeven (REAL_VALUE_TYPE *r, format_helper fmt, real_round (r, fmt, x); } +bool +real_fadd (REAL_VALUE_TYPE *r, format_helper fmt, + const REAL_VALUE_TYPE *x, const REAL_VALUE_TYPE *y) +{ + do_add (r, x, y, 0); + if (fmt) + real_convert (r, fmt, r); + fprintf (stderr, "\nin real_fadd\n"); + return false; +} + /* Set the sign of R to the sign of X. */ void diff --git a/gcc/real.h b/gcc/real.h index 76889bff0ea..708d821534b 100644 --- a/gcc/real.h +++ b/gcc/real.h @@ -510,6 +510,10 @@ extern void real_round (REAL_VALUE_TYPE *, format_helper, extern void real_roundeven (REAL_VALUE_TYPE *, format_helper, const REAL_VALUE_TYPE *); +/* Narrowing type standard math operations functions. */ +extern bool real_fadd (REAL_VALUE_TYPE *, format_helper, + const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); + /* Set the sign of R to the sign of X. */ extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);