From fcce1e13814a02d8358eae9a40e33a7e6f2b5400 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 13 Jun 2025 15:42:08 -0700 Subject: Unifying Structs and Arrays --- src/test/java/com/seaofnodes/simple/Simple.java | 289 ------------------------ 1 file changed, 289 deletions(-) delete mode 100644 src/test/java/com/seaofnodes/simple/Simple.java (limited to 'src/test/java/com/seaofnodes/simple/Simple.java') diff --git a/src/test/java/com/seaofnodes/simple/Simple.java b/src/test/java/com/seaofnodes/simple/Simple.java deleted file mode 100644 index 5eab4842..00000000 --- a/src/test/java/com/seaofnodes/simple/Simple.java +++ /dev/null @@ -1,289 +0,0 @@ -package com.seaofnodes.simple; - -import com.seaofnodes.simple.codegen.CodeGen; -import com.seaofnodes.simple.print.*; -import com.seaofnodes.simple.util.Utils; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.stream.Collectors; - -public class Simple { - public static final String PORTS = "com.seaofnodes.simple.node.cpus"; - - static final int DUMP_AFTER_PARSE = 1<<0; - static final int DUMP_AFTER_OPTO = 1<<1; - static final int DUMP_AFTER_TYPE_CHECK = 1<<2; - static final int DUMP_AFTER_LOOP_TREE = 1<<3; - static final int DUMP_AFTER_SELECT = 1<<4; - static final int DUMP_AFTER_GCM = 1<<5; - static final int DUMP_AFTER_LOCAL_SCHED = 1<<6; - static final int DUMP_AFTER_REG_ALLOC = 1<<7; - static final int DUMP_AFTER_ENCODE = 1<<8; - - static final int DUMP_FINAL = 1<<16; - - static final int DUMP_DOT = 1<<29; - static final int DUMP_PASS_NAME = 1<<30; - static final int DUMP_AFTER_ALL = 0xff | DUMP_PASS_NAME; - static final int DUMP_DOT_AFTER_ALL = 0xff | DUMP_DOT; - - static final int DUMP_DISASSEMBLE = 1<<31; - - static void usage() { - System.out.println( -""" -simple [options] ...args... -Options: - --dump - dump final intermediate representation - --dump-after-parse - dump intermediate representation after parse - --dump-after-opto - dump intermediate representation after opto pass - --dump-after-type-check - dump intermediate representation after type check pass - --dump-after-select - dump intermediate representation after instrution selection pass - --dump-after-gcm - dump intermediate representation after GCM pass - --dump-after-local-sched - dump intermediate representation after local scheduling pass - --dump-after-reg-alloc - dump intermediate representation after register allocation pass - --dump-after-encode - dump intermediate representation after encoding pass - --dump-after-all - dump intermediate representation after all passes - --dot - dump grapical representation of intermediate code into *.dot file(s) - -S - dump generated assembler code - --eval - evaluate the compiled code in emulator - --run - run the compiled code natively; this is the default - --dump-size - print the size of generated code - --dump-time - print compilation and execution times - --cpu - use specific CPU (x86_64_v2, riscv, arm) - --abi - use speific ABI variant (SystemV) - --target - print native CPU and ABI - --version - --help -""" -); - System.exit(0); - } - - static void bad_usage() { bad("Invalid usage (use --help)"); } - static RuntimeException bad(String err) { - System.err.println("ERROR: "+err); - System.exit(1); - return new RuntimeException(err); - } - - static void target() { - System.out.print(TestC.CPU_PORT); - System.out.print("-"); - System.out.println(TestC.CALL_CONVENTION); - } - - static void dump(CodeGen code, int dump, int pass) { - if ((dump & pass) != 0) { - if ((dump & DUMP_DOT) != 0) { - String fn = switch (pass) { - case DUMP_AFTER_PARSE -> "01-parse.dot"; - case DUMP_AFTER_OPTO -> "02-opto.dot"; - case DUMP_AFTER_TYPE_CHECK -> "03-type_check.dot"; - case DUMP_AFTER_LOOP_TREE -> "04-loop_tree.dot"; - case DUMP_AFTER_SELECT -> "05-instr_select.dot"; - case DUMP_AFTER_GCM -> "06-gcm.dot"; - case DUMP_AFTER_LOCAL_SCHED -> "07-local_sched.dot"; - case DUMP_AFTER_REG_ALLOC -> "08-reg_allos.dot"; - case DUMP_AFTER_ENCODE -> "09-local_sched.dot"; - case DUMP_FINAL -> "10-final.dot"; - default -> throw Utils.TODO(); - }; - - try { - Files.writeString(Path.of(fn), - new GraphVisualizer().generateDotOutput(code._stop, null, null)); - } catch(IOException e) { throw bad("Cannot write DOT file"); } - } else { - if ((dump & DUMP_PASS_NAME) != 0) { - System.err.println(switch (pass) { - case DUMP_AFTER_PARSE -> "After Parse:"; - case DUMP_AFTER_OPTO -> "After OPTO:"; - case DUMP_AFTER_TYPE_CHECK -> "After Type Check:"; - case DUMP_AFTER_LOOP_TREE -> "After Loop Tree:"; - case DUMP_AFTER_SELECT -> "After Code Selection:"; - case DUMP_AFTER_GCM -> "After GCM:"; - case DUMP_AFTER_LOCAL_SCHED -> "After Local Scheduling:"; - case DUMP_AFTER_REG_ALLOC -> "After Register Allocation:"; - case DUMP_AFTER_ENCODE -> "After Encoding:"; - case DUMP_FINAL -> "Final:"; - default -> throw Utils.TODO(); - }); - } - - System.err.println(IRPrinter.prettyPrint(code._stop, 9999)); - } - } - } - - static void print_compilation_times(CodeGen code) { - double t, total = 0; - - total += t = code._tParse / 1e3; - System.out.printf( "Parsing Time: %.3f sec%n", t); - total += t = code._tOpto / 1e3; - System.out.printf( "Optimization Time: %.3f sec%n", t); - total += t = code._tTypeCheck / 1e3; - System.out.printf( "Type Checking Time: %.3f sec%n", t); - total += t = code._tLoopTree / 1e3; - System.out.printf( "Loop Tree Time: %.3f sec%n", t); - total += t = code._tInsSel / 1e3; - System.out.printf( "Code Selection Time: %.3f sec%n", t); - total += t = code._tGCM / 1e3; - System.out.printf( "GCM Time: %.3f sec%n", t); - total += t = code._tLocal / 1e3; - System.out.printf( "Local Scheduling Time: %.3f sec%n", t); - total += t = code._tRegAlloc / 1e3; - System.out.printf( "Register Allocation Time: %.3f sec%n", t); - total += t = code._tEncode / 1e3; - System.out.printf( "Encoding Time: %.3f sec%n", t); - System.out.printf( "TOTAL COMPILATION TIME: %.3f sec%n", total); - } - - static String getInput() { - BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - return reader.lines().collect(Collectors.joining("\n")); - } - - public static void main(String[] args) throws Exception { - String input_filename = null; - boolean do_eval = false; - boolean do_run = true; - boolean do_codegen = false; - boolean do_print_size = false; - boolean do_print_time = false; - int dump = 0; - int first_arg = 0; - String src = null; - String cpu = null; - String abi = null; - - // Parse command line - int i; for( i = 0; i < args.length; i++ ) { - String arg = args[i]; - if( arg.charAt(0) != '-' ) { - input_filename = arg; - break; - } - - switch (arg) { - case "-": input_filename=""; break; - case "--dump": dump |= DUMP_FINAL; break; - case "--dump-after-parse": dump |= DUMP_AFTER_PARSE; break; - case "--dump-after-opto": dump |= DUMP_AFTER_OPTO; break; - case "--dump-after-type-check": dump |= DUMP_AFTER_TYPE_CHECK; break; - case "--dump-after-loop-tree": dump |= DUMP_AFTER_LOOP_TREE; break; - case "--dump-after-select": dump |= DUMP_AFTER_SELECT; break; - case "--dump-after-gcm": dump |= DUMP_AFTER_GCM; break; - case "--dump-after-local-sched": dump |= DUMP_AFTER_LOCAL_SCHED; break; - case "--dump-after-reg-alloc": dump |= DUMP_AFTER_REG_ALLOC; break; - case "--dump-after-encode": dump |= DUMP_AFTER_ENCODE; break; - case "--dump-after-all": dump |= DUMP_AFTER_ALL; break; - case "--dot": dump |= DUMP_DOT; break; - case "-S": dump |= DUMP_DISASSEMBLE; break; - case "--eval": do_eval = true ; do_run = false; break; - case "--run": do_run = true ; break; - case "--norun": do_run = false; break; - case "--dump-size": do_print_size = true; break; - case "--dump-time": do_print_time = true; break; - case "--cpu": if (cpu != null || i + 1 >= args.length || args[i + 1].charAt(0) == '-') bad_usage(); - cpu = args[++i]; - break; - case "--abi": if (abi != null || i + 1 >= args.length || args[i + 1].charAt(0) == '-') bad_usage(); - abi = args[++i]; - break; - case "--target": target(); break; - case "--version": throw Utils.TODO(); - case "--help": usage(); - default: bad_usage(); - } - } - - if (input_filename == null) throw bad("no input file' (use --help)"); - if( !input_filename.isEmpty() && !input_filename.endsWith(".smp") ) - throw bad("File extension must be .smp"); - String base = input_filename.substring(0,input_filename.length()-4); - - if (do_run || (dump & DUMP_DISASSEMBLE) != 0 || do_print_size) { - if (cpu == null) cpu = TestC.CPU_PORT; - if (abi == null) abi = TestC.CALL_CONVENTION; - do_codegen = true; - } - - // Read input file - try { - src = input_filename.isEmpty() ? getInput() : Files.readString(Path.of(input_filename)); - } catch( IOException e ) { throw bad("Cannot read input file: "+input_filename); } - - // Compilation pipeline - CodeGen code = new CodeGen(src); - - code.parse(); - dump(code, dump, DUMP_AFTER_PARSE); - - code.opto(); - dump(code, dump, DUMP_AFTER_OPTO); - - code.typeCheck(); - dump(code, dump, DUMP_AFTER_TYPE_CHECK); - - code.loopTree(); - dump(code, dump, DUMP_AFTER_LOOP_TREE); - - if (do_codegen) { - code.instSelect(cpu, abi, PORTS); - dump(code, dump, DUMP_AFTER_SELECT); - } - - code.GCM(); - dump(code, dump, DUMP_AFTER_GCM); - - code.localSched(); - dump(code, dump, DUMP_AFTER_LOCAL_SCHED); - - if (do_codegen) { - code.regAlloc(); - dump(code, dump, DUMP_AFTER_REG_ALLOC); - - code.encode(); - dump(code, dump, DUMP_AFTER_ENCODE); - - code.exportELF(base+".o"); - } - - dump(code, dump, DUMP_FINAL); - - if (do_codegen && (dump & DUMP_DISASSEMBLE) != 0) { - System.out.println(code.asm()); - } - - if (do_print_size) { - System.out.printf( "Code Size: %d%n", code._encoding._bits.size()); - } - - if (do_print_time) { - print_compilation_times(code); - } - - if (do_eval) { - // TODO: Support for evaluation of functions with different argument numbers and types - long t = System.currentTimeMillis(); - long arg = (i+1 < args.length) ? Integer.parseInt(args[i+1]) : 0; - System.out.println(Eval2.eval(code, arg, 100000)); - if (do_print_time) { - System.out.printf( "EXECUTION TIME: %.3f sec%n", - (System.currentTimeMillis() - t) / 1e3); - } - } - if (do_run) { - if ( !TestC.CPU_PORT.equals( cpu ) || !TestC.CALL_CONVENTION.equals( abi ) ) - throw bad("cannot run code on not native target"); - String exe = TestC.OS.startsWith("Windows") ? base+".exe" : base; - String result = com.seaofnodes.simple.TestC.gcc(base+".o", null, null, true, exe); - System.out.print(result); - } - } -} -- cgit v1.2.3