source: dev/BasicCompiler64/Opcode.h@ 31

Last change on this file since 31 was 31, checked in by dai_9181, 17 years ago

_System_LocalThis(見えないThisポインタパラメータ)を通常のパラメータ保有領域ではなく、リアルパラメータ保有領域に移動した。
メソッドとグローバル関数のオーバーロードに対応(DLL関数オーバーロードには未対応)。

File size: 16.4 KB
Line 
1//Opcode.h
2
3
4//レジスタを示す定数
5#define REG_EAX 1
6#define REG_EBX 2
7#define REG_ECX 3
8#define REG_EDX 4
9#define REG_ESP 5
10#define REG_EBP 6
11
12#define REGISTER_OPERAND(reg) (reg&0x07)
13
14#define REG_NON -1
15#define REG_RAX 0x00 //reg:000
16#define REG_RCX 0x01 //reg:001
17#define REG_RDX 0x02 //reg:010
18#define REG_RBX 0x03 //reg:011
19#define REG_RSP 0x04 //reg:100
20#define REG_RBP 0x05 //reg:101
21#define REG_RSI 0x06 //reg:110
22#define REG_RDI 0x07 //reg:111
23#define REG_R8 0x08 //reg:000(REXプリフィックス)
24#define REG_R9 0x09 //reg:001(REXプリフィックス)
25#define REG_R10 0x0A //reg:010(REXプリフィックス)
26#define REG_R11 0x0B //reg:011(REXプリフィックス)
27#define REG_R12 0x0C //reg:100(REXプリフィックス)
28#define REG_R13 0x0D //reg:101(REXプリフィックス)
29#define REG_R14 0x0E //reg:110(REXプリフィックス)
30#define REG_R15 0x0F //reg:111(REXプリフィックス)
31
32#define REG_XMM0 0x10 //reg:000
33#define REG_XMM1 0x11 //reg:001
34#define REG_XMM2 0x12 //reg:010
35#define REG_XMM3 0x13 //reg:011
36#define REG_XMM4 0x14 //reg:100
37#define REG_XMM5 0x15 //reg:101
38#define REG_XMM6 0x16 //reg:110
39#define REG_XMM7 0x17 //reg:111
40#define REG_XMM8 0x18 //reg:000
41#define REG_XMM9 0x19 //reg:001
42#define REG_XMM10 0x1A //reg:010
43#define REG_XMM11 0x1B //reg:011
44#define REG_XMM12 0x1C //reg:100
45#define REG_XMM13 0x1D //reg:101
46#define REG_XMM14 0x1E //reg:110
47#define REG_XMM15 0x1F //reg:111
48
49#define IS_XMM_REG(reg) (reg&0x10)
50
51
52
53//変数の種類
54#define NON_VAR 0
55#define VAR_GLOBAL 1 //Global Variable
56#define VAR_LOCAL 2 //Local Variable
57#define VAR_REFLOCAL 3 //Local Refference Variable
58#define VAR_DIRECTMEM 4 //Direct memory
59
60extern int cp;
61extern int obp;
62extern char *OpBuffer;
63
64//ラベルアドレス
65struct LABEL{
66 char *pName;
67 int line;
68 DWORD address;
69};
70
71//Goto未知ラベル
72struct GOTOLABELSCHEDULE{
73 char *pName;
74 int line;
75 DWORD pos;
76 DWORD now_cp;
77};
78
79
80//プロシージャの種類
81#define PROC_DEFAULT 1 //ユーザー定義関数
82#define PROC_DLL 2 //DLL関数
83#define PROC_BUILTIN 3 //コンパイラ埋め込み型
84#define PROC_PTR 4 //関数ポインタ
85
86//プロシージャ
87struct PROCEDURE{
88 char name[255];
89 int address;
90 int types[MAX_PARMS];
91 _int8 ByVal[MAX_PARMS];
92 BOOL ReturnType;
93};
94
95//With情報
96struct WITHINFO{
97 char **ppName;
98 int *pWithCp;
99 int num;
100};
101
102
103class CStackFrame:public CSchedule{
104 ///////////////////////////
105 // スタックフレーム管理
106 ///////////////////////////
107
108 int lowest_sp; //スタックポインタの最下位位置
109 int now_sp; //スタックポインタ
110 int max_parm_size; //パラメータの最大サイズ
111 int local_parm_size; //ローカル領域のパラメータサイズ
112
113public:
114 //コンストラクタ
115 CStackFrame();
116
117 //デストラクタ
118 ~CStackFrame();
119
120 void SetLocalParmSize(int size);
121 int GetFrameSize();
122 int push(int reg);
123 void push(int xmm_reg,int var_size);
124 void ref_offset_data( int reg, int sp_offset );
125 void ref(int reg);
126 void ref(int xmm_reg,int var_size);
127 void pop(int reg);
128 void pop(int xmm_reg,int var_size);
129 void parameter_allocate(int size);
130 void RunningSchedule(void);
131
132 void error_check(void);
133};
134extern CStackFrame *pobj_sf;
135
136
137class CBlockReg{
138 int array_BlockReg[256];
139 int num;
140
141public:
142 CBlockReg();
143 void lock(int reg);
144 void unlock(int reg);
145 BOOL check(int reg);
146 void clear(void);
147
148 //レジスタのバックアップと復旧
149 void backup();
150 void restore();
151};
152extern CBlockReg *pobj_BlockReg;
153class CRegister{
154 ////////////////////
155 // レジスタ管理
156 ////////////////////
157
158 //利用可能なレジスタを列挙する関数
159 void EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg);
160
161 int array_UseReg[16],sp_UseReg;
162
163 int array_XmmReg[16];
164 int sp_XmmReg;
165
166 int init_sp_reg,init_sp_xmm_reg;
167
168public:
169 CRegister(){};
170 CRegister(int AnswerReg);
171 ~CRegister(){};
172
173 //コンパイラにバグがないかをチェックする機構
174 void bug_check();
175
176 //汎用レジスタ
177 int GetNextReg();
178 int GetLockingReg();
179 int LockReg();
180 int UnlockReg();
181
182 //XMMレジスタ
183 int GetNextXmmReg();
184 int GetLockingXmmReg();
185 int LockXmmReg();
186 int UnlockXmmReg();
187
188 //レジスタが利用中かどうかを調べる
189 bool IsUsing( int reg );
190
191 //レジスタのバックアップと復旧
192 void backup();
193 void restore();
194};
195extern CRegister *pobj_reg;
196
197
198#define BACKUP_REGISTER_RESOURCE \
199 /* レジスタをスタックフレームにバックアップ */ \
200 pobj_BlockReg->backup(); \
201 if(pobj_reg) pobj_reg->backup(); \
202 \
203 /* レジスタブロッキングオブジェクトを退避して再生成 */ \
204 CBlockReg *pobj_BlockReg_back; \
205 pobj_BlockReg_back=pobj_BlockReg; \
206 pobj_BlockReg=new CBlockReg; \
207 \
208 /* レジスタ管理オブジェクトポインタを退避して0をセット */ \
209 CRegister *pobj_reg_back; \
210 pobj_reg_back=pobj_reg; \
211 pobj_reg=0;
212
213#define RESTORE_REGISTER_RESOURCE \
214 /* レジスタブロッキングオブジェクトポインタを復元 */ \
215 delete pobj_BlockReg; \
216 pobj_BlockReg=pobj_BlockReg_back; \
217 \
218 /* レジスタ管理オブジェクトポインタを復元 */ \
219 delete pobj_reg; \
220 pobj_reg=pobj_reg_back; \
221 \
222 /* レジスタをスタックフレームから復元 */ \
223 if(pobj_reg) pobj_reg->restore(); \
224 pobj_BlockReg->restore();
225
226
227
228//MakePeHdr.cpp
229int AddDataTable(char *buffer,int length);
230
231//RSrcSection.cpp
232char *GetRSrcSectionBuffer(int *pLen);
233
234//Compile.cpp
235void ChangeOpcode(char *Command);
236void GetGlobalDataForDll(void);
237DWORD CompileBuffer(char Return_Sequence,WORD Return_Command);
238
239//Register.cpp
240BOOL IsGeneralReg(int reg);
241BOOL IsXmmReg(int reg);
242BOOL IsVolatileReg(int reg);
243
244//Compile_Calc.cpp
245void ChangeTypeToDouble_ToFpuReg(int OldType);
246void ChangeTypeToDouble(int OldType);
247void ChangeTypeToSingle(int OldType);
248void ChangeTypeToInt64(int OldType);
249void ChangeTypeToLong(int OldType);
250void ChangeTypeToInteger(int OldType);
251void ChangeTypeToByte(int OldType);
252void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar);
253void OpcodeCalc(char *Command);
254
255//NumOpe.cpp
256int NumOpe(int *pReg,const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0);
257
258//NumOpe_Arithmetic.cpp
259BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
260BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer);
261BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType);
262BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer);
263BOOL Calc_MinusMark(int *type,int sp);
264BOOL Calc_Power(int *type,int *pStackPointer);
265BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer);
266
267//NumOpe_Logical.cpp
268BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
269BOOL Calc_Not(int *type,int sp);
270
271//NumOpe_Relation.cpp
272BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
273
274//NumOpe_TypeOperation.cpp
275void ExtendTypeTo64(int type,int reg);
276void ExtendTypeTo32(int type,int reg);
277void ExtendTypeTo16(int type,int reg);
278void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg);
279void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg);
280void ChangeTypeToWhole(int OldType,int NewType,int reg,int xmm_reg);
281void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg);
282void SetOneTermToReg_Whole64Calc(int TermType,int *pReg);
283void SetOneTermToReg_Whole32Calc(int TermType,int *pReg);
284void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2);
285void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2);
286void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2);
287BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer);
288
289//Compile_Set_Var.cpp
290BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar);
291void SetObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
292void SetDoubleVariable(int type,RELATIVE_VAR *pRelative);
293void SetSingleVariable(int type,RELATIVE_VAR *pRelative);
294void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative);
295
296//increment.cpp
297void IncDec(int idCalc, char *lpszLeft, char *lpszRight);
298
299//calc2.cpp
300#define EXP_TYPE_NUMBER 1
301#define EXP_TYPE_EAX 2
302#define EXP_TYPE_FPU 3
303#define EXP_TYPE_VAR 4
304int NumOpEx(char *Command,double *pDbl,DWORD *pdwType,RELATIVE_VAR *pRelativeVar);
305
306//SetVar.cpp
307BOOL SetVariable(DWORD dwVarType,RELATIVE_VAR *pVarRelativeVar,
308 DWORD dwExpType,DWORD dwType,void *data);
309
310//Compile_Calc_PushVar.cpp
311void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
312void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
313void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg);
314
315//Compile_Object.cpp
316int Operator_New(const char *Parameter,LONG_PTR *plpIndex);
317void OpcodeDelete(const char *Parameter);
318
319//Compile_Var.cpp
320void GetWithName(char *buffer);
321void SetThisPtrToReg(int reg);
322BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
323BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
324#define DIMFLAG_INITDEBUGVAR 1
325#define DIMFLAG_NONCALL_CONSTRACTOR 2
326#define DIMFLAG_STATIC 4
327#define DIMFLAG_CONST 8
328void OpcodeDim(char *Parameter,DWORD dwFlag);
329void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
330
331//CParameter.cpp
332#define OVERLOAD_LEVEL1 1
333#define OVERLOAD_LEVEL2 2
334#define OVERLOAD_LEVEL3 3
335class CParameter{
336 char *Parms[255];
337 TYPEINFO types[255];
338 int ParmsNum;
339
340 TYPEINFO ReturnTypeInfo;
341
342 //一時オブジェクト管理用
343 bool useTempObject;
344 bool useTempParameters[255];
345 int StackOffsetOfTempObject[255];
346
347public:
348 CParameter(char *buffer);
349 CParameter(PARAMETER_INFO *pParamInfo,int ParmNum);
350 ~CParameter();
351 void SetReturnType(TYPEINFO *pTypeInfo);
352
353private:
354 BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
355 SUBINFO *OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num);
356public:
357 SUBINFO *OverloadSolution(char *name,SUBINFO **ppsi,int num);
358
359 BOOL ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
360 void MacroParameterSupport(PARAMETER_INFO *ppi);
361 void SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter);
362
363 //一時オブジェクトパラメータの生成と破棄
364 void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
365 void DeleteTempParameters();
366
367 void SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
368
369 void BackupParameter(int pi_num);
370 void RestoreParameter(int pi_num);
371};
372
373//CLockParameter.cpp
374#define MAX_LOCKPARMS 255
375class CDBLockParms{
376public:
377 int array_LevelCount[MAX_LOCKPARMS];
378 CDBLockParms();
379 ~CDBLockParms();
380
381 void lock(int level);
382 void unlock(int level);
383};
384
385//Compile_CallProc.cpp
386void AddLocalVarAddrSchedule();
387int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
388BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
389#define PROCFLAG_NEW 1
390int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
391void Opcode_CallProc(char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);
392int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
393
394//Compile_ProcOp.cpp
395void CompileLocal();
396
397//Compile_Func.cpp
398int GetFunctionType(int FuncNum);
399int GetFunctionFromName(char *FuncName);
400int Opcode_CallFunc(char *Parameter,int FuncNum);
401
402//OperatorProc.cpp
403void FreeTempObject(int reg,CClass *pobj_c);
404int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
405void CallCastOperatorProc(int reg,int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex);
406void CallArrayOperatorProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo);
407
408//Compile_Statement.cpp
409void OpcodeOthers(char *Command);
410void OpcodeIf(char *Parameter);
411void OpcodeGoto(char *Parameter);
412void OpcodeWhile(char *Parameter);
413void OpcodeExitWhile(void);
414void OpcodeFor(char *Parameter);
415void OpcodeExitFor(void);
416void OpcodeDo(char *Parameter);
417void OpcodeExitDo(void);
418void OpcodeContinue(void);
419void OpcodeExitSub(void);
420void OpcodeSelect(char *Parameter);
421void OpcodeCase(char *Parameter);
422void OpcodeGosub(char *Parameter);
423void OpcodeReturn(char *Parameter);
424void Opcode_Input(char *Parameter);
425void Opcode_Print(char *Parameter,BOOL bWrite);
426void OpcodeCallPtr(char *Parameter);
427void OpcodeSetPtrData(char *Parameter,int type);
428
429
430//InsertOpcode.cpp
431void InsertDimStatement_ToProcHead(char *lpszCommand);
432
433
434
435////////////////////////////////
436// AMD64機械語生成に利用する関数郡
437////////////////////////////////
438
439//Mod(モード)
440#define MOD_BASE (char)0x00
441#define MOD_DISP32 (char)0xFF
442#define MOD_BASE_DISP8 (char)0x40
443#define MOD_BASE_DISP32 (char)0x80
444#define MOD_REG (char)0xC0
445
446#define USE_OFFSET 1
447#define NON_OFFSET 0
448
449//amd64_main.cpp
450BOOL IsSafeReg(int reg);
451void op_push(int reg);
452void op_push_value(long data);
453void op_pop(int reg);
454void op_mov_RV (int op_size,int reg,int i32data);
455void op_mov_RV64 (int reg,_int64 i64data);
456void op_mov_RM (int op_size,int reg,int base_reg,int offset,char mod);
457void op_mov_RM_ex (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
458void op_mov_MR (int op_size,int reg,int base_reg,int offset,char mod);
459void op_mov_MR_ex (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
460void op_mov_MV (int op_size,int base_reg,int offset,BOOL bUseOffset,int i32data);
461void op_mov_RR (int reg1,int reg2);
462void op_mov64_ToReg (int reg,_int64 i64data);
463void op_mov64_ToReg (int reg,int i32data);
464void op_mov64_ToReg_FromReg (int reg1,int reg2);
465void op_movsxd (int reg64,int reg32);
466void op_movsx64_FromReg16 (int reg64,int reg16);
467void op_movsx64_FromReg8 (int reg64,int reg8);
468void op_movsx32_FromReg16 (int reg32,int reg16);
469void op_movsx32_FromReg8 (int reg32,int reg8);
470void op_movsx16_FromReg8 (int reg32,int reg8);
471void op_inc (int reg);
472void op_dec (int reg);
473void op_add_RM (int op_size,int reg,int base_reg,int offset,char mod);
474void op_add64_value (int reg,int offset);
475void op_add64_reg (int reg1,int reg2);
476void op_add32_reg (int reg1,int reg2);
477void op_sub_RV (int op_size,int reg,int i32data);
478void op_sub64_reg (int reg1,int reg2);
479void op_sub32_reg (int reg1,int reg2);
480void op_imul_reg (int op_size,int reg1,int reg2);
481void op_imul_value (int op_size,int reg,int i32data);
482void op_div64_reg (int reg);
483void op_idiv64_reg (int reg);
484void op_shl_reg (int op_size,int reg);
485void op_sar_reg (int op_size,int reg);
486void op_shr_reg (int op_size,int reg);
487void op_and_reg (int op_size,int reg1,int reg2);
488void op_and64_value (int reg,int offset);
489void op_and32_value (int reg,int offset);
490void op_or_reg (int op_size,int reg1,int reg2);
491void op_xor_reg (int op_size,int reg1,int reg2);
492void op_not_reg (int op_size,int reg);
493void op_test (int reg1,int reg2);
494void op_cmp_reg (int op_size,int reg1,int reg2);
495void op_cmp_value (int op_size,int reg,char byte_data);
496void op_movlpd_MR (int xmm_reg,int base_reg,int offset,char mod);
497void op_movlpd_RM (int xmm_reg,int base_reg,int offset,char mod);
498void op_movsd_RR (int xmm_reg1,int xmm_reg2);
499void op_movsd_MR (int xmm_reg,int base_reg,int offset,char mod);
500void op_movss_RR (int xmm_reg1,int xmm_reg2);
501void op_movss_RM (int xmm_reg,int base_reg,int offset,char mod);
502void op_movss_MR (int xmm_reg,int base_reg,int offset,char mod);
503void op_movd_RX (int reg,int xmm_reg);
504void op_cvtsd2ss (int xmm_reg1,int xmm_reg2);
505void op_cvtss2sd (int xmm_reg1,int xmm_reg2);
506void op_cvttsd2si_xmm (int op_size,int reg,int xmm_reg);
507void op_cvttss2si_xmm (int op_size,int reg,int xmm_reg);
508void op_cvtsi2sd_reg (int op_size,int xmm_reg,int reg);
509void op_cvtsi2ss_reg (int op_size,int xmm_reg,int reg);
510void op_comisd (int xmm_reg1,int xmm_reg2);
511void op_comiss (int xmm_reg1,int xmm_reg2);
512void op_rep_movs (int op_size);
513void op_add_rsp(int num);
514void op_sub_rsp(int num);
515void op_add_esp(int num);
516void op_sub_esp(int num);
517void op_fld_ptr_esp(int type);
518void op_zero_reg(int reg);
519void op_call( SUBINFO *psi );
520void op_call( DECLAREINFO *pdi );
Note: See TracBrowser for help on using the repository browser.