| 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_REFGLOBAL       2   // Global Refference Variable | 
|---|
| 57 | #define VAR_LOCAL           3   // Local Variable | 
|---|
| 58 | #define VAR_REFLOCAL        4   // Local Refference Variable | 
|---|
| 59 | #define VAR_DIRECTMEM       5   // Direct memory | 
|---|
| 60 |  | 
|---|
| 61 |  | 
|---|
| 62 | extern int cp; | 
|---|
| 63 | extern int obp; | 
|---|
| 64 | extern char *OpBuffer; | 
|---|
| 65 |  | 
|---|
| 66 | #define breakpoint OpBuffer[obp++]=(char)0xCC; | 
|---|
| 67 |  | 
|---|
| 68 |  | 
|---|
| 69 | //ラベルアドレス | 
|---|
| 70 | struct LABEL{ | 
|---|
| 71 | char *pName; | 
|---|
| 72 | int line; | 
|---|
| 73 | DWORD address; | 
|---|
| 74 | }; | 
|---|
| 75 |  | 
|---|
| 76 | //Goto未知ラベル | 
|---|
| 77 | struct GOTOLABELSCHEDULE{ | 
|---|
| 78 | char *pName; | 
|---|
| 79 | int line; | 
|---|
| 80 | DWORD pos; | 
|---|
| 81 | DWORD now_cp; | 
|---|
| 82 | }; | 
|---|
| 83 |  | 
|---|
| 84 |  | 
|---|
| 85 | //プロシージャの種類 | 
|---|
| 86 | #define PROC_DEFAULT    1   //ユーザー定義関数 | 
|---|
| 87 | #define PROC_DLL        2   //DLL関数 | 
|---|
| 88 | #define PROC_BUILTIN    3   //コンパイラ埋め込み型 | 
|---|
| 89 | #define PROC_PTR        4   //関数ポインタ | 
|---|
| 90 |  | 
|---|
| 91 | //プロシージャ | 
|---|
| 92 | struct PROCEDURE{ | 
|---|
| 93 | char name[255]; | 
|---|
| 94 | int address; | 
|---|
| 95 | int types[MAX_PARMS]; | 
|---|
| 96 | _int8 ByVal[MAX_PARMS]; | 
|---|
| 97 | BOOL ReturnType; | 
|---|
| 98 | }; | 
|---|
| 99 |  | 
|---|
| 100 | //With情報 | 
|---|
| 101 | struct WITHINFO{ | 
|---|
| 102 | char **ppName; | 
|---|
| 103 | int *pWithCp; | 
|---|
| 104 | int num; | 
|---|
| 105 | }; | 
|---|
| 106 |  | 
|---|
| 107 |  | 
|---|
| 108 | class CStackFrame:public CSchedule{ | 
|---|
| 109 | /////////////////////////// | 
|---|
| 110 | // スタックフレーム管理 | 
|---|
| 111 | /////////////////////////// | 
|---|
| 112 |  | 
|---|
| 113 | int lowest_sp;          //スタックポインタの最下位位置 | 
|---|
| 114 | int now_sp;             //スタックポインタ | 
|---|
| 115 | int max_parm_size;      //パラメータの最大サイズ | 
|---|
| 116 | int local_parm_size;    //ローカル領域のパラメータサイズ | 
|---|
| 117 |  | 
|---|
| 118 | public: | 
|---|
| 119 | //コンストラクタ | 
|---|
| 120 | CStackFrame(); | 
|---|
| 121 |  | 
|---|
| 122 | //デストラクタ | 
|---|
| 123 | ~CStackFrame(); | 
|---|
| 124 |  | 
|---|
| 125 | void SetLocalParmSize(int size); | 
|---|
| 126 | int GetFrameSize(); | 
|---|
| 127 | int GetNowSp(); | 
|---|
| 128 | void mov_sp( int reg ); | 
|---|
| 129 | int push(int reg); | 
|---|
| 130 | void push(int xmm_reg,int varSize); | 
|---|
| 131 | void ref_offset_data( int reg, int sp_offset ); | 
|---|
| 132 | void ref(int reg); | 
|---|
| 133 | void ref(int xmm_reg,int varSize); | 
|---|
| 134 | void pop(int reg = REG_NON); | 
|---|
| 135 | void pop(int xmm_reg,int varSize); | 
|---|
| 136 | void parameter_allocate(int size); | 
|---|
| 137 | void RunningSchedule(void); | 
|---|
| 138 |  | 
|---|
| 139 | void error_check(void); | 
|---|
| 140 | }; | 
|---|
| 141 | extern CStackFrame *pobj_sf; | 
|---|
| 142 |  | 
|---|
| 143 |  | 
|---|
| 144 | class CBlockReg{ | 
|---|
| 145 | int array_BlockReg[256]; | 
|---|
| 146 | int num; | 
|---|
| 147 |  | 
|---|
| 148 | public: | 
|---|
| 149 | CBlockReg(); | 
|---|
| 150 | void lock(int reg); | 
|---|
| 151 | void unlock(int reg); | 
|---|
| 152 | BOOL check(int reg); | 
|---|
| 153 | void clear(void); | 
|---|
| 154 |  | 
|---|
| 155 | //レジスタのバックアップと復旧 | 
|---|
| 156 | void backup(); | 
|---|
| 157 | void restore(); | 
|---|
| 158 | }; | 
|---|
| 159 | extern CBlockReg *pobj_BlockReg; | 
|---|
| 160 | class CRegister{ | 
|---|
| 161 | //////////////////// | 
|---|
| 162 | // レジスタ管理 | 
|---|
| 163 | //////////////////// | 
|---|
| 164 |  | 
|---|
| 165 | //利用可能なレジスタを列挙する関数 | 
|---|
| 166 | void EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg); | 
|---|
| 167 |  | 
|---|
| 168 | int array_UseReg[16],sp_UseReg; | 
|---|
| 169 |  | 
|---|
| 170 | int array_XmmReg[16]; | 
|---|
| 171 | int sp_XmmReg; | 
|---|
| 172 |  | 
|---|
| 173 | int init_sp_reg,init_sp_xmm_reg; | 
|---|
| 174 |  | 
|---|
| 175 | public: | 
|---|
| 176 | CRegister(){}; | 
|---|
| 177 | CRegister(int AnswerReg); | 
|---|
| 178 | ~CRegister(){}; | 
|---|
| 179 |  | 
|---|
| 180 | //コンパイラにバグがないかをチェックする機構 | 
|---|
| 181 | void bug_check(); | 
|---|
| 182 |  | 
|---|
| 183 | //汎用レジスタ | 
|---|
| 184 | int GetNextReg(); | 
|---|
| 185 | int GetLockingReg(); | 
|---|
| 186 | int LockReg(); | 
|---|
| 187 | int UnlockReg(); | 
|---|
| 188 |  | 
|---|
| 189 | //XMMレジスタ | 
|---|
| 190 | int GetNextXmmReg(); | 
|---|
| 191 | int GetLockingXmmReg(); | 
|---|
| 192 | int LockXmmReg(); | 
|---|
| 193 | int UnlockXmmReg(); | 
|---|
| 194 |  | 
|---|
| 195 | //レジスタが利用中かどうかを調べる | 
|---|
| 196 | bool IsUsing( int reg ); | 
|---|
| 197 |  | 
|---|
| 198 | //レジスタのバックアップと復旧 | 
|---|
| 199 | void backup(); | 
|---|
| 200 | void restore(); | 
|---|
| 201 | }; | 
|---|
| 202 | extern CRegister *pobj_reg; | 
|---|
| 203 |  | 
|---|
| 204 |  | 
|---|
| 205 | #define BACKUP_REGISTER_RESOURCE                                \ | 
|---|
| 206 | /* レジスタをスタックフレームにバックアップ */              \ | 
|---|
| 207 | pobj_BlockReg->backup();                                    \ | 
|---|
| 208 | if(pobj_reg) pobj_reg->backup();                            \ | 
|---|
| 209 | \ | 
|---|
| 210 | /* レジスタブロッキングオブジェクトを退避して再生成 */      \ | 
|---|
| 211 | CBlockReg *pobj_BlockReg_back;                              \ | 
|---|
| 212 | pobj_BlockReg_back=pobj_BlockReg;                           \ | 
|---|
| 213 | pobj_BlockReg=new CBlockReg;                                \ | 
|---|
| 214 | \ | 
|---|
| 215 | /* レジスタ管理オブジェクトポインタを退避して0をセット */    \ | 
|---|
| 216 | CRegister *pobj_reg_back;                                   \ | 
|---|
| 217 | pobj_reg_back=pobj_reg;                                     \ | 
|---|
| 218 | pobj_reg=0; | 
|---|
| 219 |  | 
|---|
| 220 | #define RESTORE_REGISTER_RESOURCE                               \ | 
|---|
| 221 | /* レジスタブロッキングオブジェクトポインタを復元 */       \ | 
|---|
| 222 | delete pobj_BlockReg;                                       \ | 
|---|
| 223 | pobj_BlockReg=pobj_BlockReg_back;                           \ | 
|---|
| 224 | \ | 
|---|
| 225 | /* レジスタ管理オブジェクトポインタを復元 */               \ | 
|---|
| 226 | delete pobj_reg;                                            \ | 
|---|
| 227 | pobj_reg=pobj_reg_back;                                     \ | 
|---|
| 228 | \ | 
|---|
| 229 | /* レジスタをスタックフレームから復元 */                 \ | 
|---|
| 230 | if(pobj_reg) pobj_reg->restore();                           \ | 
|---|
| 231 | pobj_BlockReg->restore(); | 
|---|
| 232 |  | 
|---|
| 233 |  | 
|---|
| 234 |  | 
|---|
| 235 | //RSrcSection.cpp | 
|---|
| 236 | char *GetRSrcSectionBuffer(int *pLen); | 
|---|
| 237 |  | 
|---|
| 238 | //Compile.cpp | 
|---|
| 239 | void ChangeOpcode(char *Command); | 
|---|
| 240 | void GetGlobalDataForDll(void); | 
|---|
| 241 | DWORD CompileBuffer(char Return_Sequence,WORD Return_Command); | 
|---|
| 242 |  | 
|---|
| 243 | //Register.cpp | 
|---|
| 244 | BOOL IsGeneralReg(int reg); | 
|---|
| 245 | BOOL IsXmmReg(int reg); | 
|---|
| 246 | BOOL IsVolatileReg(int reg); | 
|---|
| 247 | void IfR14Push( int reg ); | 
|---|
| 248 |  | 
|---|
| 249 | //Compile_Calc.cpp | 
|---|
| 250 | void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar); | 
|---|
| 251 | void OpcodeCalc(const char *Command); | 
|---|
| 252 |  | 
|---|
| 253 | //NumOpe.cpp | 
|---|
| 254 | bool TermOpe( | 
|---|
| 255 | const char *term, | 
|---|
| 256 | const Type &baseType, | 
|---|
| 257 | Type &resultType, | 
|---|
| 258 | bool &isLiteral, | 
|---|
| 259 | BOOL *pbUseHeap, | 
|---|
| 260 | bool isWantObject = false, | 
|---|
| 261 | bool *pIsClassName = NULL, | 
|---|
| 262 | bool isProcedureCallOnly = false ); | 
|---|
| 263 | bool NumOpe( int *pReg, | 
|---|
| 264 | const char *Command, | 
|---|
| 265 | const Type &baseType, | 
|---|
| 266 | Type &resultType, | 
|---|
| 267 | BOOL *pbUseHeap = NULL ); | 
|---|
| 268 |  | 
|---|
| 269 | //NumOpe_Arithmetic.cpp | 
|---|
| 270 | BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer); | 
|---|
| 271 | BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer); | 
|---|
| 272 | BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType); | 
|---|
| 273 | BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer); | 
|---|
| 274 | BOOL Calc_MinusMark(int *type,int sp); | 
|---|
| 275 | BOOL Calc_Power(int *type,int *pStackPointer); | 
|---|
| 276 | BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer); | 
|---|
| 277 |  | 
|---|
| 278 | //NumOpe_Logical.cpp | 
|---|
| 279 | BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer); | 
|---|
| 280 | BOOL Calc_Not(int *type,int sp); | 
|---|
| 281 |  | 
|---|
| 282 | //NumOpe_Relation.cpp | 
|---|
| 283 | BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer); | 
|---|
| 284 |  | 
|---|
| 285 | //NumOpe_TypeOperation.cpp | 
|---|
| 286 | void ExtendTypeTo64(int type,int reg); | 
|---|
| 287 | void ExtendTypeTo32(int type,int reg); | 
|---|
| 288 | void ExtendTypeTo16(int type,int reg); | 
|---|
| 289 | void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg); | 
|---|
| 290 | void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg); | 
|---|
| 291 | void ChangeTypeToWhole(int OldType,int NewType,int reg,int xmm_reg); | 
|---|
| 292 | void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg); | 
|---|
| 293 | void SetOneTermToReg_Whole64Calc(int TermType,int *pReg); | 
|---|
| 294 | void SetOneTermToReg_Whole32Calc(int TermType,int *pReg); | 
|---|
| 295 | void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2); | 
|---|
| 296 | void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2); | 
|---|
| 297 | void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2); | 
|---|
| 298 | BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer); | 
|---|
| 299 |  | 
|---|
| 300 | //Compile_Set_Var.cpp | 
|---|
| 301 | BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar); | 
|---|
| 302 | void SetStructVariableFromRax( const Type &varType, const Type &calcType, RELATIVE_VAR *pRelativeVar,BOOL bUseHeap); | 
|---|
| 303 | void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar); | 
|---|
| 304 | void SetBooleanVariable(int type,RELATIVE_VAR *pRelative); | 
|---|
| 305 | void SetWholeVariable(int varSize,int type,RELATIVE_VAR *pRelative); | 
|---|
| 306 |  | 
|---|
| 307 | //increment.cpp | 
|---|
| 308 | void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight); | 
|---|
| 309 |  | 
|---|
| 310 | //Compile_Calc_PushVar.cpp | 
|---|
| 311 | void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg); | 
|---|
| 312 | void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg); | 
|---|
| 313 | void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg); | 
|---|
| 314 |  | 
|---|
| 315 | //Compile_Interface.cpp | 
|---|
| 316 | bool CastToInterface( int reg, int vtblReg, const CClass &baseClass, const CClass &interfaceClass ); | 
|---|
| 317 |  | 
|---|
| 318 | //Compile_Object.cpp | 
|---|
| 319 | void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter,const Type &baseTypeInfo ); | 
|---|
| 320 | void OpcodeDelete(const char *Parameter, bool isSweeping); | 
|---|
| 321 |  | 
|---|
| 322 | //Compile_Var.cpp | 
|---|
| 323 | bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess); | 
|---|
| 324 | void SetThisPtrToReg(int reg); | 
|---|
| 325 | bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL); | 
|---|
| 326 | bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,char *InitBuf); | 
|---|
| 327 | #define DIMFLAG_INITDEBUGVAR            0x01 | 
|---|
| 328 | #define DIMFLAG_NONCALL_CONSTRACTOR     0x02 | 
|---|
| 329 | #define DIMFLAG_STATIC                  0x04 | 
|---|
| 330 | #define DIMFLAG_CONST                   0x08 | 
|---|
| 331 | void dim( char *VarName,int *SubScripts,Type &type,char *InitBuf,char *ConstractParameter,DWORD dwFlags); | 
|---|
| 332 | void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar); | 
|---|
| 333 | bool Compile_AddGlobalRootsForGc(); | 
|---|
| 334 |  | 
|---|
| 335 | //ParamImpl.cpp | 
|---|
| 336 | class ParamImpl{ | 
|---|
| 337 | char *Parms[255]; | 
|---|
| 338 | vector<Type> types; | 
|---|
| 339 | int ParmsNum; | 
|---|
| 340 |  | 
|---|
| 341 | Type returnType; | 
|---|
| 342 |  | 
|---|
| 343 | //一時オブジェクト管理用 | 
|---|
| 344 | bool useTempObject; | 
|---|
| 345 | bool useTempParameters[255]; | 
|---|
| 346 | int StackOffsetOfTempObject[255]; | 
|---|
| 347 |  | 
|---|
| 348 | public: | 
|---|
| 349 | ParamImpl(const char *buffer); | 
|---|
| 350 | ParamImpl(const Parameters ¶ms); | 
|---|
| 351 | ~ParamImpl(); | 
|---|
| 352 | void SetReturnType( const Type &returnType ); | 
|---|
| 353 |  | 
|---|
| 354 | private: | 
|---|
| 355 | bool _overload_check( int level, const Parameters ¶ms, const Type &returnType ); | 
|---|
| 356 | UserProc *OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ); | 
|---|
| 357 | public: | 
|---|
| 358 | UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs ); | 
|---|
| 359 |  | 
|---|
| 360 | void ApplyDefaultParameters( const Parameters ¶ms ); | 
|---|
| 361 | bool ErrorCheck( const string &procName, const Parameters ¶ms, int SecondParmNum = -1 ); | 
|---|
| 362 | void MacroParameterSupport( const Parameters ¶ms ); | 
|---|
| 363 | void SetStructParameter( int reg, const Type &baseType, const char *expression ); | 
|---|
| 364 | void SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum = -1 ); | 
|---|
| 365 |  | 
|---|
| 366 | //一時オブジェクトパラメータの生成と破棄 | 
|---|
| 367 | int NewTempParameters( const string &procName, const Parameters ¶ms, int SecondParmNum = -1 ); | 
|---|
| 368 | void DeleteTempParameters(); | 
|---|
| 369 |  | 
|---|
| 370 | void BackupParameter(int pi_num); | 
|---|
| 371 | void RestoreParameter(int pi_num); | 
|---|
| 372 | }; | 
|---|
| 373 |  | 
|---|
| 374 | //CLockParameter.cpp | 
|---|
| 375 | #define MAX_LOCKPARMS 255 | 
|---|
| 376 | class CDBLockParms{ | 
|---|
| 377 | public: | 
|---|
| 378 | int array_LevelCount[MAX_LOCKPARMS]; | 
|---|
| 379 | CDBLockParms(); | 
|---|
| 380 | ~CDBLockParms(); | 
|---|
| 381 |  | 
|---|
| 382 | void lock(int level); | 
|---|
| 383 | void unlock(int level); | 
|---|
| 384 | }; | 
|---|
| 385 |  | 
|---|
| 386 | //Compile_CallProc.cpp | 
|---|
| 387 | void AddLocalVarAddrSchedule(); | 
|---|
| 388 | #define PROCFLAG_NEW    1 | 
|---|
| 389 | bool Opcode_CallProcPtr(const char *variable, const char *lpszParms,ProcPointer *pProcPointer); | 
|---|
| 390 | bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType); | 
|---|
| 391 | bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc); | 
|---|
| 392 |  | 
|---|
| 393 | //Compile_ProcOp.cpp | 
|---|
| 394 | void CompileLocal(); | 
|---|
| 395 |  | 
|---|
| 396 | //Compile_Func.cpp | 
|---|
| 397 | int GetFunctionFromName(char *FuncName); | 
|---|
| 398 | bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo, bool isCallOn = true ); | 
|---|
| 399 |  | 
|---|
| 400 | //OperatorProc.cpp | 
|---|
| 401 | void FreeTempObject(int reg,const CClass *pobj_c); | 
|---|
| 402 | int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp); | 
|---|
| 403 | void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType); | 
|---|
| 404 | void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType); | 
|---|
| 405 |  | 
|---|
| 406 | //Compile_Statement.cpp | 
|---|
| 407 | void OpcodeOthers(const char *Command); | 
|---|
| 408 | void OpcodeIf(char *Parameter); | 
|---|
| 409 | void OpcodeGoto(char *Parameter); | 
|---|
| 410 | void OpcodeWhile(char *Parameter); | 
|---|
| 411 | void OpcodeFor(char *Parameter); | 
|---|
| 412 | void OpcodeDo(char *Parameter); | 
|---|
| 413 | void OpcodeContinue(void); | 
|---|
| 414 | void OpcodeExitSub(void); | 
|---|
| 415 | void OpcodeSelect( const char *Parameter ); | 
|---|
| 416 | void OpcodeCase(char *Parameter); | 
|---|
| 417 | void OpcodeGosub(char *Parameter); | 
|---|
| 418 | void OpcodeReturn(char *Parameter); | 
|---|
| 419 | void OpcodeSetPtrData(char *Parameter,int type); | 
|---|
| 420 |  | 
|---|
| 421 |  | 
|---|
| 422 | //InsertOpcode.cpp | 
|---|
| 423 | void InsertDimStatement_ToProcHead(char *lpszCommand); | 
|---|
| 424 |  | 
|---|
| 425 |  | 
|---|
| 426 |  | 
|---|
| 427 | //////////////////////////////// | 
|---|
| 428 | // AMD64機械語生成に利用する関数郡 | 
|---|
| 429 | //////////////////////////////// | 
|---|
| 430 |  | 
|---|
| 431 | //Mod(モード) | 
|---|
| 432 | #define MOD_BASE        (char)0x00 | 
|---|
| 433 | #define MOD_DISP32      (char)0xFF | 
|---|
| 434 | #define MOD_BASE_DISP8  (char)0x40 | 
|---|
| 435 | #define MOD_BASE_DISP32 (char)0x80 | 
|---|
| 436 | #define MOD_REG             (char)0xC0 | 
|---|
| 437 |  | 
|---|
| 438 | #define USE_OFFSET 1 | 
|---|
| 439 | #define NON_OFFSET 0 | 
|---|
| 440 |  | 
|---|
| 441 | //amd64_main.cpp | 
|---|
| 442 | BOOL IsSafeReg(int reg); | 
|---|
| 443 | void op_push(int reg); | 
|---|
| 444 | void op_push_value(long data); | 
|---|
| 445 | void op_pop(int reg); | 
|---|
| 446 | void op_mov_RV                  (int op_size,int reg,int i32data); | 
|---|
| 447 | void op_mov_RV64                (int reg,_int64 i64data); | 
|---|
| 448 | void op_mov_RM                  (int op_size,int reg,int base_reg,int offset,char mod); | 
|---|
| 449 | void op_mov_RM_ex               (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset); | 
|---|
| 450 | void op_mov_MR                  (int op_size,int reg,int base_reg,int offset,char mod); | 
|---|
| 451 | void op_mov_MR_ex               (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset); | 
|---|
| 452 | void op_mov_MV                  (int op_size,int base_reg,int offset,BOOL bUseOffset,int i32data); | 
|---|
| 453 | void op_mov_RR                  (int reg1,int reg2); | 
|---|
| 454 | void op_mov64_ToReg             (int reg,_int64 i64data); | 
|---|
| 455 | void op_mov64_ToReg             (int reg,int i32data); | 
|---|
| 456 | void op_movsxd                  (int reg64,int reg32); | 
|---|
| 457 | void op_movsx64_FromReg16       (int reg64,int reg16); | 
|---|
| 458 | void op_movsx64_FromReg8        (int reg64,int reg8); | 
|---|
| 459 | void op_movsx32_FromReg16       (int reg32,int reg16); | 
|---|
| 460 | void op_movsx32_FromReg8        (int reg32,int reg8); | 
|---|
| 461 | void op_movsx16_FromReg8        (int reg32,int reg8); | 
|---|
| 462 | void op_inc                     (int reg); | 
|---|
| 463 | void op_dec                     (int reg); | 
|---|
| 464 | void op_add_RM                  (int op_size,int reg,int base_reg,int offset,char mod); | 
|---|
| 465 | void op_add_RV              (int reg,int offset); | 
|---|
| 466 | void op_add64_reg               (int reg1,int reg2); | 
|---|
| 467 | void op_add32_reg               (int reg1,int reg2); | 
|---|
| 468 | void op_sub_RV                  (int op_size,int reg,int i32data); | 
|---|
| 469 | void op_sub64_reg               (int reg1,int reg2); | 
|---|
| 470 | void op_sub32_reg               (int reg1,int reg2); | 
|---|
| 471 | void op_sbb_RR                  ( int op_size, int reg1, int reg2 ); | 
|---|
| 472 | void op_imul_RR             (int op_size,int reg1,int reg2); | 
|---|
| 473 | void op_imul_RV             (int op_size,int reg,int i32data); | 
|---|
| 474 | void op_div64_reg               (int reg); | 
|---|
| 475 | void op_idiv64_reg              (int reg); | 
|---|
| 476 | void op_shl_reg                 (int op_size,int reg); | 
|---|
| 477 | void op_sar_reg                 (int op_size,int reg); | 
|---|
| 478 | void op_shr_reg                 (int op_size,int reg); | 
|---|
| 479 | void op_and_reg                 (int op_size,int reg1,int reg2); | 
|---|
| 480 | void op_and64_value             (int reg,int offset); | 
|---|
| 481 | void op_and32_value             (int reg,int offset); | 
|---|
| 482 | void op_or_reg                  (int op_size,int reg1,int reg2); | 
|---|
| 483 | void op_xor_reg                 (int op_size,int reg1,int reg2); | 
|---|
| 484 | void op_not_reg                 (int op_size,int reg); | 
|---|
| 485 | void op_neg                     ( int reg ); | 
|---|
| 486 | void op_test                    (int reg1,int reg2); | 
|---|
| 487 | void op_cmp_reg                 (int op_size,int reg1,int reg2); | 
|---|
| 488 | void op_cmp_value               (int op_size,int reg,char byte_data); | 
|---|
| 489 | void op_setne                   (int reg); | 
|---|
| 490 | void op_movlpd_MR               (int xmm_reg,int base_reg,int offset,char mod); | 
|---|
| 491 | void op_movlpd_RM               (int xmm_reg,int base_reg,int offset,char mod); | 
|---|
| 492 | void op_movsd_RR                (int xmm_reg1,int xmm_reg2); | 
|---|
| 493 | void op_movsd_MR                (int xmm_reg,int base_reg,int offset,char mod); | 
|---|
| 494 | void op_movss_RR                (int xmm_reg1,int xmm_reg2); | 
|---|
| 495 | void op_movss_RM                (int xmm_reg,int base_reg,int offset,char mod); | 
|---|
| 496 | void op_movss_MR                (int xmm_reg,int base_reg,int offset,char mod); | 
|---|
| 497 | void op_movd_RX                 (int reg,int xmm_reg); | 
|---|
| 498 | void op_cvtsd2ss                (int xmm_reg1,int xmm_reg2); | 
|---|
| 499 | void op_cvtss2sd                (int xmm_reg1,int xmm_reg2); | 
|---|
| 500 | void op_cvttsd2si_xmm           (int op_size,int reg,int xmm_reg); | 
|---|
| 501 | void op_cvttss2si_xmm           (int op_size,int reg,int xmm_reg); | 
|---|
| 502 | void op_cvtsi2sd_reg            (int op_size,int xmm_reg,int reg); | 
|---|
| 503 | void op_cvtsi2ss_reg            (int op_size,int xmm_reg,int reg); | 
|---|
| 504 | void op_comisd                  (int xmm_reg1,int xmm_reg2); | 
|---|
| 505 | void op_comiss                  (int xmm_reg1,int xmm_reg2); | 
|---|
| 506 | void op_rep_movs                (int op_size); | 
|---|
| 507 | void op_add_rsp(int num); | 
|---|
| 508 | void op_sub_rsp(int num); | 
|---|
| 509 | void op_add_esp(int num); | 
|---|
| 510 | void op_sub_esp(int num); | 
|---|
| 511 | void op_fld_ptr_esp(int type); | 
|---|
| 512 | void op_zero_reg(int reg); | 
|---|
| 513 | void op_call( UserProc *pUserProc ); | 
|---|
| 514 | void op_call( DllProc *pDllProc ); | 
|---|