From 34e7282dd7c58b49702c7ecd9f80a46398efd0c1 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 7 Feb 2025 08:58:36 -0800 Subject: Ch19 (#155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial push Major CodeGen cleanup; most static globals move into the CodeGen object. * Minor progress bug with mutual recursion * Add test from pr#148 * First cut x86 "port" Only "return 0;", no registers, no encoding, but yah gotta start somewhere * Update README.md * Update README.md * Update ListScheduler.java * command line launcher for simple Parser bug fref in args Some new test cases. * Add basic RegMask for more than 64 bits of register mask. Add calling convention basics to X86; con+ret RegMasks. GCM computes CFG for all users. Drop unused MultiUse. Pick up reg-pressure aware ListScheduler. Re-layout CodeGen file to get code & data chunks nearer each other. minor Ary extension * ASM Printer InstSel handles folding 2+ ideal ops into 1 machine op * handle instSel for some control flow Bool,If,CProj,Region,Phi Handle 2-op expansions Shuffle instSel graph walk back again. * Basic if-block inst selects and asm prints * Add mul-by-coinstant to shift * left shift codegen basic * exclude RSP from *write* mask * 2-arg add (not immediate) mul-by-small constant opt. Some utilities. * Handle first loop Change inst sel walk again to pre-order, to set an early visit bit to stop cycles. CFGNode copies dom/loop info. Cmp not-immediate form. Ret/Fun lazy updates * inst select for new struct allocation * Float, bitwise and arithmetic operands codegen x86-64 (#150) * left shift codegen basic * sar codegen basic * merge * some basic ops * addf * divf, subf, mulf * rsp allowed in bitwise input, not output * formatting * left shift codegen basic * sar codegen basic * merge * some basic ops * addf * divf, subf, mulf * rsp allowed in bitwise input, not output * formatting * Remove non-exsting FP+imm ops * Handle first loop Change inst sel walk again to pre-order, to set an early visit bit to stop cycles. CFGNode copies dom/loop info. Cmp not-immediate form. Ret/Fun lazy updates * float ops without imm values * merge * merge * inst select for new struct allocation * left shift codegen basic * sar codegen basic * merge * some basic ops * addf * divf, subf, mulf * rsp allowed in bitwise input, not output * formatting * Remove non-exsting FP+imm ops * left shift codegen basic * sar codegen basic * merge * some basic ops * addf * divf, subf, mulf * rsp allowed in bitwise input, not output * formatting * float ops without imm values * merge * merge * Rebased on ch 19 * Update tests --------- Co-authored-by: Cliff Click * cleanup after merge alpha-sort helper fcns implicit test vs zero/null * Add LEA op asm print works on ideal nodes for all tests * Minor cleanup lea * x86 addressing modes during inst select Drop New taking inits; just follow with initializing stores. Simplifies inst selelection which otherwise needs to undo this optimization and emit following init stores. Basic load/store for now, op-to-mem comes later add same becomes Shl by 1. Drop DivF-immiedate * extended ch13, 14,15,16 (#153) * merge2 * merge3 * Fix a few minor fuzzer bugs * Force array layout ld/st get size (but not signed/unsigned) Add unsigned LT for later range checks. * Fix a bunch of float issues was deleting required inputs * simpler invariant defensive copy inputs for simpler invariant in complex sharing patterns inc/dec form (just the opcode now). * Call & CallR X86 instructions * Add-from-memory op Remove FP immediate forms. * Remove name from TFP Never shoulda been there (but was convenient for awhile). Moved into FunNode, found by checking the linker table with a TFP. * New (#154) * merge2 * merge3 * GCM for float ops fixed, other cleanup - small extensions * call setup * merge2 * remove debug prints add check for bad call convention fix 3 tests (bad merge?) * cleanup call convention abi Needs more love at some point... * one more cleanup ABI --------- Co-authored-by: Cliff Click * Add CmpMem form Common addressing mode print LEA can skip a base * Add a AddFMemX86 A bunch of mem op patterns are missing, hopefully they are just cut-n-paste from the existing patterns. * Docs * XMM reg mask fix Minor README updates * Allow inverted cmp/mem narrowing stores can bypass an AndMask Array length loads do not need control Some missing print info * Support "*ptr op= val" at least for MemAdd * missed golden rule update * Array len is u32 load-after-store zero/sign-extends if the store is truncating * One more missed case --------- Co-authored-by: hadha Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com> --- .../java/com/seaofnodes/simple/ASMPrinter.java | 140 ++ .../src/main/java/com/seaofnodes/simple/Ary.java | 217 +++ .../main/java/com/seaofnodes/simple/CodeGen.java | 288 ++++ .../com/seaofnodes/simple/GlobalCodeMotion.java | 241 +++ .../com/seaofnodes/simple/GraphVisualizer.java | 288 ++++ .../main/java/com/seaofnodes/simple/IRPrinter.java | 279 ++++ .../main/java/com/seaofnodes/simple/IterPeeps.java | 196 +++ .../main/java/com/seaofnodes/simple/JSViewer.java | 402 +++++ .../java/com/seaofnodes/simple/ListScheduler.java | 231 +++ .../main/java/com/seaofnodes/simple/Machine.java | 21 + .../main/java/com/seaofnodes/simple/Parser.java | 1729 ++++++++++++++++++++ .../main/java/com/seaofnodes/simple/RegMask.java | 39 + .../src/main/java/com/seaofnodes/simple/SB.java | 91 ++ .../com/seaofnodes/simple/SimpleWebSocket.java | 148 ++ .../src/main/java/com/seaofnodes/simple/Utils.java | 53 + .../src/main/java/com/seaofnodes/simple/Var.java | 55 + .../java/com/seaofnodes/simple/node/AddFNode.java | 44 + .../java/com/seaofnodes/simple/node/AddNode.java | 190 +++ .../java/com/seaofnodes/simple/node/AndNode.java | 58 + .../java/com/seaofnodes/simple/node/BoolNode.java | 134 ++ .../java/com/seaofnodes/simple/node/CFGNode.java | 162 ++ .../java/com/seaofnodes/simple/node/CProjNode.java | 62 + .../com/seaofnodes/simple/node/CallEndNode.java | 90 + .../java/com/seaofnodes/simple/node/CallNode.java | 146 ++ .../java/com/seaofnodes/simple/node/CastNode.java | 58 + .../com/seaofnodes/simple/node/ConstantNode.java | 70 + .../java/com/seaofnodes/simple/node/CtrlNode.java | 15 + .../java/com/seaofnodes/simple/node/DivFNode.java | 46 + .../java/com/seaofnodes/simple/node/DivNode.java | 46 + .../java/com/seaofnodes/simple/node/FRefNode.java | 35 + .../java/com/seaofnodes/simple/node/FunNode.java | 149 ++ .../java/com/seaofnodes/simple/node/IfNode.java | 69 + .../java/com/seaofnodes/simple/node/LoadNode.java | 210 +++ .../com/seaofnodes/simple/node/LogicalNode.java | 29 + .../java/com/seaofnodes/simple/node/LoopNode.java | 86 + .../seaofnodes/simple/node/MachConcreteNode.java | 27 + .../java/com/seaofnodes/simple/node/MachNode.java | 49 + .../com/seaofnodes/simple/node/MemMergeNode.java | 154 ++ .../java/com/seaofnodes/simple/node/MemOpNode.java | 74 + .../com/seaofnodes/simple/node/MinusFNode.java | 36 + .../java/com/seaofnodes/simple/node/MinusNode.java | 40 + .../java/com/seaofnodes/simple/node/MulFNode.java | 51 + .../java/com/seaofnodes/simple/node/MulNode.java | 81 + .../java/com/seaofnodes/simple/node/MultiNode.java | 29 + .../java/com/seaofnodes/simple/node/NeverNode.java | 21 + .../java/com/seaofnodes/simple/node/NewNode.java | 83 + .../main/java/com/seaofnodes/simple/node/Node.java | 640 ++++++++ .../java/com/seaofnodes/simple/node/NotNode.java | 32 + .../java/com/seaofnodes/simple/node/OrNode.java | 55 + .../java/com/seaofnodes/simple/node/ParmNode.java | 48 + .../java/com/seaofnodes/simple/node/PhiNode.java | 201 +++ .../java/com/seaofnodes/simple/node/ProjNode.java | 55 + .../com/seaofnodes/simple/node/ReadOnlyNode.java | 30 + .../com/seaofnodes/simple/node/RegionNode.java | 126 ++ .../com/seaofnodes/simple/node/ReturnNode.java | 129 ++ .../com/seaofnodes/simple/node/RoundF32Node.java | 38 + .../java/com/seaofnodes/simple/node/SarNode.java | 50 + .../java/com/seaofnodes/simple/node/ScopeNode.java | 428 +++++ .../java/com/seaofnodes/simple/node/ShlNode.java | 53 + .../java/com/seaofnodes/simple/node/ShrNode.java | 46 + .../java/com/seaofnodes/simple/node/StartNode.java | 58 + .../java/com/seaofnodes/simple/node/StopNode.java | 64 + .../java/com/seaofnodes/simple/node/StoreNode.java | 113 ++ .../com/seaofnodes/simple/node/StructNode.java | 46 + .../java/com/seaofnodes/simple/node/SubFNode.java | 44 + .../java/com/seaofnodes/simple/node/SubNode.java | 59 + .../com/seaofnodes/simple/node/ToFloatNode.java | 34 + .../java/com/seaofnodes/simple/node/XCtrlNode.java | 16 + .../java/com/seaofnodes/simple/node/XorNode.java | 54 + .../simple/node/cpus/x86_64_v2/AddFMemX86.java | 33 + .../simple/node/cpus/x86_64_v2/AddFX86.java | 29 + .../simple/node/cpus/x86_64_v2/AddIX86.java | 39 + .../simple/node/cpus/x86_64_v2/AddMemX86.java | 25 + .../simple/node/cpus/x86_64_v2/AddX86.java | 29 + .../simple/node/cpus/x86_64_v2/AndIX86.java | 42 + .../simple/node/cpus/x86_64_v2/CallRX86.java | 31 + .../simple/node/cpus/x86_64_v2/CallX86.java | 40 + .../simple/node/cpus/x86_64_v2/CmpIX86.java | 43 + .../simple/node/cpus/x86_64_v2/CmpMemX86.java | 33 + .../simple/node/cpus/x86_64_v2/CmpX86.java | 27 + .../simple/node/cpus/x86_64_v2/DivFX86.java | 33 + .../simple/node/cpus/x86_64_v2/DivX86.java | 31 + .../simple/node/cpus/x86_64_v2/FltX86.java | 36 + .../simple/node/cpus/x86_64_v2/FunX86.java | 21 + .../simple/node/cpus/x86_64_v2/I2f8X86.java | 28 + .../simple/node/cpus/x86_64_v2/IntX86.java | 45 + .../simple/node/cpus/x86_64_v2/JmpX86.java | 46 + .../simple/node/cpus/x86_64_v2/LeaX86.java | 42 + .../simple/node/cpus/x86_64_v2/LoadX86.java | 25 + .../simple/node/cpus/x86_64_v2/MemAddX86.java | 28 + .../simple/node/cpus/x86_64_v2/MemOpX86.java | 87 + .../simple/node/cpus/x86_64_v2/MulFX86.java | 30 + .../simple/node/cpus/x86_64_v2/MulIX86.java | 36 + .../simple/node/cpus/x86_64_v2/MulX86.java | 30 + .../simple/node/cpus/x86_64_v2/NewX86.java | 40 + .../simple/node/cpus/x86_64_v2/OrIX86.java | 44 + .../simple/node/cpus/x86_64_v2/ParmX86.java | 24 + .../simple/node/cpus/x86_64_v2/ProjX86.java | 23 + .../simple/node/cpus/x86_64_v2/RetX86.java | 48 + .../simple/node/cpus/x86_64_v2/SarX86.java | 40 + .../simple/node/cpus/x86_64_v2/SetX86.java | 39 + .../simple/node/cpus/x86_64_v2/ShlIX86.java | 38 + .../simple/node/cpus/x86_64_v2/ShrIX86.java | 39 + .../simple/node/cpus/x86_64_v2/StoreX86.java | 30 + .../simple/node/cpus/x86_64_v2/SubFX86.java | 29 + .../simple/node/cpus/x86_64_v2/SubX86.java | 29 + .../simple/node/cpus/x86_64_v2/TFPX86.java | 41 + .../simple/node/cpus/x86_64_v2/XorIX86.java | 42 + .../simple/node/cpus/x86_64_v2/x86_64_v2.java | 418 +++++ .../java/com/seaofnodes/simple/type/Field.java | 74 + .../main/java/com/seaofnodes/simple/type/Type.java | 235 +++ .../java/com/seaofnodes/simple/type/TypeFloat.java | 95 ++ .../com/seaofnodes/simple/type/TypeFunPtr.java | 104 ++ .../com/seaofnodes/simple/type/TypeInteger.java | 128 ++ .../java/com/seaofnodes/simple/type/TypeMem.java | 74 + .../com/seaofnodes/simple/type/TypeMemPtr.java | 105 ++ .../java/com/seaofnodes/simple/type/TypeNil.java | 62 + .../java/com/seaofnodes/simple/type/TypePtr.java | 53 + .../java/com/seaofnodes/simple/type/TypeRPC.java | 100 ++ .../com/seaofnodes/simple/type/TypeStruct.java | 248 +++ .../java/com/seaofnodes/simple/type/TypeTuple.java | 97 ++ 121 files changed, 12369 insertions(+) create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/ASMPrinter.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/Ary.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/CodeGen.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/GraphVisualizer.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/IRPrinter.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/IterPeeps.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/JSViewer.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/ListScheduler.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/Machine.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/Parser.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/RegMask.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/SB.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/SimpleWebSocket.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/Utils.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/Var.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/AddFNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/AddNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/AndNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/BoolNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/CFGNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/CProjNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/CallEndNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/CallNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/CastNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ConstantNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/CtrlNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/DivFNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/DivNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/FRefNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/FunNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/IfNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/LoadNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/LogicalNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/LoopNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MachConcreteNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MachNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MemOpNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MinusFNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MinusNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MulFNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MulNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/MultiNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/NeverNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/NewNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/Node.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/NotNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/OrNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ParmNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/PhiNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ProjNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/RegionNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ReturnNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/SarNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ScopeNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ShlNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ShrNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/StartNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/StopNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/StoreNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/StructNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/SubFNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/XorNode.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFMemX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddMemX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpMemX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivFX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FltX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/I2f8X86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/IntX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LeaX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemOpX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulFX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ParmX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ProjX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubFX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/TFPX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/XorIX86.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/Field.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/Type.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeFloat.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeInteger.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeMem.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeNil.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypePtr.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeRPC.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeStruct.java create mode 100644 chapter19/src/main/java/com/seaofnodes/simple/type/TypeTuple.java (limited to 'chapter19/src/main/java/com') diff --git a/chapter19/src/main/java/com/seaofnodes/simple/ASMPrinter.java b/chapter19/src/main/java/com/seaofnodes/simple/ASMPrinter.java new file mode 100644 index 00000000..5cc13210 --- /dev/null +++ b/chapter19/src/main/java/com/seaofnodes/simple/ASMPrinter.java @@ -0,0 +1,140 @@ +package com.seaofnodes.simple; + +import com.seaofnodes.simple.node.*; +import com.seaofnodes.simple.SB; +import com.seaofnodes.simple.type.TypeFunPtr; +import com.seaofnodes.simple.type.TypeMem; +import com.seaofnodes.simple.type.TypeRPC; + +public abstract class ASMPrinter { + + public static SB print(SB sb, CodeGen code) { + if( code._cfg==null ) + return sb.p("Need _cfg set, run after GCM"); + + // instruction address + int iadr = 0; + for( int i=0; i