summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/TestRisc5.java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-08-10 11:11:18 -0700
committerCliff Click <cliffc@acm.org>2026-08-10 15:21:17 -0700
commit28209703c72fb7e9955961dbdb84e24a0f871acd (patch)
tree8e4df2c1a5e6811696b454bbc4d7cd1cc30e42e7 /src/test/java/com/seaofnodes/simple/TestRisc5.java
parente57bdd315a7918a0d130e1c95648ca4a1b4f08ed (diff)
downloadSimple-linear-chapter25.tar.gz
Simple-linear-chapter25.zip
Chapter 25: Moduleslinear-chapter25
Diffstat (limited to 'src/test/java/com/seaofnodes/simple/TestRisc5.java')
-rw-r--r--src/test/java/com/seaofnodes/simple/TestRisc5.java44
1 files changed, 20 insertions, 24 deletions
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;
+ }
+
}