summaryrefslogtreecommitdiff
path: root/PCode.h
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2022-10-07 20:02:27 +0100
committerAsh Wolf <ninji@wuffs.org>2022-10-07 20:02:27 +0100
commit97f6a2438df1eaeb4128ce36f29346ea38a3db4a (patch)
tree78260f8f0f2b84fc70fadb1e50e7fc104390eee4 /PCode.h
downloadMWCC-97f6a2438df1eaeb4128ce36f29346ea38a3db4a.tar.gz
MWCC-97f6a2438df1eaeb4128ce36f29346ea38a3db4a.zip
first very unfinished commit lol
Diffstat (limited to '')
-rw-r--r--PCode.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/PCode.h b/PCode.h
new file mode 100644
index 0000000..601cfdc
--- /dev/null
+++ b/PCode.h
@@ -0,0 +1,110 @@
+#pragma once
+
+typedef struct _PCodeArg {
+ unsigned int _0;
+ unsigned int _4;
+ unsigned int _8;
+} PCodeArg;
+
+typedef struct _PCode {
+ struct _PCode *nextPCode;
+ struct _PCode *prevPCode;
+ struct _PCBlock *block;
+ unsigned int xx_C;
+ unsigned int _10;
+ int flags;
+ unsigned int _18;
+ unsigned int _1C;
+ short op;
+ short argCount;
+ PCodeArg args[0];
+} PCode;
+
+typedef struct _PCLabel {
+ struct _PCLabel *nextLabel;
+ struct _PCBlock *block;
+ short resolved;
+ short index;
+} PCLabel;
+
+typedef struct _PCLink {
+ struct _PCLink *nextLink;
+ struct _PCBlock *block;
+} PCLink;
+
+typedef struct _PCBlock {
+ struct _PCBlock *nextBlock;
+ struct _PCBlock *prevBlock;
+ PCLabel *labels;
+ PCLink *predecessors;
+ PCLink *successors;
+ PCode *firstPCode;
+ PCode *lastPCode;
+ int blockIndex;
+ int codeOffset; // in bytes
+ int loopWeight;
+ short pcodeCount;
+ unsigned short flags;
+} PCBlock;
+
+/* PCode Flags */
+enum {
+ fPCodeFlag1 = 1,
+ fPCodeFlag2 = 2,
+ fPCodeFlag4 = 4,
+ fPCodeFlag8 = 8,
+ fPCodeFlag10 = 0x10,
+ fIsPtrOp = 0x20,
+ fIsConst = 0x40,
+ fIsVolatile = 0x80,
+ fSideEffects = 0x100,
+ fPCodeFlag200 = 0x200,
+ fPCodeFlag400 = 0x400,
+ fPCodeFlag800 = 0x800,
+ fPCodeFlag1000 = 0x1000,
+ fCommutative = 0x2000,
+ fIsCSE = 0x4000,
+ fOverflow = 0x800000,
+ fLink = 0x1000000,
+ fBranchNotTaken = 0x4000000,
+ fBranchTaken = 0x8000000,
+ fAbsolute = 0x10000000,
+ fSetsCarry = 0x10000000,
+};
+
+enum {
+ fPCBlockFlag1 = 1,
+ fPCBlockFlag2 = 2,
+ fPCBlockFlag4 = 4,
+ fPCBlockFlag8 = 8,
+ fPCBlockFlag10 = 0x10,
+ fPCBlockFlag20 = 0x20
+};
+
+extern PCBlock *pcbasicblocks;
+extern PCBlock *pclastblock;
+extern void *prologue;
+extern void *epilogue;
+extern PCBlock **depthfirstordering;
+extern int pcblockcount;
+extern int pcloopweight;
+
+extern void initpcode();
+extern PCode *makepcode(short op, ...);
+extern void emitpcode(short op, ...);
+extern PCode *copypcode(PCode *pcode);
+extern PCLabel *makepclabel();
+extern PCBlock *makepcblock();
+extern void pclabel(PCBlock *block, PCLabel *label);
+extern void pcbranch(PCBlock *block, PCLabel *label);
+extern void pccomputepredecessors();
+extern void deleteblock(PCBlock *block);
+extern void deleteunreachableblocks();
+extern void appendpcode(PCBlock *block, PCode *pcode);
+extern void deletepcode(PCode *pcode);
+extern void insertpcodebefore(PCode *anchor, PCode *newpcode);
+extern void insertpcodeafter(PCode *anchor, PCode *newpcode);
+extern void setpcodeflags(int flags);
+extern void clearpcodeflags(int flags);
+extern int pccomputeoffsets();
+extern void computedepthfirstordering();