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

Reply via email to