You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by mf...@apache.org on 2007/08/24 12:31:00 UTC

svn commit: r569334 - in /harmony/enhanced/drlvm/trunk: src/test/regression/excludes/ vm/jitrino/src/codegenerator/ia32/ vm/jitrino/src/jet/ vm/jitrino/src/shared/

Author: mfursov
Date: Fri Aug 24 03:30:59 2007
New Revision: 569334

URL: http://svn.apache.org/viewvc?rev=569334&view=rev
Log:
Fix for HARMONY-2873 : frem and drem instructions returns incorrect result when divisor is Float/Double.MIN_VALUE
Enabling regression test on Win64 platform

Added:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.cpp   (with props)
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.h   (with props)
Modified:
    harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/arith_rt.cpp

Modified: harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64?rev=569334&r1=569333&r2=569334&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64 (original)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64 Fri Aug 24 03:30:59 2007
@@ -1,7 +1,6 @@
 # Exclude this test because of problems with hardware exceptions handling in VM for this platform
 H1859
 H2151
-H2873
 # Exclude this test because JVMTI is not implemented for x86_64 in JIT mode yet
 H2926
 H3027

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp?rev=569334&r1=569333&r2=569334&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Fri Aug 24 03:30:59 2007
@@ -27,6 +27,7 @@
 #include "Opcode.h"
 #include "Ia32Tls.h"
 #include "Ia32CgUtils.h"
+#include "Algorithms.h"
 
 #include <float.h>
 #include <math.h>
@@ -128,12 +129,12 @@
 // FP remainder internal helpers (temp solution to be optimized)
 float   __stdcall   remF4   (float v0, float v1)stdcall__;
 float   __stdcall   remF4   (float v0, float v1)   { 
-    return fmodf(v0,v1);
+    return fmod((double)v0,(double)v1);
 }
 
 double  __stdcall   remF8   (double v0, double v1)stdcall__;
 double  __stdcall   remF8   (double v0, double v1)  {
-    return  fmod(v0,v1);
+    return jitrino_ieee754_fmod_double(v0,v1);
 } 
 
 void __stdcall initialize_array(uint8* array, uint32 elems_offset, uint8* data, uint32 num_elems) stdcall__;

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/arith_rt.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/arith_rt.cpp?rev=569334&r1=569333&r2=569334&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/arith_rt.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/arith_rt.cpp Fri Aug 24 03:30:59 2007
@@ -24,6 +24,7 @@
   */
  
 #include "arith_rt.h"
+#include "Algorithms.h"
 
 #include <stdlib.h>
 #include <float.h>
@@ -138,7 +139,7 @@
     if (finite(v1) && !finite(v2)) {
         return v1;
     }
-    return fmod(v1,v2);
+    return jitrino_ieee754_fmod_double(v1,v2);
 }
 
 float __stdcall rt_h_flt_a(float v1, float v2, JavaByteCodes op)
@@ -170,7 +171,7 @@
     if (finite(v1) && !finite(v2)) {
         return v1;
     }
-    return fmod(v1,v2);
+    return fmod((double)v1,(double)v2);
 }
 
 jlong __stdcall rt_h_i64_shift(jlong v1, int v2, JavaByteCodes op)

