@@ -5607,28 +5607,27 @@ float APFloat::convertToFloat() const {
56075607}
56085608
56095609#ifdef  LLVM_INTEGRATE_LIBC
5610- APFloat exp (const  APFloat &X, RoundingMode rounding_mode) {
5610+ static  constexpr  int  getFEnvRoundingMode (llvm::RoundingMode rm) {
5611+   switch  (rm) {
5612+   case  APFloat::rmTowardPositive:
5613+     return  FE_UPWARD;
5614+   case  APFloat::rmTowardNegative:
5615+     return  FE_DOWNWARD;
5616+   case  APFloat::rmTowardZero:
5617+     return  FE_TOWARDZERO;
5618+   default :
5619+     //  TODO: fix rmNearestTiesToAway for platform without FE_TONEARESTFROMZERO.
5620+     return  FE_TONEAREST;
5621+   };
5622+ }
5623+ 
5624+ APFloat exp (const  APFloat &X,
5625+             RoundingMode rounding_mode = APFloat::rmNearestTiesToEven) {
56115626  assert ((&X.getSemantics () == (const  llvm::fltSemantics *)&semIEEEsingle) &&
56125627         " Float semantics is not IEEEsingle"  );
56135628  if  (&X.getSemantics () == (const  llvm::fltSemantics *)&semIEEEsingle) {
5614-     int  current_rounding_mode = fegetround ();
5615-     switch  (rounding_mode) {
5616-     case  APFloat::rmNearestTiesToEven:
5617-       fesetround (FE_TONEAREST);
5618-       break ;
5619-     case  APFloat::rmTowardPositive:
5620-       fesetround (FE_UPWARD);
5621-       break ;
5622-     case  APFloat::rmTowardNegative:
5623-       fesetround (FE_DOWNWARD);
5624-       break ;
5625-     case  APFloat::rmTowardZero:
5626-       fesetround (FE_TOWARDZERO);
5627-       break ;
5628-     default :
5629-     }
5630-     float  result = LIBC_NAMESPACE::shared::expf (X.convertToFloat ());
5631-     fesetround (current_rounding_mode);
5629+     float  result = LIBC_NAMESPACE::shared::expf (
5630+         X.convertToFloat (), getFEnvRoundingMode (rounding_mode));
56325631    return  APFloat (result);
56335632  }
56345633  llvm_unreachable (" Unexpected semantics"  );
0 commit comments