[kaffe] CVS kaffe (guilhem): Fixed double/float to int conversion on sparc/jit.

Kaffe CVS cvs-commits at kaffe.org
Sun Aug 22 06:38:27 PDT 2004


PatchSet 5089 
Date: 2004/08/22 13:31:24
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Fixed double/float to int conversion on sparc/jit.

        * config/sparc/jit-icode.h, config/i386/jit-icode.h,
        config/alpha/jit-icode.h, config/arm/jit-icode.h,
        config/m68k/jit-icode.h
        (HAVE_cvt_double_int_ieee, HAVE_cvt_float_int_ieee): New define
        symbols.

        * kaffe/kaffevm/jit/icode.c
        (cvt_double_int): New JIT codelet to use non Java-compatible
        floating point to integer converting instruction.
        (cvt_float_int): New JIT codelet to use non Java-compatible
        floating point to integer converting instruction.

        * test/internal/TypeConversion.java: Check for NaN (float or
        double) to int conversion.

        * test/internal/jitBasic.c: Fixed a memory overreading.

Members: 
	ChangeLog:1.2647->1.2648 
	config/alpha/jit-icode.h:1.3->1.4 
	config/arm/jit-icode.h:1.2->1.3 
	config/i386/jit-icode.h:1.5->1.6 
	config/sparc/jit-icode.h:1.3->1.4 
	kaffe/kaffevm/jit/icode.c:1.28->1.29 
	test/internal/TypeConversion.java:1.1->1.2 
	test/internal/jitBasic.c:1.3->1.4 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2647 kaffe/ChangeLog:1.2648
--- kaffe/ChangeLog:1.2647	Sat Aug 21 16:32:42 2004
+++ kaffe/ChangeLog	Sun Aug 22 13:31:24 2004
@@ -1,3 +1,22 @@
+2004-08-22  Guilhem Lavaux  <guilhem at kaffe.org>
+
+	* config/sparc/jit-icode.h, config/i386/jit-icode.h,
+	config/alpha/jit-icode.h, config/arm/jit-icode.h,
+	config/m68k/jit-icode.h
+	(HAVE_cvt_double_int_ieee, HAVE_cvt_float_int_ieee): New define
+	symbols.
+
+	* kaffe/kaffevm/jit/icode.c
+	(cvt_double_int): New JIT codelet to use non Java-compatible
+	floating point to integer converting instruction.
+	(cvt_float_int): New JIT codelet to use non Java-compatible
+	floating point to integer converting instruction.
+
+	* test/internal/TypeConversion.java: Check for NaN (float or
+	double) to int conversion.
+
+	* test/internal/jitBasic.c: Fixed a memory overreading.
+	
 2004-08-21  Dalibor Topic  <robilad at kaffe.org>
 
 	* config/powerpc/sysdepCallMethod.h:
@@ -20,7 +39,7 @@
         * config/alpha/sysdepCallMethod.h:
 	Include missing file.
 
-        * kaffe/kaffevm/jit/methodcalls.c,
+      h  * kaffe/kaffevm/jit/methodcalls.c,
         kaffe/kaffevm/jit/methodcalls.h:
 	Export soft_fixup_trampoline.
 
Index: kaffe/config/alpha/jit-icode.h
diff -u kaffe/config/alpha/jit-icode.h:1.3 kaffe/config/alpha/jit-icode.h:1.4
--- kaffe/config/alpha/jit-icode.h:1.3	Sun Jun 17 16:39:09 2001
+++ kaffe/config/alpha/jit-icode.h	Sun Aug 22 13:31:27 2004
@@ -277,7 +277,9 @@
 #else
 
 #undef HAVE_cvt_float_int
+#undef HAVE_cvt_float_int_ieee
 #undef HAVE_cvt_double_int
+#undef HAVE_cvt_double_int_ieee
 #undef HAVE_cvt_float_long
 #undef HAVE_cvt_double_long
 
Index: kaffe/config/arm/jit-icode.h
diff -u kaffe/config/arm/jit-icode.h:1.2 kaffe/config/arm/jit-icode.h:1.3
--- kaffe/config/arm/jit-icode.h:1.2	Sun Jun 17 16:39:10 2001
+++ kaffe/config/arm/jit-icode.h	Sun Aug 22 13:31:27 2004
@@ -157,7 +157,9 @@
 #define	HAVE_cvt_int_double		cvtid_RxR
 
 #define	HAVE_cvt_float_int		cvtfi_RxR
+#undef HAVE_cvt_float_int_ieee
 #define	HAVE_cvt_double_int		cvtdi_RxR
+#undef HAVE_cvt_double_int_ieee
 
 #undef	HAVE_cvt_long_double
 #undef	HAVE_cvt_long_float
