mirror of https://git.wuffs.org/MWCC
166 lines
4.6 KiB
C
166 lines
4.6 KiB
C
#ifndef COMPILER_IROLINEARFORM_H
|
|
#define COMPILER_IROLINEARFORM_H
|
|
|
|
#include "compiler/IrOptimizer.h"
|
|
#include "compiler/Switch.h"
|
|
#include "compiler/enode.h"
|
|
|
|
#ifdef __MWERKS__
|
|
#pragma options align=mac68k
|
|
#endif
|
|
|
|
typedef struct IROLinearIRSave {
|
|
IROLinear *firstLinear;
|
|
IROLinear *lastLinear;
|
|
UInt32 numLinear;
|
|
Statement *curStat;
|
|
Boolean disableDueToAsm;
|
|
Boolean isLeafFunction;
|
|
Boolean functionHasReturn;
|
|
void *nullCheckList;
|
|
Statement *currStmt;
|
|
Statement *prevStmt;
|
|
} IROLinearIRSave;
|
|
|
|
typedef enum IROLinearType {
|
|
IROLinearNop,
|
|
IROLinearOperand,
|
|
IROLinearOp1Arg,
|
|
IROLinearOp2Arg,
|
|
IROLinearGoto,
|
|
IROLinearIf,
|
|
IROLinearIfNot,
|
|
IROLinearReturn,
|
|
IROLinearLabel,
|
|
IROLinearSwitch,
|
|
IROLinearOp3Arg,
|
|
IROLinearFunccall,
|
|
IROLinearEntry,
|
|
IROLinearExit,
|
|
IROLinearBeginCatch,
|
|
IROLinearEndCatch,
|
|
IROLinearEndCatchDtor,
|
|
IROLinearAsm,
|
|
IROLinear18,
|
|
IROLinear19,
|
|
IROLinearEnd
|
|
} IROLinearType;
|
|
|
|
enum {
|
|
IROLF_1 = 0x1,
|
|
IROLF_Reffed = 0x2,
|
|
IROLF_Assigned = 0x4,
|
|
IROLF_8 = 0x8,
|
|
IROLF_Used = 0x10,
|
|
IROLF_Ind = 0x20,
|
|
IROLF_Subs = 0x40,
|
|
IROLF_80 = 0x80,
|
|
IROLF_LoopInvariant = 0x100,
|
|
IROLF_BeginLoop = 0x200,
|
|
IROLF_EndLoop = 0x400,
|
|
IROLF_Ris = 0x800,
|
|
IROLF_Immind = 0x1000,
|
|
IROLF_VecOp = 0x2000,
|
|
IROLF_4000 = 0x4000,
|
|
IROLF_8000 = 0x8000,
|
|
IROLF_VecOpBase = 0x10000,
|
|
IROLF_20000 = 0x20000,
|
|
IROLF_CounterLoop = 0x40000,
|
|
IROLF_BitfieldIndirect = 0x80000,
|
|
IROLF_CouldError = 0x100000
|
|
};
|
|
|
|
// actual name is LinearNode as per mwccppc v8
|
|
struct IROLinear {
|
|
IROLinearType type;
|
|
ENodeType nodetype;
|
|
SInt32 flags;
|
|
UInt16 nodeflags;
|
|
unsigned short index;
|
|
Statement *stmt;
|
|
Type *rtype;
|
|
IROExpr *expr;
|
|
struct ERange *x16;
|
|
PointsToFunction *pointsToFunction;
|
|
Boolean x1E;
|
|
union {
|
|
struct {
|
|
void *data1;
|
|
void *data2;
|
|
void *data3;
|
|
void *data4;
|
|
void *data5;
|
|
} idk;
|
|
// Operand
|
|
ENode *node;
|
|
// Op1Arg
|
|
IROLinear *monadic;
|
|
// Op2Arg
|
|
struct {
|
|
IROLinear *left;
|
|
IROLinear *right;
|
|
} diadic;
|
|
// Op3Arg
|
|
struct {
|
|
IROLinear *a;
|
|
IROLinear *b;
|
|
IROLinear *c;
|
|
} args3;
|
|
// Funccall
|
|
struct {
|
|
char ispascal;
|
|
short argCount;
|
|
IROLinear **args;
|
|
IROLinear *linear8; // funcref
|
|
TypeFunc *functype;
|
|
struct LocationSetSet *returnedLocs;
|
|
} funccall;
|
|
// Asm
|
|
Statement *asm_stmt;
|
|
// If, IfNot, Goto, Label
|
|
struct {
|
|
CLabel *label;
|
|
IROLinear *x4; // if,ifnot only??
|
|
} label;
|
|
struct {
|
|
SwitchInfo *info;
|
|
IROLinear *x4;
|
|
} swtch;
|
|
// BeginCatch, EndCatch, EndCatchDtor
|
|
struct {
|
|
IROLinear *linear;
|
|
int x4;
|
|
int x8;
|
|
} ctch;
|
|
} u;
|
|
IROLinear *next;
|
|
};
|
|
|
|
#ifdef __MWERKS__
|
|
#pragma options align=reset
|
|
#endif
|
|
|
|
extern IROLinear *IRO_FirstLinear;
|
|
extern IROLinear *IRO_LastLinear;
|
|
extern UInt32 IRO_NumLinear;
|
|
extern Statement *CurStat;
|
|
|
|
extern IROLinear *IRO_NewLinear(IROLinearType type);
|
|
extern void IRO_PreLinearize(Statement *stmt);
|
|
extern void IRO_Linearize(Statement *stmt);
|
|
extern ENode *IRO_NewENode(ENodeType nodetype);
|
|
extern Statement *IRO_Delinearize(IRONode *node, IROLinear *linear);
|
|
extern void IRO_RenumberInts(void);
|
|
extern void IRO_UpdateFlagsOnInts(void);
|
|
extern void IRO_SaveLinearIR(IROLinearIRSave *save);
|
|
extern void IRO_RestoreLinearIR(IROLinearIRSave *save);
|
|
|
|
#define IS_LINEAR_ENODE(_linear, _nodetype) ( ((_linear)->type == IROLinearOperand) && ((_linear)->u.node->type) == (_nodetype) )
|
|
#define IS_LINEAR_MONADIC(_linear, _nodetype) ( ((_linear)->type == IROLinearOp1Arg) && ((_linear)->nodetype) == (_nodetype) )
|
|
#define IS_LINEAR_MONADIC_2(_linear, _nodetype1, _nodetype2) ( ((_linear)->type == IROLinearOp1Arg) && (((_linear)->nodetype) == (_nodetype1) || ((_linear)->nodetype) == (_nodetype2)) )
|
|
#define IS_LINEAR_DIADIC(_linear, _nodetype) ( ((_linear)->type == IROLinearOp2Arg) && ((_linear)->nodetype) == (_nodetype) )
|
|
#define IS_LINEAR_DIADIC_2(_linear, _nodetype1, _nodetype2) ( ((_linear)->type == IROLinearOp2Arg) && (((_linear)->nodetype) == (_nodetype1) || ((_linear)->nodetype) == (_nodetype2)) )
|
|
#define IS_LINEAR_DIADIC_3(_linear, _nodetype1, _nodetype2, _nodetype3) ( ((_linear)->type == IROLinearOp2Arg) && (((_linear)->nodetype) == (_nodetype1) || ((_linear)->nodetype) == (_nodetype2) || ((_linear)->nodetype) == (_nodetype3)) )
|
|
|
|
#endif
|