Added: harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.cpp?rev=569334&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.cpp Fri Aug 24 03:30:59 2007
@@ -0,0 +1,155 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+/**
+ * @author Igor V Chebykin
+ * @version $Revision: 1.3.12.4.4.4 $
+ */
+/**
+ * @file
+ * @brief Implementation of special algorithms declared in Algorithms.h.
+ */
+ 
+#include <stdlib.h>
+#include <float.h>
+#include <math.h>
+#include <assert.h>
+#include "Algorithms.h"
+
+
+namespace Jitrino {
+	
+/* 
+ * ieee754_fmod(x,y)
+ * Return x mod y in exact arithmetic
+ * Method: shift and subtract
+ */
+#define __HI(x) *(1+(int*)&x)
+#define __LO(x) *(int*)&x
+#define __HIp(x) *(1+(int*)x)
+#define __LOp(x) *(int*)x
+ 
+double jitrino_ieee754_fmod_double(double x, double y) {
+	const double one = 1.0, Zero[] = {0.0, -0.0,};
+	int n,hx,hy,hz,ix,iy,sx,i;
+	unsigned lx,ly,lz;
+
+	hx = __HI(x);		/* high word of x */
+	lx = __LO(x);		/* low  word of x */
+	hy = __HI(y);		/* high word of y */
+	ly = __LO(y);		/* low  word of y */
+	sx = hx&0x80000000;		/* sign of x */
+	hx ^=sx;		/* |x| */
+	hy &= 0x7fffffff;	/* |y| */
+
+    /* purge off exception values */
+	if ((hy|ly)==0 || 
+		(hx>=0x7ff00000) ||	/* y=0,or x not finite */
+		((hy|((ly|(-((int)ly)))>>31))>0x7ff00000) )	/* or y is NaN */
+	    return (x*y)/(x*y);
+	if(hx<=hy) {
+	    if((hx<hy)||(lx<ly)) return x;	/* |x|<|y| return x */
+	    if(lx==ly) 
+		return Zero[(unsigned)sx>>31];	/* |x|=|y| return x*0*/
+	}
+
+    /* determine ix = ilogb(x) */
+	if(hx<0x00100000) {	/* subnormal x */
+	    if(hx==0) {
+		for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
+	    } else {
+		for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
+	    }
+	} else ix = (hx>>20)-1023;
+
+    /* determine iy = ilogb(y) */
+	if(hy<0x00100000) {	/* subnormal y */
+	    if(hy==0) {
+		for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
+	    } else {
+		for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
+	    }
+	} else iy = (hy>>20)-1023;
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+	if(ix >= -1022) 
+	    hx = 0x00100000|(0x000fffff&hx);
+	else {		/* subnormal x, shift x to normal */
+	    n = -1022-ix;
+	    if(n<=31) {
+	        hx = (hx<<n)|(lx>>(32-n));
+	        lx <<= n;
+	    } else {
+		hx = lx<<(n-32);
+		lx = 0;
+	    }
+	}
+	if(iy >= -1022) 
+	    hy = 0x00100000|(0x000fffff&hy);
+	else {		/* subnormal y, shift y to normal */
+	    n = -1022-iy;
+	    if(n<=31) {
+	        hy = (hy<<n)|(ly>>(32-n));
+	        ly <<= n;
+	    } else {
+		hy = ly<<(n-32);
+		ly = 0;
+	    }
+	}
+
+    /* fix point fmod */
+	n = ix - iy;
+	while(n--) {
+	    hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	    if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
+	    else {
+	    	if((hz|lz)==0) 		/* return sign(x)*0 */
+		    return Zero[(unsigned)sx>>31];
+	    	hx = hz+hz+(lz>>31); lx = lz+lz;
+	    }
+	}
+	hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	if(hz>=0) {hx=hz;lx=lz;}
+
+    /* convert back to floating value and restore the sign */
+	if((hx|lx)==0) 			/* return sign(x)*0 */
+	    return Zero[(unsigned)sx>>31];	
+	while(hx<0x00100000) {		/* normalize x */
+	    hx = hx+hx+(lx>>31); lx = lx+lx;
+	    iy -= 1;
+	}
+	if(iy>= -1022) {	/* normalize output */
+	    hx = ((hx-0x00100000)|((iy+1023)<<20));
+	    __HI(x) = hx|sx;
+	    __LO(x) = lx;
+	} else {		/* subnormal output */
+	    n = -1022 - iy;
+	    if(n<=20) {
+		lx = (lx>>n)|((unsigned)hx<<(32-n));
+		hx >>= n;
+	    } else if (n<=31) {
+		lx = (hx<<(32-n))|(lx>>n); hx = sx;
+	    } else {
+		lx = hx>>(n-32); hx = sx;
+	    }
+	    __HI(x) = hx|sx;
+	    __LO(x) = lx;
+	    x *= one;		/* create necessary signal */
+	}
+	return x;		/* exact output */
+}
+} //namespace Jitrino
+

Propchange: harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.h?rev=569334&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.h (added)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.h Fri Aug 24 03:30:59 2007
@@ -0,0 +1,34 @@
+#ifndef ALGORITHMS_H_
+#define ALGORITHMS_H_
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+/**
+ * @author Igor V Chebykin
+ */
+/**
+ * @file
+ * @brief Implementation of special algorithms declared in Algorithms.h.
+ */
+ 
+namespace Jitrino {
+
+double jitrino_ieee754_fmod_double(double x, double y);
+
+} //namespace Jitrino 
+
+#endif /*ALGORITHMS_H_*/
+

Propchange: harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/Algorithms.h
------------------------------------------------------------------------------
    svn:eol-style = native