|
28 | 28 | #include <cstring> |
29 | 29 | #include <limits.h> |
30 | 30 |
|
| 31 | +#ifdef LLVM_INTEGRATE_LIBC |
| 32 | +// Shared headers from LLVM libc |
| 33 | +#include "shared/math.h" |
| 34 | +#endif // LLVM_INTEGRATE_LIBC |
| 35 | + |
31 | 36 | #define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL) \ |
32 | 37 | do { \ |
33 | 38 | if (usesLayout<IEEEFloat>(getSemantics())) \ |
@@ -5601,6 +5606,35 @@ float APFloat::convertToFloat() const { |
5601 | 5606 | return Temp.getIEEE().convertToFloat(); |
5602 | 5607 | } |
5603 | 5608 |
|
| 5609 | +#ifdef LLVM_INTEGRATE_LIBC |
| 5610 | +APFloat exp(const APFloat &X, RoundingMode rounding_mode) { |
| 5611 | + assert((&X.getSemantics() == (const llvm::fltSemantics *)&semIEEEsingle) && |
| 5612 | + "Float semantics is not IEEEsingle"); |
| 5613 | + 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); |
| 5632 | + return APFloat(result); |
| 5633 | + } |
| 5634 | + llvm_unreachable("Unexpected semantics"); |
| 5635 | +} |
| 5636 | +#endif // LLVM_INTEGRATE_LIBC |
| 5637 | + |
5604 | 5638 | } // namespace llvm |
5605 | 5639 |
|
5606 | 5640 | #undef APFLOAT_DISPATCH_ON_SEMANTICS |
0 commit comments