[kaffe] [Fwd: Patch for: Kaffe doesn't work with GMP on x86_64]
Alan Eliasen
eliasen at mindspring.com
Sun Dec 11 18:20:50 PST 2005
Alan Eliasen wrote:
> I really like using Kaffe as my JVM for working with really big
> numbers, as it can be compiled to use the GMP library. It makes certain
> programs that work with really big integers run thousands of times
> faster than any other JVM. I was really excited about running it on the
> x86_64 with 64-bit multiplies that might be up to 4 times faster. There
> seem to be major bugs preventing this from working on the x86_64
> architecture, though. (I tested against the CVS head.)
I think that I have a patch for this problem. (See below.) It
appears that all of the steps in Java_java_math_BigInteger_assignLong0
in the file can simply be replaced with a single call to mpz_set_si(res,
v) which sets a GMP integer from a signed long int. (The signature is
void mpz_set_ui (mpz t rop, unsigned long int op), see the GMP
documentation at http://www.swox.com/gmp/gmp-man-4.1.4.pdf , section 5.2. )
I think that this code should be simpler and faster than the original
code, if a jlong is an unsigned long, but I haven't checked it on all
architectures, only on x86_64 where the problem originally occurred.
This works and passes my regression tests.
this is a patch to libraries/clib/math/BigInteger.c . Please let me
know if I can produce this patch in a better format, and what I can do
to get this fixed in Kaffe.
*** BigInteger.c 2005-12-11 18:45:45.000000000 -0700
--- BigInteger.c.new 2005-12-11 18:34:54.000000000 -0700
***************
*** 77,100 ****
Java_java_math_BigInteger_assignLong0(JNIEnv* env, jobject r, jlong v)
{
mpz_ptr res;
- int negative = v < 0 ? -1 : 0;
-
res = (*env)->GetObjectField(env, r, number);
! if (negative)
! v = -v;
! /* Note that v will remain negative if it's LONG_LONG_MIN.
! This is not a problem because any sign copying in the right
! shift will be stripped with the cast to jint, and the
! number will be considered positive. Furthermore, in this
! case, (jint)v will be zero, so the addition will be a
! do-nothing operation. At last, the number will be made
! negative, as appropriate. */
! mpz_set_ui(res, (unsigned long)(jint)(v >> 32));
! mpz_mul_2exp(res, res, 32);
! mpz_add_ui(res, res, (unsigned long)(jint)v);
! if (negative)
! mpz_neg(res, res);
}
void
--- 77,85 ----
Java_java_math_BigInteger_assignLong0(JNIEnv* env, jobject r, jlong v)
{
mpz_ptr res;
res = (*env)->GetObjectField(env, r, number);
! mpz_set_si(res, v);
}
void
--
Alan Eliasen | "It's amazing how much mature wisdom
eliasen at mindspring.com | resembles being too tired."
http://futureboy.homeip.net/ | -- Robert Heinlein
--
Alan Eliasen | "It's amazing how much mature wisdom
eliasen at mindspring.com | resembles being too tired."
http://futureboy.homeip.net/ | -- Robert Heinlein
More information about the kaffe
mailing list