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. |