[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 64bit 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/gmpman4.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 20051211 18:45:45.000000000 0700
 BigInteger.c.new 20051211 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
! donothing 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