mirror of https://git.wuffs.org/MWCC
111 lines
2.6 KiB
C
111 lines
2.6 KiB
C
|
#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();
|