From a8229dff7f625e882411f16857e7257045f1536e Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 7 Feb 2025 08:58:36 -0800 Subject: 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: Tamás Hadházy <85063808+Hels15@users.noreply.github.com> Co-authored-by: hadha Co-authored-by: godalming123 <68993177+godalming123@users.noreply.github.com> Co-authored-by: RobertObkircher --- .../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 | 47 +++ src/main/java/com/seaofnodes/simple/SB.java | 17 + .../java/com/seaofnodes/simple/node/AddNode.java | 3 +- .../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 | 14 +- .../java/com/seaofnodes/simple/node/CallNode.java | 22 +- .../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 | 28 +- .../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/riscv/AddFRISC.java | 30 ++ .../simple/node/cpus/riscv/AddIRISC.java | 39 ++ .../seaofnodes/simple/node/cpus/riscv/AddRISC.java | 36 ++ .../simple/node/cpus/riscv/AndIRISC.java | 40 ++ .../seaofnodes/simple/node/cpus/riscv/AndRISC.java | 41 ++ .../simple/node/cpus/riscv/CBranchRISC.java | 49 +++ .../simple/node/cpus/riscv/CallRISC.java | 37 ++ .../simple/node/cpus/riscv/CallRRISC.java | 31 ++ .../simple/node/cpus/riscv/CmpIRISC.java | 44 +++ .../seaofnodes/simple/node/cpus/riscv/CmpRISC.java | 28 ++ .../simple/node/cpus/riscv/DivFRISC.java | 30 ++ .../seaofnodes/simple/node/cpus/riscv/DivRISC.java | 33 ++ .../seaofnodes/simple/node/cpus/riscv/FltRISC.java | 39 ++ .../seaofnodes/simple/node/cpus/riscv/FunRISC.java | 22 ++ .../simple/node/cpus/riscv/I2F8RISC.java | 29 ++ .../seaofnodes/simple/node/cpus/riscv/IntRISC.java | 43 ++ .../simple/node/cpus/riscv/LoadRISC.java | 34 ++ .../simple/node/cpus/riscv/MemOpRISC.java | 36 ++ .../simple/node/cpus/riscv/MulFRISC.java | 30 ++ .../simple/node/cpus/riscv/MulIRISC.java | 35 ++ .../seaofnodes/simple/node/cpus/riscv/MulRISC.java | 33 ++ .../seaofnodes/simple/node/cpus/riscv/NewRISC.java | 44 +++ .../seaofnodes/simple/node/cpus/riscv/OrIRISC.java | 43 ++ .../seaofnodes/simple/node/cpus/riscv/OrRISC.java | 43 ++ .../simple/node/cpus/riscv/ParmRISC.java | 25 ++ .../simple/node/cpus/riscv/ProjRISC.java | 23 ++ .../seaofnodes/simple/node/cpus/riscv/RetRISC.java | 48 +++ .../seaofnodes/simple/node/cpus/riscv/SetRISC.java | 35 ++ .../simple/node/cpus/riscv/SllIRISC.java | 40 ++ .../seaofnodes/simple/node/cpus/riscv/SllRISC.java | 36 ++ .../simple/node/cpus/riscv/SraIRISC.java | 43 ++ .../seaofnodes/simple/node/cpus/riscv/SraRISC.java | 42 ++ .../simple/node/cpus/riscv/SrlIRISC.java | 43 ++ .../seaofnodes/simple/node/cpus/riscv/SrlRISC.java | 38 ++ .../simple/node/cpus/riscv/StoreRISC.java | 40 ++ .../simple/node/cpus/riscv/SubFRISC.java | 30 ++ .../seaofnodes/simple/node/cpus/riscv/SubRISC.java | 29 ++ .../seaofnodes/simple/node/cpus/riscv/TFPRISC.java | 43 ++ .../simple/node/cpus/riscv/XorIRISC.java | 45 +++ .../seaofnodes/simple/node/cpus/riscv/XorRISC.java | 43 ++ .../seaofnodes/simple/node/cpus/riscv/riscv.java | 329 +++++++++++++++ .../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/AndX86.java | 33 ++ .../simple/node/cpus/x86_64_v2/CallEndX86.java | 37 ++ .../simple/node/cpus/x86_64_v2/CallRX86.java | 31 ++ .../simple/node/cpus/x86_64_v2/CallX86.java | 41 ++ .../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 | 28 ++ .../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/OrX86.java | 33 ++ .../simple/node/cpus/x86_64_v2/ParmX86.java | 23 ++ .../simple/node/cpus/x86_64_v2/ProjX86.java | 25 ++ .../simple/node/cpus/x86_64_v2/RetX86.java | 48 +++ .../simple/node/cpus/x86_64_v2/SarIX86.java | 37 ++ .../simple/node/cpus/x86_64_v2/SarX86.java | 42 ++ .../simple/node/cpus/x86_64_v2/SetX86.java | 39 ++ .../simple/node/cpus/x86_64_v2/ShlIX86.java | 38 ++ .../simple/node/cpus/x86_64_v2/ShlX86.java | 39 ++ .../simple/node/cpus/x86_64_v2/ShrIX86.java | 40 ++ .../simple/node/cpus/x86_64_v2/ShrX86.java | 38 ++ .../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 | 440 +++++++++++++++++++++ src/main/java/com/seaofnodes/simple/type/Type.java | 4 - .../com/seaofnodes/simple/type/TypeFunPtr.java | 68 +--- .../com/seaofnodes/simple/type/TypeStruct.java | 10 +- 134 files changed, 5049 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/riscv/AddFRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/CBranchRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/CmpIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/CmpRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivFRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/FltRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/FunRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/I2F8RISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/IntRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/LoadRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulFRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/ParmRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/ProjRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/RetRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubFRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/TFPRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorIRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorRISC.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.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/AndX86.java create mode 100644 src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallEndX86.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/OrX86.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/SarIX86.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/ShlX86.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/ShrX86.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/java/com/seaofnodes') 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