summaryrefslogtreecommitdiff
path: root/chapter25/src/test/java/com/seaofnodes/simple/TestRisc5.java
blob: 10c75d3fa36ebdb67e0ad311a503220d002843f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.seaofnodes.simple;

import com.seaofnodes.isa.eval.EvalRisc5;

import com.seaofnodes.simple.codegen.RegAllocTestSupport.CheckedCodeGen;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.codegen.Encoding;
import com.seaofnodes.simple.node.FunNode;
import com.seaofnodes.simple.node.cpus.riscv.riscv;
import com.seaofnodes.simple.util.BAOS;
import java.io.IOException;

import static org.junit.Assert.*;

// Runs 32-bit R5 code in an emulator
public abstract class TestRisc5 {

    public static EvalRisc5 build( String src, String main, int arg, int spills, boolean print ) throws IOException {
        // Compile and export Simple
        CodeGen code = new CheckedCodeGen(src).driver("riscv", "SystemV",true,false);

        // Allocation quality not degraded
        int delta = spills>>3;
        if( delta==0 ) delta = 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);
        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( 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;
    }

}