Skip to content

Commit

Permalink
Bring pr/154 to ch 20
Browse files Browse the repository at this point in the history
RISC5 changes.
Some missing x86 ops.
Still needs some calling convention love.
  • Loading branch information
cliffclick committed Feb 11, 2025
1 parent 47b405d commit 03ed954
Show file tree
Hide file tree
Showing 51 changed files with 2,414 additions and 120 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -65,45 +65,16 @@ public class x86_64_v2 extends Machine {
// Calling convention; returns a machine-specific register
// for incoming argument idx.
// index 0 for control, 1 for memory, real args start at index 2
static int callInArgInt( int idx ) {
static int callInArg( TypeFunPtr tfp, int idx ) {
return switch( CodeGen.CODE._callingConv ) {
case CodeGen.CallingConv.SystemV -> callInArgSystemVInt(idx);
case CodeGen.CallingConv.Win64 -> callInArgWin64Int (idx);
case CodeGen.CallingConv.SystemV -> callInArgSystemV(tfp.idx);
case CodeGen.CallingConv.Win64 -> callInArgWin64 (tfp.idx);
};
}
static int callInArgFloat(int idx) {
return switch(CodeGen.CODE._callingConv) {
case CodeGen.CallingConv.SystemV -> callInArgSystemVFloat(idx);
case CodeGen.CallingConv.Win64 -> callInArgWin64Float(idx);
};
}

// WIN64(param passing)
static RegMask[] CALLINMASK_WIN64_INT = new RegMask[] {
RegMask.EMPTY,
RegMask.EMPTY,
RCX_MASK,
RDX_MASK,
R08_MASK,
R09_MASK,
RegMask.EMPTY,
RegMask.EMPTY
};

static RegMask[] CALLINMASK_WIN64_FLOAT = new RegMask[] {
RegMask.EMPTY,
RegMask.EMPTY,
XMM0_MASK,
XMM1_MASK,
XMM2_MASK,
XMM3_MASK,
RegMask.EMPTY,
RegMask.EMPTY
};

static int[] CALLINARG_WIN64_INT = new int[] {
0, // Control, no register
0, // Memory, no register
-1, // Control, no register
-1, // Memory, no register
RCX,
RDX,
R08,
Expand All @@ -112,79 +83,23 @@ static int callInArgFloat(int idx) {
0,
};

static int[] CALLINARG_WIN64_FLOAT = new int[] {
0, // Control, no register
0, // Memory, no register
RCX,
RDX,
R08,
R09,
0,
0,
};


static int callInArgWin64Int( int idx ) { return CALLINARG_WIN64_INT[idx]; }
static int callInArgWin64Float(int idx) {return CALLINARG_WIN64_FLOAT[idx];}
// caller saved(win64)
public static final long WIN64_ABI_CALLER_SAVED =
(1L << RAX) | (1L << RCX) | (1L << RDX) | (1L << R08) | (1L << R09) | (1L << R10) | (1L << R11);

// callee saved(win64)
public static final long WIN64_ABI_CALLEE_SAVED = ~WIN64_ABI_CALLER_SAVED;


// SystemV(param passing)
static RegMask[] CALLINMASK_SYSTEMV_INT = new RegMask[] {
RegMask.EMPTY,
RegMask.EMPTY,
RDI_MASK,
RSI_MASK,
RDX_MASK,
RCX_MASK,
R08_MASK,
R09_MASK
};

static RegMask[] CALLINMASK_SYSTEMV_FLOAT = new RegMask[] {
RegMask.EMPTY,
RegMask.EMPTY,
XMM0_MASK,
XMM1_MASK,
XMM2_MASK,
XMM3_MASK,
XMM4_MASK,
XMM5_MASK,
XMM6_MASK,
XMM7_MASK,
};

static int[] CALLINARG_SYSTEMV_INT = new int[] {
0, // Control, no register
0, // Memory, no register
-1, // Control, no register
-1, // Memory, no register
RDI,
RSI,
RDX,
RCX,
R08,
R09,
};

static int[] CALLINARG_SYSTEMV_FLOAT = new int[] {
0, // Control, no register
0, // Memory, no register
XMM0,
XMM1,
XMM2,
XMM3,
XMM4,
XMM5,
XMM6,
XMM7,
};

static int callInArgSystemVInt( int idx ) { return CALLINARG_SYSTEMV_INT[idx]; }
static int callInArgSystemVFloat(int idx) { return CALLINARG_SYSTEMV_FLOAT [idx]; }
// caller saved(systemv)
// caller saved(win64)
public static final long SYSTEMV_ABI_CALLER_SAVED =
Expand All @@ -193,17 +108,10 @@ static int callInArgFloat(int idx) {
public static final long SYSTEMV_ABI_CALLE_SAVED = ~SYSTEMV_ABI_CALLER_SAVED;


static RegMask callInMaskInt( int idx ) {
static RegMask callInMask( TypeFunPtr tfp, int idx ) {
return switch( CodeGen.CODE._callingConv ) {
case CodeGen.CallingConv.SystemV -> CALLINMASK_SYSTEMV_INT[idx];
case CodeGen.CallingConv.Win64 -> CALLINMASK_WIN64_INT [idx];
};
}

static RegMask callInMaskFloat(int idx) {
return switch(CodeGen.CODE._callingConv) {
case CodeGen.CallingConv.SystemV -> CALLINMASK_SYSTEMV_FLOAT[idx];
case CodeGen.CallingConv.Win64 -> CALLINMASK_WIN64_FLOAT[idx];
case CodeGen.CallingConv.Win64 -> CALLINMASK_WIN64_INT [idx];
};
}

Expand Down
181 changes: 181 additions & 0 deletions chapter20/javac.20250211_115901.args
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
-g
-cp
build/classes/main;lib/hamcrest-core-1.3.jar;lib/junit-4.12.jar
-sourcepath
src/main/java
-d
build/classes/main
src/main/java/com/seaofnodes/simple/Ary.java
src/main/java/com/seaofnodes/simple/IterPeeps.java
src/main/java/com/seaofnodes/simple/Parser.java
src/main/java/com/seaofnodes/simple/SB.java
src/main/java/com/seaofnodes/simple/Utils.java
src/main/java/com/seaofnodes/simple/Var.java
src/main/java/com/seaofnodes/simple/codegen/BuildLRG.java
src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java
src/main/java/com/seaofnodes/simple/codegen/IFG.java
src/main/java/com/seaofnodes/simple/codegen/LRG.java
src/main/java/com/seaofnodes/simple/codegen/ListScheduler.java
src/main/java/com/seaofnodes/simple/codegen/Machine.java
src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java
src/main/java/com/seaofnodes/simple/codegen/RegMask.java
src/main/java/com/seaofnodes/simple/node/AddFNode.java
src/main/java/com/seaofnodes/simple/node/AddNode.java
src/main/java/com/seaofnodes/simple/node/AndNode.java
src/main/java/com/seaofnodes/simple/node/BoolNode.java
src/main/java/com/seaofnodes/simple/node/CFGNode.java
src/main/java/com/seaofnodes/simple/node/CProjNode.java
src/main/java/com/seaofnodes/simple/node/CallEndNode.java
src/main/java/com/seaofnodes/simple/node/CallNode.java
src/main/java/com/seaofnodes/simple/node/CastNode.java
src/main/java/com/seaofnodes/simple/node/ConstantNode.java
src/main/java/com/seaofnodes/simple/node/CtrlNode.java
src/main/java/com/seaofnodes/simple/node/DivFNode.java
src/main/java/com/seaofnodes/simple/node/DivNode.java
src/main/java/com/seaofnodes/simple/node/FRefNode.java
src/main/java/com/seaofnodes/simple/node/FunNode.java
src/main/java/com/seaofnodes/simple/node/IfNode.java
src/main/java/com/seaofnodes/simple/node/LoadNode.java
src/main/java/com/seaofnodes/simple/node/LogicalNode.java
src/main/java/com/seaofnodes/simple/node/LoopNode.java
src/main/java/com/seaofnodes/simple/node/MachConcreteNode.java
src/main/java/com/seaofnodes/simple/node/MachNode.java
src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
src/main/java/com/seaofnodes/simple/node/MemOpNode.java
src/main/java/com/seaofnodes/simple/node/MinusFNode.java
src/main/java/com/seaofnodes/simple/node/MinusNode.java
src/main/java/com/seaofnodes/simple/node/MulFNode.java
src/main/java/com/seaofnodes/simple/node/MulNode.java
src/main/java/com/seaofnodes/simple/node/MultiNode.java
src/main/java/com/seaofnodes/simple/node/NeverNode.java
src/main/java/com/seaofnodes/simple/node/NewNode.java
src/main/java/com/seaofnodes/simple/node/Node.java
src/main/java/com/seaofnodes/simple/node/NotNode.java
src/main/java/com/seaofnodes/simple/node/OrNode.java
src/main/java/com/seaofnodes/simple/node/ParmNode.java
src/main/java/com/seaofnodes/simple/node/PhiNode.java
src/main/java/com/seaofnodes/simple/node/ProjNode.java
src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java
src/main/java/com/seaofnodes/simple/node/RegionNode.java
src/main/java/com/seaofnodes/simple/node/ReturnNode.java
src/main/java/com/seaofnodes/simple/node/RoundF32Node.java
src/main/java/com/seaofnodes/simple/node/SarNode.java
src/main/java/com/seaofnodes/simple/node/ScopeNode.java
src/main/java/com/seaofnodes/simple/node/ShlNode.java
src/main/java/com/seaofnodes/simple/node/ShrNode.java
src/main/java/com/seaofnodes/simple/node/StartNode.java
src/main/java/com/seaofnodes/simple/node/StopNode.java
src/main/java/com/seaofnodes/simple/node/StoreNode.java
src/main/java/com/seaofnodes/simple/node/StructNode.java
src/main/java/com/seaofnodes/simple/node/SubFNode.java
src/main/java/com/seaofnodes/simple/node/SubNode.java
src/main/java/com/seaofnodes/simple/node/ToFloatNode.java
src/main/java/com/seaofnodes/simple/node/XCtrlNode.java
src/main/java/com/seaofnodes/simple/node/XorNode.java
src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
src/main/java/com/seaofnodes/simple/print/GraphVisualizer.java
src/main/java/com/seaofnodes/simple/print/IRPrinter.java
src/main/java/com/seaofnodes/simple/print/JSViewer.java
src/main/java/com/seaofnodes/simple/print/SimpleWebSocket.java
src/main/java/com/seaofnodes/simple/type/Field.java
src/main/java/com/seaofnodes/simple/type/Type.java
src/main/java/com/seaofnodes/simple/type/TypeFloat.java
src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java
src/main/java/com/seaofnodes/simple/type/TypeInteger.java
src/main/java/com/seaofnodes/simple/type/TypeMem.java
src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
src/main/java/com/seaofnodes/simple/type/TypeNil.java
src/main/java/com/seaofnodes/simple/type/TypePtr.java
src/main/java/com/seaofnodes/simple/type/TypeRPC.java
src/main/java/com/seaofnodes/simple/type/TypeStruct.java
src/main/java/com/seaofnodes/simple/type/TypeTuple.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddFRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/CBranchRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/CmpIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/CmpRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivFRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/FltRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/FunRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/I2F8RISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/IntRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/LoadRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulFRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/ParmRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/ProjRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/RetRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubFRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/TFPRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorIRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorRISC.java
src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFMemX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddMemX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallEndX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpFX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpMemX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivFX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FltX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/I2f8X86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/IntX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LeaX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemOpX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulFX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ParmX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ProjX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubFX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/TFPX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/XorIX86.java
src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java
Loading

0 comments on commit 03ed954

Please sign in to comment.