From 489672dfac7efc78fc239ba7c2dfc82f1c5fbeab Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sat, 24 Oct 2026 15:41:48 -0700 Subject: Finish chapter numbering, retire combined chapter 24, and update documentation --- chapter24/#README.md# | 338 --- chapter24/.#README.md | 1 - chapter24/Makefile | 186 -- chapter24/README.ja.md | 262 --- chapter24/README.md | 338 --- chapter24/docs/24-grammar.ja.md | 168 -- chapter24/docs/24-grammar.md | 168 -- chapter24/docs/Makefile | 12 - chapter24/docs/examples/A_helloWorld.smp | 3 - chapter24/docs/examples/BubbleSort.smp | 37 - chapter24/docs/font-awesome-4.7.0.zip | Bin 669808 -> 0 bytes chapter24/docs/ifg_trim.pdf | Bin 155190 -> 0 bytes chapter24/docs/lattice.gv | 203 -- chapter24/docs/lattice.svg | 691 ------- chapter24/docs/lattice2.gv | 85 - chapter24/docs/lattice2.svg | 260 --- chapter24/docs/pardoe.docx | Bin 22583 -> 0 bytes chapter24/docs/webtcp.min.js | 65 - chapter24/pom.xml | 46 - chapter24/simple.bat | 2 - chapter24/simple.sh | 2 - .../main/java/com/seaofnodes/simple/IterPeeps.java | 230 --- .../main/java/com/seaofnodes/simple/Parser.java | 2156 -------------------- .../src/main/java/com/seaofnodes/simple/Var.java | 56 - .../com/seaofnodes/simple/codegen/BuildLRG.java | 95 - .../com/seaofnodes/simple/codegen/Coalesce.java | 105 - .../com/seaofnodes/simple/codegen/CodeGen.java | 399 ---- .../com/seaofnodes/simple/codegen/ElfExpr.java | 87 - .../com/seaofnodes/simple/codegen/ElfFile.java | 382 ---- .../com/seaofnodes/simple/codegen/Encoding.java | 543 ----- .../com/seaofnodes/simple/codegen/FinalizeIR.java | 76 - .../simple/codegen/GlobalCodeMotion.java | 311 --- .../java/com/seaofnodes/simple/codegen/IFG.java | 539 ----- .../com/seaofnodes/simple/codegen/InstSelect.java | 90 - .../java/com/seaofnodes/simple/codegen/LRG.java | 235 --- .../com/seaofnodes/simple/codegen/LinkMem.java | 23 - .../seaofnodes/simple/codegen/ListScheduler.java | 261 --- .../com/seaofnodes/simple/codegen/Machine.java | 108 - .../java/com/seaofnodes/simple/codegen/Opto.java | 182 -- .../com/seaofnodes/simple/codegen/RIPRelSize.java | 14 - .../com/seaofnodes/simple/codegen/RegAlloc.java | 704 ------- .../com/seaofnodes/simple/codegen/RegMask.java | 122 -- .../com/seaofnodes/simple/codegen/RegMaskRW.java | 36 - .../com/seaofnodes/simple/codegen/TypeCheck.java | 15 - .../java/com/seaofnodes/simple/node/AddFNode.java | 31 - .../java/com/seaofnodes/simple/node/AddNode.java | 169 -- .../java/com/seaofnodes/simple/node/AndNode.java | 48 - .../com/seaofnodes/simple/node/ArithFNode.java | 30 - .../java/com/seaofnodes/simple/node/ArithNode.java | 98 - .../java/com/seaofnodes/simple/node/BoolNode.java | 156 -- .../com/seaofnodes/simple/node/BulkMemPhiNode.java | 240 --- .../java/com/seaofnodes/simple/node/CFGNode.java | 222 -- .../java/com/seaofnodes/simple/node/CProjNode.java | 69 - .../com/seaofnodes/simple/node/CallEndMach.java | 36 - .../com/seaofnodes/simple/node/CallEndNode.java | 232 --- .../java/com/seaofnodes/simple/node/CallNode.java | 175 -- .../com/seaofnodes/simple/node/CalleeSaveNode.java | 23 - .../java/com/seaofnodes/simple/node/CastMach.java | 19 - .../java/com/seaofnodes/simple/node/CastNode.java | 71 - .../com/seaofnodes/simple/node/ConFldOffNode.java | 41 - .../com/seaofnodes/simple/node/ConstantNode.java | 59 - .../java/com/seaofnodes/simple/node/CtrlNode.java | 16 - .../java/com/seaofnodes/simple/node/DivFNode.java | 26 - .../java/com/seaofnodes/simple/node/DivNode.java | 28 - .../com/seaofnodes/simple/node/ExternNode.java | 25 - .../java/com/seaofnodes/simple/node/FRefNode.java | 35 - .../java/com/seaofnodes/simple/node/FunNode.java | 257 --- .../com/seaofnodes/simple/node/FunPtrNode.java | 12 - .../java/com/seaofnodes/simple/node/IfNode.java | 103 - .../java/com/seaofnodes/simple/node/LoadNode.java | 263 --- .../java/com/seaofnodes/simple/node/LoopNode.java | 104 - .../seaofnodes/simple/node/MachConcreteNode.java | 27 - .../java/com/seaofnodes/simple/node/MachNode.java | 60 - .../com/seaofnodes/simple/node/MemMergeNode.java | 102 - .../java/com/seaofnodes/simple/node/MemOpNode.java | 146 -- .../com/seaofnodes/simple/node/MemPhiNode.java | 49 - .../com/seaofnodes/simple/node/MinusFNode.java | 31 - .../java/com/seaofnodes/simple/node/MinusNode.java | 33 - .../java/com/seaofnodes/simple/node/MulFNode.java | 36 - .../java/com/seaofnodes/simple/node/MulNode.java | 63 - .../java/com/seaofnodes/simple/node/MultiNode.java | 29 - .../java/com/seaofnodes/simple/node/NeverNode.java | 23 - .../java/com/seaofnodes/simple/node/NewNode.java | 103 - .../main/java/com/seaofnodes/simple/node/Node.java | 693 ------- .../java/com/seaofnodes/simple/node/NotNode.java | 26 - .../java/com/seaofnodes/simple/node/OrNode.java | 42 - .../java/com/seaofnodes/simple/node/ParmNode.java | 75 - .../java/com/seaofnodes/simple/node/PhiNode.java | 311 --- .../java/com/seaofnodes/simple/node/ProjNode.java | 54 - .../com/seaofnodes/simple/node/ReadOnlyMach.java | 19 - .../com/seaofnodes/simple/node/ReadOnlyNode.java | 27 - .../com/seaofnodes/simple/node/RegionNode.java | 174 -- .../com/seaofnodes/simple/node/ReturnNode.java | 163 -- .../com/seaofnodes/simple/node/RoundF32Node.java | 34 - .../java/com/seaofnodes/simple/node/SarNode.java | 36 - .../java/com/seaofnodes/simple/node/ScopeNode.java | 530 ----- .../java/com/seaofnodes/simple/node/ShlNode.java | 48 - .../java/com/seaofnodes/simple/node/ShrNode.java | 32 - .../java/com/seaofnodes/simple/node/SplitNode.java | 28 - .../java/com/seaofnodes/simple/node/StartNode.java | 49 - .../java/com/seaofnodes/simple/node/StopNode.java | 76 - .../java/com/seaofnodes/simple/node/StoreNode.java | 183 -- .../com/seaofnodes/simple/node/StructNode.java | 47 - .../java/com/seaofnodes/simple/node/SubFNode.java | 27 - .../java/com/seaofnodes/simple/node/SubNode.java | 54 - .../com/seaofnodes/simple/node/ToFloatNode.java | 27 - .../com/seaofnodes/simple/node/ToIntegerNode.java | 23 - .../java/com/seaofnodes/simple/node/XCtrlNode.java | 16 - .../java/com/seaofnodes/simple/node/XorNode.java | 42 - .../seaofnodes/simple/node/cpus/arm/AddARM.java | 21 - .../seaofnodes/simple/node/cpus/arm/AddFARM.java | 23 - .../seaofnodes/simple/node/cpus/arm/AddIARM.java | 28 - .../seaofnodes/simple/node/cpus/arm/AndARM.java | 22 - .../seaofnodes/simple/node/cpus/arm/AndIARM.java | 25 - .../seaofnodes/simple/node/cpus/arm/AsrARM.java | 19 - .../seaofnodes/simple/node/cpus/arm/AsrIARM.java | 32 - .../seaofnodes/simple/node/cpus/arm/BranchARM.java | 78 - .../seaofnodes/simple/node/cpus/arm/CallARM.java | 51 - .../seaofnodes/simple/node/cpus/arm/CallRRARM.java | 33 - .../seaofnodes/simple/node/cpus/arm/CmpARM.java | 23 - .../seaofnodes/simple/node/cpus/arm/CmpFARM.java | 22 - .../seaofnodes/simple/node/cpus/arm/CmpIARM.java | 41 - .../seaofnodes/simple/node/cpus/arm/DivARM.java | 20 - .../seaofnodes/simple/node/cpus/arm/DivFARM.java | 20 - .../seaofnodes/simple/node/cpus/arm/ExtendARM.java | 31 - .../seaofnodes/simple/node/cpus/arm/F8ToIARM.java | 21 - .../seaofnodes/simple/node/cpus/arm/FloatARM.java | 44 - .../seaofnodes/simple/node/cpus/arm/FunARM.java | 22 - .../seaofnodes/simple/node/cpus/arm/I2F8ARM.java | 26 - .../seaofnodes/simple/node/cpus/arm/IntARM.java | 36 - .../seaofnodes/simple/node/cpus/arm/LoadARM.java | 34 - .../seaofnodes/simple/node/cpus/arm/LslARM.java | 20 - .../seaofnodes/simple/node/cpus/arm/LslIARM.java | 34 - .../seaofnodes/simple/node/cpus/arm/LsrARM.java | 20 - .../seaofnodes/simple/node/cpus/arm/LsrIARM.java | 29 - .../seaofnodes/simple/node/cpus/arm/MemOpARM.java | 79 - .../seaofnodes/simple/node/cpus/arm/MulARM.java | 20 - .../seaofnodes/simple/node/cpus/arm/MulFARM.java | 19 - .../seaofnodes/simple/node/cpus/arm/NegARM.java | 25 - .../seaofnodes/simple/node/cpus/arm/NewARM.java | 38 - .../seaofnodes/simple/node/cpus/arm/NotARM.java | 28 - .../com/seaofnodes/simple/node/cpus/arm/OrARM.java | 21 - .../seaofnodes/simple/node/cpus/arm/OrIARM.java | 25 - .../seaofnodes/simple/node/cpus/arm/ParmARM.java | 17 - .../seaofnodes/simple/node/cpus/arm/ProjARM.java | 15 - .../seaofnodes/simple/node/cpus/arm/RetARM.java | 16 - .../seaofnodes/simple/node/cpus/arm/SetARM.java | 34 - .../seaofnodes/simple/node/cpus/arm/SplitARM.java | 66 - .../simple/node/cpus/arm/SplitFlagsARM.java | 21 - .../simple/node/cpus/arm/SplitGPRARM.java | 11 - .../seaofnodes/simple/node/cpus/arm/StoreARM.java | 38 - .../seaofnodes/simple/node/cpus/arm/SubARM.java | 20 - .../seaofnodes/simple/node/cpus/arm/SubFARM.java | 19 - .../seaofnodes/simple/node/cpus/arm/SubIARM.java | 29 - .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 58 - .../seaofnodes/simple/node/cpus/arm/TMPARM.java | 55 - .../seaofnodes/simple/node/cpus/arm/UJmpARM.java | 48 - .../seaofnodes/simple/node/cpus/arm/XorARM.java | 20 - .../seaofnodes/simple/node/cpus/arm/XorIARM.java | 27 - .../com/seaofnodes/simple/node/cpus/arm/arm.java | 466 ----- .../seaofnodes/simple/node/cpus/riscv/AUIPC.java | 43 - .../simple/node/cpus/riscv/AddFRISC.java | 18 - .../simple/node/cpus/riscv/AddIRISC.java | 22 - .../seaofnodes/simple/node/cpus/riscv/AddRISC.java | 21 - .../simple/node/cpus/riscv/AndIRISC.java | 13 - .../seaofnodes/simple/node/cpus/riscv/AndRISC.java | 16 - .../simple/node/cpus/riscv/BranchRISC.java | 95 - .../simple/node/cpus/riscv/CallRISC.java | 63 - .../simple/node/cpus/riscv/CallRRISC.java | 32 - .../simple/node/cpus/riscv/DivFRISC.java | 20 - .../seaofnodes/simple/node/cpus/riscv/DivRISC.java | 17 - .../simple/node/cpus/riscv/ExtendRISC.java | 32 - .../simple/node/cpus/riscv/F8ToIRISC.java | 19 - .../seaofnodes/simple/node/cpus/riscv/FltRISC.java | 47 - .../seaofnodes/simple/node/cpus/riscv/FunRISC.java | 23 - .../simple/node/cpus/riscv/I2F8RISC.java | 24 - .../seaofnodes/simple/node/cpus/riscv/ImmRISC.java | 55 - .../simple/node/cpus/riscv/Int8RISC.java | 47 - .../seaofnodes/simple/node/cpus/riscv/IntRISC.java | 31 - .../com/seaofnodes/simple/node/cpus/riscv/LUI.java | 33 - .../simple/node/cpus/riscv/LoadRISC.java | 30 - .../simple/node/cpus/riscv/MemOpRISC.java | 80 - .../simple/node/cpus/riscv/MulFRISC.java | 18 - .../seaofnodes/simple/node/cpus/riscv/MulRISC.java | 17 - .../seaofnodes/simple/node/cpus/riscv/NegRISC.java | 21 - .../seaofnodes/simple/node/cpus/riscv/NewRISC.java | 48 - .../seaofnodes/simple/node/cpus/riscv/NotRISC.java | 22 - .../seaofnodes/simple/node/cpus/riscv/OrIRISC.java | 13 - .../seaofnodes/simple/node/cpus/riscv/OrRISC.java | 16 - .../simple/node/cpus/riscv/ParmRISC.java | 17 - .../simple/node/cpus/riscv/ProjRISC.java | 15 - .../seaofnodes/simple/node/cpus/riscv/RetRISC.java | 22 - .../simple/node/cpus/riscv/SetFRISC.java | 34 - .../simple/node/cpus/riscv/SetIRISC.java | 21 - .../seaofnodes/simple/node/cpus/riscv/SetRISC.java | 20 - .../simple/node/cpus/riscv/SllIRISC.java | 13 - .../seaofnodes/simple/node/cpus/riscv/SllRISC.java | 17 - .../simple/node/cpus/riscv/SplitRISC.java | 67 - .../simple/node/cpus/riscv/SraIRISC.java | 15 - .../seaofnodes/simple/node/cpus/riscv/SraRISC.java | 17 - .../simple/node/cpus/riscv/SrlIRISC.java | 13 - .../seaofnodes/simple/node/cpus/riscv/SrlRISC.java | 17 - .../simple/node/cpus/riscv/StoreRISC.java | 50 - .../simple/node/cpus/riscv/SubFRISC.java | 18 - .../seaofnodes/simple/node/cpus/riscv/SubRISC.java | 16 - .../seaofnodes/simple/node/cpus/riscv/TFPRISC.java | 49 - .../seaofnodes/simple/node/cpus/riscv/TMPRISC.java | 42 - .../simple/node/cpus/riscv/UJmpRISC.java | 49 - .../simple/node/cpus/riscv/XorIRISC.java | 14 - .../seaofnodes/simple/node/cpus/riscv/XorRISC.java | 16 - .../seaofnodes/simple/node/cpus/riscv/riscv.java | 428 ---- .../simple/node/cpus/x86_64_v2/AddFMemX86.java | 33 - .../simple/node/cpus/x86_64_v2/AddFX86.java | 24 - .../simple/node/cpus/x86_64_v2/AddIX86.java | 23 - .../simple/node/cpus/x86_64_v2/AddMemX86.java | 24 - .../simple/node/cpus/x86_64_v2/AddX86.java | 11 - .../simple/node/cpus/x86_64_v2/AndIX86.java | 11 - .../simple/node/cpus/x86_64_v2/AndX86.java | 11 - .../simple/node/cpus/x86_64_v2/CallRX86.java | 30 - .../simple/node/cpus/x86_64_v2/CallX86.java | 49 - .../simple/node/cpus/x86_64_v2/CmpFX86.java | 24 - .../simple/node/cpus/x86_64_v2/CmpIX86.java | 38 - .../simple/node/cpus/x86_64_v2/CmpMemX86.java | 44 - .../simple/node/cpus/x86_64_v2/CmpX86.java | 28 - .../simple/node/cpus/x86_64_v2/DivFX86.java | 24 - .../simple/node/cpus/x86_64_v2/DivX86.java | 25 - .../simple/node/cpus/x86_64_v2/ExtendX86.java | 29 - .../simple/node/cpus/x86_64_v2/F8ToIX86.java | 22 - .../simple/node/cpus/x86_64_v2/FltX86.java | 36 - .../simple/node/cpus/x86_64_v2/FunX86.java | 31 - .../simple/node/cpus/x86_64_v2/I2f8X86.java | 21 - .../simple/node/cpus/x86_64_v2/ImmX86.java | 32 - .../simple/node/cpus/x86_64_v2/IntX86.java | 40 - .../simple/node/cpus/x86_64_v2/JmpX86.java | 65 - .../simple/node/cpus/x86_64_v2/LeaX86.java | 38 - .../simple/node/cpus/x86_64_v2/LoadX86.java | 44 - .../simple/node/cpus/x86_64_v2/MemAddX86.java | 28 - .../simple/node/cpus/x86_64_v2/MemOpX86.java | 89 - .../simple/node/cpus/x86_64_v2/MulFX86.java | 24 - .../simple/node/cpus/x86_64_v2/MulIX86.java | 27 - .../simple/node/cpus/x86_64_v2/MulX86.java | 24 - .../simple/node/cpus/x86_64_v2/NegX86.java | 20 - .../simple/node/cpus/x86_64_v2/NewX86.java | 23 - .../simple/node/cpus/x86_64_v2/NotX86.java | 21 - .../simple/node/cpus/x86_64_v2/OrIX86.java | 11 - .../simple/node/cpus/x86_64_v2/OrX86.java | 11 - .../simple/node/cpus/x86_64_v2/ParmX86.java | 17 - .../simple/node/cpus/x86_64_v2/ProjX86.java | 15 - .../simple/node/cpus/x86_64_v2/RegX86.java | 22 - .../simple/node/cpus/x86_64_v2/RetX86.java | 15 - .../simple/node/cpus/x86_64_v2/SarIX86.java | 32 - .../simple/node/cpus/x86_64_v2/SarX86.java | 21 - .../simple/node/cpus/x86_64_v2/SetX86.java | 44 - .../simple/node/cpus/x86_64_v2/ShlIX86.java | 32 - .../simple/node/cpus/x86_64_v2/ShlX86.java | 21 - .../simple/node/cpus/x86_64_v2/ShrIX86.java | 27 - .../simple/node/cpus/x86_64_v2/ShrX86.java | 21 - .../simple/node/cpus/x86_64_v2/SplitFlagsX86.java | 25 - .../simple/node/cpus/x86_64_v2/SplitX86.java | 52 - .../simple/node/cpus/x86_64_v2/StoreX86.java | 48 - .../simple/node/cpus/x86_64_v2/SubFX86.java | 23 - .../simple/node/cpus/x86_64_v2/SubX86.java | 10 - .../simple/node/cpus/x86_64_v2/TFPX86.java | 53 - .../simple/node/cpus/x86_64_v2/TMPX86.java | 40 - .../simple/node/cpus/x86_64_v2/UJmpX86.java | 41 - .../simple/node/cpus/x86_64_v2/XorIX86.java | 11 - .../simple/node/cpus/x86_64_v2/XorX86.java | 11 - .../simple/node/cpus/x86_64_v2/x86_64_v2.java | 564 ----- .../com/seaofnodes/simple/print/ASMPrinter.java | 85 - .../com/seaofnodes/simple/print/IRPrinter.java | 61 - .../simple/print/SimpleGraphAdapter.java | 57 - .../simple/print/SimpleGraphObserver.java | 35 - .../src/main/java/com/seaofnodes/simple/sys.java | 25 - .../java/com/seaofnodes/simple/type/Field.java | 136 -- .../main/java/com/seaofnodes/simple/type/Type.java | 526 ----- .../com/seaofnodes/simple/type/TypeConAry.java | 79 - .../com/seaofnodes/simple/type/TypeConAryB.java | 20 - .../com/seaofnodes/simple/type/TypeConAryI.java | 16 - .../java/com/seaofnodes/simple/type/TypeFloat.java | 110 - .../com/seaofnodes/simple/type/TypeFunPtr.java | 269 --- .../com/seaofnodes/simple/type/TypeInteger.java | 183 -- .../java/com/seaofnodes/simple/type/TypeMem.java | 110 - .../com/seaofnodes/simple/type/TypeMemPtr.java | 177 -- .../java/com/seaofnodes/simple/type/TypeNil.java | 62 - .../java/com/seaofnodes/simple/type/TypePtr.java | 55 - .../java/com/seaofnodes/simple/type/TypeRPC.java | 111 - .../com/seaofnodes/simple/type/TypeStruct.java | 493 ----- .../java/com/seaofnodes/simple/type/TypeTuple.java | 119 -- .../main/java/com/seaofnodes/simple/util/Ary.java | 229 --- .../java/com/seaofnodes/simple/util/AryInt.java | 192 -- .../main/java/com/seaofnodes/simple/util/SB.java | 99 - .../java/com/seaofnodes/simple/util/Utils.java | 53 - chapter24/src/main/smp/sys.smp | 199 -- .../java/com/seaofnodes/simple/BrainFuckTest.java | 89 - .../java/com/seaofnodes/simple/Chapter01Test.java | 95 - .../java/com/seaofnodes/simple/Chapter02Test.java | 61 - .../java/com/seaofnodes/simple/Chapter03Test.java | 66 - .../java/com/seaofnodes/simple/Chapter04Test.java | 159 -- .../java/com/seaofnodes/simple/Chapter05Test.java | 201 -- .../java/com/seaofnodes/simple/Chapter06Test.java | 305 --- .../java/com/seaofnodes/simple/Chapter07Test.java | 222 -- .../java/com/seaofnodes/simple/Chapter08Test.java | 208 -- .../java/com/seaofnodes/simple/Chapter09Test.java | 299 --- .../java/com/seaofnodes/simple/Chapter10Test.java | 609 ------ .../java/com/seaofnodes/simple/Chapter11Test.java | 61 - .../java/com/seaofnodes/simple/Chapter12Test.java | 283 --- .../java/com/seaofnodes/simple/Chapter13Test.java | 266 --- .../com/seaofnodes/simple/Chapter14FloatTest.java | 103 - .../java/com/seaofnodes/simple/Chapter14Test.java | 228 --- .../java/com/seaofnodes/simple/Chapter15Test.java | 417 ---- .../java/com/seaofnodes/simple/Chapter16Test.java | 172 -- .../java/com/seaofnodes/simple/Chapter17aTest.java | 106 - .../java/com/seaofnodes/simple/Chapter17bTest.java | 583 ------ .../java/com/seaofnodes/simple/Chapter18Test.java | 544 ----- .../java/com/seaofnodes/simple/Chapter19Test.java | 507 ----- .../java/com/seaofnodes/simple/Chapter20Test.java | 430 ---- .../com/seaofnodes/simple/Chapter21AllocTest.java | 55 - .../java/com/seaofnodes/simple/Chapter21Test.java | 727 ------- .../java/com/seaofnodes/simple/Chapter22Test.java | 432 ---- .../com/seaofnodes/simple/Chapter23AllocTest.java | 37 - .../java/com/seaofnodes/simple/Chapter23Test.java | 422 ---- .../com/seaofnodes/simple/Chapter24AllocTest.java | 170 -- .../java/com/seaofnodes/simple/Chapter24Test.java | 735 ------- .../test/java/com/seaofnodes/simple/Compile.java | 65 - .../seaofnodes/simple/CompoundAssignmentTest.java | 94 - .../src/test/java/com/seaofnodes/simple/Eval2.java | 489 ----- .../java/com/seaofnodes/simple/FuzzerWrap.java | 58 - .../java/com/seaofnodes/simple/LiteralTest.java | 65 - .../src/test/java/com/seaofnodes/simple/Main.java | 18 - .../com/seaofnodes/simple/MemoryEncodingTest.java | 181 -- .../java/com/seaofnodes/simple/MergeSortTest.java | 85 - .../java/com/seaofnodes/simple/MutabilityTest.java | 73 - .../com/seaofnodes/simple/NativeAddressTest.java | 54 - .../test/java/com/seaofnodes/simple/PhaseTest.java | 56 - .../java/com/seaofnodes/simple/SchedulerTest.java | 94 - .../test/java/com/seaofnodes/simple/Simple.java | 217 -- .../java/com/seaofnodes/simple/SpillStats.java | 73 - .../test/java/com/seaofnodes/simple/TestArm64.java | 51 - .../src/test/java/com/seaofnodes/simple/TestC.java | 137 -- .../test/java/com/seaofnodes/simple/TestRisc5.java | 57 - .../test/java/com/seaofnodes/simple/TypeTest.java | 235 --- .../simple/codegen/FlagSpillTestSupport.java | 145 -- .../simple/codegen/PrintRegTestSupport.java | 26 - .../simple/codegen/RegAllocTestSupport.java | 346 ---- .../seaofnodes/simple/codegen/X86EncodingTest.java | 123 -- .../com/seaofnodes/simple/evaluator/Evaluator.java | 380 ---- .../com/seaofnodes/simple/evaluator/Scheduler.java | 605 ------ .../java/com/seaofnodes/simple/fuzzer/Fuzzer.java | 188 -- .../com/seaofnodes/simple/fuzzer/FuzzerUtils.java | 111 - .../java/com/seaofnodes/simple/fuzzer/Reducer.java | 177 -- .../seaofnodes/simple/fuzzer/ScriptGenerator.java | 940 --------- .../java/com/seaofnodes/simple/progs/arg_count.c | 10 - .../java/com/seaofnodes/simple/progs/arg_count.smp | 6 - .../java/com/seaofnodes/simple/progs/array1.smp | 9 - .../java/com/seaofnodes/simple/progs/brain_fuck.c | 18 - .../java/com/seaofnodes/simple/progs/c_returns.c | 28 - .../test/java/com/seaofnodes/simple/progs/fib.c | 16 - .../test/java/com/seaofnodes/simple/progs/funptr.c | 15 - .../test/java/com/seaofnodes/simple/progs/jig.smp | 16 - .../test/java/com/seaofnodes/simple/progs/loop2.c | 7 - .../java/com/seaofnodes/simple/progs/newtonFloat.c | 16 - .../com/seaofnodes/simple/progs/newtonFloat.smp | 12 - .../seaofnodes/simple/progs/no_stack_arg_count.smp | 6 - .../test/java/com/seaofnodes/simple/progs/person.c | 34 - .../java/com/seaofnodes/simple/progs/person21.c | 34 - .../java/com/seaofnodes/simple/progs/person21.smp | 9 - .../test/java/com/seaofnodes/simple/progs/sieve.c | 19 - .../test/java/com/seaofnodes/simple/progs/sort.c | 28 - .../com/seaofnodes/simple/progs/stacked_r_10x.c | 13 - .../com/seaofnodes/simple/progs/stacked_r_11x.c | 13 - .../com/seaofnodes/simple/progs/stacked_r_12x.c | 13 - .../com/seaofnodes/simple/progs/stacked_r_13x.c | 13 - .../com/seaofnodes/simple/progs/stacked_r_9x.c | 13 - .../java/com/seaofnodes/simple/progs/stringHash.c | 30 - .../com/seaofnodes/simple/progs/stringHash.smp | 30 - .../com/seaofnodes/simple/progs/stringHash21.smp | 31 - 376 files changed, 39513 deletions(-) delete mode 100644 chapter24/#README.md# delete mode 100644 chapter24/.#README.md delete mode 100644 chapter24/Makefile delete mode 100644 chapter24/README.ja.md delete mode 100644 chapter24/README.md delete mode 100644 chapter24/docs/24-grammar.ja.md delete mode 100644 chapter24/docs/24-grammar.md delete mode 100644 chapter24/docs/Makefile delete mode 100644 chapter24/docs/examples/A_helloWorld.smp delete mode 100644 chapter24/docs/examples/BubbleSort.smp delete mode 100644 chapter24/docs/font-awesome-4.7.0.zip delete mode 100644 chapter24/docs/ifg_trim.pdf delete mode 100644 chapter24/docs/lattice.gv delete mode 100644 chapter24/docs/lattice.svg delete mode 100644 chapter24/docs/lattice2.gv delete mode 100644 chapter24/docs/lattice2.svg delete mode 100644 chapter24/docs/pardoe.docx delete mode 100644 chapter24/docs/webtcp.min.js delete mode 100644 chapter24/pom.xml delete mode 100644 chapter24/simple.bat delete mode 100644 chapter24/simple.sh delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/IterPeeps.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/Parser.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/Var.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/BuildLRG.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/Coalesce.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/ElfExpr.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/ElfFile.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/Encoding.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/FinalizeIR.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/IFG.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/InstSelect.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/LRG.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/LinkMem.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/ListScheduler.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/Machine.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/Opto.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/RIPRelSize.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/RegMask.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/RegMaskRW.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/AddFNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/AddNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/AndNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ArithFNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ArithNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/BoolNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/BulkMemPhiNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CFGNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CProjNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CallEndMach.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CallEndNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CallNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CalleeSaveNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CastMach.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CastNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ConFldOffNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ConstantNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/CtrlNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/DivFNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/DivNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ExternNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/FRefNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/FunNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/FunPtrNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/IfNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/LoadNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/LoopNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MachConcreteNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MachNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MemOpNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MemPhiNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MinusFNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MinusNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MulFNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MulNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/MultiNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/NeverNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/NewNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/Node.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/NotNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/OrNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ParmNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/PhiNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ProjNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ReadOnlyMach.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/RegionNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ReturnNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/SarNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ScopeNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ShlNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ShrNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/SplitNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/StartNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/StopNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/StoreNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/StructNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/SubFNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/ToIntegerNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/XorNode.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/AddARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/AddFARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/AddIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/AndARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/AndIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/AsrARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/AsrIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallRRARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/CmpARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/CmpFARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/CmpIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/DivARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/DivFARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/ExtendARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/F8ToIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/FloatARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/FunARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/I2F8ARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/IntARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/LoadARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/LslARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/LslIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/LsrARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/LsrIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/MemOpARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/MulARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/MulFARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/NegARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/NotARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/ParmARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/ProjARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/RetARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/SetARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/SplitARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/SplitFlagsARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/SplitGPRARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/StoreARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/SubARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/SubFARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/SubIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/TMPARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/UJmpARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/XorARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/XorIARM.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AUIPC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddFRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivFRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ExtendRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/F8ToIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/FltRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/FunRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/I2F8RISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/Int8RISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/IntRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/LUI.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/LoadRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulFRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NegRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NotRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ParmRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ProjRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/RetRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetFRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SplitRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubFRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/TFPRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/TMPRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorIRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorRISC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFMemX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddMemX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpFX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpMemX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivFX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ExtendX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/F8ToIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FltX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/I2f8X86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ImmX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/IntX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LeaX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemOpX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulFX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NegX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NotX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ParmX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ProjX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitFlagsX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubFX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/TFPX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/TMPX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/XorIX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/XorX86.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/print/IRPrinter.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/sys.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/Field.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/Type.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeConAry.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeConAryB.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeConAryI.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeFloat.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeInteger.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeMem.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeNil.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypePtr.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeRPC.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeStruct.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/type/TypeTuple.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/util/Ary.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/util/AryInt.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/util/SB.java delete mode 100644 chapter24/src/main/java/com/seaofnodes/simple/util/Utils.java delete mode 100644 chapter24/src/main/smp/sys.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/BrainFuckTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter01Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter02Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter03Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter04Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter05Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter06Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter07Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter08Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter09Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter10Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter11Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter12Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter13Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter14FloatTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter14Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter15Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter16Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter17aTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter17bTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter18Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter19Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter20Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter21AllocTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter21Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter22Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter23AllocTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter23Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter24AllocTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Chapter24Test.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Compile.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/CompoundAssignmentTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Eval2.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/FuzzerWrap.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/LiteralTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Main.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/MemoryEncodingTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/MergeSortTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/MutabilityTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/NativeAddressTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/PhaseTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/SchedulerTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/Simple.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/SpillStats.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/TestArm64.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/TestC.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/TestRisc5.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/TypeTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/codegen/FlagSpillTestSupport.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/codegen/PrintRegTestSupport.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/codegen/RegAllocTestSupport.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/codegen/X86EncodingTest.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/fuzzer/Reducer.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/arg_count.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/arg_count.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/array1.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/brain_fuck.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/c_returns.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/fib.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/funptr.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/jig.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/loop2.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/newtonFloat.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/newtonFloat.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/no_stack_arg_count.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/person.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/person21.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/person21.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/sieve.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/sort.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stacked_r_10x.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stacked_r_11x.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stacked_r_12x.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stacked_r_13x.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stacked_r_9x.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stringHash.c delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stringHash.smp delete mode 100644 chapter24/src/test/java/com/seaofnodes/simple/progs/stringHash21.smp (limited to 'chapter24') diff --git a/chapter24/#README.md# b/chapter24/#README.md# deleted file mode 100644 index 9b973a09..00000000 --- a/chapter24/#README.md# +++ /dev/null @@ -1,338 +0,0 @@ -# Chapter 24: Chaining Relationals and Sparse Conditional Constant Propagation - -English | [日本語](README.ja.md) - -[Previous: Chapter 23](../chapter23/README.md) | -[Next: Chapter 25](../chapter25/README.md) - -In this Chapter we allow *chaining* conditionals, e.g. `(60 <= score < 90)` -where `score` in the middle does not have to be repeated. - -The main compiler change is Interprocedural Sparse Conditional Constant -Propagation (SCCP): an optimistic type solve which also discovers call-graph -edges. SCCP is otherwise the traditional one taught in many classes, except -the lattice it operates on is very rich. - -A new syntax feature is chaining conditions, ala `lo <= x < min` is legal syntax. - -You can also read [this chapter](https://github.com/SeaOfNodes/Simple/tree/linear-chapter24) in a linear Git revision history on the [linear](https://github.com/SeaOfNodes/Simple/tree/linear) branch and [compare](https://github.com/SeaOfNodes/Simple/compare/linear-chapter23...linear-chapter24) it to the previous chapter. - - -Here is the [complete language grammar](docs/24-grammar.md) for this chapter. - - -## Sparse Conditional Constant Propagation - -[SCCP](https://en.wikipedia.org/wiki/Sparse_conditional_constant_propagation) -is the top-down version of the same peephole/constant-folding work we have -been doing all along. The rules for the algorithm are well known from the -literature and commonly taught at the college level; -[example slides](https://www.cse.psu.edu/~gxt29/teaching/cse522s23/slides/08monotoneFramework.pdf). - -- We have a lattice already -- We have SSA form already (hence the algorithm is *sparse*) -- We have a mapping from Nodes to Types (`Node._type`) -- We have transfer functions (`Node.compute`) already. - -We initialize all `_type` fields to ⊤ (as opposed to ⊥), and place all Nodes on -a worklist. We pull a Node from the worklist, run the transfer function -`node.compute()`, and if the result changes from `node._type` we update -`node._type` and put its output neighbors on the worklist. A simplified -version with all asserts and debug helpers removed: - -```java -while( (n = code._iter._work.pop()) != null ) { - Type nval = n.compute(); - if( n._type != nval ) { - assert n._type.isa(nval); // Types start high and always fall - n._type = nval; // Update type in Node - code._iter.addAll(n._outputs);// Neighbors might change, need to inspect - } -} -``` - -This algorithm always terminates (and generally fairly quickly) and always -reaches a *fixed point*, as "best answer" subject to the limits of our lattice -and transfer functions. The resulting types are monotonically better than -those found by the peephole rules; we can then run the peephole rules on nodes -with improved types, to see if unrelated peepholes can fire - such as newly -discovered constants replacing computations with ConstantNodes. - -The following is SSA pseudocode: - -```text -int x0 = 1; // x0 = 1 -while( rand ) { - x1 = phi(x0,x2); // x1 = BOT = phi(1,BOT) - x2 = 2 - x1; // x2 = BOT = 2 - BOT -} -return x1 -``` - -Without SCCP, this small program cannot fold the computation of `x`. -A glance at the program tells us `x` must always be a `1` but -the bottom-up (pessimistic) approach decides that since x1 is BOT, x2 must be -BOT so x1 must be BOT. We need the optimistic approach to break the -stalemate, and just *assume* x1 is `1`, and then we can discover that x2 is -also a `1`. Folding the value does not prove the loop terminates or make -its condition and side effects removable. - - -The algorithm progresses from left to right and stops when no more changes -happen: - -|Var|init|x0=1|x1=phi(1,T)|x2=2-x1|x1=phi(1,1)| -|---|----|----|-----------|-------|-----------| -|x0 | T | 1 | 1 | 1 | 1 | -|x1 | T | T | 1 | 1 | 1 | -|x2 | T | T | T | 1 | 1 | - - - -### Conditional - -Since our control flow is in the same graph as our data flow (that's the major -point of Sea-of-Nodes!), we need not do anything special and our algorithm is -*conditional* already. Again an example is interesting: - -Again using SSA pseudocode: - -```text -int x0 = 1; // x0 = 1 -while( rand ) { - x1 = phi(x0,x4); // x1 = BOT = phi(1,BOT) - if( x1 == 1 ) // Since x1 is BOT, both true and false arms are taken - x2 = 2 - x1; // x2 = BOT = 2 - BOT - else x3 = 99; // x3 = 99 - x4 = phi(x2,x3); // x4 = BOT = phi(BOT,99) -} -return x1 -``` - -Again the algorithm progresses from left to right, although this time not all -paths are reachable. The `if` result is a pair of Control values, shown as -either `C` if the path is alive or `X` if not. This is used when we compute -`x4 = phi(x2,x3)`; the `PhiNode` ALSO checks the corresponding control input -from the `if` and only merges alive paths. - - -|Var|init |x0=1|x1=phi(1,T)| 1 == 1? | x2=2-x1 | x3=99 |x4=phi(C/1,X/99)|x1=phi(1,1)| -|---|-----|----|-----------|---------|---------|---------|----------------|-----------| -|x0 | T | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -|x1 | T | T | 1 | 1 | 1 | 1 | 1 | 1 | -|if | T | T | T | [C,X] | [C,X] | [C,X] | [C,X] | [C,X] | -|x2 | T | T | T | T | 1 | 1 | 1 | 1 | -|x3 | T | T | T | T | T | 99 | 99 | 99 | -|x4 | T | T | T | T | T | T | 1 | 1 | - -This kind of conditional constant propagation really helps if a condition can -be proven true or false, as this removes a test and branch from the optimized -program. A common way this happens is with null tests; here is the same -program above, but using null pointers instead of integers: - -```java -List head = notNullList(); -while( rand ) { - if( head ) head = new List(head,payload); - else { head = null; default_action(); } -} -``` - -Here since `head` starts not-null, it can never be null and the -`default_action` can never happen, and the loop can -simplify: - -```java -List head = notNullList(); -while( rand ) { - head = new List(head,payload); -} -``` - -### Interprocedural - -In **Simple**, we let our SCCP run interprocedurally, again by (nearly) doing nothing: -`CallNodes` call `FunNodes`, `ReturnNodes` return to `CallEndNodes` and they -pass their type information along in exactly the normal way... except for one issue: -there are no edges between `Calls` and `Funs` (nor `Returns` and `CallEnds`). -Such edges make up a [Call Graph](https://en.wikipedia.org/wiki/Call_graph). - -We extend the normal SCCP algorithm to observe when a `Call`s function pointer -input changes - when it picks up new function targets. There are only a finite -number so we represent them exactly with *function indices* as described in an -earlier chapter. (Separate compilation adds a special index for the infinite -unknown functions that are called outside this compilation unit). - -Once we observe a new *fidx* at a `Call`, we *link* the `Call` with the `Fun`, -and the `Return` with the `CallEnd`. Such linkage acts exactly as-if we added -a CFG edge from the `Call` to the `Fun`, and the `Call`s arguments to the -`Fun`s `ParmNodes`. `FunNodes` extend `RegionNodes` (and `ParmNodes` extend -`PhiNodes`), so this linkage uses the same semantics. `Fun`s become reachable -when called; `Parm`s merge (*meet*) all calling arguments, and so on. -Similarly, `CallEnd`s merge results from all called functions, computing the -*meet* over all the `Return`s. - -This *link* step adds a few checks to our algorithm's inner loop, and also -builds a precise Call Graph which allows our SCCP to run interprocedurally. -Other than discovering a few new edges as the algorithm proceeds, the core -algorithm is unchanged. We are guaranteed to terminate with a fixed point -solution, and may discover e.g. certain call parameters are constants (or -e.g. not-null) on all calling paths. - - - -## Chaining Relational Tests - -Chaining relational tests offer a cleaner, more readable way to write chained -comparisons without repeating the same variable. - -```java -if (min <= x && x < max) -``` - -becomes - -```java -if (min <= x < max) -``` - -This syntax saves space and makes the condition more intuitive, similar to how -range checks are written in mathematics. E.g. - -```java -int score = 75; -if (60 <= score < 90) { - sys.io.p("Pass"); -} -``` -This checks if score is between 60 (inclusive) and 90 (exclusive), without repeating `score`. - -Expressions that mix opposite directions of comparison, like using both -`<=` and `>=`, are not allowed by Simple's direction rule. - -```java -if (a <= b >= c) -``` - - -### Operator direction rules -Stacked comparisons are *only* valid if all the comparison operators -"point" the same way: -- `<` with `<` -- `<` with `<=` -- `>` with `>` -- `>` with `>=` - -Equality operators (`==` and `!=`) have their normal, lower precedence; they -are not links in a relational chain. - -It is not allowed to mix directions in a single chain: -```java -if (a <= b >= c) // Invalid -``` - -Comparisons can be forced into numeric context using booleans. -This is valid but unusual: -```java -return (0 < arg) > 1; -``` -Depending on the result of (0 < arg) this will turn into either -```java -return 0 > 1; -``` -OR -```java -return 1 > 1; -``` -The equality operator is valid in this form, but since it has lower precedence than comparisons, -```java -a < b == c -``` -is parsed as: -```java -(a < b) == c -``` -This might not be the intended chained comparison. -A more explicit alternative is: -```java -a < b && b == c -``` -Comparisons can be chained together in any length, and different comparison operators may be -mixed freely as long as they point in the same direction. -Each intermediate operand is evaluated once. Later operands are evaluated only -if earlier comparisons succeed, so calls and updates in a chain short-circuit. - -E.g: -``` -return 0 < arg < arg+1 < 4; -``` - -### Tricky edge cases -```java -return 0 != arg != 1; -``` - -This is parsed by standard precedence rules as: -```java -return ((0 != arg) != 1); -``` -not as chained inequality. - -```java -return a == b == c; -``` -Similarly, this is parsed as: -```java -return ((a == b) == c); -``` - - -### Optimization phases - -SCCP introduces a real `Opto` phase between two uses of the peephole worklist: - -```text -Parse -> Iter -> Opto -> IterPostOpto -> FinalizeIR -> TypeCheck -``` - -`Iter` first reaches the pessimistic fixed point. `Opto` resets types to TOP, -solves SCCP and the call graph, and queues nodes whose types changed. - `IterPostOpto` applies rewrites and inlining enabled by that solution. -`FinalizeIR` settles layouts and detaches the analyzed call graph while keeping -surviving functions available to the backend. - - -## RegAlloc improvements: try cold loop splits first - -A loop Phi and its backedge can belong to one live range even though their -values must coexist at some instruction. This self-conflict requires splitting -the range. Chapter 23 split the Phi's definition and incoming values right away. -This chapter first leaves the hot definition/backedge alone and tries the -outside-loop copies. If coloring succeeds, it avoids moves on every iteration. -Other conflicts, including two-address operations, keep their existing handling. - -The allocator remembers which Phis have had this chance. If the same Phi -self-conflicts again, the next attempt uses the ordinary aggressive splitting. -The record uses Phi identity because live ranges are rebuilt each round. It -also covers a backedge-only conflict where the first attempt inserts no copy: -that attempt must still consume the one permitted delay. A regression checks -both the cheaper first attempt and the mandatory fallback. - -Rows are fixed test cohorts; columns are compiler chapters. Each cell gives -**Ops / RA / X**: executed ARM+RISC-V instructions, the subset emitted for -allocator copies/rematerializations, and x86's loop-weighted split-move estimate. -**Cases D / X** counts measured dynamic program/target cases and x86 compilations; -membership and inputs stay fixed across columns. Native-library work is excluded. -Chapter 20 has no encoder, hence no dynamic counts. Lower is better within each -metric; see the [measurement details](../docs/regalloc-spills.md) for coverage. - - -| Test cohort | Cases D / X | Ch 20: Ops / RA / X | Ch 21: Ops / RA / X | Ch 22: Ops / RA / X | Ch 23: Ops / RA / X | Ch 24: Ops / RA / X | -|---|---:|---:|---:|---:|---:|---:| -| Ch 20 | 22 / 13 | — / — / 161 | 55,173 / 5,407 / 174 | 58,751 / 9,099 / 175 | 58,736 / 9,084 / 184 | 58,720 / 9,068 / 183 | -| Ch 21 | 20 / 18 | | 6,207 / 261 / 461 | 6,324 / 379 / 475 | 6,326 / 381 / 475 | 6,325 / 380 / 470 | -| Ch 22 | 14 / 8 | | | 198 / 60 / 7 | 194 / 56 / 7 | 194 / 56 / 7 | -| Ch 23 | 14 / 8 | | | | 630 / 160 / 36 | 630 / 160 / 36 | -| Ch 24 | 36 / 20 | | | | | 4,923 / 1,341 / 790 | - - diff --git a/chapter24/.#README.md b/chapter24/.#README.md deleted file mode 100644 index c657b199..00000000 --- a/chapter24/.#README.md +++ /dev/null @@ -1 +0,0 @@ -cliffc@DESKTOP-DAD.21980:1790387027 \ No newline at end of file diff --git a/chapter24/Makefile b/chapter24/Makefile deleted file mode 100644 index e02c8096..00000000 --- a/chapter24/Makefile +++ /dev/null @@ -1,186 +0,0 @@ -# -# Makefile expects to run at the project root, and not nested inside anywhere -# -# cd $DESK/Simple/chapterXX; make -# -# -# first time only - this is the only thing that hits the Interwebs -# -# make lib -# -# any time you want to nuke everything from space: -# -# make clean tags -# -# run the tests -# -# make tests - -####################################################### -# -# Boilerplate because make syntax isn't the best -# - -# Use bash for recipes -SHELL := /bin/bash - -# Remove target on error (no broken leftover files) -.DELETE_ON_ERROR: - -# Keep partial builds but not partial recipes; keeping them speeds up the next `make` -.NOTINTERMEDIATE: - -# for printing variable values -# usage: make print-VARIABLE -# > VARIABLE = value_of_variable -print-% : ; @echo $* = $($*) - -# literal space -space := $() $() - -# Decide OS-specific questions -# jar-file seperator -ifeq ($(OS),Windows_NT) - SEP = ; -else - SEP = : -endif -# Find a reasonable ctags. -CTAGS = $(shell which ctags) -# Hack for MacOS: /usr/bin/ctags is unfriendly, so look for ctags from brew -ifeq ($(UNAME),Darwin) - CTAGS = $(shell brew list ctags 2> /dev/null | grep bin/ctags) -endif - -# Fun Args to javac. Mostly limit to java8 source definitions, and fairly -# aggressive lint warnings. -JAVAC_ARGS = -g - -# Source code -SIMPLE := com/seaofnodes/simple -SRC := src/main/java -TST := src/test/java -CLZDIR:= build/classes -main_javas := $(wildcard $(SRC)/$(SIMPLE)/*java $(SRC)/$(SIMPLE)/*/*java $(SRC)/$(SIMPLE)/node/cpus/*/*java) -test_javas := $(wildcard $(TST)/$(SIMPLE)/*java $(TST)/$(SIMPLE)/*/*java) -main_classes := $(patsubst $(SRC)/%java,$(CLZDIR)/main/%class,$(main_javas)) -include $(firstword $(wildcard ../graph/graph.mk graph/graph.mk)) -include $(firstword $(wildcard ../print/print.mk print/print.mk)) -include $(firstword $(wildcard ../isa/isa.mk isa/isa.mk)) -test_classes := $(patsubst $(TST)/%java,$(CLZDIR)/test/%class,$(test_javas)) -test_cp := $(patsubst $(TST)/$(SIMPLE)/%.java,com.seaofnodes.simple.%,$(wildcard $(TST)/$(SIMPLE)/*Test.java)) com.seaofnodes.simple.codegen.X86EncodingTest -classes = $(main_classes) $(test_classes) -# All the libraries -libs = $(wildcard lib/*jar) -jars = $(subst $(space),$(SEP),$(libs)) - - -default_targets := $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag -# Optionally add ctags to the default target if a reasonable one was found. -ifneq ($(CTAGS),) -default_targets += tags -endif - -default: $(default_targets) - -####################################################### -# Compile the chapter and shared viewer sources together - -$(CLZDIR)/main/.mtag: $(main_javas) Makefile - @[ -d $(CLZDIR)/main ] || mkdir -p $(CLZDIR)/main - @# This crap is really just "javac", but with a beautiful error message. - @# The very very long list of java files is suppressed and counted. - @# The required output "Note: blah blah deprecated blah" is suppressed. - $(file >.argsM.txt,$(main_javas)) - @if [ ! -z "$(main_javas)" ] ; then \ - echo "compiling main because " $< " and " `wc -w < .argsM.txt` " more files" ; \ - if ! javac $(JAVAC_ARGS) -cp "$(CLZDIR)/main$(SEP)$(jars)" -sourcepath $(SRC) -d $(CLZDIR)/main $(main_javas) >& .out.txt ; then \ - cat .out.txt ; \ - exit 1; \ - fi ; \ - rm -rf .out.txt ; \ - fi - @touch $(CLZDIR)/main/.mtag - @rm -f .argsM.txt - -$(main_classes): $(CLZDIR)/main/.mtag - - - -####################################################### - -OODT := $(isa_test_javas) -$(CLZDIR)/test/.ttag: $(test_classes) $(test_javas) $(isa_test_javas) $(CLZDIR)/main/.mtag - @[ -d $(CLZDIR)/test ] || mkdir -p $(CLZDIR)/test - $(file >.argsT.txt,$(OODT)) - @if [ ! -z "$(OODT)" ] ; then \ - echo "compiling test because " $< " and " `wc -w < .argsT.txt` " more files" ; \ - if ! javac $(JAVAC_ARGS) -cp "$(CLZDIR)/test$(SEP)$(CLZDIR)/main$(SEP)$(jars)" -sourcepath $(TST) -d $(CLZDIR)/test $(OODT) >& .out.txt ; then \ - cat .out.txt ; \ - exit 1; \ - fi ; \ - rm -rf .out.txt ; \ - fi - @touch $(CLZDIR)/test/.ttag - @rm -f .argsT.txt - -# Collect just the out-of-date files -$(test_classes): $(CLZDIR)/test/%class: $(TST)/%java - $(eval OODT += $$<) - -####################################################### -# Base launch line for JVM tests -JVM=nice java -ea -cp "$(CLZDIR)/main${SEP}${jars}${SEP}$(CLZDIR)/test" - - -tests: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag - @echo "testing " $(test_cp) - @[ -d build/objs ] || mkdir -p build/objs - @$(JVM) org.junit.runner.JUnitCore $(test_cp) - @$(JVM) org.junit.runner.JUnitCore com.seaofnodes.simple.FuzzerWrap - -fuzzer: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag - @echo "fuzzing " $(test_cp) - @$(JVM) org.junit.runner.JUnitCore com.seaofnodes.simple.FuzzerWrap - -# Build a Simple jar -release: build/release/simple.jar - -# Build a Simple jar -build/release/simple.jar: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag - @echo "jarring " $@ " because " $? - @[ -d $(dir $@) ] || mkdir -p $(dir $@) - @jar cf build/release/simple.jar -C $(CLZDIR)/main . -C $(CLZDIR)/test . -C $(SRC)/$(SIMPLE) . -C $(TST)/$(SIMPLE) . - - -.PHONY: clean -clean: - rm -rf build - rm -f TAGS - (find . -name "*~" -exec rm {} \; 2>/dev/null; exit 0) - -# Download libs from maven -lib: lib/junit-4.12.jar lib/hamcrest-core-1.3.jar - -# Jars -lib/junit-4.12.jar: - @[ -d lib ] || mkdir -p lib - @(cd lib; wget https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar) - -lib/hamcrest-core-1.3.jar: - @[ -d lib ] || mkdir -p lib - @(cd lib; wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar) - -# Build emacs tags (part of a tasty emacs ide experience) -tags: $(main_javas) $(test_javas) - @rm -f TAGS - @$(CTAGS) -e --recurse=yes --extra=+q --fields=+fksaiS $(SRC) $(TST) - -spill-stats: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag - @[ -d build/objs ] || mkdir -p build/objs - @$(JVM) com.seaofnodes.simple.SpillStats - -.PHONY: spill-stats - -.PHONY: build -build: $(CLZDIR)/main/.mtag diff --git a/chapter24/README.ja.md b/chapter24/README.ja.md deleted file mode 100644 index 1f16365c..00000000 --- a/chapter24/README.ja.md +++ /dev/null @@ -1,262 +0,0 @@ -# 第24章: 関係演算の連鎖と疎な条件付き定数伝播 - -[English](README.md) | 日本語 - -この文書は [原文](README.md) の日本語訳です。 - -[前の章: 第23章](../chapter23/README.ja.md) | -[次の章: 第25章](../chapter25/README.ja.md) - -この章では、たとえば `(60 <= score < 90)` のような条件の *連鎖* を許し、中央の `score` を繰り返さずに済むようにします。 - -コンパイラの主な変更は、手続き間の疎な条件付き定数伝播(SCCP)です。呼び出しグラフの辺も発見する、楽観的な型の求解です。メモリは第11章の遅延分割に従います。BulkMemPhi はメモリ全体を表し、MemPhi は正確なエイリアスをマージし、割り当てはインスタンスフィールドの部分メモリを消費・生成します。SCCP 中、メモリ Phi は到達不能入力を無視し、割り当て結果は制御が到達するまで高いままです。第25章には、不完全な型のための大きな SSA 再設計、非公開のコンストラクタメモリ、分割コンパイルを残します。[バックポートのレビュー待ち一覧](../docs/chapter-backports.md) を参照してください。 - -[linear](https://github.com/SeaOfNodes/Simple/tree/linear) ブランチ上の直線的な Git リビジョン履歴で [この章](https://github.com/SeaOfNodes/Simple/tree/linear-chapter24) を読み、前の章と [比較](https://github.com/SeaOfNodes/Simple/compare/linear-chapter23...linear-chapter24) することもできます。 - -この章の[完全な言語文法](docs/24-grammar.ja.md)はこちらです。 - -## 関係比較の連鎖 - -関係比較の連鎖により、同じ変数を繰り返さず、連続する比較をすっきりと読みやすく書けます。 - -```java -if (min <= x && x < max) -``` - -は、次になります。 - -```java -if (min <= x < max) -``` - -この構文は場所を節約し、数学で範囲検査を書く方法に似た、直感的な条件にします。たとえば: - -```java -int score = 75; -if (60 <= score < 90) { - sys.io.p("Pass"); -} -``` - -これは `score` を繰り返さず、60以上90未満かを検査します。 - -`<=` と `>=` の両方を使うなど、逆向きの比較を混ぜる式は、Simple の方向規則では許されません。 - -```java -if (a <= b >= c) -``` - -### 演算子の方向規則 - -重ねた比較は、すべての比較演算子が同じ方向を「向く」場合 *だけ* 有効です。 - -- `<` と `<` -- `<` と `<=` -- `>` と `>` -- `>` と `>=` - -等値演算子(`==` と `!=`)は通常どおり、より低い優先順位を持ちます。関係演算の連鎖をつなぐ要素ではありません。 - -1つの連鎖で方向を混ぜることはできません。 - -```java -if (a <= b >= c) // Invalid -``` - -真偽値を使えば、比較を数値の文脈に強制できます。次は有効ですが、珍しい書き方です。 - -```java -return (0 < arg) > 1; -``` - -`(0 < arg)` の結果に応じて、次のいずれかになります。 - -```java -return 0 > 1; -``` - -または - -```java -return 1 > 1; -``` - -等値演算子もこの形式で有効ですが、比較より優先順位が低いため、 - -```java -a < b == c -``` - -は次のように解析されます。 - -```java -(a < b) == c -``` - -これは意図した連鎖比較とは違うかもしれません。より明示的な代替は次です。 - -```java -a < b && b == c -``` - -比較は任意の長さで連鎖でき、同じ方向を向く限り、異なる比較演算子を自由に混ぜられます。中間の各オペランドは1回だけ評価します。後のオペランドは、前の比較が成功した場合だけ評価するため、連鎖内の呼び出しや更新は短絡評価されます。 - -例: - -``` -return 0 < arg < arg+1 < 4; -``` - -### 注意が必要な境界例 - -```java -return 0 != arg != 1; -``` - -これは連鎖した不等比較ではなく、標準の優先順位規則により次のように解析します。 - -```java -return ((0 != arg) != 1); -``` - -```java -return a == b == c; -``` - -同様に、これは次のように解析します。 - -```java -return ((a == b) == c); -``` - -## 疎な条件付き定数伝播 - -[SCCP](https://en.wikipedia.org/wiki/Sparse_conditional_constant_propagation) は、これまで行ってきたピープホール最適化/定数畳み込みの、上から下へ進む版です。アルゴリズムの規則は文献でよく知られ、大学で一般に教えられています。[スライドの例](https://www.cse.psu.edu/~gxt29/teaching/cse522s23/slides/08monotoneFramework.pdf) があります。 - -- すでに束を持っています。 -- すでに SSA 形式を持っています。したがってアルゴリズムは *疎* です。 -- ノードから型への対応(`Node._type`)を持っています。 -- すでに伝達関数(`Node.compute`)を持っています。 - -すべての `_type` を、⊥ ではなく ⊤ に初期化し、すべてのノードをワークリストに置きます。そこからノードを取り、伝達関数 `node.compute()` を実行します。結果が `node._type` と変われば更新し、その出力側の隣接ノードをワークリストへ入れます。アサーションとデバッグ補助をすべて取り除いた簡略版は次のとおりです。 - -```java -while( (n = code._iter._work.pop()) != null ) { - Type nval = n.compute(); - if( n._type != nval ) { - assert n._type.isa(nval); // Types start high and always fall - n._type = nval; // Update type in Node - code._iter.addAll(n._outputs);// Neighbors might change, need to inspect - } -} -``` - -このアルゴリズムは必ず停止し、一般にはかなり速く、束と伝達関数の制限内での「最良の答え」である *不動点* に必ず到達します。得られる型はピープホール規則で見つけたものより単調に改善されます。その後、型が改善されたノードでピープホール規則を実行し、無関係なピープホール最適化が適用できるかを調べられます。たとえば新しく発見した定数が、計算を ConstantNode に置き換えます。 - -以下は SSA の擬似コードです。`phi` はマージを意味し、Simple の構文ではありません。 - -```text -int x0 = 1; // x0 = 1 -while( rand ) { - x1 = phi(x0,x2); // x1 = BOT = phi(1,BOT) - x2 = 2 - x1; // x2 = BOT = 2 - BOT -} -return x1 -``` - -SCCP がなければ、この小さなプログラムは `x` の計算を畳み込めません。見れば `x` は常に `1` とわかりますが、下から上へ進む悲観的手法は、x1 が BOT なので x2 が BOT、したがって x1 が BOT と判断します。行き詰まりを解くには楽観的手法が必要です。x1 が `1` と *仮定* すれば、x2 も `1` と発見できます。値の畳み込みは、ループ停止を証明したり、その条件と副作用を除去可能にしたりするものではありません。 - -アルゴリズムは左から右へ進み、変化がなくなったら停止します。 - -| 変数 | 初期 | x0=1 | x1=phi(1,T) | x2=2-x1 | x1=phi(1,1) | -|---|----|----|-----------|-------|-----------| -| x0 | T | 1 | 1 | 1 | 1 | -| x1 | T | T | 1 | 1 | 1 | -| x2 | T | T | T | 1 | 1 | - -### 条件付き - -制御フローがデータフローと同じグラフ内にあるため(これが Sea-of-Nodes の大きな要点です)、特別なことをする必要はなく、アルゴリズムはすでに *条件付き* です。ここでも例が役に立ちます。 - -再び SSA の擬似コードを使います。 - -```text -int x0 = 1; // x0 = 1 -while( rand ) { - x1 = phi(x0,x4); // x1 = BOT = phi(1,BOT) - if( x1 == 1 ) // Since x1 is BOT, both true and false arms are taken - x2 = 2 - x1; // x2 = BOT = 2 - BOT - else x3 = 99; // x3 = 99 - x4 = phi(x2,x3); // x4 = BOT = phi(BOT,99) -} -return x1 -``` - -再び左から右へ進みますが、今度はすべての経路が到達可能とは限りません。`if` の結果は Control 値の対で、経路が生きていれば `C`、そうでなければ `X` で示します。これは `x4 = phi(x2,x3)` の計算で使います。`PhiNode` は `if` の対応する制御入力 *も* 確認し、生きた経路だけをマージします。 - -| 変数 | 初期 | x0=1 | x1=phi(1,T) | 1 == 1? | x2=2-x1 | x3=99 | x4=phi(C/1,X/99) | x1=phi(1,1) | -|---|-----|----|-----------|---------|---------|---------|----------------|-----------| -| x0 | T | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -| x1 | T | T | 1 | 1 | 1 | 1 | 1 | 1 | -| if | T | T | T | [C,X] | [C,X] | [C,X] | [C,X] | [C,X] | -| x2 | T | T | T | T | 1 | 1 | 1 | 1 | -| x3 | T | T | T | T | T | 99 | 99 | 99 | -| x4 | T | T | T | T | T | T | 1 | 1 | - -この種の条件付き定数伝播は、条件が真か偽と証明できると、最適化後のプログラムから検査と分岐を除去するので、非常に役立ちます。よくあるのが null 検査です。同じプログラムで、整数の代わりに null ポインタを使います。 - -```java -List head = notNullList(); -while( rand ) { - if( head ) head = new List(head,payload); - else { head = null; default_action(); } -} -``` - -`head` は非 null で始まるため、決して null にならず、`default_action` も起きません。ループは簡略化できます。 - -```java -List head = notNullList(); -while( rand ) { - head = new List(head,payload); -} -``` - -### 手続き間 - -**Simple** では、ここでもほぼ何もせず、SCCP を手続き間で実行します。`CallNode` は `FunNode` を呼び、`ReturnNode` は `CallEndNode` に戻り、まったく通常の方法で型情報を渡します。ただし問題が1つあります。`Call` と `Fun`、および `Return` と `CallEnd` の間に辺がありません。そのような辺が [呼び出しグラフ](https://en.wikipedia.org/wiki/Call_graph) を構成します。 - -通常の SCCP を拡張し、`Call` の関数ポインタ入力が変わり、新しい関数対象を得る時点を監視します。対象の数は有限なので、前の章で説明した *関数インデックス* で正確に表します。分割コンパイルでは、このコンパイル単位の外で呼ばれる無限の未知関数に対して、特別なインデックスを追加します。 - -`Call` で新しい *fidx* を見つけたら、`Call` と `Fun`、`Return` と `CallEnd` を *リンク* します。このリンクは、`Call` から `Fun`、そして `Call` の引数から `Fun` の `ParmNode` へ CFG 辺を追加したかのように動きます。`FunNode` は `RegionNode` を、`ParmNode` は `PhiNode` を拡張するため、同じ意味規則を使います。`Fun` は呼ばれると到達可能になり、`Parm` はすべての呼び出し引数をマージ(*meet*)します。同様に `CallEnd` は、すべての `Return` の *meet* を計算して、呼ばれたすべての関数の結果をマージします。 - -この *リンク* 段階はアルゴリズムの内部ループにいくつかの検査を加え、正確な呼び出しグラフも構築し、SCCP の手続き間実行を可能にします。進行中に新しい辺を少し発見する以外は、中核アルゴリズムは変わりません。不動点解で停止することが保証され、たとえば特定の呼び出しパラメータが、すべての呼び出し経路で定数、あるいは非 null と発見できることがあります。 - -## RegAlloc の改良: 低頻度側のループ分割を先に試す - -ループの Phi と後退辺は、ある命令で値が共存しなければならなくても、同じ生存区間に属する場合があります。この自己衝突は区間の分割を必要とします。第23章は Phi の定義と入力値をすぐに分割しました。この章では先に、高頻度の定義/後退辺をそのままにし、ループ外のコピーを試します。彩色が成功すれば各反復の移動を避けられます。2アドレス演算を含むほかの衝突は、既存の処理を保持します。 - -割り当て器は、どの Phi にこの機会を与えたかを記憶します。同じ Phi が再び自己衝突すると、次は通常の積極的な分割を使います。区間は各ラウンドで再構築するため、記録には Phi の同一性を使います。最初の試行でコピーを挿入しない、後退辺だけの衝突も対象です。その試行も、1回だけ許された遅延を消費しなければなりません。回帰テストは、安い最初の試行と、必須の代替処理の両方を確認します。 - -第21章の隣接コピー転送も引き継ぎます。彩色後、次の命令に唯一の使用がある場合、オペランドマスクが許し、2アドレスの結び付きを壊さなければコピー元レジスタを読めます。以下の表は、この整理と遅延メモリの前方移植を含みます。第22章の群には、以前の監査後に追加した移動0の C 戻り値 ABI 確認2件も含むようになりました(24ではなく26項目)。 - -`make spill-stats` を実行してください。全行は **第24章のコンパイラ**、最適化器のシード123、以前の群の表と同じソース/対象の組み合わせを使います。この Windows 結果は、x86 SystemV/Win64 と RISC-V/ARM SystemV を合わせ、遅延メモリの前方移植後に再測定したものです。 - -| プログラム群 | コンパイル数 | 残存する移動 | ループ重み付き移動 | -|---|---:|---:|---:| -| 第20章 | 39 | 320 | 439 | -| 第21章 | 52 | 420 | 952 | -| 第22章 | 26 | 67 | 67 | -| 第23章 | 30 | 78 | 225 | -| 第24章 | 67 | 422 | 1,325 | -| **合計** | **214** | **1,307** | **3,008** | - -`_spills` はレジスタ移動を含む残存 SplitNode を数えます。`_spillScaled` は `8^loopDepth` で重み付けするコスト推定で、測定されたメモリアクセスではありません。診断マシングラフはこの表の割り当てに寄与しません。報告器は、スピル期待値が異なっても、割り当ての合法性とネイティブ/エミュレーション結果を確認し、いずれの失敗でも失敗終了します。 - -後のコンパイラ修正より前の、元の2026-09-20割り当て器監査では、表の合計は1,332/2,956でした。低頻度側を先にする規則だけを無効にすると、同じコンパイラとプログラムは **1,338移動/2,962重み付き移動** でした。この規則は各6を減らします。RISC-V MergeSort の1ケースは1移動増えますが、ほかの MergeSort、Sieve、ARM ループの1ケースの改善が相殺します。集計測定はこの局所的な悪化を受け入れる根拠となります。ここでの改善は小さく、普遍的ではありません。 - -その監査で第20〜23章の群だけを見ると、第23章は933/1,745、第24章は900/1,614でした。それぞれの削減のうち、この割り当て器変更によるものは6だけです。残りは SCCP を含むほかのコンパイラ変更です。章だけの比較では、ヒューリスティックの効果を過大に見積もってしまいます。 - -以前の群は64ビット Person、ガード付き String、短いエミュレータ引数リストを保持します。改訂した Jig、BubbleSort、Newton、スタック引数入力は、既存のテストとともに第24章の群に属します。固定した String 処理対象は、インライン化の支配ノード走査で null 検査が欠けていたことも明らかにしました。その正しさの修正はヒューリスティック比較の両側に含めています。面積/コストのスピル順位付けは第25章に残します。 - -現在の関数ポインタ規則は、アドレスが直接呼び出し対象としてだけでなく、値として使われるたびに、未知の呼び出し側を保持します。これにより脱出解析なしで呼び出し可能な本体を保存しますが、Phi で選ばれた関数は一般的なパラメータ型を保持します。return のない String ケースは、今では未使用のハッシュ本体を除去し、分割を必要としません。ソース/対象の構成は変わりません。これらのグラフ変更は、上の低頻度側優先の割り当て器比較とは別です。 diff --git a/chapter24/README.md b/chapter24/README.md deleted file mode 100644 index e647bec3..00000000 --- a/chapter24/README.md +++ /dev/null @@ -1,338 +0,0 @@ -# Chapter 24: Chaining Relationals and Sparse Conditional Constant Propagation - -English | [日本語](README.ja.md) - -[Previous: Chapter 23](../chapter23/README.md) | -[Next: Chapter 25](../chapter25/README.md) - -In this Chapter we allow *chaining* conditionals, e.g. `(60 <= score < 90)` -where `score` in the middle does not have to be repeated. - -The main compiler change is Interprocedural Sparse Conditional Constant -Propagation (SCCP): an optimistic type solve which also discovers call-graph -edges. SCCP is otherwise the traditional one taught in many classes, except -the lattice it operates on is very rich. - -A new syntax feature is chaining conditions, ala `lo <= x < min` is legal syntax. - -You can also read [this chapter](https://github.com/SeaOfNodes/Simple/tree/linear-chapter24) in a linear Git revision history on the [linear](https://github.com/SeaOfNodes/Simple/tree/linear) branch and [compare](https://github.com/SeaOfNodes/Simple/compare/linear-chapter23...linear-chapter24) it to the previous chapter. - - -Here is the [complete language grammar](docs/24-grammar.md) for this chapter. - - -## Sparse Conditional Constant Propagation - -[SCCP](https://en.wikipedia.org/wiki/Sparse_conditional_constant_propagation) -is the top-down version of the same peephole/constant-folding work we have -been doing all along. The rules for the algorithm are well known from the -literature and commonly taught at the college level; -[example slides](https://www.cse.psu.edu/~gxt29/teaching/cse522s23/slides/08monotoneFramework.pdf). - -- We have a lattice already -- We have SSA form already (hence the algorithm is *sparse*) -- We have a mapping from Nodes to Types (`Node._type`) -- We have transfer functions (`Node.compute`) already. - -We initialize all `_type` fields to ⊤ (as opposed to ⊥), and place all Nodes on -a worklist. We pull a Node from the worklist, run the transfer function -`node.compute()`, and if the result changes from `node._type` we update -`node._type` and put its output neighbors on the worklist. A simplified -version with all asserts and debug helpers removed: - -```java -while( (n = code._iter._work.pop()) != null ) { - Type nval = n.compute(); - if( n._type != nval ) { - assert n._type.isa(nval); // Types start high and always fall - n._type = nval; // Update type in Node - code._iter.addAll(n._outputs);// Neighbors might change, need to inspect - } -} -``` - -This algorithm always terminates (and generally fairly quickly) and always -reaches a *fixed point*, as "best answer" subject to the limits of our lattice -and transfer functions. The resulting types are monotonically better than -those found by the peephole rules; we can then run the peephole rules on nodes -with improved types, to see if unrelated peepholes can fire - such as newly -discovered constants replacing computations with ConstantNodes. - -The following is SSA pseudocode: - -```text -int x0 = 1; // x0 = 1 -while( rand ) { - x1 = phi(x0,x2); // x1 = BOT = phi(1,BOT) - x2 = 2 - x1; // x2 = BOT = 2 - BOT -} -return x1 -``` - -Without SCCP, this small program cannot fold the computation of `x`. -A glance at the program tells us `x` must always be a `1` but -the bottom-up (pessimistic) approach decides that since x1 is BOT, x2 must be -BOT so x1 must be BOT. We need the optimistic approach to break the -stalemate, and just *assume* x1 is `1`, and then we can discover that x2 is -also a `1`. Folding the value does not prove the loop terminates or make -its condition and side effects removable. - - -The algorithm progresses from left to right and stops when no more changes -happen: - -|Var|init|x0=1|x1=phi(1,T)|x2=2-x1|x1=phi(1,1)| -|---|----|----|-----------|-------|-----------| -|x0 | T | 1 | 1 | 1 | 1 | -|x1 | T | T | 1 | 1 | 1 | -|x2 | T | T | T | 1 | 1 | - - - -### Conditional - -Since our control flow is in the same graph as our data flow (that's the major -point of Sea-of-Nodes!), we need not do anything special and our algorithm is -*conditional* already. Again an example is interesting: - -Again using SSA pseudocode: - -```text -int x0 = 1; // x0 = 1 -while( rand ) { - x1 = phi(x0,x4); // x1 = BOT = phi(1,BOT) - if( x1 == 1 ) // Since x1 is BOT, both true and false arms are taken - x2 = 2 - x1; // x2 = BOT = 2 - BOT - else x3 = 99; // x3 = 99 - x4 = phi(x2,x3); // x4 = BOT = phi(BOT,99) -} -return x1 -``` - -Again the algorithm progresses from left to right, although this time not all -paths are reachable. The `if` result is a pair of Control values, shown as -either `C` if the path is alive or `X` if not. This is used when we compute -`x4 = phi(x2,x3)`; the `PhiNode` ALSO checks the corresponding control input -from the `if` and only merges alive paths. - - -|Var|init |x0=1|x1=phi(1,T)| 1 == 1? | x2=2-x1 | x3=99 |x4=phi(C/1,X/99)|x1=phi(1,1)| -|---|-----|----|-----------|---------|---------|---------|----------------|-----------| -|x0 | T | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -|x1 | T | T | 1 | 1 | 1 | 1 | 1 | 1 | -|if | T | T | T | [C,X] | [C,X] | [C,X] | [C,X] | [C,X] | -|x2 | T | T | T | T | 1 | 1 | 1 | 1 | -|x3 | T | T | T | T | T | 99 | 99 | 99 | -|x4 | T | T | T | T | T | T | 1 | 1 | - -This kind of conditional constant propagation really helps if a condition can -be proven true or false, as this removes a test and branch from the optimized -program. A common way this happens is with null tests; here is the same -program above, but using null pointers instead of integers: - -```java -List head = notNullList(); -while( rand ) { - if( head ) head = new List(head,payload); - else { head = null; default_action(); } -} -``` - -Here since `head` starts not-null, it can never be null and the -`default_action` can never happen, and the loop can -simplify: - -```java -List head = notNullList(); -while( rand ) { - head = new List(head,payload); -} -``` - -### Interprocedural - -In **Simple**, we let our SCCP run interprocedurally, again by (nearly) doing nothing: -`CallNodes` call `FunNodes`, `ReturnNodes` return to `CallEndNodes` and they -pass their type information along in exactly the normal way... except for one issue: -there are no edges between `Calls` and `Funs` (nor `Returns` and `CallEnds`). -Such edges make up a [Call Graph](https://en.wikipedia.org/wiki/Call_graph). - -We extend the normal SCCP algorithm to observe when a `Call`s function pointer -input changes - when it picks up new function targets. There are only a finite -number so we represent them exactly with *function indices* as described in an -earlier chapter. (Separate compilation adds a special index for the infinite -unknown functions that are called outside this compilation unit). - -Once we observe a new *fidx* at a `Call`, we *link* the `Call` with the `Fun`, -and the `Return` with the `CallEnd`. Such linkage acts exactly as-if we added -a CFG edge from the `Call` to the `Fun`, and the `Call`s arguments to the -`Fun`s `ParmNodes`. `FunNodes` extend `RegionNodes` (and `ParmNodes` extend -`PhiNodes`), so this linkage uses the same semantics. `Fun`s become reachable -when called; `Parm`s merge (*meet*) all calling arguments, and so on. -Similarly, `CallEnd`s merge results from all called functions, computing the -*meet* over all the `Return`s. - -This *link* step adds a few checks to our algorithm's inner loop, and also -builds a precise Call Graph which allows our SCCP to run interprocedurally. -Other than discovering a few new edges as the algorithm proceeds, the core -algorithm is unchanged. We are guaranteed to terminate with a fixed point -solution, and may discover e.g. certain call parameters are constants (or -e.g. not-null) on all calling paths. - - - -## Chaining Relational Tests - -Chaining relational tests offer a cleaner, more readable way to write chained -comparisons without repeating the same variable. - -```java -if (min <= x && x < max) -``` - -becomes - -```java -if (min <= x < max) -``` - -This syntax saves space and makes the condition more intuitive, similar to how -range checks are written in mathematics. E.g. - -```java -int score = 75; -if (60 <= score < 90) { - sys.io.p("Pass"); -} -``` -This checks if score is between 60 (inclusive) and 90 (exclusive), without repeating `score`. - -Expressions that mix opposite directions of comparison, like using both -`<=` and `>=`, are not allowed by Simple's direction rule. - -```java -if (a <= b >= c) -``` - - -### Operator direction rules -Stacked comparisons are *only* valid if all the comparison operators -"point" the same way: -- `<` with `<` -- `<` with `<=` -- `>` with `>` -- `>` with `>=` - -Equality operators (`==` and `!=`) have their normal, lower precedence; they -are not links in a relational chain. - -It is not allowed to mix directions in a single chain: -```java -if (a <= b >= c) // Invalid -``` - -Comparisons can be forced into numeric context using booleans. -This is valid but unusual: -```java -return (0 < arg) > 1; -``` -Depending on the result of (0 < arg) this will turn into either -```java -return 0 > 1; -``` -OR -```java -return 1 > 1; -``` -The equality operator is valid in this form, but since it has lower precedence than comparisons, -```java -a < b == c -``` -is parsed as: -```java -(a < b) == c -``` -This might not be the intended chained comparison. -A more explicit alternative is: -```java -a < b && b == c -``` -Comparisons can be chained together in any length, and different comparison operators may be -mixed freely as long as they point in the same direction. -Each intermediate operand is evaluated once. Later operands are evaluated only -if earlier comparisons succeed, so calls and updates in a chain short-circuit. - -E.g: -``` -return 0 < arg < arg+1 < 4; -``` - -### Tricky edge cases -```java -return 0 != arg != 1; -``` - -This is parsed by standard precedence rules as: -```java -return ((0 != arg) != 1); -``` -not as chained inequality. - -```java -return a == b == c; -``` -Similarly, this is parsed as: -```java -return ((a == b) == c); -``` - - -### Optimization phases - -SCCP introduces a real `Opto` phase between two uses of the peephole worklist: - -```text -Parse -> Iter -> Opto -> IterPostOpto -> FinalizeIR -> TypeCheck -``` - -`Iter` first reaches the pessimistic fixed point. `Opto` resets types to TOP, -solves SCCP and the call graph, and queues nodes whose types changed. -`IterPostOpto` applies rewrites and inlining enabled by that solution. -`FinalizeIR` settles layouts and detaches the analyzed call graph while keeping -surviving functions available to the backend. - - -## RegAlloc improvements: try cold loop splits first - -A loop Phi and its backedge can belong to one live range even though their -values must coexist at some instruction. This self-conflict requires splitting -the range. Chapter 23 split the Phi's definition and incoming values right away. -This chapter first leaves the hot definition/backedge alone and tries the -outside-loop copies. If coloring succeeds, it avoids moves on every iteration. -Other conflicts, including two-address operations, keep their existing handling. - -The allocator remembers which Phis have had this chance. If the same Phi -self-conflicts again, the next attempt uses the ordinary aggressive splitting. -The record uses Phi identity because live ranges are rebuilt each round. It -also covers a backedge-only conflict where the first attempt inserts no copy: -that attempt must still consume the one permitted delay. A regression checks -both the cheaper first attempt and the mandatory fallback. - -Rows are fixed test cohorts; columns are compiler chapters. Each cell gives -**Ops / RA / X**: executed ARM+RISC-V instructions, the subset emitted for -allocator copies/rematerializations, and x86's loop-weighted split-move estimate. -**Cases D / X** counts measured dynamic program/target cases and x86 compilations; -membership and inputs stay fixed across columns. Native-library work is excluded. -Chapter 20 has no encoder, hence no dynamic counts. Lower is better within each -metric; see the [measurement details](../docs/regalloc-spills.md) for coverage. - - -| Test cohort | Cases D / X | Ch 20: Ops / RA / X | Ch 21: Ops / RA / X | Ch 22: Ops / RA / X | Ch 23: Ops / RA / X | Ch 24: Ops / RA / X | -|---|---:|---:|---:|---:|---:|---:| -| Ch 20 | 22 / 13 | — / — / 161 | 55,173 / 5,407 / 174 | 58,751 / 9,099 / 175 | 58,736 / 9,084 / 184 | 58,720 / 9,068 / 183 | -| Ch 21 | 20 / 18 | | 6,207 / 261 / 461 | 6,324 / 379 / 475 | 6,326 / 381 / 475 | 6,325 / 380 / 470 | -| Ch 22 | 14 / 8 | | | 198 / 60 / 7 | 194 / 56 / 7 | 194 / 56 / 7 | -| Ch 23 | 14 / 8 | | | | 630 / 160 / 36 | 630 / 160 / 36 | -| Ch 24 | 36 / 20 | | | | | 4,923 / 1,341 / 790 | - - diff --git a/chapter24/docs/24-grammar.ja.md b/chapter24/docs/24-grammar.ja.md deleted file mode 100644 index fd3fa232..00000000 --- a/chapter24/docs/24-grammar.ja.md +++ /dev/null @@ -1,168 +0,0 @@ -# 第24章の文法 - -[English](24-grammar.md) | 日本語 - -```antlrv4 -grammar SimpleLanguage; - -// Name lookup, assignable operands, type compatibility, and access permissions -// are checked by the compiler in addition to these syntax rules. -program : statement* EOF ; - -block : '{' statement* '}' ; - -statement - : block - | returnStatement - | ifStatement - | whileStatement - | forStatement - | breakStatement - | continueStatement - | structDeclaration - | declaration ';' - | assignment ';' - | ';' - ; - -returnStatement : 'return' assignment ';' ; -ifStatement : 'if' '(' assignment ')' statement ('else' statement)? ; -whileStatement : 'while' '(' assignment ')' statement ; -breakStatement : 'break' ';' ; -continueStatement : 'continue' ';' ; - -forStatement - : 'for' '(' (declaration | assignment)? ';' assignment? ';' assignment? ')' statement - ; - -structDeclaration : 'struct' IDENTIFIER '{' structMember* '}' ';' ; -structMember : methodDeclaration | statement ; - -// A method is an ordinary fixed function binding in a struct definition. -// The compiler supplies self; it is not written in parameterList. -// The general declaration rule also admits explicitly typed function fields. -methodDeclaration : 'val' bindingModifier? IDENTIFIER '=' functionExpression ';' ; - -declaration : declarationType binding (',' binding)* ; -declarationType : type | 'var' | 'val' ; -binding : bindingModifier? IDENTIFIER ('=' initializer)? ; -bindingModifier : '!' | '~' ; -// A declaration initializer consisting of the string "C" declares an extern -// symbol. Ordinary strings elsewhere are array-valued expressions. -initializer : assignment ; - -// The prefix qualifies the named struct reference, not an enclosing array. -// Each [] / [~] suffix qualifies its own array layer. ? requires a reference. -type - : functionType - | primitiveType typeSuffix* - | accessModifier? typeName typeSuffix* - ; -accessModifier : '!' | '~' ; -typeSuffix : '?' | '[]' | '[~]' ; -typeName : IDENTIFIER ('.' IDENTIFIER)* ; - -primitiveType - : 'int' | 'i8' | 'i16' | 'i32' | 'i64' - | 'u1' | 'u8' | 'u16' | 'u32' | 'byte' | 'bool' - | 'flt' | 'f32' | 'f64' - ; - -assignment : expression (assignmentOperator assignment)? ; -assignmentOperator - : '=' | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '^=' - | '<<=' | '>>=' | '>>>=' - ; - -expression : logicalExpression ('?' assignment (':' assignment)?)? ; - -// Both logical operators short-circuit and associate to the right here. -logicalExpression : bitwiseExpression (('&&' | '||') logicalExpression)? ; - -bitwiseExpression - : equalityExpression (('&' | '|' | '^') equalityExpression)* - ; - -equalityExpression : comparisonExpression (('==' | '!=') comparisonExpression)* ; - -// Chained comparisons test adjacent operands and short-circuit. A chain must -// keep its direction; equality has lower precedence and does not join a chain. -comparisonExpression - : shiftExpression - ( (('<' | '<=') shiftExpression)+ | (('>' | '>=') shiftExpression)+ )? - ; - -shiftExpression - : additiveExpression (('<<' | '>>' | '>>>') additiveExpression)* - ; - -additiveExpression - : multiplicativeExpression (('+' | '-') multiplicativeExpression)* - ; - -multiplicativeExpression - : unaryExpression (('*' | '/') unaryExpression)* - ; - -unaryExpression - : ('-' | '!') unaryExpression - | updateOperator IDENTIFIER - | postfixExpression - ; - -// Prefix updates require a local name; postfix updates also allow fields -// and array elements. All updates require an assignable operand. -updateOperator : '++' | '--' ; -postfixExpression : primaryExpression postfixSuffix* updateOperator? ; -postfixSuffix : '.' IDENTIFIER | '[' assignment ']' | '#' | callSuffix | methodCallSuffix ; - -// For a fixed function-valued member, object.name(args) passes object as self. -// This overlaps ordinary field selection followed by a call syntactically; -// name/type resolution determines which call form applies. -methodCallSuffix : '.' IDENTIFIER callSuffix ; - -primaryExpression - : INTEGER_LITERAL - | FLOAT_LITERAL - | STRING_LITERAL - | CHARACTER_LITERAL - | 'true' - | 'false' - | 'null' - | IDENTIFIER - | '(' assignment ')' - | newExpression - | functionExpression - ; - -// A function is an expression bound with an ordinary declaration. -// Its last statement supplies the implicit result; return can exit earlier. -functionExpression : '{' parameterList? '->' statement* '}' ; -parameterList : (parameter ','?)+ ; -parameter : type bindingModifier? IDENTIFIER ; - -// Function types have unnamed, space-separated argument types. -// {int} is the zero-argument type; its function expression still uses ->. -functionType - : '{' type+ '->' type '}' '?'? - | '{' type '}' '?'? - ; - -callSuffix : '(' argumentList? ')' ; -argumentList : assignment (',' assignment)* ','? ; - -// Struct initialization uses a block; array allocation supplies a length. -newExpression : 'new' type ('[' assignment ']' | block)? ; - -INTEGER_LITERAL : '0' | [1-9] DIGIT* ; -FLOAT_LITERAL : DIGIT+ ('.' DIGIT* ('e' DIGIT+)? | 'e' '-'? DIGIT+) ; -STRING_LITERAL : '"' (ESCAPE | ~["\\])* '"' ; -CHARACTER_LITERAL : '\'' (ESCAPE | ~['\\]) '\'' ; -fragment ESCAPE : '\\' [0ntr\\'"] ; -IDENTIFIER : NON_DIGIT (NON_DIGIT | DIGIT)* ; -fragment NON_DIGIT : [a-zA-Z_] ; -fragment DIGIT : [0-9] ; -WHITESPACE : [ \t\r\n]+ -> skip ; -LINE_COMMENT : '//' ~[\r\n]* -> skip ; -BLOCK_COMMENT : '/*' .*? '*/' -> skip ; -``` diff --git a/chapter24/docs/24-grammar.md b/chapter24/docs/24-grammar.md deleted file mode 100644 index 22867355..00000000 --- a/chapter24/docs/24-grammar.md +++ /dev/null @@ -1,168 +0,0 @@ -# Grammar for Chapter 24 - -English | [日本語](24-grammar.ja.md) - -```antlrv4 -grammar SimpleLanguage; - -// Name lookup, assignable operands, type compatibility, and access permissions -// are checked by the compiler in addition to these syntax rules. -program : statement* EOF ; - -block : '{' statement* '}' ; - -statement - : block - | returnStatement - | ifStatement - | whileStatement - | forStatement - | breakStatement - | continueStatement - | structDeclaration - | declaration ';' - | assignment ';' - | ';' - ; - -returnStatement : 'return' assignment ';' ; -ifStatement : 'if' '(' assignment ')' statement ('else' statement)? ; -whileStatement : 'while' '(' assignment ')' statement ; -breakStatement : 'break' ';' ; -continueStatement : 'continue' ';' ; - -forStatement - : 'for' '(' (declaration | assignment)? ';' assignment? ';' assignment? ')' statement - ; - -structDeclaration : 'struct' IDENTIFIER '{' structMember* '}' ';' ; -structMember : methodDeclaration | statement ; - -// A method is an ordinary fixed function binding in a struct definition. -// The compiler supplies self; it is not written in parameterList. -// The general declaration rule also admits explicitly typed function fields. -methodDeclaration : 'val' bindingModifier? IDENTIFIER '=' functionExpression ';' ; - -declaration : declarationType binding (',' binding)* ; -declarationType : type | 'var' | 'val' ; -binding : bindingModifier? IDENTIFIER ('=' initializer)? ; -bindingModifier : '!' | '~' ; -// A declaration initializer consisting of the string "C" declares an extern -// symbol. Ordinary strings elsewhere are array-valued expressions. -initializer : assignment ; - -// The prefix qualifies the named struct reference, not an enclosing array. -// Each [] / [~] suffix qualifies its own array layer. ? requires a reference. -type - : functionType - | primitiveType typeSuffix* - | accessModifier? typeName typeSuffix* - ; -accessModifier : '!' | '~' ; -typeSuffix : '?' | '[]' | '[~]' ; -typeName : IDENTIFIER ('.' IDENTIFIER)* ; - -primitiveType - : 'int' | 'i8' | 'i16' | 'i32' | 'i64' - | 'u1' | 'u8' | 'u16' | 'u32' | 'byte' | 'bool' - | 'flt' | 'f32' | 'f64' - ; - -assignment : expression (assignmentOperator assignment)? ; -assignmentOperator - : '=' | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '^=' - | '<<=' | '>>=' | '>>>=' - ; - -expression : logicalExpression ('?' assignment (':' assignment)?)? ; - -// Both logical operators short-circuit and associate to the right here. -logicalExpression : bitwiseExpression (('&&' | '||') logicalExpression)? ; - -bitwiseExpression - : equalityExpression (('&' | '|' | '^') equalityExpression)* - ; - -equalityExpression : comparisonExpression (('==' | '!=') comparisonExpression)* ; - -// Chained comparisons test adjacent operands and short-circuit. A chain must -// keep its direction; equality has lower precedence and does not join a chain. -comparisonExpression - : shiftExpression - ( (('<' | '<=') shiftExpression)+ | (('>' | '>=') shiftExpression)+ )? - ; - -shiftExpression - : additiveExpression (('<<' | '>>' | '>>>') additiveExpression)* - ; - -additiveExpression - : multiplicativeExpression (('+' | '-') multiplicativeExpression)* - ; - -multiplicativeExpression - : unaryExpression (('*' | '/') unaryExpression)* - ; - -unaryExpression - : ('-' | '!') unaryExpression - | updateOperator IDENTIFIER - | postfixExpression - ; - -// Prefix updates require a local name; postfix updates also allow fields -// and array elements. All updates require an assignable operand. -updateOperator : '++' | '--' ; -postfixExpression : primaryExpression postfixSuffix* updateOperator? ; -postfixSuffix : '.' IDENTIFIER | '[' assignment ']' | '#' | callSuffix | methodCallSuffix ; - -// For a fixed function-valued member, object.name(args) passes object as self. -// This overlaps ordinary field selection followed by a call syntactically; -// name/type resolution determines which call form applies. -methodCallSuffix : '.' IDENTIFIER callSuffix ; - -primaryExpression - : INTEGER_LITERAL - | FLOAT_LITERAL - | STRING_LITERAL - | CHARACTER_LITERAL - | 'true' - | 'false' - | 'null' - | IDENTIFIER - | '(' assignment ')' - | newExpression - | functionExpression - ; - -// A function is an expression bound with an ordinary declaration. -// Its last statement supplies the implicit result; return can exit earlier. -functionExpression : '{' parameterList? '->' statement* '}' ; -parameterList : (parameter ','?)+ ; -parameter : type bindingModifier? IDENTIFIER ; - -// Function types have unnamed, space-separated argument types. -// {int} is the zero-argument type; its function expression still uses ->. -functionType - : '{' type+ '->' type '}' '?'? - | '{' type '}' '?'? - ; - -callSuffix : '(' argumentList? ')' ; -argumentList : assignment (',' assignment)* ','? ; - -// Struct initialization uses a block; array allocation supplies a length. -newExpression : 'new' type ('[' assignment ']' | block)? ; - -INTEGER_LITERAL : '0' | [1-9] DIGIT* ; -FLOAT_LITERAL : DIGIT+ ('.' DIGIT* ('e' DIGIT+)? | 'e' '-'? DIGIT+) ; -STRING_LITERAL : '"' (ESCAPE | ~["\\])* '"' ; -CHARACTER_LITERAL : '\'' (ESCAPE | ~['\\]) '\'' ; -fragment ESCAPE : '\\' [0ntr\\'"] ; -IDENTIFIER : NON_DIGIT (NON_DIGIT | DIGIT)* ; -fragment NON_DIGIT : [a-zA-Z_] ; -fragment DIGIT : [0-9] ; -WHITESPACE : [ \t\r\n]+ -> skip ; -LINE_COMMENT : '//' ~[\r\n]* -> skip ; -BLOCK_COMMENT : '/*' .*? '*/' -> skip ; -``` diff --git a/chapter24/docs/Makefile b/chapter24/docs/Makefile deleted file mode 100644 index 12659b8f..00000000 --- a/chapter24/docs/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -GV := $(wildcard *.gv) -SVG := $(patsubst %.gv,%.svg,$(GV)) - -.PHONY: all -all: $(SVG) - -%.svg: %.gv - dot -Tsvg $< > $@ - -.PHONY: clean -clean: - @rm -f $(SVG) diff --git a/chapter24/docs/examples/A_helloWorld.smp b/chapter24/docs/examples/A_helloWorld.smp deleted file mode 100644 index 07ff935f..00000000 --- a/chapter24/docs/examples/A_helloWorld.smp +++ /dev/null @@ -1,3 +0,0 @@ -// -*- mode: java; -*- -sys.io.p("Hello, World!"); -return 0; diff --git a/chapter24/docs/examples/BubbleSort.smp b/chapter24/docs/examples/BubbleSort.smp deleted file mode 100644 index 938e3181..00000000 --- a/chapter24/docs/examples/BubbleSort.smp +++ /dev/null @@ -1,37 +0,0 @@ -// -*- mode: java; -*- - -// An implementation of -// https://sampleprograms.io/projects/bubble-sort/ -// -// Bubble sort, with reading (parsing) and writing (formatting) the data. - -val sort = { !sys.aryi64 nums -> - var done = false; - while( !done ) { - done = true; - for( var i = 0; i < nums.len-1; i++ ) - if( nums.buf[i] > nums.buf[i+1] ) { - int tmp = nums.buf[i]; - nums.buf[i] = nums.buf[i+1]; - nums.buf[i+1] = tmp; // Swap - done = false; - } - } -}; - -// Read from stdin a line of the form "[ 4, 3, 2, 1]" and print it sorted. -val main = { -> - // Parse array of numbers from stdin - var nums = sys.parseAryI64( sys.io.stdin() ); - if( !nums ) { - sys.io.p("stdin must look like [4, 3, 2, 1]"); - return 1; - } - - // Bubble sort array of integers - sort(nums); - - // Print a list of numbers to stdout - nums.str().write(1); - return 0; -}; diff --git a/chapter24/docs/font-awesome-4.7.0.zip b/chapter24/docs/font-awesome-4.7.0.zip deleted file mode 100644 index b6bdb4bd..00000000 Binary files a/chapter24/docs/font-awesome-4.7.0.zip and /dev/null differ diff --git a/chapter24/docs/ifg_trim.pdf b/chapter24/docs/ifg_trim.pdf deleted file mode 100644 index d952fd4f..00000000 Binary files a/chapter24/docs/ifg_trim.pdf and /dev/null differ diff --git a/chapter24/docs/lattice.gv b/chapter24/docs/lattice.gv deleted file mode 100644 index 8661082d..00000000 --- a/chapter24/docs/lattice.gv +++ /dev/null @@ -1,203 +0,0 @@ -digraph Lattice { - compound = true; - // Define nodes - splines=false; - node [shape=circle, style=filled]; - nodesep=0.2; - ranksep=0.2; - - TOP [label=<⊤>, fillcolor=black, fontcolor=white]; - BOT [label=<⊥>, fillcolor=black, fontcolor=white]; - - // ---------------------- - // Control - XCTRL [label=<⊤:ctrl>, fillcolor=yellow, shape=oval]; - CTRL [label=<⊥:ctrl>, fillcolor=yellow, shape=oval]; - - TOP -> XCTRL; - XCTRL -> CTRL; - CTRL -> BOT; - - // ---------------------- - // Integers - INT_TOP [label=<⊤:int>, fillcolor=lightblue, shape=oval]; - INT_BOT [label=<⊥:int>, fillcolor=lightblue, shape=oval]; - - INT_HI [label="[min>max]" , fillcolor=lightblue, shape=oval]; - INT_XBOOL [label="[1...0]", fillcolor=lightblue, shape=oval]; - INT_CON [label="constants", fillcolor=lightblue, shape=oval]; - INT_CON0 [label="0", fillcolor=lightblue]; - INT_CON1 [label="1", fillcolor=lightblue]; - INT_BOOL [label="[0...1]", fillcolor=lightblue,shape=oval]; - INT_LO [label="[min INT_TOP; - INT_TOP -> INT_HI; - INT_HI -> INT_XBOOL; - INT_XBOOL -> INT_CON0; - INT_XBOOL -> INT_CON1; - INT_HI -> INT_CON; - INT_CON0 -> INT_BOOL; - INT_CON1 -> INT_BOOL; - INT_BOOL -> INT_LO; - INT_CON -> INT_LO; - INT_LO -> INT_BOT; - INT_BOT -> BOT; - - INT_CON0 -> INT_CON1 -> INT_CON [style=invis]; - - // ---------------------- - // Floats - FLT_TOP [label=<⊤:flt>, fillcolor=aqua, shape=oval]; - FLT_BOT [label=<⊥:flt>, fillcolor=aqua, shape=oval]; - - FLT_CON64 [label="64b consts\n[excludes\n32b consts]" , fillcolor=aqua, shape=oval]; - FLT_CON32 [label="32b consts", fillcolor=aqua, shape=oval]; - FLT_CONPI [label="3.14159...", fillcolor=aqua, shape=oval]; - FLT_X32 [label="~f32", fillcolor=aqua]; - FLT_CON0 [label="0." , fillcolor=aqua]; - FLT_32 [label="f32" , fillcolor=aqua]; - - TOP -> FLT_TOP; - FLT_TOP -> FLT_CON64 - FLT_TOP -> FLT_CONPI - FLT_CON64 -> FLT_BOT - FLT_CONPI -> FLT_BOT - - FLT_TOP -> FLT_X32; - FLT_X32 -> FLT_CON0; - FLT_X32 -> FLT_CON32; - FLT_CON0 -> FLT_32; - FLT_CON32 -> FLT_32; - FLT_32 -> FLT_BOT - - FLT_BOT -> BOT; - - FLT_CON0 -> FLT_CON32 -> FLT_CONPI -> FLT_CON64 [style=invis]; - - - // ---------------------- - // Pointers, just a boolean nil/not and a struct - PTR [shape=none, fillcolor=none, label=< - - - -
*ptr
struct
- >]; - PTR0 [shape=none, fillcolor=none, label=< - - - -
*ptr?
struct
- >]; - - TOP -> PTR; - PTR -> PTR0; - PTR0 -> BOT; - - // ---------------------- - // Structs - STRUCT_TOP [label=<⊤:struct>, fillcolor=lightgreen, shape=oval]; - STRUCT_BOT [label=<⊥:struct>, fillcolor=lightgreen, shape=oval]; - - STRUCT_S1 [shape=none, fillcolor=none, label=< - - -
fieldint/ptr
- >]; - STRUCT_S2 [shape=none, fillcolor=none, label=< - - - -
fieldint/ptr
fieldint/ptr
- >]; - STRUCT_SN [shape=none, fillcolor=none, label=< - - - - -
fieldint/ptr
... int/ptr
fieldint/ptr
- >]; - - - TOP -> STRUCT_TOP; - STRUCT_TOP -> STRUCT_S1; - STRUCT_TOP -> STRUCT_S2; - STRUCT_TOP -> STRUCT_SN; - STRUCT_S1 -> STRUCT_BOT; - STRUCT_S2 -> STRUCT_BOT; - STRUCT_SN -> STRUCT_BOT; - STRUCT_BOT -> BOT; - - STRUCT_S1 -> STRUCT_S2 -> STRUCT_SN [style=invis]; - - // ---------------------- - // Memory - MEM_TOP [label=<⊤:mem>, fillcolor=blue, fontcolor=white, shape=oval]; - MEM_BOT [label=<⊥:mem>, fillcolor=blue, fontcolor=white, shape=oval]; - MEM_ALIAS1 [label="#1" , fillcolor=blue, fontcolor=white]; - MEM_ALIASDOTS [label="..." , fillcolor=blue, fontcolor=white, shape=oval]; - MEM_ALIASN [label="#n" , fillcolor=blue, fontcolor=white]; - - TOP -> MEM_TOP; - MEM_TOP -> MEM_ALIAS1; - MEM_TOP -> MEM_ALIASDOTS; - MEM_TOP -> MEM_ALIASN; - MEM_ALIAS1 -> MEM_BOT; - MEM_ALIASDOTS -> MEM_BOT; - MEM_ALIASN -> MEM_BOT; - MEM_BOT -> BOT; - - MEM_ALIAS1 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis]; - - // ---------------------- - // Tuples - - TUPLE_TOP [label=<⊤:tuple>, fillcolor=pink, shape=oval]; - TUPLE_BOT [label=<⊥:tuple>, fillcolor=pink, shape=oval]; - - TUPLE1 [shape=none, fillcolor=none, label=< - - - -
Tuple
type
- >]; - TUPLE2 [shape=none, fillcolor=none, label=< - - - - -
Tuple
type
type
- >]; - TUPLEN [shape=none, fillcolor=none, label=< - - - - - -
Tuple
type
...
type
- >]; - - - TOP -> TUPLE_TOP; - TUPLE_TOP -> TUPLE1; - TUPLE_TOP -> TUPLE2; - TUPLE_TOP -> TUPLEN; - TUPLE1 -> TUPLE_BOT; - TUPLE2 -> TUPLE_BOT; - TUPLEN -> TUPLE_BOT; - TUPLE_BOT -> BOT; - - // ---------------------- - // Additional customization - {rank=same; TOP;} - {rank=same; INT_TOP; FLT_TOP; XCTRL; PTR; STRUCT_TOP; MEM_TOP; TUPLE_TOP} - {rank=same; INT_CON; INT_CON0; INT_CON1; - FLT_CON32; FLT_CON64; FLT_CON0; FLT_CONPI; - STRUCT_S1; STRUCT_S2; STRUCT_SN; - MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN; - TUPLE1; TUPLE2; TUPLEN; - } - {rank=same; INT_BOT; FLT_BOT; CTRL; PTR0; STRUCT_BOT; MEM_BOT; TUPLE_BOT} - {rank=same; BOT;} -} diff --git a/chapter24/docs/lattice.svg b/chapter24/docs/lattice.svg deleted file mode 100644 index e72b473b..00000000 --- a/chapter24/docs/lattice.svg +++ /dev/null @@ -1,691 +0,0 @@ - - - - - - -Lattice - - - -TOP - -⊤ - - - -XCTRL - -⊤ -:ctrl - - - -TOP->XCTRL - - - - - -INT_TOP - -⊤ -:int - - - -TOP->INT_TOP - - - - - -FLT_TOP - -⊤ -:flt - - - -TOP->FLT_TOP - - - - - -PTR - - - -*ptr - - -struct - - - -TOP->PTR - - - - - -STRUCT_TOP - -⊤ -:struct - - - -TOP->STRUCT_TOP - - - - - -MEM_TOP - -⊤ -:mem - - - -TOP->MEM_TOP - - - - - -TUPLE_TOP - -⊤ -:tuple - - - -TOP->TUPLE_TOP - - - - - -BOT - -⊥ - - - -CTRL - -⊥ -:ctrl - - - -XCTRL->CTRL - - - - - -CTRL->BOT - - - - - -INT_HI - -[min>max] - - - -INT_TOP->INT_HI - - - - - -INT_BOT - -⊥ -:int - - - -INT_BOT->BOT - - - - - -INT_XBOOL - -[1...0] - - - -INT_HI->INT_XBOOL - - - - - -INT_CON - -constants - - - -INT_HI->INT_CON - - - - - -INT_CON0 - -0 - - - -INT_XBOOL->INT_CON0 - - - - - -INT_CON1 - -1 - - - -INT_XBOOL->INT_CON1 - - - - - -INT_LO - -[min<max] - - - -INT_CON->INT_LO - - - - - - -INT_BOOL - -[0...1] - - - -INT_CON0->INT_BOOL - - - - - - -INT_CON1->INT_BOOL - - - - - -INT_BOOL->INT_LO - - - - - -INT_LO->INT_BOT - - - - - -FLT_CON64 - -64b consts -[excludes -32b consts] - - - -FLT_TOP->FLT_CON64 - - - - - -FLT_CONPI - -3.14159... - - - -FLT_TOP->FLT_CONPI - - - - - -FLT_X32 - -~f32 - - - -FLT_TOP->FLT_X32 - - - - - -FLT_BOT - -⊥ -:flt - - - -FLT_BOT->BOT - - - - - -FLT_CON64->FLT_BOT - - - - - -FLT_CON32 - -32b consts - - - - -FLT_32 - -f32 - - - -FLT_CON32->FLT_32 - - - - - -FLT_CONPI->FLT_BOT - - - - - - -FLT_X32->FLT_CON32 - - - - - -FLT_CON0 - -0. - - - -FLT_X32->FLT_CON0 - - - - - - -FLT_CON0->FLT_32 - - - - - -FLT_32->FLT_BOT - - - - - -PTR0 - - - -*ptr? - - -struct - - - -PTR->PTR0 - - - - - -PTR0->BOT - - - - - -STRUCT_S1 - - - -field - - - - - - - - -int/ptr - - - -STRUCT_TOP->STRUCT_S1 - - - - - -STRUCT_S2 - - - -field - - - - - - - - -int/ptr - - -field - - - - - - - - -int/ptr - - - -STRUCT_TOP->STRUCT_S2 - - - - - -STRUCT_SN - - - -field - - - - - - - - -int/ptr - - -...   - - - - - - - - -int/ptr - - -field - - - - - - - - -int/ptr - - - -STRUCT_TOP->STRUCT_SN - - - - - -STRUCT_BOT - -⊥ -:struct - - - -STRUCT_BOT->BOT - - - - - -STRUCT_S1->STRUCT_BOT - - - - - - -STRUCT_S2->STRUCT_BOT - - - - - - -STRUCT_SN->STRUCT_BOT - - - - - -MEM_ALIAS1 - -#1 - - - -MEM_TOP->MEM_ALIAS1 - - - - - -MEM_ALIASDOTS - -... - - - -MEM_TOP->MEM_ALIASDOTS - - - - - -MEM_ALIASN - -#n - - - -MEM_TOP->MEM_ALIASN - - - - - -MEM_BOT - -⊥ -:mem - - - -MEM_BOT->BOT - - - - - -MEM_ALIAS1->MEM_BOT - - - - - - -MEM_ALIASDOTS->MEM_BOT - - - - - - -MEM_ALIASN->MEM_BOT - - - - - -TUPLE1 - - - -Tuple - - -type - - - -TUPLE_TOP->TUPLE1 - - - - - -TUPLE2 - - - -Tuple - - -type - - -type - - - -TUPLE_TOP->TUPLE2 - - - - - -TUPLEN - - - -Tuple - - -type - - -... - - -type - - - -TUPLE_TOP->TUPLEN - - - - - -TUPLE_BOT - -⊥ -:tuple - - - -TUPLE_BOT->BOT - - - - - -TUPLE1->TUPLE_BOT - - - - - -TUPLE2->TUPLE_BOT - - - - - -TUPLEN->TUPLE_BOT - - - - - diff --git a/chapter24/docs/lattice2.gv b/chapter24/docs/lattice2.gv deleted file mode 100644 index 6aa37fa0..00000000 --- a/chapter24/docs/lattice2.gv +++ /dev/null @@ -1,85 +0,0 @@ -digraph Lattice { - compound = true; - // Define nodes - splines=false; - node [shape=oval, style=filled]; - nodesep=0.2; - ranksep=0.4; - - TOP [label="~scalar\n+int+tmp+0", fillcolor=black, fontcolor=white, group=center]; - - // ------------------------ - PTRHQ [label="~tmp\n+tmp+0", fillcolor=green, fontcolor=white, group=left]; - TOP -> PTRHQ - - VALH_ [label="~nscalar\n+int+tmp", fillcolor=white, group=center]; - TOP -> VALH_ - - INTHQ [label="~int\n+int+0", fillcolor=lightblue, group=right]; - TOP -> INTHQ - - LEFTHI [label="junk", style=invis, group=junkleft] - - - PTRHQ -> LEFTHI-> VALH_ -> INTHQ [style=invis]; - { rank=same; PTRHQ; LEFTHI; VALH_; INTHQ } - - // ------------------------ - PTRH_ [label="~ntmp\n+tmp", fillcolor=green, fontcolor=white, group=left]; - VALH_ -> PTRH_ - PTRHQ -> PTRH_ - - INTH_ [label="~nint\n+int", fillcolor=lightblue, group=right]; - VALH_ -> INTH_ - INTHQ -> INTH_ - { rank=same; PTRH_; INTH_ } - - // ------------------------ - NILX_ [label="~nil\n[int,tmp]+0", fillcolor=aqua, group=junkleft]; - INTHQ -> NILX_ - PTRHQ -> NILX_ - - NIL__ [label="nil\n[+int+tmp],0", fillcolor=pink]; - VALH_ -> NIL__; - - NILX_ -> NIL__ [style=invis]; - { rank=same; NIL__; NILX_ } - - // ------------------------ - PTRL_ [label="ntmp\ntmp", fillcolor=green, fontcolor=white, group=left]; - PTRH_ -> PTRL_ - - INTL_ [label="nint\nint", fillcolor=lightblue, group=right]; - INTH_ -> INTL_ - { rank=same; PTRL_; INTL_ } - - // ------------------------ - PTRL0 [label="tmp\ntmp,0", fillcolor=green, fontcolor=white, group=left]; - PTRL_ -> PTRL0 - NIL__ -> PTRL0 - - VALL_ [label="nscalar\nint,tmp", fillcolor=white, group=center]; - PTRL_ -> VALL_ - INTL_ -> VALL_ - NILX_ -> VALL_ - - INTL0 [label="int\nint,0", fillcolor=lightblue, group=right]; - INTL_ -> INTL0 - NIL__ -> INTL0 - - PTRL0 -> VALL_ -> INTL0 [style=invis]; - { rank=same; PTRL0; VALL_; INTL0 } - - // ------------------------ - BOT [label="scalar\nint,tmp,0", fillcolor=black, fontcolor=white, group=center]; - PTRL0 -> BOT - INTL0 -> BOT - VALL_ -> BOT - - // ------------------------ - // Verticle alignment - TOP -> VALH_ -> VALL_ -> BOT [style=invis]; - PTRHQ -> PTRH_ -> PTRL_ -> PTRL0 [style=invis]; - INTHQ -> INTH_ -> INTL_ -> INTL0 [style=invis]; - LEFTHI -> NILX_ [style=invis] -} diff --git a/chapter24/docs/lattice2.svg b/chapter24/docs/lattice2.svg deleted file mode 100644 index 8b682aa7..00000000 --- a/chapter24/docs/lattice2.svg +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - -Lattice - - - -TOP - -~scalar -+int+tmp+0 - - - -PTRHQ - -~tmp -+tmp+0 - - - -TOP->PTRHQ - - - - - -VALH_ - -~nscalar -+int+tmp - - - -TOP->VALH_ - - - - - - -INTHQ - -~int -+int+0 - - - -TOP->INTHQ - - - - - - - -PTRH_ - -~ntmp -+tmp - - - -PTRHQ->PTRH_ - - - - - - -NILX_ - -~nil -[int,tmp]+0 - - - -PTRHQ->NILX_ - - - - - - -VALH_->PTRH_ - - - - - -INTH_ - -~nint -+int - - - -VALH_->INTH_ - - - - - -NIL__ - -nil -[+int+tmp],0 - - - -VALH_->NIL__ - - - - - -VALL_ - -nscalar -int,tmp - - - - -INTHQ->INTH_ - - - - - - -INTHQ->NILX_ - - - - - - - -PTRL_ - -ntmp -tmp - - - -PTRH_->PTRL_ - - - - - - -INTL_ - -nint -int - - - -INTH_->INTL_ - - - - - - - -NILX_->VALL_ - - - - - -PTRL0 - -tmp -tmp,0 - - - -NIL__->PTRL0 - - - - - -INTL0 - -int -int,0 - - - -NIL__->INTL0 - - - - - -PTRL_->PTRL0 - - - - - - -PTRL_->VALL_ - - - - - -INTL_->VALL_ - - - - - -INTL_->INTL0 - - - - - - - -BOT - -scalar -int,tmp,0 - - - -PTRL0->BOT - - - - - - -VALL_->BOT - - - - - - -INTL0->BOT - - - - - diff --git a/chapter24/docs/pardoe.docx b/chapter24/docs/pardoe.docx deleted file mode 100644 index 24fde921..00000000 Binary files a/chapter24/docs/pardoe.docx and /dev/null differ diff --git a/chapter24/docs/webtcp.min.js b/chapter24/docs/webtcp.min.js deleted file mode 100644 index bf23ee5a..00000000 --- a/chapter24/docs/webtcp.min.js +++ /dev/null @@ -1,65 +0,0 @@ -function Http(j){this.cID=Math.random().toString(36).substr(2);this.webtcp=j;this.webtcp.httpClients[this.cID]=this;this.createPacket=function(){return{cID:this.cID,type:"http",host:this.remoteAddress,port:this.remotePort,method:null,data:null}};this.ondata=function(){};this.get=function(g,c){this.on("data",c);this.rpc("httpGet",[g])};this.post=function(g,c,j){this.on("data",j);this.rpc("httpPost",[g,c])}}Http.prototype=new WebTCPIO;function Socket(j,g,c,p){this.sID=Math.random().toString(36).substr(2);this.webtcp=j;this.closed=this.ready=!1;this.options=p;this.sockOpts={_updating:!1};this.remoteAddress=g;this.remotePort=c;this.webtcp.sockets[this.sID]=this;this.createPacket=function(){return{id:Math.random().toString(36).substr(2),sID:this.sID,type:"tcp",options:this.options,host:this.remoteAddress,port:this.remotePort,data:null}};this.onconnect=function(){this.webtcp.sockets[sID].ready=!0;this.webtcp.sockets[sID].closed=!1}; -this.ondata=function(){};this.onend=function(){};this.ontimeout=function(){};this.ondrain=function(){};this.onclose=function(){this.webtcp.sockets[sID].ready=!1;this.webtcp.sockets[sID].closed=!0};this.getSockOpts=function(){this.sockOpts._updating=!0;this.rpc("getSockOpts")};this.onSockOptsRcv=function(c){this.sockOpts=c;this.sockOpts._updating=!1}}Socket.prototype=new WebTCPIO;var JSON;JSON||(JSON={}); -(function(){function j(c,p){var q,t,n,x,i=k,e,l=p[c];l&&"object"==typeof l&&"function"==typeof l.toJSON&&(l=l.toJSON(c));"function"==typeof r&&(l=r.call(p,c,l));switch(typeof l){case "string":return g(l);case "number":return isFinite(l)?String(l):"null";case "boolean":case "null":return String(l);case "object":if(!l)return"null";k+=v;e=[];if("[object Array]"===Object.prototype.toString.apply(l)){x=l.length;for(q=0;qc?"0"+c:c}"use strict";"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+c(this.getUTCMonth()+1)+"-"+c(this.getUTCDate())+"T"+c(this.getUTCHours())+":"+c(this.getUTCMinutes())+":"+c(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var p=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, -n=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,k,v,D={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},r;"function"!=typeof JSON.stringify&&(JSON.stringify=function(c,g,p){var n;v=k="";if("number"==typeof p)for(n=0;n=a};c.countRTO=function(a){var b;return 100b;b++)d.push(String.fromCharCode(b));B=(r.lastIndex=0,d.join("").replace(r,function(a){return c[a]="\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4),""}),r.lastIndex=0,c)}a=a.replace(r,function(a){return B[a]})}return a};var q="websocket xdr-streaming xhr-streaming iframe-eventsource iframe-htmlfile xdr-polling xhr-polling iframe-xhr-polling jsonp-polling".split(" "); -c.probeProtocols=function(){for(var a={},b=0;b