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 [EMAIL PROTECTED] | resembles being too tired." http://futureboy.homeip.net/ | -- Robert Heinlein -- Alan Eliasen | "It's amazing how much mature wisdom [EMAIL PROTECTED] | resembles being too tired." http://futureboy.homeip.net/ | -- Robert Heinlein _______________________________________________ kaffe mailing list [email protected] http://kaffe.org/cgi-bin/mailman/listinfo/kaffe
