https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85957
--- Comment #15 from Vincent Lefèvre <vincent-gcc at vinc17 dot net> --- (In reply to Rich Felker from comment #14) > It sounds like you misunderstand the standard's requirements on, and GCC's > implementation of, FLT_EVAL_METHOD==2/excess-precision. The availability of > registers does not in any way affect the result, because when expressions > are evaluated with excess precision, any spills must take place in the > format of float_t or double_t (long double) and are thereby transparent to > the application. The types float_t or double_t correspond to the evaluation format. Thus they are equivalent to long double if FLT_EVAL_METHOD is 2 (see 7.12p2). And GCC does not do spills in this format, as see in bug 323. > With standards-conforming behavior, the rounding of an operation and of > storage to an object of float/double type are discrete roundings and you can > observe and handle the intermediate value between them. With -ffloat-store, > every operation inherently has a double-rounding attached to it. This > behavior is non-conforming This is conforming as there is no requirement to keep intermediate results in excess precision and range.