Changeset 250 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Jul 29, 2007, 9:30:14 PM (17 years ago)
Author:
dai_9181
Message:

Selectステートメントのスケジュール機構をリファクタリング

Location:
trunk/abdev/BasicCompiler32
Files:
7 edited

Legend:

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

    r235 r250  
    329329        //call dword ptr[edx+func_index]
    330330        if(i2*PTR_SIZE<=0x7F){
    331             OpBuffer[obp++]=(char)0xFF;
    332             OpBuffer[obp++]=(char)0x52;
    333             OpBuffer[obp++]=(char)(i2*PTR_SIZE);
     331            compiler.codeGenerator.PutOld(
     332                (char)0xFF,
     333                (char)0x52,
     334                (char)(i2*PTR_SIZE)
     335            );
    334336        }
    335337        else{
    336             OpBuffer[obp++]=(char)0xFF;
    337             OpBuffer[obp++]=(char)0x92;
    338             *((long *)(OpBuffer+obp))=i2*PTR_SIZE;
    339             obp+=sizeof(long);
     338            compiler.codeGenerator.PutOld(
     339                (char)0xFF,
     340                (char)0x92
     341            );
     342            compiler.codeGenerator.PutOld( (long)(i2*PTR_SIZE), Schedule::None );
    340343        }
    341344    }
     
    361364}
    362365
    363 bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc ){
     366bool Opcode_CallDllProc( const char *lpszParms, const DllProc *pDllProc ){
    364367
    365368    extern BOOL bDebugCompile;
     
    397400
    398401    //call dword ptr[LookupTable]
    399     pDllProc->Using();
    400     OpBuffer[obp++]=(char)0xFF;
    401     OpBuffer[obp++]=(char)0x15;
    402     pobj_ImportAddrSchedule->add(pDllProc);
    403     obp+=sizeof(long);
     402    compiler.codeGenerator.op_call( pDllProc );
    404403
    405404    if(pDllProc->IsCdecl()){
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r235 r250  
    3636
    3737        //fnstcw word ptr[esp]
    38         OpBuffer[obp++]=(char)0xD9;
    39         OpBuffer[obp++]=(char)0x3C;
    40         OpBuffer[obp++]=(char)0x24;
     38        compiler.codeGenerator.PutOld(
     39            (char)0xD9,
     40            (char)0x3C,
     41            (char)0x24
     42        );
    4143
    4244        //mov ax,word ptr[esp]
    43         OpBuffer[obp++]=(char)0x66;
    44         OpBuffer[obp++]=(char)0x8B;
    45         OpBuffer[obp++]=(char)0x04;
    46         OpBuffer[obp++]=(char)0x24;
     45        compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_ESP, 0, MOD_BASE );
    4746
    4847        //or ah,0Ch
    49         OpBuffer[obp++]=(char)0x80;
    50         OpBuffer[obp++]=(char)0xCC;
    51         OpBuffer[obp++]=(char)0x0C;
     48        compiler.codeGenerator.PutOld(
     49            (char)0x80,
     50            (char)0xCC,
     51            (char)0x0C
     52        );
    5253
    5354        //mov word ptr[esp-2],ax
    54         OpBuffer[obp++]=(char)0x66;
    55         OpBuffer[obp++]=(char)0x89;
    56         OpBuffer[obp++]=(char)0x44;
    57         OpBuffer[obp++]=(char)0x24;
    58         OpBuffer[obp++]=(char)0xFE;
     55        compiler.codeGenerator.op_mov_MR( sizeof(short), REG_EAX, REG_ESP, -2, MOD_BASE_DISP8 );
    5956
    6057        //fldcw word ptr[esp-2]
    61         OpBuffer[obp++]=(char)0xD9;
    62         OpBuffer[obp++]=(char)0x6C;
    63         OpBuffer[obp++]=(char)0x24;
    64         OpBuffer[obp++]=(char)0xFE;
     58        compiler.codeGenerator.PutOld(
     59            (char)0xD9,
     60            (char)0x6C,
     61            (char)0x24,
     62            (char)0xFE
     63        );
    6564
    6665        //fistp dword ptr[esp+4]
    67         OpBuffer[obp++]=(char)0xDB;
    68         OpBuffer[obp++]=(char)0x5C;
    69         OpBuffer[obp++]=(char)0x24;
    70         OpBuffer[obp++]=(char)0x04;
     66        compiler.codeGenerator.PutOld(
     67            (char)0xDB,
     68            (char)0x5C,
     69            (char)0x24,
     70            (char)0x04
     71        );
    7172
    7273        //fldcw word ptr[esp]
    73         OpBuffer[obp++]=(char)0xD9;
    74         OpBuffer[obp++]=(char)0x2C;
    75         OpBuffer[obp++]=(char)0x24;
     74        compiler.codeGenerator.PutOld(
     75            (char)0xD9,
     76            (char)0x2C,
     77            (char)0x24
     78        );
    7679
    7780        //add esp,4
     
    8689
    8790        //fnstcw word ptr[esp]
    88         OpBuffer[obp++]=(char)0xD9;
    89         OpBuffer[obp++]=(char)0x3C;
    90         OpBuffer[obp++]=(char)0x24;
     91        compiler.codeGenerator.PutOld(
     92            (char)0xD9,
     93            (char)0x3C,
     94            (char)0x24
     95        );
    9196
    9297        //mov ax,word ptr[esp]
    93         OpBuffer[obp++]=(char)0x66;
    94         OpBuffer[obp++]=(char)0x8B;
    95         OpBuffer[obp++]=(char)0x04;
    96         OpBuffer[obp++]=(char)0x24;
     98        compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_ESP, 0, MOD_BASE );
    9799
    98100        //or ah,0Ch
    99         OpBuffer[obp++]=(char)0x80;
    100         OpBuffer[obp++]=(char)0xCC;
    101         OpBuffer[obp++]=(char)0x0C;
     101        compiler.codeGenerator.PutOld(
     102            (char)0x80,
     103            (char)0xCC,
     104            (char)0x0C
     105        );
    102106
    103107        //mov word ptr[esp-2],ax
    104         OpBuffer[obp++]=(char)0x66;
    105         OpBuffer[obp++]=(char)0x89;
    106         OpBuffer[obp++]=(char)0x44;
    107         OpBuffer[obp++]=(char)0x24;
    108         OpBuffer[obp++]=(char)0xFE;
     108        compiler.codeGenerator.op_mov_MR( sizeof(short), REG_EAX, REG_ESP, -2, MOD_BASE_DISP8 );
    109109
    110110        //fldcw word ptr[esp-2]
    111         OpBuffer[obp++]=(char)0xD9;
    112         OpBuffer[obp++]=(char)0x6C;
    113         OpBuffer[obp++]=(char)0x24;
    114         OpBuffer[obp++]=(char)0xFE;
     111        compiler.codeGenerator.PutOld(
     112            (char)0xD9,
     113            (char)0x6C,
     114            (char)0x24,
     115            (char)0xFE
     116        );
    115117
    116118        //fistp dword ptr[esp+4]
    117         OpBuffer[obp++]=(char)0xDB;
    118         OpBuffer[obp++]=(char)0x5C;
    119         OpBuffer[obp++]=(char)0x24;
    120         OpBuffer[obp++]=(char)0x04;
     119        compiler.codeGenerator.PutOld(
     120            (char)0xDB,
     121            (char)0x5C,
     122            (char)0x24,
     123            (char)0x04
     124        );
    121125
    122126        //fldcw word ptr[esp]
    123         OpBuffer[obp++]=(char)0xD9;
    124         OpBuffer[obp++]=(char)0x2C;
    125         OpBuffer[obp++]=(char)0x24;
     127        compiler.codeGenerator.PutOld(
     128            (char)0xD9,
     129            (char)0x2C,
     130            (char)0x24
     131        );
    126132
    127133        //add esp,4
     
    307313
    308314        //mov eax,ProcAddr
    309         OpBuffer[obp++]=(char)0xB8;
    310         pobj_SubAddrSchedule->add(pUserProc,0);
    311         obp+=sizeof(long);
     315        compiler.codeGenerator.op_addressof( REG_EAX, pUserProc );
    312316    }
    313317
  • trunk/abdev/BasicCompiler32/Compile_Object.cpp

    r244 r250  
    8989        compiler.codeGenerator.op_sub_RV8(REG_EBX,1);
    9090
    91         //jnz ↑
    92         OpBuffer[obp++]=(char)0x0F;
    93         OpBuffer[obp++]=(char)0x85;
    94         *((long *)(OpBuffer+obp))=jnz_back-(obp+sizeof(long));
    95         obp+=sizeof(long);
     91        //jne ↑
     92        compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
    9693    }
    9794}
     
    293290    compiler.codeGenerator.op_sub_RV8(REG_EBX,1);
    294291
    295     //jnz ↑
    296     OpBuffer[obp++]=(char)0x0F;
    297     OpBuffer[obp++]=(char)0x85;
    298     *((long *)(OpBuffer+obp))=jnz_back-(obp+sizeof(long));
    299     obp+=sizeof(long);
     292    //jne ↑
     293    compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
    300294
    301295
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r248 r250  
    798798}
    799799
    800 void AddCaseSchedule(void){
    801     extern DWORD *pCaseSchedule;
    802     extern int CaseScheduleNum;
    803     extern HANDLE hHeap;
    804 
    805     pCaseSchedule=(DWORD *)HeapReAlloc(hHeap,0,pCaseSchedule,(CaseScheduleNum+1)*sizeof(DWORD));
    806     pCaseSchedule[CaseScheduleNum]=obp;
    807     CaseScheduleNum++;
    808 }
    809 
    810 int CaseTypeSize;
     800//Caseスケジュール
     801class SelectSchedule
     802{
     803public:
     804    SelectSchedule( int typeSize )
     805        : typeSize( typeSize )
     806        , nowCaseSchedule( 0 )
     807    {
     808    }
     809
     810    PertialSchedules casePertialSchedules;
     811    int typeSize;
     812    int nowCaseSchedule;
     813};
     814std::vector<SelectSchedule> selectSchedules;
     815
    811816void OpcodeSelect(const char *lpszParms){
    812     extern DWORD *pCaseSchedule;
    813     extern int CaseScheduleNum;
    814     extern int NowCaseSchedule;
    815     extern int CaseTypeSize;
    816817    extern HANDLE hHeap;
    817818    extern char *basbuf;
    818819    int i,i2,i3,sw,NowCaseCp;
    819820    char temporary[VN_SIZE];
    820 
    821     DWORD *temp_pCaseSchedule;
    822     int temp_CaseScheduleNum;
    823     int temp_NowCaseSchedule;
    824     int temp_CaseTypeSize;
    825 
    826     temp_pCaseSchedule=pCaseSchedule;
    827     temp_CaseScheduleNum=CaseScheduleNum;
    828     temp_NowCaseSchedule=NowCaseSchedule;
    829     temp_CaseTypeSize=CaseTypeSize;
    830     pCaseSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
    831     CaseScheduleNum=0;
    832     NowCaseSchedule=0;
    833 
     821   
    834822    Type type1;
    835823    if( !NumOpe(lpszParms,Type(), type1 ) ){
     
    837825    }
    838826
    839     CaseTypeSize = type1.GetSize();
    840     if( CaseTypeSize < sizeof(long) ){
    841         CaseTypeSize=sizeof(long);
     827    selectSchedules.push_back( SelectSchedule( type1.GetSize() ) );
     828
     829    if( selectSchedules.back().typeSize < sizeof(long) ){
     830        selectSchedules.back().typeSize = sizeof(long);
    842831    }
    843832
    844833    for(i=cp,sw=0;;i++){
    845834        if(basbuf[i]=='\0'){
    846             HeapDefaultFree(pCaseSchedule);
    847             pCaseSchedule=temp_pCaseSchedule;
    848             CaseScheduleNum=temp_CaseScheduleNum;
    849             NowCaseSchedule=temp_NowCaseSchedule;
    850             CaseTypeSize=temp_CaseTypeSize;
     835            selectSchedules.pop_back();
    851836            SetError(22,"Select",cp);
    852837            return;
     
    865850            if(sw==0){
    866851                //add esp,CaseTypeSize
    867                 compiler.codeGenerator.op_add_esp(CaseTypeSize);
     852                compiler.codeGenerator.op_add_esp( selectSchedules.back().typeSize );
    868853            }
    869854            break;
     
    957942
    958943                    //jne ...
    959                     OpBuffer[obp++]=(char)0x0F;
    960                     OpBuffer[obp++]=(char)0x85;
    961                     AddCaseSchedule();
    962                     obp+=sizeof(long);
     944                    selectSchedules.back().casePertialSchedules.push_back(
     945                        compiler.codeGenerator.op_jne( 0, sizeof(long), true )
     946                    );
    963947                }
    964948                else if(type1.IsDouble()){
     
    969953
    970954                    //add esp,CaseTypeSize
    971                     compiler.codeGenerator.op_add_esp(CaseTypeSize);
     955                    compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
    972956
    973957                    //fld qword ptr[esp]
     
    984968
    985969                    //jne ...
    986                     OpBuffer[obp++]=(char)0x0F;
    987                     OpBuffer[obp++]=(char)0x85;
    988                     AddCaseSchedule();
    989                     obp+=sizeof(long);
     970                    selectSchedules.back().casePertialSchedules.push_back(
     971                        compiler.codeGenerator.op_jne( 0, sizeof(long), true )
     972                    );
    990973                }
    991974                else if(type1.IsSingle()){
     
    996979
    997980                    //add esp,CaseTypeSize
    998                     compiler.codeGenerator.op_add_esp(CaseTypeSize);
     981                    compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
    999982
    1000983                    //fld dword ptr[esp]
     
    1011994
    1012995                    //jne ...
    1013                     OpBuffer[obp++]=(char)0x0F;
    1014                     OpBuffer[obp++]=(char)0x85;
    1015                     AddCaseSchedule();
    1016                     obp+=sizeof(long);
     996                    selectSchedules.back().casePertialSchedules.push_back(
     997                        compiler.codeGenerator.op_jne( 0, sizeof(long), true )
     998                    );
    1017999                }
    10181000                else{
     
    10291011
    10301012                    //je ...
    1031                     OpBuffer[obp++]=(char)0x0F;
    1032                     OpBuffer[obp++]=(char)0x84;
    1033                     AddCaseSchedule();
    1034                     obp+=sizeof(long);
     1013                    selectSchedules.back().casePertialSchedules.push_back(
     1014                        compiler.codeGenerator.op_je( 0, sizeof(long), true )
     1015                    );
    10351016                }
    10361017
     
    10421023
    10431024            //jmp ...
    1044             OpBuffer[obp++]=(char)0xE9;
    1045             AddCaseSchedule();
    1046             obp+=sizeof(long);
     1025            selectSchedules.back().casePertialSchedules.push_back(
     1026                compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
     1027            );
    10471028        }
    10481029    }
     
    10551036
    10561037    //jmp EndSelect
    1057     OpBuffer[obp++]=(char)0xE9;
    1058     AddCaseSchedule();
    1059     obp+=sizeof(long);
     1038    selectSchedules.back().casePertialSchedules.push_back(
     1039        compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
     1040    );
    10601041
    10611042    //最終スケジュール
    1062     for(i=NowCaseSchedule;i<CaseScheduleNum;i++){
    1063         *(long *)(OpBuffer+pCaseSchedule[i])=obp-(pCaseSchedule[i]+sizeof(long));
    1064     }
    1065     HeapDefaultFree(pCaseSchedule);
     1043    for(i=selectSchedules.back().nowCaseSchedule;i<(int)selectSchedules.back().casePertialSchedules.size();i++){
     1044        compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[i] );
     1045    }
    10661046
    10671047    //レキシカルスコープをレベルダウン
    10681048    compiler.codeGenerator.lexicalScopes.End();
    10691049
    1070     pCaseSchedule=temp_pCaseSchedule;
    1071     CaseScheduleNum=temp_CaseScheduleNum;
    1072     NowCaseSchedule=temp_NowCaseSchedule;
    1073     CaseTypeSize=temp_CaseTypeSize;
     1050    selectSchedules.pop_back();
    10741051}
    10751052void OpcodeCase(char *Parameter){
    1076     extern DWORD *pCaseSchedule;
    1077     extern int NowCaseSchedule;
    1078     extern int CaseTypeSize;
    10791053    int i;
    10801054
    1081     if(!pCaseSchedule){
     1055    if(selectSchedules.back().typeSize==-1){
    10821056        SetError(30,"Case",cp);
    10831057        return;
     
    10851059
    10861060    //jmp EndSelect
    1087     OpBuffer[obp++]=(char)0xE9;
    1088     AddCaseSchedule();
    1089     obp+=sizeof(long);
     1061    selectSchedules.back().casePertialSchedules.push_back(
     1062        compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
     1063    );
    10901064
    10911065    i=0;
    10921066    while(1){
    10931067        //Caseスケジュール
    1094         *(long *)(OpBuffer+pCaseSchedule[NowCaseSchedule])=obp-(pCaseSchedule[NowCaseSchedule]+sizeof(long));
    1095         NowCaseSchedule++;
     1068        compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[selectSchedules.back().nowCaseSchedule] );
     1069        selectSchedules.back().nowCaseSchedule++;
    10961070
    10971071        i=JumpOneParameter(Parameter,i);
     
    11001074
    11011075    //add esp,CaseTypeSize
    1102     compiler.codeGenerator.op_add_esp(CaseTypeSize);
     1076    compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
    11031077}
    11041078
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r248 r250  
    11361136
    11371137            //call FillMemory
    1138             OpBuffer[obp++]=(char)0xFF;
    1139             OpBuffer[obp++]=(char)0x15;
    1140             DllProc *pDllProc = GetDeclareHash("FillMemory");
    1141             pDllProc->Using();
    1142             pobj_ImportAddrSchedule->add(pDllProc);
    1143             obp+=sizeof(long);
     1138            compiler.codeGenerator.op_call( GetDeclareHash("FillMemory") );
    11441139        }
    11451140    }
  • trunk/abdev/BasicCompiler32/Opcode.h

    r246 r250  
    219219bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
    220220bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType);
    221 bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc );
     221bool Opcode_CallDllProc( const char *lpszParms, const DllProc *pDllProc );
    222222
    223223//Compile_ProcOp.cpp
  • trunk/abdev/BasicCompiler32/x86CodeGenerator.cpp

    r244 r250  
    11801180}
    11811181void CodeGenerator::op_call(const UserProc *pUserProc){
    1182     pUserProc->Using();
    1183 
    11841182    pNativeCode->Put( (char)0xE8 );
    11851183    pNativeCode->PutUserProcSchedule( pUserProc, true );
    11861184}
     1185void CodeGenerator::op_call( const DllProc *pDllProc )
     1186{
     1187    pNativeCode->Put( (char)0xFF );
     1188    pNativeCode->Put( (char)0x15 );
     1189    pNativeCode->PutDllProcSchedule( pDllProc );
     1190}
    11871191void CodeGenerator::op_ret(){
    11881192    pNativeCode->Put( (char)0xC3 );
Note: See TracChangeset for help on using the changeset viewer.