Index: kaffe/kaffevm/fp.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/fp.c,v
retrieving revision 1.14
diff -u -r1.14 fp.c
--- kaffe/kaffevm/fp.c	15 Feb 2008 01:32:36 -0000	1.14
+++ kaffe/kaffevm/fp.c	17 Feb 2008 12:18:28 -0000
@@ -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/kaffevm/soft.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/soft.c,v
retrieving revision 1.90
diff -u -r1.90 soft.c
--- kaffe/kaffevm/soft.c	15 Feb 2008 00:01:19 -0000	1.90
+++ kaffe/kaffevm/soft.c	17 Feb 2008 12:18:28 -0000
@@ -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/kaffevm/soft.h
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/soft.h,v
retrieving revision 1.20
diff -u -r1.20 soft.h
--- kaffe/kaffevm/soft.h	5 Mar 2006 14:35:26 -0000	1.20
+++ kaffe/kaffevm/soft.h	17 Feb 2008 12:18:28 -0000
@@ -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/kaffevm/intrp/icode.h
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/intrp/icode.h,v
retrieving revision 1.28
diff -u -r1.28 icode.h
--- kaffe/kaffevm/intrp/icode.h	11 Feb 2008 23:26:09 -0000	1.28
+++ kaffe/kaffevm/intrp/icode.h	17 Feb 2008 12:18:28 -0000
@@ -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
