From 2aa8c5d1d0659bd1c828134f1a1f14d025a2d0f1 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 7 Feb 2025 08:58:36 -0800 Subject: Ch# Chapter 19: Instruction Selection and Portable Compilation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 | 34 +- src/main/java/com/seaofnodes/simple/CodeGen.java | 241 ++++++++++-- .../com/seaofnodes/simple/GlobalCodeMotion.java | 67 ++-- .../com/seaofnodes/simple/GraphVisualizer.java | 2 +- src/main/java/com/seaofnodes/simple/IRPrinter.java | 27 +- src/main/java/com/seaofnodes/simple/IterPeeps.java | 48 +-- src/main/java/com/seaofnodes/simple/JSViewer.java | 30 +- .../java/com/seaofnodes/simple/ListScheduler.java | 245 +++++++++--- src/main/java/com/seaofnodes/simple/Machine.java | 21 ++ src/main/java/com/seaofnodes/simple/Parser.java | 107 +++--- src/main/java/com/seaofnodes/simple/RegMask.java | 39 ++ src/main/java/com/seaofnodes/simple/SB.java | 17 + .../java/com/seaofnodes/simple/node/AddNode.java | 5 +- .../java/com/seaofnodes/simple/node/BoolNode.java | 27 +- .../java/com/seaofnodes/simple/node/CFGNode.java | 18 +- .../java/com/seaofnodes/simple/node/CProjNode.java | 4 +- .../com/seaofnodes/simple/node/CallEndNode.java | 12 +- .../java/com/seaofnodes/simple/node/CallNode.java | 20 +- .../com/seaofnodes/simple/node/ConstantNode.java | 14 +- .../java/com/seaofnodes/simple/node/CtrlNode.java | 3 +- .../java/com/seaofnodes/simple/node/FunNode.java | 38 +- .../java/com/seaofnodes/simple/node/IfNode.java | 7 +- .../java/com/seaofnodes/simple/node/LoadNode.java | 47 ++- .../java/com/seaofnodes/simple/node/LoopNode.java | 1 + .../seaofnodes/simple/node/MachConcreteNode.java | 27 ++ .../java/com/seaofnodes/simple/node/MachNode.java | 49 +++ .../com/seaofnodes/simple/node/MemMergeNode.java | 8 +- .../java/com/seaofnodes/simple/node/MemOpNode.java | 13 + .../java/com/seaofnodes/simple/node/MulNode.java | 30 +- .../java/com/seaofnodes/simple/node/MultiUse.java | 5 - .../java/com/seaofnodes/simple/node/NewNode.java | 30 +- src/main/java/com/seaofnodes/simple/node/Node.java | 107 +++--- .../java/com/seaofnodes/simple/node/ParmNode.java | 3 +- .../java/com/seaofnodes/simple/node/PhiNode.java | 7 +- .../java/com/seaofnodes/simple/node/ProjNode.java | 6 +- .../com/seaofnodes/simple/node/ReadOnlyNode.java | 1 + .../com/seaofnodes/simple/node/RegionNode.java | 70 ++-- .../com/seaofnodes/simple/node/ReturnNode.java | 5 +- .../java/com/seaofnodes/simple/node/ScopeNode.java | 4 +- .../java/com/seaofnodes/simple/node/StartNode.java | 6 +- .../java/com/seaofnodes/simple/node/StopNode.java | 1 + .../java/com/seaofnodes/simple/node/StoreNode.java | 46 +-- .../java/com/seaofnodes/simple/node/XCtrlNode.java | 3 +- .../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 +++++++++++++++++++++ src/main/java/com/seaofnodes/simple/type/Type.java | 4 - .../com/seaofnodes/simple/type/TypeFunPtr.java | 68 +--- .../com/seaofnodes/simple/type/TypeStruct.java | 10 +- 87 files changed, 2995 insertions(+), 535 deletions(-) create mode 100644 src/main/java/com/seaofnodes/simple/ASMPrinter.java create mode 100644 src/main/java/com/seaofnodes/simple/Machine.java create mode 100644 src/main/java/com/seaofnodes/simple/RegMask.java create mode 100644 src/main/java/com/seaofnodes/simple/node/MachConcreteNode.java create mode 100644 src/main/java/com/seaofnodes/simple/node/MachNode.java delete mode 100644 src/main/java/com/seaofnodes/simple/node/MultiUse.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFMemX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddMemX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpMemX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivFX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FltX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/I2f8X86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/IntX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LeaX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemOpX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulFX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ParmX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ProjX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubFX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/TFPX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/XorIX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java (limited to 'src/main') diff --git a/src/main/java/com/seaofnodes/simple/ASMPrinter.java b/src/main/java/com/seaofnodes/simple/ASMPrinter.java new file mode 100644 index 00000000..5cc13210 --- /dev/null +++ b/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