summaryrefslogtreecommitdiff
path: root/libraries/integer-gmp
Commit message (Collapse)AuthorAgeFilesLines
...
* Dont use big/small-int primops on IL32P64 (i.e. Win/x86_64) for nowHerbert Valerio Riedel2014-01-171-9/+78
| | | | | | | | | | | | | | This is due to `mpz_*()` functions having @long@ arguments which are 32bit on IL32P64, whereas `Int#` and `Word#` are 64bit wide, causing all sorts of malfunction due to truncation. This affects mostly the new big/small-int primops introduced in the course of #8647, so when `SIZEOF_W != SIZEOF_LONG` we simply fall back to using the big/big-int primops. big/small primops implemented via the low-level `mpn_*()` GMP operations are not affected, as those use `mp_limb_t` arguments. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Introduce new SIZEOF_MP_LIMB_T derived constantHerbert Valerio Riedel2014-01-163-9/+7
| | | | | | | | This allows to simplify code in `float.c` and to encode the "sizeof(mp_limb_t) != sizeof(W_)" assumption as a compile-time assertion. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Use correct package id for `stg_INTLIKE_closure` importHerbert Valerio Riedel2014-01-141-1/+1
| | | | | | | | I'm a bit surprised though this didn't cause linkage errors (the incorrect import statement was introduced in 7bdcadda7e) Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Fix in-tree GMP build (#8497) on OS X MavericksKazu Yamamoto2014-01-141-1/+9
| | | | Signed-off-by: Austin Seipp <austin@well-typed.com>
* Wrap `gmpz_fdiv_{q,r,qr}_ui` to optimize `div`/`mod`Herbert Valerio Riedel2014-01-133-10/+41
| | | | | | | | | | | | | | This is similiar to what has been done in [af2ba9c8/integer-gmp] for `gmpz_tdiv_{q,r,qr}_ui` (re #8647); However, the gain is more modest here, as performance-conscious code tends to use `quot`/`rem` rather than `div`/`mod`: Program Size Allocs Runtime Elapsed TotalMem ------------------------------------------------------------- primetest +0.3% -2.4% 0.06 0.06 +0.0% rsa +0.2% -3.3% 0.02 0.02 +0.0% Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Allocate initial 1-limb mpz_t on the Stack and introduce MPZ# typeHerbert Valerio Riedel2014-01-133-187/+306
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We now allocate a 1-limb mpz_t on the stack instead of doing a more expensive heap-allocation (especially if the heap-allocated copy becomes garbage right away); this addresses #8647. In order to delay heap allocations of 1-limb `ByteArray#`s instead of the previous `(# Int#, ByteArray# #)` pair, a 3-tuple `(# Int#, ByteArray#, Word# #)` is returned now. This tuple is given the type-synonym `MPZ#`. This 3-tuple representation uses either the 1st and the 2nd element, or the 1st and the 3rd element to represent the limb(s) (NB: undefined `ByteArray#` elements must not be accessed as they don't point to a proper `ByteArray#`, see also `DUMMY_BYTE_ARR`); more specifically, the following encoding is used (where `⊥` means undefined/unused): - (# 0#, ⊥, 0## #) -> value = 0 - (# 1#, ⊥, w #) -> value = w - (# -1#, ⊥, w #) -> value = -w - (# s#, d, 0## #) -> value = J# s d The `mpzToInteger` helper takes care of converting `MPZ#` into an `Integer`, and allocating a 1-limb `ByteArray#` in case the value (`w`/`-w`) doesn't fit the `S# Int#` representation). The following nofib benchmarks benefit from this optimization: Program Size Allocs Runtime Elapsed TotalMem ------------------------------------------------------------------ bernouilli +0.2% -5.2% 0.12 0.12 +0.0% gamteb +0.2% -1.7% 0.03 0.03 +0.0% kahan +0.3% -13.2% 0.17 0.17 +0.0% mandel +0.2% -24.6% 0.04 0.04 +0.0% power +0.2% -2.6% -2.0% -2.0% -8.3% primetest +0.1% -17.3% 0.06 0.06 +0.0% rsa +0.2% -18.5% 0.02 0.02 +0.0% scs +0.1% -2.9% -0.1% -0.1% +0.0% sphere +0.3% -0.8% 0.03 0.03 +0.0% symalg +0.2% -3.1% 0.01 0.01 +0.0% ------------------------------------------------------------------ Min +0.1% -24.6% -4.6% -4.6% -8.3% Max +0.3% +0.0% +5.9% +5.9% +4.5% Geometric Mean +0.2% -1.0% +0.2% +0.2% -0.0% Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Drop redundant formal parameter from TAKE1_UL1_RET2Herbert Valerio Riedel2014-01-112-10/+2
| | | | | | | | | | | This fixes the actual cause for #8661, i.e. a mismatch between the actual arity of the Cmm implementation and the arity declared in the foreign import statement. This also reverts [a3878d17/integer-gmp] as the workaround isn't needed anymore. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Follow-up to a3878d17Herbert Valerio Riedel2014-01-101-1/+4
| | | | | | Forgot to add this chunk to the commit [a3878d17/integer-gmp] Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Temporary disable `mpz_gmpz_tdiv_qr_ui` to workaround #8661Herbert Valerio Riedel2014-01-101-1/+6
| | | | | | | | | | | I still need to investigated, but for some reason not yet obvious to me, commit [af2ba9c8/integer-gmp] (re #8647) seems to have triggered #8661 on linux/32 This commit disables the use of the `quotRemIntegerWord#` primop on 32bit (which seems to trigger the issue). Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Manually float out `int2Integer# INT_MINBOUND`Herbert Valerio Riedel2014-01-081-9/+13
| | | | | | | This avoids allocating this special value over and over again every time it's needed, and therefore this addresses #8647. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Wrap `gmpz_tdiv_{q,r,qr}_ui` to optimize `quot`/`rem`Herbert Valerio Riedel2014-01-083-7/+71
| | | | | | | | | | | | | | | | | This is useful as `quot`/`rem` are often used with small-int divisors, like when computing the digits of an `Integer`. This optimization reduces allocations in the following `nofib` benchmarks: Program Size Allocs Runtime Elapsed TotalMem ----------------------------------------------------------------- power +0.3% -0.8% -1.2% -1.2% +0.0% primetest +0.3% -3.9% 0.07 0.07 +0.0% rsa +0.3% -4.0% 0.02 0.02 +0.0% symalg +0.2% -1.4% 0.01 0.01 +0.0% This addresses #8647 Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Hackishly fix parallel build failure with in-tree GMPAustin Seipp2014-01-071-1/+8
| | | | | | | | | | | | | | See the comments and #8102. The basic gist of it seems to be that the build system follows an implied rule from somewhere to directly build a C file, which doesn't have a dependency on the in-tree gmp.h that we build. As a result, the C file compilation races against the GMP build, causing an error. This is a pretty unsatisfactory hack, but for Windows and OS X machines where we more often build in-tree GMPs, it's quite important. Authored-by: Kazu Yamamoto <kazu@iij.ad.jp> Signed-off-by: Austin Seipp <austin@well-typed.com>
* Add new `mpz_{sub,add}_ui`-based primop (re #8647)Herbert Valerio Riedel2014-01-043-10/+66
| | | | | | | | | | | | | | | | | | | | | | | | | This adds `{plus,minus}IntegerInt#` which help to reduce temporary allocations in `plusInteger` and `minusInteger`. This and the previous commit introducing `timesIntegerInt#` (i.e. baeeef7af6e) result in reduced allocations for the following nofib benchmarks on Linux/amd64: Program Size Allocs Runtime Elapsed TotalMem ------------------------------------------------------------------ bernouilli +0.0% -4.2% 0.12 0.12 +0.0% kahan +0.1% -12.6% 0.17 0.17 +0.0% pidigits +0.0% -0.5% -4.7% -4.5% +0.0% power +0.0% -2.7% +3.1% +3.1% +9.1% primetest +0.0% -4.2% 0.07 0.07 +0.0% rsa +0.0% -4.1% 0.02 0.02 +0.0% scs +0.0% -2.6% -0.8% -0.7% +0.0% ------------------------------------------------------------------ Min +0.0% -12.6% -4.7% -4.5% -5.0% Max +0.1% +0.2% +3.1% +3.1% +9.1% Geometric Mean +0.1% -0.3% -0.0% +0.0% +0.1% ------------------------------------------------------------------ Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Add new `mpz_mul_si`-based primop (re #8647)Herbert Valerio Riedel2014-01-043-4/+15
| | | | | | | | | | | This primop helps reducing allocation by being able to pass one `S#` argument directly to the GMP multiplication primitive without needing to promote (and thus allocate a `ByteArray#` as well) the `J#` first. This benefits a few nofib benchmarks wrt to allocations (having most impact on `kahan` resulting in about 10% less allocations) Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Refactor C-- wrappers to use macros for mpz_t accessHerbert Valerio Riedel2014-01-041-90/+43
| | | | | | | This factors out the recurring task of converting mpz_t structures to/from Int#/ByteArrays# pairs and makes the code more readable. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Refactor `stgReallocForGMP` to use `memcpy`Herbert Valerio Riedel2014-01-031-13/+5
| | | | | | | | | | GCC is able to generate better code when using `memcpy` instead of manually copying bytes in a loop. Otoh, `stgAllocForGMP` is typically called for enlarging initial single-limb structures (see also #8647 for more information) and so this minor optimization won't be very visible in measurements. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Make use of `quotRemInt#` primop in `quotRemInteger`Herbert Valerio Riedel2014-01-031-10/+7
| | | | | | | | Otoh, `divModInt#` is not a proper primop (it's implemented as wrapper around `quotRemInt#` in `GHC.Base`), so we can't do the same for `divModInteger` yet. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Refactor and comment the smartJ# changes (re Trac #8638)Simon Peyton Jones2014-01-031-9/+41
|
* Try harder to demote results from `J#` to `S#` (re #8638)Herbert Valerio Riedel2014-01-021-33/+59
| | | | Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Update Autoconf tests for recent GMP versionHerbert Valerio Riedel2013-11-241-3/+3
| | | | | | | | This should improve the check for a suitable installed GMP version, to implicitly check if GMP provides __gmpz_powm_sec() which has been added in GMP version 5.0.0 and switch to the in-tree GMP 5.0.3 source otherwise. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Improve Haddock documentationHerbert Valerio Riedel2013-11-082-47/+95
| | | | Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Optimize order of pattern matches for export operationsHerbert Valerio Riedel2013-11-071-2/+2
| | | | | | | These are supposed to be called with `J#`-kind `Integer`s, so check that constructor first. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Add `Addr#` based `{import,export}Integer` variantsHerbert Valerio Riedel2013-11-074-6/+79
| | | | | | | These follow closely the existing implementations for `importIntegerFromByteArray` and `exportIntegerToMutableByteArray`. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Rename `{import,export}Integer`Herbert Valerio Riedel2013-11-074-21/+21
| | | | | | | | | | | | | This renames to more verbose names which include the type these operations import/export from/to: - `importIntegerFromByteArray`, and - `exportIntegerToMutableByteArray`. This follows the naming convention used for other primitive operations, such as the recently added `copyMutableByteArrayToAddr` operation. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Clean-up Cmm of import/export primitivesHerbert Valerio Riedel2013-11-051-16/+17
| | | | | | | This is a follow-up to e94799c9 fixing the Cmm implementation of the primops based on suggestions by Duncan Coutts. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Add primitives to write/read Integers to/from bytearraysHerbert Valerio Riedel2013-11-054-2/+142
| | | | | | | | | | | | | | | | | | | | This adds the following new (internal) primitives {{{#!hs sizeInBaseInteger :: Integer -> Int# -> Word# exportInteger :: Integer -> MutableByteArray# s -> Word# -> Int# -> State# s -> (# State# s, Word# #) importInteger :: ByteArray# -> Word# -> Word# -> Int# -> Integer }}} The import/export primitives support selecting most/least significant byte first order as well as using an offset into the byte-arrays. See Haddock comments for more details. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Expose two GMP primality operationsHerbert Valerio Riedel2013-10-284-3/+76
| | | | | | | | This exposes `mpz_probab_prime_p()` and `mpz_nextprime()` as `testPrimeInteger` and `nextPrimeInteger` respectively and is especially useful for cryptographic algorithms such as RSA. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Add side-channel attack resilient `powModSecInteger`Herbert Valerio Riedel2013-10-274-2/+24
| | | | | | | This is a follow-up to 97c101b7363f84d925a600acb56a9fa3a997ea0d which introduced the "ordinary" `powModInteger` operation. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Add overlooked files created by `configure` to `extra-tmp-files`Herbert Valerio Riedel2013-10-241-0/+2
| | | | Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Refactor & modernize `.cabal` to `cabal-version>=1.10`Herbert Valerio Riedel2013-10-243-22/+53
| | | | | | | | | This sets a sensible cabal category (i.e. `Numerical`), extends `extra-tmp-{files,files}` to make this package self-contained, updates the bug-report URL, and cleans up the `{-# LANGUAGE #-}` pragma usage in the source code. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Add aux files `config.{guess,sub}` and `install-sh`Herbert Valerio Riedel2013-10-243-0/+3876
| | | | | | These files are taken from GNU automake 1.13.3 Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Expose GMP's `mpz_gcdext()` as internal primitiveHerbert Valerio Riedel2013-09-294-2/+22
| | | | | | | The extended GCD computation is useful to have for implementing algorithms such as the chinese reminder theorem. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Expose new internal exponentiation primitivesHerbert Valerio Riedel2013-09-294-1/+107
| | | | | | | | This exposes the GMP functions `mpz_pow_ui()`, `mpz_powm()`, and `mpz_invert()` as `powInteger`, `powModInteger`, and `recipModInteger` respectively in the module `GHC.Integer.GMP.Internals`. Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
* Follow changes in comparison primops (see #6135)Jan Stolarek2013-09-163-96/+91
|
* Update Git repo URL in `.cabal` fileHerbert Valerio Riedel2013-09-111-1/+1
|
* Comments onlyJan Stolarek2013-08-191-0/+6
| | | | Link to documentation of library on the wiki
* Comparison primops return Int# (Fixes #6135)Jan Stolarek2013-07-194-44/+70
| | | | | For a deatiled discussion of this changes please visit the wiki page: http://hackage.haskell.org/trac/ghc/wiki/PrimBool
* Follow GHC build system changesIan Lynagh2013-07-031-1/+1
|
* Run "sh ./configure" rather than "sh configure"; part of #7992Ian Lynagh2013-06-221-2/+2
| | | | This fixes a bug with how configure re-execs itself.
* Handle dependencies for .cmm files properlyIan Lynagh2013-05-091-6/+2
|
* Fix build when gmp isn't installedIan Lynagh2013-04-281-0/+6
|
* Build system refactoringIan Lynagh2013-04-206-14/+52
|
* integer-gmp: mpn_gcd_1 allocate one Word on stack instead of 'sizeof ↵Sergei Trofimovich2013-03-171-2/+2
| | | | | | | | | (__mpz_struct)' gmp.h defines 'mpn_gcd_1' as following: mp_limb_t mpn_gcd_1 (mp_srcptr /* aka 'mp_limb_t *' */, mp_size_t, mp_limb_t); Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
* Follow changes in GHC's build systemIan Lynagh2013-03-011-1/+1
|
* Fix GMP_PREFER_FRAMEWORKIan Lynagh2013-02-091-5/+5
| | | | It doesn't look like the old code could have worked
* Never try to use the system gmp on WindowsIan Lynagh2013-02-093-6/+21
| | | | | Apparently building on Windows failed when there is a system gmp available.
* Revert "integer-gmp: improve cross-compiling support GmpDerivedConstants.h"Simon Marlow2013-01-265-34/+87
| | | | | | | This reverts commit 860f2fa9a1f1ca4f8d94388723687f90d122ae81. People reported problems with it on the mailing list, so reverting until we can figure out the cause.
* integer-gmp: improve cross-compiling support GmpDerivedConstants.hSergei Trofimovich2013-01-245-87/+34
| | | | | | | | | | Before the patch GmpDerivedConstants.h was generated by running mkGmpDerivedConstants on target. Now it's generated only with help of autoconf macros. Tested on --target=ia64-unknown-linux-gnu. Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
* Fix configure when we don't have a gmp libraryIan Lynagh2013-01-011-1/+1
|
* Provide a way for OS X users to indicate a preference for the GMP frameworkIan Lynagh2013-01-013-27/+65
| | | | | | | | We used to always use the framework if it existed. Now the make variable GMP_PREFER_FRAMEWORK can be used to control whether the library or the framework is preferred. Fixes #7466.