@@ -5607,28 +5607,27 @@ float APFloat::convertToFloat() const {
5607
5607
}
5608
5608
5609
5609
#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) {
5611
5626
assert ((&X.getSemantics () == (const llvm::fltSemantics *)&semIEEEsingle) &&
5612
5627
" Float semantics is not IEEEsingle" );
5613
5628
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));
5632
5631
return APFloat (result);
5633
5632
}
5634
5633
llvm_unreachable (" Unexpected semantics" );
0 commit comments