[FPEnv] Use single enum to represent rounding mode

Authored by sepavloff on Mar 26 2020, 12:51 AM.


[FPEnv] Use single enum to represent rounding mode

Now compiler defines 5 sets of constants to represent rounding mode.
These are:

  1. llvm::APFloatBase::roundingMode. It specifies all 5 rounding modes

defined by IEEE-754 and is used in APFloat implementation.

  1. clang::LangOptions::FPRoundingModeKind. It specifies 4 of 5 IEEE-754

rounding modes and a special value for dynamic rounding mode. It is used
in clang frontend.

  1. llvm::fp::RoundingMode. Defines the same values as

clang::LangOptions::FPRoundingModeKind but in different order. It is
used to specify rounding mode in in IR and functions that operate IR.

  1. Rounding mode representation used by FLT_ROUNDS (C11,

Besides constants for rounding mode it also uses a special value to
indicate error. It is convenient to use in intrinsic functions, as it
represents platform-independent representation for rounding mode. In this
role it is used in some pending patches.

  1. Values like FE_DOWNWARD and other, which specify rounding mode in

library calls fesetround and fegetround. Often they represent bits
of some control register, so they are target-dependent. The same names
(not values) and a special name FE_DYNAMIC are used in

The first 4 sets of constants are target independent and could have the
same numerical representation. It would simplify conversion between the
representations. Also now clang::LangOptions::FPRoundingModeKind and
llvm::fp::RoundingMode do not contain the value for IEEE-754 rounding
direction roundTiesToAway, although it is supported natively on
some targets.

This change defines all the rounding mode type via one llvm::RoundingMode,
which also contains rounding mode for IEEE rounding direction roundTiesToAway.

Differential Revision: https://reviews.llvm.org/D77379