summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
authorAndrew John Hughes <gnu_andrew@member.fsf.org>2008-02-28 22:44:19 +0000
committerAndrew John Hughes <gnu_andrew@member.fsf.org>2008-02-28 22:44:19 +0000
commitc0daa0df39fcb3be58fba09bb936f515368b085e (patch)
tree2e34f6ff45835a1575bb81690a45f1c4f7e4207a /vm
parent16ccc49aedb2f5edc29d4d0c70a84d8fc06f78c2 (diff)
downloadclasspath-c0daa0df39fcb3be58fba09bb936f515368b085e.tar.gz
2008-02-28 Andrew John Hughes <gnu_andrew@member.fsf.org>
PR classpath/28664 * include/Makefile.am: Add generation of header file java_math_VMBigInteger.h * java/math/BigInteger.java: Separate NativeMPI into VMBigInteger. * native/jni/Makefile.am: Add java-math. * native/jni/java-math/java_math_VMBigInteger.c: Renamed from java_math_BigInteger.c. * vm/reference/java/math/VMBigInteger.java: Former NativeMPI class from java.math.BigInteger. 2006-11-28 Raif S. Naffah <classpath@naffah-raif.name> Jeroen Frijters <jeroen@sumatra.nl> PR classpath/28664 * configure.ac: Add support for configuring GNU MP. * native/jni/Makefile.am: Include java-math directory if required. * native/jni/java-math/.cvsignore: New file. * native/jni/java-math/Makefile.am: Likewise. * native/jni/java-math/java_math_BigInteger.c: Likewise. * java/math/BigInteger.java: Added support for native methods. * gnu/classpath/Configuration.java.in (WANT_NATIVE_BIG_INTEGER): New field.
Diffstat (limited to 'vm')
-rw-r--r--vm/reference/java/math/VMBigInteger.java474
1 files changed, 474 insertions, 0 deletions
diff --git a/vm/reference/java/math/VMBigInteger.java b/vm/reference/java/math/VMBigInteger.java
new file mode 100644
index 000000000..6b5ab485d
--- /dev/null
+++ b/vm/reference/java/math/VMBigInteger.java
@@ -0,0 +1,474 @@
+/* java.math.VMBigInteger -- Arbitary precision integers using GMP
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.math;
+
+import gnu.classpath.Pointer;
+
+/**
+ * Implement BigInteger using GMP
+ */
+final class VMBigInteger
+{
+ private Pointer native_ptr;
+ private int refCount = 1;
+
+ VMBigInteger()
+ {
+ super();
+
+ natInitialize();
+ }
+
+ private synchronized void acquireRef()
+ {
+ refCount++;
+ }
+
+ private synchronized void releaseRef()
+ {
+ refCount--;
+ if (refCount == 0)
+ {
+ natFinalize();
+ native_ptr = null;
+ }
+ }
+
+ protected void finalize()
+ {
+ releaseRef();
+ }
+
+
+ void fromByteArray(byte[] v)
+ {
+ this.acquireRef();
+ natFromByteArray(v);
+ this.releaseRef();
+ }
+
+ void fromBI(BigInteger x)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ natFromBI(x.mpz.native_ptr);
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void fromLong(long n)
+ {
+ this.acquireRef();
+ natFromLong(n);
+ this.releaseRef();
+ }
+
+ int fromString(String s, int rdx)
+ {
+ this.acquireRef();
+ int result = natFromString(s, rdx);
+ this.releaseRef();
+ return result;
+ }
+
+ void fromSignedMagnitude(byte[] m, boolean isNegative)
+ {
+ this.acquireRef();
+ natFromSignedMagnitude(m, isNegative);
+ this.releaseRef();
+ }
+
+ String toString(int b)
+ {
+ this.acquireRef();
+ String result = natToString(b);
+ this.releaseRef();
+ return result;
+ }
+
+ void toByteArray(byte[] r)
+ {
+ this.acquireRef();
+ natToByteArray(r);
+ this.releaseRef();
+ }
+
+ double doubleValue()
+ {
+ this.acquireRef();
+ double result = natDoubleValue();
+ this.releaseRef();
+ return result;
+ }
+
+ int absIntValue()
+ {
+ this.acquireRef();
+ int result = natAbsIntValue();
+ this.releaseRef();
+ return result;
+ }
+
+ int compare(BigInteger x)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ int result = natCompare(x.mpz.native_ptr);
+ x.mpz.releaseRef();
+ this.releaseRef();
+ return result;
+ }
+
+ void add(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natAdd(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void subtract(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natSubtract(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void multiply(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natMultiply(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void quotient(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natQuotient(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void remainder(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natRemainder(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void quotientAndRemainder(BigInteger x, BigInteger q, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ q.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natQuotientAndRemainder(x.mpz.native_ptr, q.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ q.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void modulo(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natModulo(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void pow(int n, BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natPow(n, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void modPow(BigInteger e, BigInteger m, BigInteger r)
+ {
+ this.acquireRef();
+ e.mpz.acquireRef();
+ m.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natModPow(e.mpz.native_ptr, m.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ m.mpz.releaseRef();
+ e.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void modInverse(BigInteger m, BigInteger r)
+ {
+ this.acquireRef();
+ m.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natModInverse(m.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ m.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void gcd(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natGCD(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void shiftLeft(int n, BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natShiftLeft(n, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void shiftRight(int n, BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natShiftRight(n, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void abs(BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natAbs(r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void negate(BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natNegate(r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ int bitLength()
+ {
+ this.acquireRef();
+ int result = natBitLength();
+ this.releaseRef();
+ return result;
+ }
+
+ int bitCount()
+ {
+ this.acquireRef();
+ int result = natSetBitCount();
+ this.releaseRef();
+ return result;
+ }
+
+ void and(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natAnd(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void or(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natOr(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void xor(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natXor(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void andNot(BigInteger x, BigInteger r)
+ {
+ this.acquireRef();
+ x.mpz.acquireRef();
+ r.mpz.acquireRef();
+ natAndNot(x.mpz.native_ptr, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ x.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void not(BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natNot(r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ void flipBit(int n, BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natFlipBit(n, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ int testBit(int n)
+ {
+ this.acquireRef();
+ int result = natTestBit(n);
+ this.releaseRef();
+ return result;
+ }
+
+ void setBit(int n, boolean setIt, BigInteger r)
+ {
+ this.acquireRef();
+ r.mpz.acquireRef();
+ natSetBit(n, setIt, r.mpz.native_ptr);
+ r.mpz.releaseRef();
+ this.releaseRef();
+ }
+
+ int testPrimality(int certainty)
+ {
+ this.acquireRef();
+ int result = natTestPrimality(certainty);
+ this.releaseRef();
+ return result;
+ }
+
+ int lowestSetBit()
+ {
+ this.acquireRef();
+ int result = natLowestSetBit();
+ this.releaseRef();
+ return result;
+ }
+
+ // Native methods .........................................................
+
+ static native void natInitializeLibrary();
+
+ native void natInitialize();
+ native void natFinalize();
+
+ native void natFromLong(long n);
+ native void natFromBI(Pointer x);
+ native void natFromByteArray(byte[] v);
+ native int natFromString(String s, int rdx);
+ native void natFromSignedMagnitude(byte[] m, boolean isNegative);
+
+ native String natToString(int base);
+ native void natToByteArray(byte[] r);
+ native int natAbsIntValue();
+ native double natDoubleValue();
+
+ native int natCompare(Pointer y);
+ native void natAdd(Pointer x, Pointer r);
+ native void natSubtract(Pointer x, Pointer r);
+ native void natMultiply(Pointer x, Pointer r);
+ native void natQuotient(Pointer x, Pointer r);
+ native void natRemainder(Pointer x, Pointer r);
+ native void natQuotientAndRemainder(Pointer x, Pointer q, Pointer r);
+ native void natModulo(Pointer m, Pointer r);
+ native void natPow(int n, Pointer r);
+ native void natModPow(Pointer e, Pointer m, Pointer r);
+ native void natModInverse(Pointer x, Pointer r);
+ native void natGCD(Pointer x, Pointer r);
+ native int natTestPrimality(int c);
+ native void natShiftLeft(int n, Pointer r);
+ native void natShiftRight(int n, Pointer r);
+ native int natLowestSetBit();
+ native void natAbs(Pointer r);
+ native void natNegate(Pointer r);
+ native int natBitLength();
+ native int natSetBitCount();
+ native void natXor(Pointer x, Pointer r);
+ native void natOr(Pointer x, Pointer r);
+ native void natAnd(Pointer x, Pointer r);
+ native void natAndNot(Pointer x, Pointer r);
+ native void natFlipBit(int n, Pointer r);
+ native int natTestBit(int n);
+ native void natSetBit(int n, boolean setIt, Pointer r);
+ native void natNot(Pointer r);
+}