Ignore:
Timestamp:
Jul 21, 2007, 11:47:40 PM (17 years ago)
Author:
dai_9181
Message:

CodeGeneratorクラスのベースを実装

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r206 r225  
    2323
    2424        //ret
    25         op_ret();
     25        compiler.codeGenerator.op_ret();
    2626    }
    2727    else if( userProc.GetName() == "_System_InitDllGlobalVariables" ){
     
    3333        if(!bDll){
    3434            //ret
    35             op_ret();
     35            compiler.codeGenerator.op_ret();
    3636
    3737            return;
     
    5757        //_System_StartupProgramの呼び出し
    5858        extern const UserProc *pSub_System_StartupProgram;
    59         op_call(pSub_System_StartupProgram);
     59        compiler.codeGenerator.op_call(pSub_System_StartupProgram);
    6060
    6161        //クラスに属する静的メンバを定義
     
    6868
    6969        //ret
    70         op_ret();
     70        compiler.codeGenerator.op_ret();
    7171    }
    7272    else if( userProc.GetName() == "_System_InitStaticLocalVariables" ){
     
    9191
    9292        //ret
    93         op_ret();
     93        compiler.codeGenerator.op_ret();
    9494    }
    9595    else if( userProc.GetName() == "_System_Call_Destructor_of_GlobalObject" ){
     
    105105
    106106        //ret
    107         op_ret();
     107        compiler.codeGenerator.op_ret();
    108108    }
    109109    else if( userProc.GetName() == "_System_GetSp" ){
    110110        //mov eax,esp
    111         op_mov_RR(REG_EAX,REG_ESP);
     111        compiler.codeGenerator.op_mov_RR(REG_EAX,REG_ESP);
    112112
    113113        //add eax,PTR_SIZE
    114         op_add_RV8(REG_EAX,PTR_SIZE);
     114        compiler.codeGenerator.op_add_RV8(REG_EAX,PTR_SIZE);
    115115
    116116        //ret
    117         op_ret();
     117        compiler.codeGenerator.op_ret();
    118118    }
    119119    else if( userProc.GetName() == "_allrem" ){
     
    290290    compiler.GetNamespaceSupporter().SetImportedNamespaces( pUserProc->GetImportedNamespaces() );
    291291
     292    // コード生成対象を選択
     293    compiler.codeGenerator.Select( (const_cast<UserProc *>(pUserProc))->GetNativeCode() );
     294
    292295    if(pUserProc->IsSystem()){
    293296        ////////////////////
     
    369372
    370373    //sub esp,AllLocalVarSize(スケジュール)
    371     op_sub_esp(0xFFFFFFFF);
     374    compiler.codeGenerator.op_sub_esp(0xFFFFFFFF);
    372375    LocalVarSchedule=obp-sizeof(long);
    373376
    374377    //push ebp
    375     op_push(REG_EBP);
     378    compiler.codeGenerator.op_push(REG_EBP);
    376379
    377380    //mov ebp,esp
     
    380383
    381384    //push ebx
    382     op_push(REG_EBX);
     385    compiler.codeGenerator.op_push(REG_EBX);
    383386
    384387    //push esi
     
    460463        //call _DebugSys_StartProc
    461464        extern const UserProc *pSub_DebugSys_StartProc;
    462         op_call(pSub_DebugSys_StartProc);
     465        compiler.codeGenerator.op_call(pSub_DebugSys_StartProc);
    463466    }
    464467
     
    543546
    544547                    //mov dword ptr[ecx],eax
    545                     OpBuffer[obp++]=(char)0x89;
    546                     OpBuffer[obp++]=(char)0x01;
     548                    compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ECX, 0, MOD_BASE );
    547549            }
    548550        }
     
    653655        //call _DebugSys_EndProc
    654656        extern const UserProc *pSub_DebugSys_EndProc;
    655         op_call(pSub_DebugSys_EndProc);
     657        compiler.codeGenerator.op_call(pSub_DebugSys_EndProc);
    656658    }
    657659
     
    672674            if( i3==DEF_OBJECT ){
    673675                //mov eax,dword ptr[eax]
    674                 op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     676                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
    675677            }
    676678        }
     
    717719        else if(i3==DEF_INTEGER||i3==DEF_WORD || (Smoothie::IsUnicode()&&i3==DEF_CHAR)){
    718720            //xor eax,eax(eaxを0に初期化する)
    719             op_zero_reg(REG_EAX);
     721            compiler.codeGenerator.op_zero_reg(REG_EAX);
    720722
    721723            //mov ax,word ptr[ebp+offset]
     
    729731        else if(i3==DEF_SBYTE||i3==DEF_BYTE||i3==DEF_BOOLEAN || (Smoothie::IsUnicode()==false&&i3==DEF_CHAR)){
    730732            //xor eax,eax(eaxを0に初期化する)
    731             op_zero_reg(REG_EAX);
     733            compiler.codeGenerator.op_zero_reg(REG_EAX);
    732734
    733735            //mov al,byte ptr[ebp+offset]
     
    763765
    764766    //pop ebx
    765     op_pop(REG_EBX);
     767    compiler.codeGenerator.op_pop(REG_EBX);
    766768
    767769    if(bDebugCompile){
    768770        //cmp esp,ebp
    769         op_cmp_RR( REG_ESP, REG_EBP );
     771        compiler.codeGenerator.op_cmp_RR( REG_ESP, REG_EBP );
    770772
    771773        //jz 6(次のcallとbreakpointを飛び越す)
     
    775777        //call _esp_error
    776778        extern const UserProc *pSub_esp_error;
    777         op_call( pSub_esp_error );
     779        compiler.codeGenerator.op_call( pSub_esp_error );
    778780
    779781        breakpoint;
     
    785787
    786788    //pop ebp
    787     op_pop(REG_EBP);
     789    compiler.codeGenerator.op_pop(REG_EBP);
    788790
    789791    //add esp AllLocalVarSize
    790     op_add_esp(AllLocalVarSize-BaseOffset);
     792    compiler.codeGenerator.op_add_esp(AllLocalVarSize-BaseOffset);
    791793
    792794    if( BaseOffset==0 || pUserProc->IsCdecl() ){
    793795        //ret
    794         op_ret();
     796        compiler.codeGenerator.op_ret();
    795797    }
    796798    else{
Note: See TracChangeset for help on using the changeset viewer.