source: dev/trunk/abdev/BasicCompiler64/Opcode.h@ 226

Last change on this file since 226 was 226, checked in by dai_9181, 17 years ago
File size: 11.4 KB
RevLine 
[206]1#pragma once
[3]2
[206]3#include <Type.h>
4#include <Procedure.h>
[226]5#include "MachineFixed.h"
[3]6
[206]7
[3]8//変数の種類
[40]9#define NON_VAR 0
[62]10#define VAR_GLOBAL 1 // Global Variable
11#define VAR_REFGLOBAL 2 // Global Refference Variable
12#define VAR_LOCAL 3 // Local Variable
13#define VAR_REFLOCAL 4 // Local Refference Variable
14#define VAR_DIRECTMEM 5 // Direct memory
[3]15
[40]16
[3]17extern int cp;
18extern int obp;
19extern char *OpBuffer;
20
[49]21#define breakpoint OpBuffer[obp++]=(char)0xCC;
22
23
[3]24//ラベルアドレス
25struct LABEL{
26 char *pName;
27 int line;
28 DWORD address;
29};
30
31//Goto未知ラベル
32struct GOTOLABELSCHEDULE{
33 char *pName;
34 int line;
35 DWORD pos;
36 DWORD now_cp;
37};
38
39
40//プロシージャの種類
41#define PROC_DEFAULT 1 //ユーザー定義関数
42#define PROC_DLL 2 //DLL関数
43#define PROC_BUILTIN 3 //コンパイラ埋め込み型
44#define PROC_PTR 4 //関数ポインタ
45
46//プロシージャ
47struct PROCEDURE{
48 char name[255];
49 int address;
50 int types[MAX_PARMS];
51 _int8 ByVal[MAX_PARMS];
52 BOOL ReturnType;
53};
54
55//With情報
56struct WITHINFO{
57 char **ppName;
58 int *pWithCp;
59 int num;
60};
61
62
63class CStackFrame:public CSchedule{
64 ///////////////////////////
65 // スタックフレーム管理
66 ///////////////////////////
67
68 int lowest_sp; //スタックポインタの最下位位置
69 int now_sp; //スタックポインタ
70 int max_parm_size; //パラメータの最大サイズ
71
72public:
73 //コンストラクタ
74 CStackFrame();
75
76 //デストラクタ
77 ~CStackFrame();
78
[220]79 int GetFrameSize( int localParamSize );
[64]80 int GetNowSp();
81 void mov_sp( int reg );
[20]82 int push(int reg);
[66]83 void push(int xmm_reg,int varSize);
[20]84 void ref_offset_data( int reg, int sp_offset );
[3]85 void ref(int reg);
[66]86 void ref(int xmm_reg,int varSize);
[64]87 void pop(int reg = REG_NON);
[66]88 void pop(int xmm_reg,int varSize);
[3]89 void parameter_allocate(int size);
[220]90 void RunningSchedule( int stackFrameSize );
[3]91
92 void error_check(void);
93};
94extern CStackFrame *pobj_sf;
95
96
97class CBlockReg{
98 int array_BlockReg[256];
99 int num;
100
101public:
102 CBlockReg();
103 void lock(int reg);
104 void unlock(int reg);
105 BOOL check(int reg);
106 void clear(void);
107
108 //レジスタのバックアップと復旧
109 void backup();
110 void restore();
111};
112extern CBlockReg *pobj_BlockReg;
113class CRegister{
114 ////////////////////
115 // レジスタ管理
116 ////////////////////
117
118 //利用可能なレジスタを列挙する関数
119 void EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg);
120
121 int array_UseReg[16],sp_UseReg;
122
123 int array_XmmReg[16];
124 int sp_XmmReg;
125
126 int init_sp_reg,init_sp_xmm_reg;
127
128public:
129 CRegister(){};
130 CRegister(int AnswerReg);
131 ~CRegister(){};
132
133 //コンパイラにバグがないかをチェックする機構
134 void bug_check();
135
136 //汎用レジスタ
137 int GetNextReg();
138 int GetLockingReg();
139 int LockReg();
140 int UnlockReg();
141
142 //XMMレジスタ
143 int GetNextXmmReg();
144 int GetLockingXmmReg();
145 int LockXmmReg();
146 int UnlockXmmReg();
147
[19]148 //レジスタが利用中かどうかを調べる
149 bool IsUsing( int reg );
150
[3]151 //レジスタのバックアップと復旧
152 void backup();
153 void restore();
154};
155extern CRegister *pobj_reg;
156
157
158#define BACKUP_REGISTER_RESOURCE \
159 /* レジスタをスタックフレームにバックアップ */ \
160 pobj_BlockReg->backup(); \
161 if(pobj_reg) pobj_reg->backup(); \
162 \
163 /* レジスタブロッキングオブジェクトを退避して再生成 */ \
164 CBlockReg *pobj_BlockReg_back; \
165 pobj_BlockReg_back=pobj_BlockReg; \
166 pobj_BlockReg=new CBlockReg; \
167 \
168 /* レジスタ管理オブジェクトポインタを退避して0をセット */ \
169 CRegister *pobj_reg_back; \
170 pobj_reg_back=pobj_reg; \
171 pobj_reg=0;
172
173#define RESTORE_REGISTER_RESOURCE \
174 /* レジスタブロッキングオブジェクトポインタを復元 */ \
175 delete pobj_BlockReg; \
176 pobj_BlockReg=pobj_BlockReg_back; \
177 \
178 /* レジスタ管理オブジェクトポインタを復元 */ \
179 delete pobj_reg; \
180 pobj_reg=pobj_reg_back; \
181 \
182 /* レジスタをスタックフレームから復元 */ \
183 if(pobj_reg) pobj_reg->restore(); \
184 pobj_BlockReg->restore();
185
186
187
188//RSrcSection.cpp
189char *GetRSrcSectionBuffer(int *pLen);
190
191//Compile.cpp
192void ChangeOpcode(char *Command);
193void GetGlobalDataForDll(void);
194DWORD CompileBuffer(char Return_Sequence,WORD Return_Command);
195
196//Register.cpp
197BOOL IsGeneralReg(int reg);
198BOOL IsXmmReg(int reg);
199BOOL IsVolatileReg(int reg);
[131]200void IfR14Push( int reg );
[3]201
202//Compile_Calc.cpp
203void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar);
[129]204void OpcodeCalc(const char *Command);
[3]205
206//NumOpe.cpp
[128]207bool TermOpe(
208 const char *term,
209 const Type &baseType,
210 Type &resultType,
211 bool &isLiteral,
212 BOOL *pbUseHeap,
213 bool isWantObject = false,
214 bool *pIsClassName = NULL,
215 bool isProcedureCallOnly = false );
[75]216bool NumOpe( int *pReg,
217 const char *Command,
218 const Type &baseType,
219 Type &resultType,
220 BOOL *pbUseHeap = NULL );
[3]221
222//NumOpe_Arithmetic.cpp
223BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
224BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer);
225BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType);
226BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer);
227BOOL Calc_MinusMark(int *type,int sp);
228BOOL Calc_Power(int *type,int *pStackPointer);
229BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer);
230
231//NumOpe_Logical.cpp
232BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
233BOOL Calc_Not(int *type,int sp);
234
235//NumOpe_Relation.cpp
236BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
237
238//NumOpe_TypeOperation.cpp
239void ExtendTypeTo64(int type,int reg);
240void ExtendTypeTo32(int type,int reg);
241void ExtendTypeTo16(int type,int reg);
242void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg);
243void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg);
244void ChangeTypeToWhole(int OldType,int NewType,int reg,int xmm_reg);
245void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg);
246void SetOneTermToReg_Whole64Calc(int TermType,int *pReg);
247void SetOneTermToReg_Whole32Calc(int TermType,int *pReg);
248void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2);
249void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2);
250void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2);
251BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer);
252
253//Compile_Set_Var.cpp
254BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar);
[75]255void SetStructVariableFromRax( const Type &varType, const Type &calcType, RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
[64]256void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar);
[36]257void SetBooleanVariable(int type,RELATIVE_VAR *pRelative);
[66]258void SetWholeVariable(int varSize,int type,RELATIVE_VAR *pRelative);
[3]259
260//increment.cpp
[129]261void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight);
[3]262
263//Compile_Calc_PushVar.cpp
264void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
265void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
266void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg);
267
[131]268//Compile_Interface.cpp
269bool CastToInterface( int reg, int vtblReg, const CClass &baseClass, const CClass &interfaceClass );
270
[3]271//Compile_Object.cpp
[75]272void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter,const Type &baseTypeInfo );
[64]273void OpcodeDelete(const char *Parameter, bool isSweeping);
[3]274
275//Compile_Var.cpp
[97]276bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess);
[3]277void SetThisPtrToReg(int reg);
[206]278bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts = NULL );
279bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *InitBuf);
[40]280#define DIMFLAG_INITDEBUGVAR 0x01
281#define DIMFLAG_NONCALL_CONSTRACTOR 0x02
282#define DIMFLAG_STATIC 0x04
283#define DIMFLAG_CONST 0x08
[206]284void dim( char *VarName, const Subscripts &subscripts, Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags);
[3]285void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
[95]286bool Compile_AddGlobalRootsForGc();
[3]287
[71]288//ParamImpl.cpp
289class ParamImpl{
[3]290 char *Parms[255];
[75]291 vector<Type> types;
[3]292 int ParmsNum;
293
[75]294 Type returnType;
[3]295
[20]296 //一時オブジェクト管理用
297 bool useTempObject;
298 bool useTempParameters[255];
299 int StackOffsetOfTempObject[255];
300
[3]301public:
[71]302 ParamImpl(const char *buffer);
[75]303 ParamImpl(const Parameters &params);
[71]304 ~ParamImpl();
[75]305 void SetReturnType( const Type &returnType );
[3]306
307private:
[140]308 bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType );
309
[3]310public:
[206]311 const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
312 const UserProc *OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
[3]313
[77]314 void ApplyDefaultParameters( const Parameters &params );
[75]315 bool ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum = -1 );
316 void MacroParameterSupport( const Parameters &params );
317 void SetStructParameter( int reg, const Type &baseType, const char *expression );
318 void SetParameter( const string &procName, const Parameters &params, int SecondParmNum = -1 );
[20]319
320 //一時オブジェクトパラメータの生成と破棄
[75]321 int NewTempParameters( const string &procName, const Parameters &params, int SecondParmNum = -1 );
[20]322 void DeleteTempParameters();
323
[3]324 void BackupParameter(int pi_num);
325 void RestoreParameter(int pi_num);
326};
327
328//CLockParameter.cpp
329#define MAX_LOCKPARMS 255
330class CDBLockParms{
331public:
332 int array_LevelCount[MAX_LOCKPARMS];
333 CDBLockParms();
334 ~CDBLockParms();
335
336 void lock(int level);
337 void unlock(int level);
338};
339
340//Compile_CallProc.cpp
341void AddLocalVarAddrSchedule();
342#define PROCFLAG_NEW 1
[75]343bool Opcode_CallProcPtr(const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
[206]344bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType);
[75]345bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
[3]346
347//Compile_ProcOp.cpp
348void CompileLocal();
349
350//Compile_Func.cpp
351int GetFunctionFromName(char *FuncName);
[75]352bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo, bool isCallOn = true );
[3]353
354//OperatorProc.cpp
[75]355void FreeTempObject(int reg,const CClass *pobj_c);
[206]356int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
[75]357void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType);
358void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType);
[3]359
360//Compile_Statement.cpp
[129]361void OpcodeOthers(const char *Command);
[3]362void OpcodeIf(char *Parameter);
363void OpcodeGoto(char *Parameter);
364void OpcodeWhile(char *Parameter);
365void OpcodeFor(char *Parameter);
366void OpcodeDo(char *Parameter);
367void OpcodeContinue(void);
368void OpcodeExitSub(void);
[75]369void OpcodeSelect( const char *Parameter );
[3]370void OpcodeCase(char *Parameter);
371void OpcodeGosub(char *Parameter);
372void OpcodeReturn(char *Parameter);
373void OpcodeSetPtrData(char *Parameter,int type);
374
375
376//InsertOpcode.cpp
377void InsertDimStatement_ToProcHead(char *lpszCommand);
378
379
380BOOL IsSafeReg(int reg);
Note: See TracBrowser for help on using the repository browser.