Hello. > I don't think you should have the unreachable "return false;" in is_even. > The last "else if" can just be "else". I don't think return false in is_even is unreachable. As per my understanding, when one else if is true in the else if ladder, all the subsequent "else ifs" including "else" are ignored. When REAL_EXP is less than SIGNIFICAND_BITS, but the number is odd, the inner "if" for even-odd will not return true in which case should return false. That case will ignore next "else if" and will reach return false. > Suppose REAL_EXP (r) > SIGNIFICAND_BITS. Then the number is definitely > even, so you should return true, not false. for this condition, else if can be modified to just else and return true. PATCH: gcc/ChangeLog: 2019-06-12 Tejas Joshi * builtins.c (mathfn_built_in_2): Added CASE_MATHFN for ROUNDEVEN. * builtins.def: Added function definitions for roundeven function variants. * fold-const-call.c (fold_const_call_ss): Added case for function call and fold_const_conversion call for roundeven function. * fold-const.c (negate_mathfn_p): Added case for roundeven function. (tree_call_nonnegative_warnv_p): Added case for roundeven function. (integer_valued_real_call_p): Added case for roundeven function. * real.c (is_even): New function. Returns true if real number is even, otherwise returns false. (is_halfway_below): New function. Returns true if real number is halfway between two integers, else return false. (real_roundeven): New function. Round real number to nearest integer, rounding halfway cases towards even. * real.h (real_value): Added descriptive comments. Added function declaration for roundeven function. gcc/testsuite/ChangeLog: 2019-06-12 Tejas Joshi * gcc.dg/torture/builtin-round-roundeven.c: New test. * gcc.dg/torture/builtin-round-roundevenf128.c: New test. On Tue, 11 Jun 2019 at 01:56, Joseph Myers wrote: > > On Sun, 9 Jun 2019, Tejas Joshi wrote: > > > Hello. > > I have created another patch which addresses the above points, > > attached herewith. > > I don't think you should have the unreachable "return false;" in is_even. > The last "else if" can just be "else". > > > > a conditional with < not <=; if REAL_EXP (r) == SIGNIFICAND_BITS, the > > > least significant bit has value 1 and the number must be an integer). > > > > The number is integer because of the whole word spaces is occupied by > > integer part? > > Also, why would the least significant bit will have value 1 if > > REAL_EXP (r) == SIGNIFICAND_BITS, as it only concerns with 2^0th > > position (even or odd)? > > My understanding is that the significand is, as per the comments in > real.c, in the range [0.5, 1.0). There are SIGNIFICAND_BITS bits. The > bit above the most significant one has value 2^REAL_EXP. The most > significant one has value 2^(REAL_EXP-1). The least significant one has > value 2^(REAL_EXP-SIGNIFICAND_BITS). If REAL_EXP == SIGNIFICAND_BITS, > that means the least significant bit has value 2^0 = 1, and there are no > bits with value 0.5 or below, so the number is an integer. > > -- > Joseph S. Myers > joseph@codesourcery.com