Index: kaffe/config/i386/jit-icode.h
diff -u kaffe/config/i386/jit-icode.h:1.5 kaffe/config/i386/jit-icode.h:1.6
--- kaffe/config/i386/jit-icode.h:1.5	Sun Jun 17 16:39:10 2001
+++ kaffe/config/i386/jit-icode.h	Sun Aug 22 13:31:28 2004
@@ -124,7 +124,9 @@
 #define	HAVE_cvt_float_double		cvtfd_RxR
 #define	HAVE_cvt_double_float		cvtdf_RxR
 #undef	HAVE_cvt_float_int
+#undef  HAVE_cvt_float_int_ieee
 #undef	HAVE_cvt_double_int
+#undef  HAVE_cvt_double_int_ieee
 #undef	HAVE_cvt_float_long
 #undef	HAVE_cvt_double_long
 
Index: kaffe/config/sparc/jit-icode.h
diff -u kaffe/config/sparc/jit-icode.h:1.3 kaffe/config/sparc/jit-icode.h:1.4
--- kaffe/config/sparc/jit-icode.h:1.3	Sun Jun 17 16:39:11 2001
+++ kaffe/config/sparc/jit-icode.h	Sun Aug 22 13:31:29 2004
@@ -110,8 +110,10 @@
 #define	HAVE_build_code_ref		set_wordpc_xxC
 
 #define	HAVE_cvt_int_double		cvtid_RxR
-#define	HAVE_cvt_float_int		cvtfi_RxR
-#define	HAVE_cvt_double_int		cvtdi_RxR
+#define	HAVE_cvt_float_int_ieee		cvtfi_RxR
+#undef HAVE_cvt_float_int
+#define	HAVE_cvt_double_int_ieee	cvtdi_RxR
+#undef HAVE_cvt_double_int
 #define	HAVE_cvt_int_float		cvtif_RxR
 #define	HAVE_cvt_float_double		cvtfd_RxR
 #define	HAVE_cvt_double_float		cvtdf_RxR
Index: kaffe/kaffe/kaffevm/jit/icode.c
diff -u kaffe/kaffe/kaffevm/jit/icode.c:1.28 kaffe/kaffe/kaffevm/jit/icode.c:1.29
--- kaffe/kaffe/kaffevm/jit/icode.c:1.28	Thu Aug 19 19:29:03 2004
+++ kaffe/kaffe/kaffevm/jit/icode.c	Sun Aug 22 13:31:30 2004
@@ -33,6 +33,7 @@
 #include "locks.h"
 #include "machine.h"
 #include "codeproto.h"
+#include "fp.h"
 
 #if defined(WORDS_BIGENDIAN)
 #define	LSLOT(_s)	((_s)+1)
@@ -468,6 +469,26 @@
 }
 
 void
+move_float_const_bits(SlotInfo* dst, int val)
+{
+	constpool *c;
+        label* l;
+        SlotInfo* tmp;
+
+        c = newConstant(CPint, val);
+        l = newLabel();
+        l->type = Lconstant;
+        l->at = 0;
+        l->to = (uintp)c;
+        l->from = 0;
+
+        slot_alloctmp(tmp);
+        move_label_const(tmp, l);
+        load_float(dst, tmp);
+        slot_freetmp(tmp);
+}
+
+void
 move_float_const(SlotInfo* dst, float val)
 {
 #if defined(HAVE_move_float_const)
@@ -1157,14 +1178,15 @@
 #endif
 }
 
-#if defined(HAVE_and_long_const)
 void
 and_long_const(SlotInfo* dst, SlotInfo* src, jlong val)
 {
+#if defined(HAVE_and_long_const)
 	if (HAVE_and_long_const_rangecheck(val)) {
 		lslot_lslot_lconst(dst, src, val, HAVE_and_long_const, Tcomplex);
 	}
 	else
+#endif
 	{
 		SlotInfo* tmp;
 		slot_alloctmp(tmp);
@@ -1173,7 +1195,6 @@
 		slot_freetmp(tmp);
 	}
 }
-#endif
 
 void
 or_int_const(SlotInfo* dst, SlotInfo* src, jint val)
@@ -2791,7 +2812,7 @@
 	}
 	else {
 		assert(labtab[n]->type == Lnull);
-		labtab[n]->type = Linternal;
+		labtab[n]->type = Linternal | (labtab[n]->type & ~Ltomask);
 		slot_slot_const(0, 0, (jword)labtab[n], HAVE_set_label, Tnull);
 		labtab[n] = 0;
 	}
@@ -3049,6 +3070,36 @@
 	used_ieee_rounding = true;
 #if defined(HAVE_cvt_float_int)
 	slot_slot_slot(dst, 0, src, HAVE_cvt_float_int, Tcomplex);
