[FPEnv] Use single enum to represent rounding mode
Now compiler defines 5 sets of constants to represent rounding mode.
- llvm::APFloatBase::roundingMode. It specifies all 5 rounding modes
defined by IEEE-754 and is used in APFloat implementation.
- 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.
- 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.
- Rounding mode representation used by FLT_ROUNDS (C11, 18.104.22.168.2p7).
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.
- 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
#pragma STDC FENV_ROUND.
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
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