|
From: <fd...@us...> - 2009-01-17 21:25:55
|
Revision: 4881
http://jnode.svn.sourceforge.net/jnode/?rev=4881&view=rev
Author: fduminy
Date: 2009-01-17 21:25:50 +0000 (Sat, 17 Jan 2009)
Log Message:
-----------
- bug fix from Peter Barth (StackException in floating point computations)
- added test for the above bug
Modified Paths:
--------------
trunk/core/src/core/org/jnode/vm/x86/compiler/l1a/X86BytecodeVisitor.java
Added Paths:
-----------
trunk/core/src/test/org/jnode/test/TestFPStackException.java
Modified: trunk/core/src/core/org/jnode/vm/x86/compiler/l1a/X86BytecodeVisitor.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/x86/compiler/l1a/X86BytecodeVisitor.java 2009-01-17 19:11:28 UTC (rev 4880)
+++ trunk/core/src/core/org/jnode/vm/x86/compiler/l1a/X86BytecodeVisitor.java 2009-01-17 21:25:50 UTC (rev 4881)
@@ -1,5 +1,4 @@
/*
- * $Id$
*
* JNode.org
* Copyright (C) 2003-2006 JNode.org
@@ -23,7 +22,6 @@
import java.util.HashMap;
import java.util.Map;
-
import org.jnode.assembler.Label;
import org.jnode.assembler.NativeStream;
import org.jnode.assembler.x86.X86Assembler;
@@ -1937,7 +1935,7 @@
if (isfloat) {
result = ifac.createFPUStack(JvmType.FLOAT);
os.writeFLD32(refr, fieldOffset);
- vstack.fpuStack.push(result);
+ pushFloat(result);
} else {
final char fieldType = field.getSignature().charAt(0);
final WordItem iw = L1AHelper.requestWordRegister(eContext,
@@ -1970,7 +1968,7 @@
if (isfloat) {
result = ifac.createFPUStack(JvmType.DOUBLE);
os.writeFLD64(refr, fieldOffset);
- vstack.fpuStack.push(result);
+ pushFloat(result);
} else {
final DoubleWordItem idw = L1AHelper
.requestDoubleWordRegisters(eContext, type);
@@ -2022,7 +2020,7 @@
L1AHelper.releaseRegister(eContext, tmp);
}
final Item result = ifac.createFPUStack(type);
- vstack.fpuStack.push(result);
+ pushFloat(result);
vstack.push(result);
} else if (!fieldRef.isWide()) {
final WordItem result = L1AHelper.requestWordRegister(eContext,
@@ -4550,4 +4548,13 @@
}
return _curInstrLabel;
}
+
+ private void pushFloat(Item floatItem) {
+ // TODO should we do the same check for all calls to vstack.fpuStack.push(Item) ?
+ if (!vstack.fpuStack.hasCapacity(1)) {
+ vstack.push(eContext);
+ }
+
+ vstack.fpuStack.push(floatItem);
+ }
}
Added: trunk/core/src/test/org/jnode/test/TestFPStackException.java
===================================================================
--- trunk/core/src/test/org/jnode/test/TestFPStackException.java (rev 0)
+++ trunk/core/src/test/org/jnode/test/TestFPStackException.java 2009-01-17 21:25:50 UTC (rev 4881)
@@ -0,0 +1,58 @@
+package org.jnode.test;
+
+public class TestFPStackException {
+ public static void main(String[] args) {
+ System.out.println("creating instances");
+ Matrix m = new Matrix(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0);
+ Matrix m2 = new Matrix(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0);
+
+ System.out.println("calling times(...)");
+
+ // without bug fix, here the jnode compiler will fail with a org.jnode.vm.bytecode.StackException
+ Matrix m3 = m.times(m2);
+
+ System.out.println("end");
+ }
+
+ private static class Matrix {
+ private double m11, m12, m13, m14;
+ private double m21, m22, m23, m24;
+ private double m31, m32, m33, m34;
+ private double m41, m42, m43, m44;
+
+ public Matrix(double e11, double e12, double e13, double e14, double e21, double e22, double e23,
+ double e24, double e31, double e32, double e33, double e34, double e41, double e42,
+ double e43, double e44) {
+ m11 = e11;
+ m12 = e12;
+ m13 = e13;
+ m14 = e14;
+ m21 = e21;
+ m22 = e22;
+ m23 = e23;
+ m24 = e24;
+ m31 = e31;
+ m32 = e32;
+ m33 = e33;
+ m34 = e34;
+ m41 = e41;
+ m42 = e42;
+ m43 = e43;
+ m44 = e44;
+ }
+
+ public final Matrix times(Matrix a) {
+ return new Matrix(m11 * a.m11 + m12 * a.m21 + m13 * a.m31 + m14 * a.m41, m11 * a.m12 + m12 *
+ a.m22 + m13 * a.m32 + m14 * a.m42, m11 * a.m13 + m12 * a.m23 + m13 * a.m33 + m14 *
+ a.m43, m11 * a.m14 + m12 * a.m24 + m13 * a.m34 + m14 * a.m44, m21 * a.m11 + m22 *
+ a.m21 + m23 * a.m31 + m24 * a.m41, m21 * a.m12 + m22 * a.m22 + m23 * a.m32 + m24 *
+ a.m42, m21 * a.m13 + m22 * a.m23 + m23 * a.m33 + m24 * a.m43, m21 * a.m14 + m22 *
+ a.m24 + m23 * a.m34 + m24 * a.m44, m31 * a.m11 + m32 * a.m21 + m33 * a.m31 + m34 *
+ a.m41, m31 * a.m12 + m32 * a.m22 + m33 * a.m32 + m34 * a.m42, m31 * a.m13 + m32 *
+ a.m23 + m33 * a.m33 + m34 * a.m43, m31 * a.m14 + m32 * a.m24 + m33 * a.m34 + m34 *
+ a.m44, m41 * a.m11 + m42 * a.m21 + m43 * a.m31 + m44 * a.m41, m41 * a.m12 + m42 *
+ a.m22 + m43 * a.m32 + m44 * a.m42, m41 * a.m13 + m42 * a.m23 + m43 * a.m33 + m44 *
+ a.m43, m41 * a.m14 + m42 * a.m24 + m43 * a.m34 + m44 * a.m44);
+ }
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|