CVS kaffe (robilad): cache Double.NaN for conversions
Kaffe CVS <[email protected]> Thu, 14 Feb 2008 15:33:16 -0800
| Newsgroups | gmane.comp.java.vm.kaffe.general |
|---|---|
| Message-ID | <[email protected]> |
PatchSet 7745 Date: 2008/02/14 23:31:38 Author: robilad Branch: HEAD Tag: (none) Log: cache Double.NaN for conversions 2008-02-15 Dalibor Topic <[email protected]> * kaffe/kaffevm/fp.c (doubleAdd, doubleSubtract, doubleMultiply) (doubleDivide): Use KAFFE_JDOUBLE_NAN. * kaffe/kaffevm/soft.c (soft_cvtfd): Use KAFFE_JDOUBLE_NAN. Documented. * kaffe/kaffevm/baseClasses.c (initBaseClasses): Initialize KAFFE_JDOUBLE_NAN. * kaffe/kaffevm/baseClasses.h (KAFFE_JDOUBLE_NAN): New field caching java.lang.Double.NaN. Members: ChangeLog:1.5245->1.5246 kaffe/kaffevm/baseClasses.c:1.80->1.81 kaffe/kaffevm/baseClasses.h:1.25->1.26 kaffe/kaffevm/fp.c:1.8->1.9 kaffe/kaffevm/soft.c:1.88->1.89 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.5245 kaffe/ChangeLog:1.5246 --- kaffe/ChangeLog:1.5245 Thu Feb 14 22:24:40 2008 +++ kaffe/ChangeLog Thu Feb 14 23:31:38 2008 @@ -1,3 +1,15 @@ +2008-02-15 Dalibor Topic <[email protected]> + + * kaffe/kaffevm/fp.c (doubleAdd, doubleSubtract, doubleMultiply) + (doubleDivide): Use KAFFE_JDOUBLE_NAN. + + * kaffe/kaffevm/soft.c (soft_cvtfd): Use KAFFE_JDOUBLE_NAN. Documented. + + * kaffe/kaffevm/baseClasses.c (initBaseClasses): Initialize KAFFE_JDOUBLE_NAN. + + * kaffe/kaffevm/baseClasses.h (KAFFE_JDOUBLE_NAN): New field caching + java.lang.Double.NaN. + 2008-02-14 Dalibor Topic <[email protected]> * kaffe/kaffevm/fp.h (DISNAN): Removed. Index: kaffe/kaffe/kaffevm/baseClasses.c diff -u kaffe/kaffe/kaffevm/baseClasses.c:1.80 kaffe/kaffe/kaffevm/baseClasses.c:1.81 --- kaffe/kaffe/kaffevm/baseClasses.c:1.80 Mon Jan 21 01:04:36 2008 +++ kaffe/kaffe/kaffevm/baseClasses.c Thu Feb 14 23:31:41 2008 @@ -44,6 +44,7 @@ #include "fileSections.h" #include "verify-type.h" #include "jar.h" +#include "jni_funcs.h" Utf8Const* init_name; Utf8Const* final_name; @@ -90,6 +91,8 @@ Hjava_lang_Class* javaLangFloatClass; Hjava_lang_Class* javaLangDoubleClass; +jdouble KAFFE_JDOUBLE_NAN; + Hjava_lang_Class *javaNioBufferClass; Hjava_lang_Class *javaNioDirectByteBufferImplClass; Hjava_lang_Class *javaNioDirectByteBufferImplReadWriteClass; @@ -421,5 +424,9 @@ DBG(INIT, dprintf("Cannot resolve fields necessary for NIO operations\n"); ); KAFFEVM_EXIT(-1); } + + 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.25 kaffe/kaffe/kaffevm/baseClasses.h:1.26 --- kaffe/kaffe/kaffevm/baseClasses.h:1.25 Fri Dec 16 20:35:47 2005 +++ kaffe/kaffe/kaffevm/baseClasses.h Thu Feb 14 23:31:41 2008 @@ -50,6 +50,7 @@ extern struct Hjava_lang_Class* javaLangLongClass; extern struct Hjava_lang_Class* javaLangFloatClass; extern struct Hjava_lang_Class* javaLangDoubleClass; +extern jdouble KAFFE_JDOUBLE_NAN; extern struct Hjava_lang_Class *javaNioDirectByteBufferImplClass; extern struct Hjava_lang_Class *javaNioDirectByteBufferImplReadWriteClass; Index: kaffe/kaffe/kaffevm/fp.c diff -u kaffe/kaffe/kaffevm/fp.c:1.8 kaffe/kaffe/kaffevm/fp.c:1.9 --- kaffe/kaffe/kaffevm/fp.c:1.8 Thu Feb 14 22:24:41 2008 +++ kaffe/kaffe/kaffevm/fp.c Thu Feb 14 23:31:41 2008 @@ -15,6 +15,7 @@ #include "config-mem.h" #include "config-hacks.h" #include <math.h> +#include "baseClasses.h" #include "gtypes.h" #include "defs.h" #include "files.h" @@ -106,7 +107,7 @@ doubleAdd(jdouble v1, jdouble v2) { if (isnan(v1) || isnan(v2)) { - return longToDouble(DNANBITS); + return KAFFE_JDOUBLE_NAN; } return (v1 + v2); } @@ -130,7 +131,7 @@ doubleSubtract(jdouble v1, jdouble v2) { if (isnan(v1) || isnan(v2)) { - return longToDouble(DNANBITS); + return KAFFE_JDOUBLE_NAN; } return (v1 - v2); } @@ -154,7 +155,7 @@ doubleMultiply(jdouble v1, jdouble v2) { if (isnan(v1) || isnan(v2)) { - return longToDouble(DNANBITS); + return KAFFE_JDOUBLE_NAN; } return (v1 * v2); } @@ -183,13 +184,13 @@ v2bits = doubleToLong(v2); if (isnan(v1) || isnan(v2)) { - return longToDouble(DNANBITS); + return KAFFE_JDOUBLE_NAN; } if (v2 != 0.0) { return (v1 / v2); } if (v1 == 0.0) { - return longToDouble(DNANBITS); + return KAFFE_JDOUBLE_NAN; } return longToDouble((jlong)(DINFBITS | ((v1bits ^ v2bits) & DSIGNBIT))); } Index: kaffe/kaffe/kaffevm/soft.c diff -u kaffe/kaffe/kaffevm/soft.c:1.88 kaffe/kaffe/kaffevm/soft.c:1.89 --- kaffe/kaffe/kaffevm/soft.c:1.88 Thu Feb 14 22:24:41 2008 +++ kaffe/kaffe/kaffevm/soft.c Thu Feb 14 23:31:41 2008 @@ -845,15 +845,20 @@ return ((jdouble)v); } +/** + * convert a float to a double + * + * @param v a float + * + * @return the double corresponding to the float, or Double.NaN if the float is a NaN. + */ jdouble soft_cvtfd(jfloat v) { - if (isnan(v)) { - return (longToDouble(DNANBITS)); - } - else { - return ((jdouble)v); - } + if (isnan(v)) + return KAFFE_JDOUBLE_NAN; + else + return (jdouble)v; } jfloat