PatchSet 7761 Date: 2008/02/17 13:17:59 Author: robilad Branch: HEAD Tag: (none) Log: cleanup interpreter double division
2008-02-17 Dalibor Topic <[EMAIL PROTECTED]> * kaffe/kaffevm/fp.c (doubleDivide): Follow the spec more closely. * kaffe/kaffevm/soft.c, kaffe/kaffevm/soft.h (soft_fdivl): Make the function available to the interpreter. * kaffe/kaffevm/intrp/icode.h (div_double): Use soft_fdivl. Members: ChangeLog:1.5261->1.5262 kaffe/kaffevm/fp.c:1.14->1.15 kaffe/kaffevm/soft.c:1.90->1.91 kaffe/kaffevm/soft.h:1.20->1.21 kaffe/kaffevm/intrp/icode.h:1.28->1.29 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.5261 kaffe/ChangeLog:1.5262 --- kaffe/ChangeLog:1.5261 Sat Feb 16 17:40:10 2008 +++ kaffe/ChangeLog Sun Feb 17 13:17:59 2008 @@ -1,3 +1,12 @@ +2008-02-17 Dalibor Topic <[EMAIL PROTECTED]> + + * kaffe/kaffevm/fp.c (doubleDivide): Follow the spec more closely. + + * kaffe/kaffevm/soft.c, kaffe/kaffevm/soft.h (soft_fdivl): + Make the function available to the interpreter. + + * kaffe/kaffevm/intrp/icode.h (div_double): Use soft_fdivl. + 2008-02-16 Dalibor Topic <[EMAIL PROTECTED]> * TODO: Updated. Index: kaffe/kaffe/kaffevm/fp.c diff -u kaffe/kaffe/kaffevm/fp.c:1.14 kaffe/kaffe/kaffevm/fp.c:1.15 --- kaffe/kaffe/kaffevm/fp.c:1.14 Fri Feb 15 01:32:36 2008 +++ kaffe/kaffe/kaffevm/fp.c Sun Feb 17 13:18:01 2008 @@ -131,19 +131,48 @@ jdouble doubleDivide(jdouble v1, jdouble v2) { - if (isnan(v1) || isnan(v2)) { + jboolean negative_result; + + if (isnan(v1) || isnan(v2)) return KAFFE_JDOUBLE_NAN; + + negative_result = ((signbit(v1) == 0) && (signbit(v2) != 0)) + || ((signbit(v1) != 0) && (signbit(v2) == 0)); + + if (isinf(v1) && isinf(v2)) + return KAFFE_JDOUBLE_NAN; + + if (isinf(v1) && isfinite(v2)) { + if (negative_result) + return KAFFE_JDOUBLE_NEG_INF; + else + return KAFFE_JDOUBLE_POS_INF; } - if (v2 != 0.0) { - return (v1 / v2); + + if (isfinite(v1) && isinf(v2)) { + if (negative_result) + return -0.0; + else + return 0.0; } + if (v1 == 0.0) { - return KAFFE_JDOUBLE_NAN; + if (v2 == 0.0) + return KAFFE_JDOUBLE_NAN; + else if (negative_result) + return -0.0; + else + return 0.0; + } + + if (v1 != 0.0 && v2 == 0.0) { + if (negative_result) + return KAFFE_JDOUBLE_NEG_INF; + else + return KAFFE_JDOUBLE_POS_INF; } - if (signbit(v1) ^ signbit(v2)) - return KAFFE_JDOUBLE_NEG_INF; - else - return KAFFE_JDOUBLE_POS_INF; + + return (v1 / v2); } /* Index: kaffe/kaffe/kaffevm/soft.c diff -u kaffe/kaffe/kaffevm/soft.c:1.90 kaffe/kaffe/kaffevm/soft.c:1.91 --- kaffe/kaffe/kaffevm/soft.c:1.90 Fri Feb 15 00:01:19 2008 +++ kaffe/kaffe/kaffevm/soft.c Sun Feb 17 13:18:02 2008 @@ -686,6 +686,12 @@ return soft_dcmpl(v1, v2); } +jdouble +soft_fdivl(jdouble v1, jdouble v2) +{ + return doubleDivide(v1, v2); +} + #if defined(TRANSLATOR) jlong soft_lmul(jlong v1, jlong v2) @@ -746,12 +752,6 @@ soft_fdiv(jfloat v1, jfloat v2) { return floatDivide(v1, v2); -} - -jdouble -soft_fdivl(jdouble v1, jdouble v2) -{ - return doubleDivide(v1, v2); } jfloat Index: kaffe/kaffe/kaffevm/soft.h diff -u kaffe/kaffe/kaffevm/soft.h:1.20 kaffe/kaffe/kaffevm/soft.h:1.21 --- kaffe/kaffe/kaffevm/soft.h:1.20 Sun Mar 5 14:35:26 2006 +++ kaffe/kaffe/kaffevm/soft.h Sun Feb 17 13:18:02 2008 @@ -59,6 +59,8 @@ void* soft_multianewarray(struct Hjava_lang_Class*, jint, struct _slots*); #endif +jdouble soft_fdivl(jdouble, jdouble); + #if defined(TRANSLATOR) jlong soft_lmul(jlong, jlong); jlong soft_ldiv(jlong, jlong); @@ -70,7 +72,6 @@ jfloat soft_fmul(jfloat, jfloat); jdouble soft_fmull(jdouble, jdouble); jfloat soft_fdiv(jfloat, jfloat); -jdouble soft_fdivl(jdouble, jdouble); jfloat soft_frem(jfloat, jfloat); jdouble soft_freml(jdouble, jdouble); jlong soft_lshll(jlong, jint); Index: kaffe/kaffe/kaffevm/intrp/icode.h diff -u kaffe/kaffe/kaffevm/intrp/icode.h:1.28 kaffe/kaffe/kaffevm/intrp/icode.h:1.29 --- kaffe/kaffe/kaffevm/intrp/icode.h:1.28 Mon Feb 11 23:26:09 2008 +++ kaffe/kaffe/kaffevm/intrp/icode.h Sun Feb 17 13:18:03 2008 @@ -266,7 +266,7 @@ #define mul_float(t, f1, f2) (t)[0].v.tfloat = (f1)[0].v.tfloat * (f2)[0].v.tfloat #define mul_double(t, f1, f2) (t)[0].v.tdouble = (f1)[0].v.tdouble * (f2)[0].v.tdouble #define div_float(t, f1, f2) (t)[0].v.tfloat = (f1)[0].v.tfloat / (f2)[0].v.tfloat -#define div_double(t, f1, f2) (t)[0].v.tdouble = (f1)[0].v.tdouble / (f2)[0].v.tdouble +#define div_double(t, f1, f2) (t)[0].v.tdouble = soft_fdivl((f1)[0].v.tdouble , (f2)[0].v.tdouble) #define rem_float(t, f1, f2) (t)[0].v.tfloat = javaRemainderf((f1)[0].v.tfloat, (f2)[0].v.tfloat) #define rem_double(t, f1, f2) (t)[0].v.tdouble = javaRemainder((f1)[0].v.tdouble, (f2)[0].v.tdouble) #define neg_float(t, f) (t)[0].v.tfloat = -(f)[0].v.tfloat _______________________________________________ kaffe mailing list kaffe@kaffe.org http://kaffe.org/cgi-bin/mailman/listinfo/kaffe