From 6ca8e846620f8c46811c8417b6f9b7f05d79a706 Mon Sep 17 00:00:00 2001 From: brian Date: Tue, 1 Jun 2004 03:22:34 -0700 Subject: [PATCH] single-float darcs-hash:20040601102234-24bed-ffad3220e5c5f8886860cda6f3dcd4390d099287.gz --- Makefile | 2 +- src/org/ibex/nestedvm/ClassFileCompiler.java | 81 ++++++++++++++++--------- src/org/ibex/nestedvm/Compiler.java | 3 +- src/org/ibex/nestedvm/JavaSourceCompiler.java | 1 + src/org/ibex/nestedvm/Runtime.java | 2 - upstream/Makefile | 11 ++-- upstream/patches/gcc-fixes.patch | 4 +- 7 files changed, 65 insertions(+), 39 deletions(-) diff --git a/Makefile b/Makefile index 28e8100..24d675a 100644 --- a/Makefile +++ b/Makefile @@ -305,7 +305,7 @@ paranoiatest: build/tests/Paranoia.class # Linpack build/tests/Linpack.mips: $(tasks)/download_linpack $(tasks)/build_gcc_step2 mkdir -p `dirname "$@"` - $(MIPS_G77) $(MIPS_CFLAGS) $(MIPS_LDFLAGS) -o $@ upstream/download/linpack_bench.f -lc + $(MIPS_G77) $(MIPS_CFLAGS) $(Linpack_CFLAGS) $(MIPS_LDFLAGS) -o $@ upstream/download/linpack_bench.f -lc linpacktest: build/tests/Linpack.class $(JAVA) -cp build tests.Linpack diff --git a/src/org/ibex/nestedvm/ClassFileCompiler.java b/src/org/ibex/nestedvm/ClassFileCompiler.java index 0572ea1..aa99aa3 100644 --- a/src/org/ibex/nestedvm/ClassFileCompiler.java +++ b/src/org/ibex/nestedvm/ClassFileCompiler.java @@ -5,9 +5,7 @@ import java.io.*; import org.ibex.nestedvm.util.*; import org.ibex.classgen.*; -// FEATURE: Use IINC where possible -// FEATURE: Some kind of peephole optimization -// FEATURE: Special mode to support single-precision only - regs are floats not ints +// FEATURE: Eliminate unnecessary use of SWAP /* FEATURE: Span large binaries across several classfiles * We should be able to do this with no performance penalty @@ -56,7 +54,7 @@ public class ClassFileCompiler extends Compiler implements CGConst { try { __go(); } catch(ClassGen.Exn e) { - e.printStackTrace(); + e.printStackTrace(warn); throw new Exn("Class generation exception: " + e.toString()); } } @@ -76,7 +74,7 @@ public class ClassFileCompiler extends Compiler implements CGConst { cg.addField("lo",Type.INT,ACC_PRIVATE); cg.addField("fcsr",Type.INT,ACC_PRIVATE); for(int i=1;i<32;i++) cg.addField("r" + i,Type.INT,ACC_PRIVATE); - for(int i=0;i<32;i++) cg.addField("f" + i,Type.INT,ACC_PRIVATE); + for(int i=0;i<32;i++) cg.addField("f" + i,singleFloat ? Type.FLOAT : Type.INT,ACC_PRIVATE); clinit = cg.addMethod("",Type.VOID,Type.NO_ARGS,ACC_PRIVATE|ACC_STATIC); @@ -276,12 +274,14 @@ public class ClassFileCompiler extends Compiler implements CGConst { setCPUState.add(ALOAD_2); setCPUState.add(LDC,i); setCPUState.add(IALOAD); - setCPUState.add(PUTFIELD,new FieldRef(me,"f"+i,Type.INT)); + if(singleFloat) setCPUState.add(INVOKESTATIC,new MethodRef(Type.FLOAT_OBJECT,"intBitsToFloat",Type.FLOAT,new Type[]{Type.INT})); + setCPUState.add(PUTFIELD,new FieldRef(me,"f"+i,singleFloat ? Type.FLOAT : Type.INT)); getCPUState.add(ALOAD_2); getCPUState.add(LDC,i); getCPUState.add(ALOAD_0); - getCPUState.add(GETFIELD,new FieldRef(me,"f"+i,Type.INT)); + getCPUState.add(GETFIELD,new FieldRef(me,"f"+i,singleFloat ? Type.FLOAT: Type.INT)); + if(singleFloat) getCPUState.add(INVOKESTATIC,new MethodRef(Type.FLOAT_OBJECT,"floatToIntBits",Type.INT,new Type[]{Type.FLOAT})); getCPUState.add(IASTORE); } @@ -424,7 +424,13 @@ public class ClassFileCompiler extends Compiler implements CGConst { continue; } try { + int o = preSetRegStackPos; skipNext = emitInstruction(addr,insn,nextInsn); + if(o != preSetRegStackPos) throw new Exn("here"); + } catch(Exn e) { + e.printStackTrace(warn); + warn.println("Exception at " + toHex(addr)); + throw e; } catch(RuntimeException e) { warn.println("Exception at " + toHex(addr)); throw e; @@ -605,12 +611,12 @@ public class ClassFileCompiler extends Compiler implements CGConst { int fd = (insn >>> 6) & 0x1f; int subcode = insn & 0x3f; // bits 0-5 int breakCode = (insn >>> 6) & 0xfffff; // bits 6-20 - + int jumpTarget = (insn & 0x03ffffff); // bits 0-25 int unsignedImmediate = insn & 0xffff; int signedImmediate = (insn << 16) >> 16; int branchTarget = signedImmediate; - + // temporaries int b1,b2; @@ -1039,9 +1045,16 @@ public class ClassFileCompiler extends Compiler implements CGConst { case 8: // ADDI throw new Exn("ADDI (add immediate with oveflow trap) not suported"); case 9: // ADDIU - preSetReg(R+rt); - addiu(rs,signedImmediate); - setReg(); + if(rs != 0 && signedImmediate != 0 && rs == rt && doLocal(rt) && signedImmediate >= -32768 && signedImmediate <= 32767) { + // HACK: This should be a little cleaner + regLocalReadCount[rt]++; + regLocalWriteCount[rt]++; + mg.add(IINC, new MethodGen.Pair(getLocalForReg(rt),signedImmediate)); + } else { + preSetReg(R+rt); + addiu(rs,signedImmediate); + setReg(); + } break; case 10: // SLTI preSetReg(R+rt); @@ -1120,10 +1133,8 @@ public class ClassFileCompiler extends Compiler implements CGConst { break; case 4: // MTC.1 preSetReg(F+rd); - if(rt != 0) - pushReg(R+rt); - else - mg.add(LDC,0); + if(rt != 0) pushReg(R+rt); + else mg.add(ICONST_0); setReg(); break; case 6: // CTC.1 @@ -1198,13 +1209,12 @@ public class ClassFileCompiler extends Compiler implements CGConst { preSetReg(F+fd); pushReg(F+fs); setReg(); - + if(d) { preSetReg(F+fd+1); pushReg(F+fs+1); setReg(); } - break; case 7: // NEG.X preSetDouble(F+fd,d); @@ -1684,7 +1694,7 @@ public class ClassFileCompiler extends Compiler implements CGConst { private int getLocalForReg(int reg) { if(regLocalMapping[reg] != 0) return regLocalMapping[reg]; - if(nextAvailLocal == 0) nextAvailLocal = onePage ? 3 : 4; + if(nextAvailLocal == 0) nextAvailLocal = onePage ? 4 : 5; regLocalMapping[reg] = nextAvailLocal++; return regLocalMapping[reg]; } @@ -1703,13 +1713,13 @@ public class ClassFileCompiler extends Compiler implements CGConst { for(int i=0;i 0) { mg.add(ALOAD_0); mg.add(ILOAD,regLocalMapping[i]); - mg.add(PUTFIELD,new FieldRef(me,regField(i),Type.INT)); + mg.add(PUTFIELD,new FieldRef(me,regField[i],Type.INT)); } } } @@ -1719,7 +1729,7 @@ public class ClassFileCompiler extends Compiler implements CGConst { if(regLocalWriteCount[i] > 0) { mg.add(ALOAD_0); mg.add(ILOAD,regLocalMapping[i]); - mg.add(PUTFIELD,new FieldRef(me,regField(i),Type.INT)); + mg.add(PUTFIELD,new FieldRef(me,regField[i],Type.INT)); } } } @@ -1737,8 +1747,6 @@ public class ClassFileCompiler extends Compiler implements CGConst { "hi","lo","fcsr" }; - - private static String regField(int reg) { return regField[reg]; } private int pushRegWZ(int reg) { if(reg == R+0) { @@ -1759,10 +1767,13 @@ public class ClassFileCompiler extends Compiler implements CGConst { if(doLocal(reg)) { regLocalReadCount[reg]++; mg.add(ILOAD,getLocalForReg(reg)); - + } else if(reg >= F+0 && reg <= F+31 && singleFloat) { + mg.add(ALOAD_0); + mg.add(GETFIELD,new FieldRef(me,regField[reg],Type.FLOAT)); + mg.add(INVOKESTATIC,new MethodRef(Type.FLOAT_OBJECT,"floatToIntBits",Type.INT,new Type[]{Type.FLOAT})); } else { mg.add(ALOAD_0); - mg.add(GETFIELD,new FieldRef(me,regField(reg),Type.INT)); + mg.add(GETFIELD,new FieldRef(me,regField[reg],Type.INT)); } return h; } @@ -1772,7 +1783,6 @@ public class ClassFileCompiler extends Compiler implements CGConst { // This can push ONE or ZERO words to the stack. If it pushed one it returns true private boolean preSetReg(int reg) { - regField(reg); // just to check for validity preSetRegStack[preSetRegStackPos] = reg; preSetRegStackPos++; if(doLocal(reg)) { @@ -1791,8 +1801,11 @@ public class ClassFileCompiler extends Compiler implements CGConst { if(doLocal(reg)) { mg.add(ISTORE,getLocalForReg(reg)); regLocalWriteCount[reg]++; + } else if(reg >= F+0 && reg <= F+31 && singleFloat) { + mg.add(INVOKESTATIC,new MethodRef(Type.FLOAT_OBJECT,"intBitsToFloat",Type.FLOAT,new Type[]{Type.INT})); + mg.add(PUTFIELD,new FieldRef(me,regField[reg],Type.FLOAT)); } else { - mg.add(PUTFIELD,new FieldRef(me,regField(reg),Type.INT)); + mg.add(PUTFIELD,new FieldRef(me,regField[reg],Type.INT)); } return h; } @@ -1802,12 +1815,13 @@ public class ClassFileCompiler extends Compiler implements CGConst { return mg.add(PUTFIELD,new FieldRef(me,"pc",Type.INT)); } - //unused - private InstructionHandle pushFloat(int reg) throws CompilationException { return pushDouble(reg,false); } //unused - private InstructionHandle pushDouble(int reg) throws CompilationException { return pushDouble(reg,true); } + private int pushFloat(int reg) throws Exn { return pushDouble(reg,false); } private int pushDouble(int reg, boolean d) throws Exn { if(reg < F || reg >= F+32) throw new IllegalArgumentException(""+reg); int h = mg.size(); if(d) { + if(singleFloat) throw new Exn("Double operations not supported when singleFloat is enabled"); if(reg == F+31) throw new Exn("Tried to use a double in f31"); pushReg(reg+1); mg.add(I2L); @@ -1819,6 +1833,9 @@ public class ClassFileCompiler extends Compiler implements CGConst { mg.add(LAND); mg.add(LOR); mg.add(INVOKESTATIC,new MethodRef(Type.DOUBLE_OBJECT,"longBitsToDouble",Type.DOUBLE,new Type[]{Type.LONG})); + } else if(singleFloat) { + mg.add(ALOAD_0); + mg.add(GETFIELD,new FieldRef(me,regField[reg],Type.FLOAT)); } else { pushReg(reg); mg.add(INVOKESTATIC,new MethodRef("java.lang.Float","intBitsToFloat",Type.FLOAT,new Type[]{Type.INT})); @@ -1837,6 +1854,7 @@ public class ClassFileCompiler extends Compiler implements CGConst { if(reg < F || reg >= F+32) throw new IllegalArgumentException(""+reg); int h = mg.size(); if(d) { + if(singleFloat) throw new Exn("Double operations not supported when singleFloat is enabled"); if(reg == F+31) throw new Exn("Tried to use a double in f31"); mg.add(INVOKESTATIC,new MethodRef(Type.DOUBLE_OBJECT,"doubleToLongBits",Type.LONG,new Type[]{Type.DOUBLE})); mg.add(DUP2); @@ -1848,6 +1866,10 @@ public class ClassFileCompiler extends Compiler implements CGConst { setReg(); mg.add(L2I); setReg(); // preSetReg was already done for this by preSetDouble + } else if(singleFloat) { + // HACK: Clean this up + preSetRegStackPos--; + mg.add(PUTFIELD,new FieldRef(me,regField[reg],Type.FLOAT)); } else { //h = a(fac.createInvoke("java.lang.Float","floatToRawIntBits",Type.INT,new Type[]{Type.FLOAT},INVOKESTATIC)); mg.add(INVOKESTATIC,new MethodRef(Type.FLOAT_OBJECT,"floatToRawIntBits",Type.INT,new Type[]{Type.FLOAT})); @@ -1856,6 +1878,7 @@ public class ClassFileCompiler extends Compiler implements CGConst { return h; } + private final int tmpVar = 1; private void pushTmp() { mg.add(ILOAD_1); } private void setTmp() { mg.add(ISTORE_1); } diff --git a/src/org/ibex/nestedvm/Compiler.java b/src/org/ibex/nestedvm/Compiler.java index 0897789..7a1eb43 100644 --- a/src/org/ibex/nestedvm/Compiler.java +++ b/src/org/ibex/nestedvm/Compiler.java @@ -425,7 +425,8 @@ public abstract class Compiler implements Registers { "pageSize", "The page size (must be a power of two)", "totalPages", "Total number of pages (total mem = pageSize*totalPages, must be a power of two)", "onePage", "One page hack (FIXME: document this better)", - "lessConstants", "Use less constants at the cost of speed (FIXME: document this better)" + "lessConstants", "Use less constants at the cost of speed (FIXME: document this better)", + "singleFloat", "Support single precision (32-bit) FP ops only" }; private Option getOption(String name) { diff --git a/src/org/ibex/nestedvm/JavaSourceCompiler.java b/src/org/ibex/nestedvm/JavaSourceCompiler.java index 499b218..596e15f 100644 --- a/src/org/ibex/nestedvm/JavaSourceCompiler.java +++ b/src/org/ibex/nestedvm/JavaSourceCompiler.java @@ -33,6 +33,7 @@ public class JavaSourceCompiler extends Compiler { } protected void _go() throws Exn, IOException { + if(singleFloat) throw new Exn("JavaSourceCompiler doesn't support singleFloat"); String packageName; String className; if (fullClassName.indexOf('.') != -1) { diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java index c2941f0..88c18b5 100644 --- a/src/org/ibex/nestedvm/Runtime.java +++ b/src/org/ibex/nestedvm/Runtime.java @@ -2,8 +2,6 @@ // Based on org.xwt.imp.MIPS by Adam Megacz // Portions Copyright 2003 Adam Megacz -// FEATURE: Add a patch to gcc that enabled -Wall -Werror by default - package org.ibex.nestedvm; import org.ibex.nestedvm.util.*; diff --git a/upstream/Makefile b/upstream/Makefile index c375b30..7a25bee 100644 --- a/upstream/Makefile +++ b/upstream/Makefile @@ -51,7 +51,6 @@ tasks/build_gcc: tasks/build_linker tasks/build_newlib: tasks/build_gcc cross_root := $(usr)/mips-unknown-elf -libc_a := $(cross_root)/lib/libc.a tasks/download_%: if [ -z "$(url_$*)" ]; then echo "No url for $*" >&2; false; fi @@ -95,12 +94,16 @@ tasks/build_extraheaders: $(upstream)/misc/extraheaders.sh tasks/build_newlib cd $(cross_root)/include && sh $< touch $@ -tasks/build_libc: tasks/build_newlib tasks/build_extraheaders tasks/build_regex tasks/build_openbsdglob misc/extraheaders.sh $(patsubst %,$(root)/build/org/ibex/nestedvm/%.o, crt0 support support_aux) +top_lev_stuff := $(patsubst %,../build/org/ibex/nestedvm/%.o, crt0 support support_aux) + +$(top_lev_stuff): # HACK: Get the top level makefile to build the support stuff - $(MAKE) -s -C $(root) $(patsubst %,build/org/ibex/nestedvm/%.o, crt0 support support_aux) + $(MAKE) -C .. $(top_lev_stuff:../%=%) +tasks/build_libc: tasks/build_newlib tasks/build_extraheaders tasks/build_regex tasks/build_openbsdglob misc/extraheaders.sh $(top_lev_stuff) # Add our support stuff to libc - mips-unknown-elf-ar sr $(libc_a) $(patsubst %,$(root)/build/org/ibex/nestedvm/%.o, support support_aux) + mips-unknown-elf-ar sr $(cross_root)/lib/libc.a $(patsubst %,../build/org/ibex/nestedvm/%.o, support support_aux) + mips-unknown-elf-ar sr $(cross_root)/lib/single-float/libc.a $(patsubst %,../build/org/ibex/nestedvm/%.o, support support_aux) rm -f $(cross_root)/lib/crt0.o cp $(root)/build/org/ibex/nestedvm/crt0.o $(cross_root)/lib/crt0.o diff --git a/upstream/patches/gcc-fixes.patch b/upstream/patches/gcc-fixes.patch index ab6a652..d38e241 100644 --- a/upstream/patches/gcc-fixes.patch +++ b/upstream/patches/gcc-fixes.patch @@ -46,8 +46,8 @@ diff -urN ../gcc-3.3.1/gcc/config/mips/t-unknown ./gcc/config/mips/t-unknown --- ../gcc-3.3.1/gcc/config/mips/t-unknown Wed Dec 31 19:00:00 1969 +++ ./gcc/config/mips/t-unknown Mon Sep 1 01:19:35 2003 @@ -0,0 +1,3 @@ -+MULTILIB_OPTIONS= -+MULTILIB_DIRNAMES = ++MULTILIB_OPTIONS= msingle-float ++MULTILIB_DIRNAMES = single-float +MULTILIB_MATCHES = diff -urN ../gcc-3.3.1/gcc/config.gcc ./gcc/config.gcc --- ../gcc-3.3.1/gcc/config.gcc Fri Jun 27 07:44:22 2003 -- 1.7.10.4