+#elif defined(HAVE_cvt_float_int_ieee)
+	{
+	  SlotInfo *tmp;
+	  
+	  slot_alloctmp(tmp);
+
+	  end_sub_block();
+	  and_int_const(tmp, src, FEXPMASK);
+	  cbranch_int_const_ne(tmp, FEXPMASK, reference_label(1, 1));
+	  
+	  and_int_const(tmp, src, FMANMASK);
+	  cbranch_int_const_eq(tmp, 0, reference_label(1, 2));
+
+          start_sub_block();
+	  move_int_const(dst, 0);
+	  end_sub_block();
+	  branch_a(reference_label(1, 3));
+
+	  set_label(1, 1);
+	  set_label(1, 2);
+	  start_sub_block();
+	  slot_slot_lslot(dst, 0, src, HAVE_cvt_float_int_ieee, Tcomplex);
+	  end_sub_block();
+
+	  set_label(1, 3);
+
+	  start_sub_block();
+
+	  slot_freetmp(tmp);
+	}
 #else
 	end_sub_block();
 	pusharg_float(src, 0);
@@ -3096,6 +3147,39 @@
 	used_ieee_rounding = true;
 #if defined(HAVE_cvt_double_int)
 	slot_slot_lslot(dst, 0, src, HAVE_cvt_double_int, Tcomplex);
+#elif defined(HAVE_cvt_double_int_ieee)
+	{
+	  SlotInfo *tmp;
+	  int i;
+	  
+	  end_sub_block();
+	  slot_alloc2tmp(tmp);
+
+	  and_long_const(tmp, src, DEXPMASK);
+	  cbranch_int_const_ne(LSLOT(tmp), (jint)(DEXPMASK & 0xffffffff), reference_label(1, 1));
+	  cbranch_int_const_ne(HSLOT(tmp), (jint)((DEXPMASK >> 32) & 0xffffffff), reference_label(1, 2));
+	  
+	  and_long_const(tmp, src, DMANMASK);
+	  cbranch_int_const_ne(LSLOT(tmp), 0, reference_label(1, 3));
+	  cbranch_int_const_eq(HSLOT(tmp), 0, reference_label(1, 4));
+
+	  set_label(1, 3);
+	  start_sub_block();
+	  move_int_const(dst, 0);
+	  end_sub_block();
+	  branch_a(reference_label(1, 5));
+
+	  set_label(1, 4);
+	  set_label(1, 1);
+	  set_label(1, 2);
+	  start_sub_block();
+	  slot_slot_lslot(dst, 0, src, HAVE_cvt_double_int_ieee, Tcomplex);
+	  end_sub_block();
+
+	  set_label(1, 5);
+	  slot_free2tmp(tmp);
+	  start_sub_block();
+	}
 #else
 	end_sub_block();
 	pusharg_double(src, 0);
Index: kaffe/test/internal/TypeConversion.java
diff -u kaffe/test/internal/TypeConversion.java:1.1 kaffe/test/internal/TypeConversion.java:1.2
--- kaffe/test/internal/TypeConversion.java:1.1	Fri Apr 25 21:35:34 2003
+++ kaffe/test/internal/TypeConversion.java	Sun Aug 22 13:31:29 2004
@@ -14,6 +14,22 @@
     {
 	return (int)a;
     }
+
+    public static final int test__float_nan_to_int = 0;
+    public static float mynanf = Float.NaN;
+
+    public static int float_nan_to_int()
+    {
+      return (int)mynanf;
+    }
+
+    public static final int test__double_nan_to_int = 0;
+    public static double mynand = Double.NaN;
+
+    public static int double_nan_to_int()
+    {
+      return (int)mynand;
+    }
     
     public static final float test_1__int_to_float = 1.0F;
     public static final float test_255__int_to_float = 255.0F;
Index: kaffe/test/internal/jitBasic.c
diff -u kaffe/test/internal/jitBasic.c:1.3 kaffe/test/internal/jitBasic.c:1.4
--- kaffe/test/internal/jitBasic.c:1.3	Mon Jul 19 13:19:07 2004
+++ kaffe/test/internal/jitBasic.c	Sun Aug 22 13:31:29 2004
@@ -222,11 +222,26 @@
 		for( lpc = 0; (lpc < CLASS_NSFIELDS(cl)) && retval; lpc++ )
 		{
 			Field *field;
+			uint32 expected_value;
 			
 			field = &CLASS_SFIELDS(cl)[lpc];
-			kaffe_dprintf("  field: %s = 0x%08x\n",
-				      field->name->data,
-				      ((int *)field->info.addr)[0]);
+
+			switch (field->bsize) {
+			case 1:
+			  expected_value = ((uint8 *)field->info.addr)[0];
+			  break;
+			case 2:
+			  expected_value = ((uint16 *)field->info.addr)[0];
+			  break;
+			case 4:
+			  expected_value = ((uint32 *)field->info.addr)[0];
+			  break;
+			default:
+			  expected_value = 0;
+			}
+                        kaffe_dprintf("  field: %s = 0x%08x\n",
+                                      field->name->data,
+				      expected_value);
 			if( !strncmp("test_", field->name->data, 5) )
 			{
 				retval = testMethod(cl, field);



More information about the kaffe mailing list