From 28209703c72fb7e9955961dbdb84e24a0f871acd Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 10 Aug 2026 11:11:18 -0700 Subject: Chapter 25: Modules --- src/test/java/com/seaofnodes/simple/TestRisc5.java | 44 ++++++++++------------ 1 file changed, 20 insertions(+), 24 deletions(-) (limited to 'src/test/java/com/seaofnodes/simple/TestRisc5.java') diff --git a/src/test/java/com/seaofnodes/simple/TestRisc5.java b/src/test/java/com/seaofnodes/simple/TestRisc5.java index a8f6817e..658909ca 100644 --- a/src/test/java/com/seaofnodes/simple/TestRisc5.java +++ b/src/test/java/com/seaofnodes/simple/TestRisc5.java @@ -1,56 +1,52 @@ package com.seaofnodes.simple; import com.seaofnodes.simple.codegen.CodeGen; +import com.seaofnodes.simple.codegen.Encoding; import com.seaofnodes.simple.node.FunNode; -import com.seaofnodes.simple.node.Node; import com.seaofnodes.simple.node.cpus.riscv.riscv; +import com.seaofnodes.simple.util.BAOS; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; + import static org.junit.Assert.*; // Runs 32-bit R5 code in an emulator public abstract class TestRisc5 { - public static EvalRisc5 build( String file, int arg, int spills, boolean print ) throws IOException { - String dir = "src/test/java/com/seaofnodes/simple/progs"; - String src = Files.readString(Path.of(dir + "/"+file+".smp")); - return build(dir,src, file, null, arg, spills, print); - } - - public static EvalRisc5 build( String name, String src, int arg, int spills, boolean print ) throws IOException { - String dir = "src/test/java/com/seaofnodes/simple/progs"; - return build(dir, src ,name, null, arg, spills, print); - } - - // Compile and run a simple program - public static EvalRisc5 build( String dir, String src, String file, String main, int arg, int spills, boolean print ) throws IOException { + public static EvalRisc5 build( String src, String main, int arg, int spills, boolean print ) throws IOException { // Compile and export Simple - CodeGen code = new CodeGen(src).driver("riscv", "SystemV",null); - if( print ) { code.print_as_hex(); System.out.print(code.asm()); } + CodeGen code = new CodeGen(src).driver("riscv", "SystemV",true,false); // Allocation quality not degraded int delta = spills>>3; if( delta==0 ) delta = 1; - if( spills != -1 ) + if( spills != -1 && !CodeGen.iterSeedOverridden() ) assertEquals("Expect spills:",spills,code._regAlloc._spillScaled,delta); // Image byte[] image = new byte[1<<20]; // A megabyte (1024*1024 bytes) EvalRisc5 R5 = new EvalRisc5(image, 1<<16); - // Code at offset 0 - System.arraycopy(code._encoding.bits(), 0, image, 0, code._encoding.bits().length); + int start = 0; // Code at offset 0 + int cpool = fill(code._encoding._bits ,image,start); + int sdata = fill(code._encoding._cpool,image,cpool); + int end = fill(code._encoding._sdata,image,sdata); + // Initial incoming int arg R5.regs[riscv.A0] = arg; // malloc memory starts at 64K and goes up // Look up starting PC or zero if not given if( main!=null ) - for( Node use : code._start._outputs ) - if( use instanceof FunNode fun && main.equals(fun._name) ) - R5._pc = code._encoding._opStart[fun._nid]; + for( FunNode fun : code._linker ) + if( fun != null && !fun.isDead() && fun._compunit == code.compunit() && main.equals(fun._name) ) + R5._pc = code._encoding.opStart(fun); return R5; } + // Fill bits into image; return end point rounded up. + private static int fill( BAOS bits, byte[] image, int off) { + System.arraycopy(bits.buf(), 0, image, off, bits.size()); + return (off+bits.size() + 15) & -16; + } + } -- cgit v1.2.3