about summary refs log tree commit diff
path: root/library/compiler-builtins/libm
AgeCommit message (Collapse)AuthorLines
2025-04-18Combine the source files for `fmod`Trevor Gross-31/+27
Since `fmod` is generic, there isn't any need to have the small wrappers in separate files. Most operations was done in [1] but `fmod` was omitted until now. [1]: https://github.com/rust-lang/libm/pull/537
2025-04-18Ensure all public functions are marked `no_panic`Trevor Gross-0/+15
Fixes: https://github.com/rust-lang/libm/issues/201
2025-04-18ci: Account for `PR_NUMBER` being set to an empty stringTrevor Gross-1/+1
This is the case for CI after merge that is no longer associated with a pull request.
2025-04-18Ensure configure.rs changes trigger rebuildsTrevor Gross-0/+3
2025-04-17ci: Increase the timeout for extensive testsTrevor Gross-1/+1
The reorganization PR has caused this to fail once before because every file shows up as changed. Increase the timeout so this doesn't happen. We now cancel the job if too many extensive tests are run unless `ci: allow-many-extensive` is in the PR description, so this helps prevent the limit being hit by accident.
2025-04-17ci: Require `ci: allow-many-extensive` if a threshold is exceededTrevor Gross-3/+25
Error out when too many extensive tests would be run unless `ci: allow-many-extensive` is in the PR description. This allows us to set a much higher CI timeout with less risk that a 4+ hour job gets started by accident.
2025-04-17ci: Allow skipping extensive tests with `ci: skip-extensive`Trevor Gross-30/+73
Sometimes we do refactoring that moves things around and triggers an extensive test, even though the implementation didn't change. There isn't any need to run full extensive CI in these cases, so add a way to skip it from the PR message.
2025-04-17ci: Cancel jobs when a new push happensTrevor Gross-0/+5
Jobs should just cancel automatically, it isn't ideal that extensive jobs can continue running for multiple hours after code has been updated. Use a solution from [1] to do this. [1]: https://stackoverflow.com/a/72408109/5380651
2025-04-17Combine the source files for more generic implementationsTrevor Gross-804/+819
Splitting into different source files by float size doesn't have any benefit when the only content is a small function that forwards to the generic implementation. Combine the source files for all width versions of: * ceil * copysign * fabs * fdim * floor * fmaximum * fmaximum_num * fminimum * fminimum_num * ldexp * scalbn * sqrt * truc fmod is excluded to avoid conflicts with an open PR. As part of this change move unit tests out of the generic module, instead testing the type-specific functions (e.g. `ceilf16` rather than `ceil::<f16>()`). This ensures that unit tests are validating whatever we expose, such as arch-specific implementations via `select_implementation!`, which would otherwise be skipped. (They are still covered by integration tests).
2025-04-17Make `assert_biteq!` not rely on having `Int` in scopeTrevor Gross-9/+9
2025-04-17Add `NEG_NAN` to `Float`Trevor Gross-4/+22
Introduce a constant representing NaN with a negative sign bit for use with testing. There isn't really any guarantee that `F::NAN` is positive but in practice it always is, which is good enough for testing purposes.
2025-04-16fmod: Correct the normalization of subnormalsTrevor Gross-2/+2
Discussed at [1], there was an off-by-one mistake when converting from the loop routine to using `leading_zeros` for normalization. Currently, using `EXP_BITS` has the effect that `ix` after the branch has its MSB _one bit to the left_ of the implicit bit's position, whereas a shift by `EXP_BITS + 1` ensures that the MSB is exactly at the implicit bit's position, matching what is done for normals (where the implicit bit is set to be explicit). This doesn't seem to have any effect in our implementation since the failing test cases from [1] appear to still have correct results. Since the result of using `EXP_BITS + 1` is more consistent with what is done for normals, apply this here. [1]: https://github.com/rust-lang/libm/pull/469#discussion_r2012473920
2025-04-16fmod: Add regression tests for subnormal issueTrevor Gross-2/+24
From discussion at [1] our loop count calculation is incorrect, causing an issue with subnormal numbers. Add test cases for known failures. [1]: https://github.com/rust-lang/libm/pull/469#discussion_r2012473920
2025-04-15Implement rounding for the hex float parsing and prepare to improve error ↵quaternic-111/+405
handling Parsing errors are now bubbled up part of the way, but that needs some more work. Rounding should be correct, and the `Status` returned by `parse_any` should have the correct bits set. These are used for the current (unchanged) behavior of the surface level functions like `hf64`: panic on invalid inputs, or values that aren't exactly representable.
2025-04-09Add assembly version of simple operations on aarch64Trevor Gross-28/+155
Replace `core::arch` versions of the following with handwritten assembly, which avoids recursion issues (cg_gcc using `rint` as a fallback) as well as problems with `aarch64be`. * `rint` * `rintf` Additionally, add assembly versions of the following: * `fma` * `fmaf` * `sqrt` * `sqrtf` If the `fp16` target feature is available, which implies `neon`, also include the following: * `rintf16` * `sqrtf16` `sqrt` is added to match the implementation for `x86`. `fma` is included since it is used by many other routines. There are a handful of other operations that have assembly implementations. They are omitted here because we should have basic float math routines available in `core` in the near future, which will allow us to defer to LLVM for assembly lowering rather than implementing these ourselves.
2025-04-08Resolve small errors identified by recent clippyTrevor Gross-1/+1
2025-04-08Replace calls to `core::arch` intrinsics with assemblyTrevor Gross-15/+20
Some backends may replace calls to `core::arch` with multiple calls to `sqrt` [1], which becomes recursive. Help mitigate this by replacing the call with assembly. Results in the same assembly as the current implementation when built with optimizations. [1]: https://github.com/rust-lang/compiler-builtins/issues/649
2025-03-18Upgrade all dependencies to the latestTrevor Gross-25/+20
This is mostly done to get the latest version of `rand`, which includes some breaking changes.
2025-02-24Gate another assertion behind `compiler-builtins`Trevor Gross-0/+1
This is causing link errors on Windows.
2025-02-24Configure out remaining formatting when `compiler-builtins` is setTrevor Gross-4/+38
These are still causing errors in the compiler-builtins CI.
2025-02-24Ignore unused variables when `compiler-builtins` is setTrevor Gross-5/+7
2025-02-23Resolve monomorphization errors in `compiler-builtins`Trevor Gross-2/+25
`compiler-builtins` is not allowed to call anything from `core`; however, there are a couple of cases where we do so in `libm` for debug output. Gate relevant locations behind the `compiler-builtins` Cargo feature.
2025-02-23Make the compiler-builtins test more accurately mirror compiler-builtinsTrevor Gross-185/+186
In `compiler-builtins`, `libm` is contained within a `math` module. The smoke test in this repo has a slightly different layout so some things were passing that shouldn't be. Change module layouts in `compiler-builtins-smoke-test` to match `compiler-builtins` and update a few instances of broken paths.
2025-02-23ci: Pin the nightly toolchain for aarch64 jobsTrevor Gross-0/+4
Pin aarch64-unknown-linux-gnu and aarch64-apple-darwin to nightly-2025-02-07 until [1] makes it to a Rust nightly. [1]: https://github.com/llvm/llvm-project/issues/127804
2025-02-12Use `git ls-files` rather than manually globbing for tidyTrevor Gross-28/+26
This avoids matching build directories, ignored files, and submodules.
2025-02-12Make `fma` a trait method on `Float`Trevor Gross-25/+30
2025-02-12fma refactor 3/3: combine `fma` public API with its implementationTrevor Gross-125/+161
Similar to other recent changes, just put public API in the same file as its generic implementation. To keep things slightly cleaner, split the default implementation from the `_wide` implementation. Also introduces a stub `fmaf16`.
2025-02-12fma refactor 2/3: move math/generic/fma.rs to math/fma.rsTrevor Gross-0/+0
Done in stages so git tracks the moved file correctly.
2025-02-12fma refactor 1/3: remove math/fma.rsTrevor Gross-40/+0
Done in stages so git tracks the moved file correctly.
2025-02-12Scale test iteration count at a later pointTrevor Gross-16/+21
Currently the argument multiplier and large float multiplier happen before selecting count based on generator. However, this means that bivariate and trivariate functions don't get scaled at all (except for the special cased fma). Move this scaling to a later point.
2025-02-11Add a way to print inputs on failureTrevor Gross-8/+27
When there is a panic in an extensive test, tracing down where it came from can be difficult since no information is provides (messeges are e.g. "attempted to subtract with overflow"). Resolve this by calling the functions within `panic::catch_unwind`, printing the input, and continuing.
2025-02-11Rename `Float::exp` to `Float::ex`Trevor Gross-11/+10
Our function to get the exponent conflicts with the inherent `exp` function for `e^x`. Rename `exp` to `ex` to avoid confusion and usage problems.
2025-02-11Check exact values for specified casesTrevor Gross-3/+21
Inputs in `case_list` shouldn't hit xfails or increased ULP tolerance. Ensure that overrides are skipped when testing against MPFR or a specified value and that NaNs, if any, are checked bitwise.
2025-02-11Add `roundeven{,f,f16,f128}`Trevor Gross-101/+363
C23 specifies a new set of `roundeven` functions that round to the nearest integral, with ties to even. It does not raise any floating point exceptions. This behavior is similar to two other functions: 1. `rint`, which rounds to the nearest integer respecting rounding mode and possibly raising exceptions. 2. `nearbyint`, which is identical to `rint` except it may not raise exceptions. Technically `rint`, `nearbyint`, and `roundeven` all behave the same in Rust because we assume default floating point environment. The backends are allowed to lower to `roundeven`, however, so we should provide it in case the fallback is needed. Add the `roundeven` family here and convert `rint` to a function that takes a rounding mode. This currently has no effect.
2025-02-11Fix parsing of negative hex float literals in utilTrevor Gross-1/+1
2025-02-10Increase allowed offset from infinity for ynfTrevor Gross-1/+1
Failed with called `Result::unwrap()` on an `Err` value: ynf Caused by: 0: input: (223, 116.89665) as hex: (, 0x1.d3962cp+6) as bits: (0x000000df, 0x42e9cb16) expected: -3.1836905e38 -0x1.df074cp+127 0xff6f83a6 actual: -inf -inf 0xff800000 1: mismatched infinities
2025-02-10Add `fminimum`, `fmaximum`, `fminimum_num`, and `fmaximum_num`Trevor Gross-31/+997
These functions represent new operations from IEEE 754-2019. Introduce them for all float sizes.
2025-02-10Combine `fmin{,f,f16,f128}` and `fmax{,f,f16,128}` into a single fileTrevor Gross-64/+65
These don't have much content since they now use the generic implementation. There will be more similar functions in the near future (fminimum, fmaximum, fminimum_num, fmaximum_num); start the pattern of combining similar functions now so we don't have to eventually maintain similar docs across 24 different files.
2025-02-10Small refactor of bigint testsTrevor Gross-31/+34
Print errors immediately rather than deferring to the end, so any debug output shows up immediately before the relevant failed test.
2025-02-10Eliminate the use of `force_eval!` in `ceil`, `floor`, and `trunc`Trevor Gross-37/+220
2025-02-10Migrate away from nonfunctional `fenv` stubsTrevor Gross-141/+240
Many routines have some form of handling for rounding mode and floating point exceptions, which are implemented via a combination of stubs and `force_eval!` use. This is suboptimal, however, because: 1. Rust does not interact with the floating point environment, so most of this code does nothing. 2. The parts of the code that are not dead are not testable. 3. `force_eval!` blocks optimizations, which is unnecessary because we do not rely on its side effects. We cannot ensure correct rounding and exception handling in all cases without some form of arithmetic operations that are aware of this behavior. However, the cases where rounding mode is explicitly handled or exceptions are explicitly raised are testable. Make this possible here for functions that depend on `math::fenv` by moving the implementation to a nonpublic function that takes a `Round` and returns a `Status`. Link: https://github.com/rust-lang/libm/issues/480
2025-02-10Introduce a trait constant for the minimum positive normal valueTrevor Gross-0/+10
2025-02-09Implement `u256` with two `u128`s rather than `u64`Trevor Gross-188/+298
This produces better assembly, e.g. on aarch64: .globl libm::u128_wmul .p2align 2 libm::u128_wmul: Lfunc_begin124: .cfi_startproc mul x9, x2, x0 umulh x10, x2, x0 umulh x11, x3, x0 mul x12, x3, x0 umulh x13, x2, x1 mul x14, x2, x1 umulh x15, x3, x1 mul x16, x3, x1 adds x10, x10, x14 cinc x13, x13, hs adds x13, x13, x16 cinc x14, x15, hs adds x10, x10, x12 cinc x11, x11, hs adds x11, x13, x11 stp x9, x10, [x8] cinc x9, x14, hs stp x11, x9, [x8, rust-lang/libm#16] ret The original was ~70 instructions so the improvement is significant. With these changes, the result is reasonably close to what LLVM generates using `u256` operands [1]. [1]: https://llvm.godbolt.org/z/re1aGdaqY
2025-02-09ci: Pin the nightly toolchain for i686-pc-windows-gnuTrevor Gross-1/+2
Pin i686-pc-windows-gnu to nightly-2025-02-07 until [1] is resolved. [1]: https://github.com/rust-lang/rust/issues/136795
2025-02-09Increase the tolerance for `jn` and `yn`Trevor Gross-12/+14
These still fail random tests, e.g.: called `Result::unwrap()` on an `Err` value: jn Caused by: 0: input: (1068, -16013.98381387313) as hex: (, -0x1.f46fded9ced39p+13) as bits: (0x0000042c, 0xc0cf46fded9ced39) expected: 6.7603314308122506e-6 0x1.c5ad9c102d413p-18 0x3edc5ad9c102d413 actual: 6.7603314308006335e-6 0x1.c5ad9c1029e80p-18 0x3edc5ad9c1029e80 1: ulp 13715 > 4000 Caused by: 0: input: (195, 42147.94) as hex: (, 0x1.4947e2p+15) as bits: (0x000000c3, 0x4724a3f1) expected: -2.13669e-7 -0x1.cad9c6p-23 0xb4656ce3 actual: -2.1376937e-7 -0x1.cb10f4p-23 0xb465887a 1: ulp 7063 > 4000 Caused by: 0: input: (194, 740.1916) as hex: (, 0x1.721886p+9) as bits: (0x000000c2, 0x44390c43) expected: 1.212096e-6 0x1.455e9ap-20 0x35a2af4d actual: 1.2172386e-6 0x1.46c000p-20 0x35a36000 1: ulp 45235 > 10000 Increase allowed precision to avoid spurious failures.
2025-02-08Replace an `assert!` with `debug_assert!` in `u256::shr`Trevor Gross-1/+23
The implementation came from the `compiler_builtins` port but this should be weakened to match other integer types.
2025-02-08Change how operators are `black_box`edTrevor Gross-7/+3
For some reason, the upcoming limb changes in [1] seem to ignore the black boxing when applied to the operator function. Changing to instead black box the inputs appears to fix this. [1]: https://github.com/rust-lang/libm/pull/503
2025-02-08Add simple icount benchmarks for `u256` operationsTrevor Gross-1/+104
2025-02-07Decrease the allowed error for `cbrt`Trevor Gross-2/+3
With the correctly rounded implementation, we can reduce the ULP requirement for `cbrt` to zero. There is still an override required for `i586` because of the imprecise FMA.
2025-02-07Port the CORE-MATH version of `cbrt`Trevor Gross-103/+216
Replace our current implementation with one that is correctly rounded. Source: https://gitlab.inria.fr/core-math/core-math/-/blob/81d447bb1c46592291bec3476bc24fa2c2688c67/src/binary64/cbrt/cbrt.c