PatchSet 7747 Date: 2008/02/15 00:01:16 Author: robilad Branch: HEAD Tag: (none) Log: cache Float.NaN for conversions
2008-02-15 Dalibor Topic <[EMAIL PROTECTED]> * kaffe/kaffevm/fp.c (floatAdd, floatSubtract, floatMultiply) (floatDivide): Use KAFFE_JFLOAT_NAN. * kaffe/kaffevm/soft.c (soft_cvtdf): Use KAFFE_JFLOAT_NAN. Documented. * kaffe/kaffevm/baseClasses.c (initBaseClasses): Initialize KAFFE_JFLOAT_NAN. * kaffe/kaffevm/baseClasses.h (KAFFE_JFLOAT_NAN): New field caching java.lang.Float.NaN. Members: ChangeLog:1.5247->1.5248 kaffe/kaffevm/baseClasses.c:1.81->1.82 kaffe/kaffevm/baseClasses.h:1.26->1.27 kaffe/kaffevm/fp.c:1.10->1.11 kaffe/kaffevm/soft.c:1.89->1.90 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.5247 kaffe/ChangeLog:1.5248 --- kaffe/ChangeLog:1.5247 Thu Feb 14 23:42:20 2008 +++ kaffe/ChangeLog Fri Feb 15 00:01:16 2008 @@ -1,5 +1,17 @@ 2008-02-15 Dalibor Topic <[EMAIL PROTECTED]> + * kaffe/kaffevm/fp.c (floatAdd, floatSubtract, floatMultiply) + (floatDivide): Use KAFFE_JFLOAT_NAN. + + * kaffe/kaffevm/soft.c (soft_cvtdf): Use KAFFE_JFLOAT_NAN. Documented. + + * kaffe/kaffevm/baseClasses.c (initBaseClasses): Initialize KAFFE_JFLOAT_NAN. + + * kaffe/kaffevm/baseClasses.h (KAFFE_JFLOAT_NAN): New field caching + java.lang.Float.NaN. + +2008-02-15 Dalibor Topic <[EMAIL PROTECTED]> + * kaffe/kaffevm/fp.h (DNANBITS, longToDouble): Removed. * kaffe/kaffevm/fp.c (longToDouble): Simplified collapsing of NaNs. Index: kaffe/kaffe/kaffevm/baseClasses.c diff -u kaffe/kaffe/kaffevm/baseClasses.c:1.81 kaffe/kaffe/kaffevm/baseClasses.c:1.82 --- kaffe/kaffe/kaffevm/baseClasses.c:1.81 Thu Feb 14 23:31:41 2008 +++ kaffe/kaffe/kaffevm/baseClasses.c Fri Feb 15 00:01:18 2008 @@ -91,6 +91,7 @@ Hjava_lang_Class* javaLangFloatClass; Hjava_lang_Class* javaLangDoubleClass; +jfloat KAFFE_JFLOAT_NAN; jdouble KAFFE_JDOUBLE_NAN; Hjava_lang_Class *javaNioBufferClass; @@ -425,6 +426,9 @@ KAFFEVM_EXIT(-1); } + KAFFE_JFLOAT_NAN = KaffeJNI_GetStaticFloatField(NULL, javaLangFloatClass, + KNI_lookupFieldC(javaLangFloatClass, + "NaN", true, &einfo)); KAFFE_JDOUBLE_NAN = KaffeJNI_GetStaticDoubleField(NULL, javaLangDoubleClass, KNI_lookupFieldC(javaLangDoubleClass, "NaN", true, &einfo)); Index: kaffe/kaffe/kaffevm/baseClasses.h diff -u kaffe/kaffe/kaffevm/baseClasses.h:1.26 kaffe/kaffe/kaffevm/baseClasses.h:1.27 --- kaffe/kaffe/kaffevm/baseClasses.h:1.26 Thu Feb 14 23:31:41 2008 +++ kaffe/kaffe/kaffevm/baseClasses.h Fri Feb 15 00:01:19 2008 @@ -50,6 +50,7 @@ extern struct Hjava_lang_Class* javaLangLongClass; extern struct Hjava_lang_Class* javaLangFloatClass; extern struct Hjava_lang_Class* javaLangDoubleClass; +extern jfloat KAFFE_JFLOAT_NAN; extern jdouble KAFFE_JDOUBLE_NAN; extern struct Hjava_lang_Class *javaNioDirectByteBufferImplClass; Index: kaffe/kaffe/kaffevm/fp.c diff -u kaffe/kaffe/kaffevm/fp.c:1.10 kaffe/kaffe/kaffevm/fp.c:1.11 --- kaffe/kaffe/kaffevm/fp.c:1.10 Thu Feb 14 23:42:22 2008 +++ kaffe/kaffe/kaffevm/fp.c Fri Feb 15 00:01:19 2008 @@ -121,7 +121,7 @@ floatAdd(jfloat v1, jfloat v2) { if (isnan(v1) || isnan(v2)) { - return intToFloat(FNANBITS); + return KAFFE_JFLOAT_NAN; } return (v1 + v2); } @@ -145,7 +145,7 @@ floatSubtract(jfloat v1, jfloat v2) { if (isnan(v1) || isnan(v2)) { - return intToFloat(FNANBITS); + return KAFFE_JFLOAT_NAN; } return (v1 - v2); } @@ -169,7 +169,7 @@ floatMultiply(jfloat v1, jfloat v2) { if (isnan(v1) || isnan(v2)) { - return intToFloat(FNANBITS); + return KAFFE_JFLOAT_NAN; } return (v1 * v2); } @@ -209,13 +209,13 @@ v2bits = floatToInt(v2); if (isnan(v1) || isnan(v2)) { - return intToFloat(FNANBITS); + return KAFFE_JFLOAT_NAN; } if (v2 != 0.0) { return (v1 / v2); } if (v1 == 0.0) { - return intToFloat(FNANBITS); + return KAFFE_JFLOAT_NAN; } return intToFloat((jint)(FINFBITS | ((v1bits ^ v2bits) & FSIGNBIT))); } Index: kaffe/kaffe/kaffevm/soft.c diff -u kaffe/kaffe/kaffevm/soft.c:1.89 kaffe/kaffe/kaffevm/soft.c:1.90 --- kaffe/kaffe/kaffevm/soft.c:1.89 Thu Feb 14 23:31:41 2008 +++ kaffe/kaffe/kaffevm/soft.c Fri Feb 15 00:01:19 2008 @@ -861,15 +861,20 @@ return (jdouble)v; } +/** + * convert a double to float + * + * @param v a double + * + * @return the float corresponding to the double, or Float.NaN if the double is a NaN. + */ jfloat soft_cvtdf(jdouble v) { - if (isnan(v)) { - return (intToFloat(FNANBITS)); - } - else { - return ((jfloat)v); - } + if (isnan(v)) + return KAFFE_JFLOAT_NAN; + else + return (jfloat)v; } /* _______________________________________________ kaffe mailing list kaffe@kaffe.org http://kaffe.org/cgi-bin/mailman/listinfo/kaffe