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_Statement.cpp

    r206 r225  
    110110        else if( resultType.IsStruct() ){
    111111            //mov ebx,eax
    112             op_mov_RR(REG_EBX,REG_EAX);
     112            compiler.codeGenerator.op_mov_RR(REG_EBX,REG_EAX);
    113113
    114114            FreeTempObject(REG_EBX,&resultType.GetClass());
     
    144144    else if( tempType.IsDouble() ){
    145145        //fld qword ptr[esp]
    146         op_fld_ptr_esp(DEF_DOUBLE);
     146        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    147147
    148148        //push 0
    149         op_push_V(0);
     149        compiler.codeGenerator.op_push_V(0);
    150150
    151151        //fild dword ptr[esp]
    152         op_fld_ptr_esp(DEF_LONG);
     152        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    153153
    154154        //add esp,sizeof(double)+sizeof(long)
    155         op_add_esp(sizeof(double)+sizeof(long));
     155        compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
    156156
    157157        //fcompp
    158         OpBuffer[obp++]=(char)0xDE;
    159         OpBuffer[obp++]=(char)0xD9;
     158        compiler.codeGenerator.op_fcompp();
    160159
    161160        //fnstsw ax
    162         OpBuffer[obp++]=(char)0xDF;
    163         OpBuffer[obp++]=(char)0xE0;
     161        compiler.codeGenerator.op_fnstsw_ax();
    164162
    165163        //test ah,40
    166         OpBuffer[obp++]=(char)0xF6;
    167         OpBuffer[obp++]=(char)0xC4;
    168         OpBuffer[obp++]=(char)0x40;
     164        compiler.codeGenerator.op_test_ah( (char)0x40 );
    169165
    170166        //jne (endif、または else まで)
     
    178174    else if( tempType.IsSingle() ){
    179175        //fld dword ptr[esp]
    180         op_fld_ptr_esp(DEF_SINGLE);
     176        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    181177
    182178        //push 0
    183         op_push_V(0);
     179        compiler.codeGenerator.op_push_V(0);
    184180
    185181        //fild dword ptr[esp]
    186         op_fld_ptr_esp(DEF_LONG);
     182        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    187183
    188184        //add esp,sizeof(float)+sizeof(long)
    189         op_add_esp(sizeof(float)+sizeof(long));
     185        compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
    190186
    191187        //fcompp
    192         OpBuffer[obp++]=(char)0xDE;
    193         OpBuffer[obp++]=(char)0xD9;
     188        compiler.codeGenerator.op_fcompp();
    194189
    195190        //fnstsw ax
    196         OpBuffer[obp++]=(char)0xDF;
    197         OpBuffer[obp++]=(char)0xE0;
     191        compiler.codeGenerator.op_fnstsw_ax();
    198192
    199193        //test ah,40
    200         OpBuffer[obp++]=(char)0xF6;
    201         OpBuffer[obp++]=(char)0xC4;
    202         OpBuffer[obp++]=(char)0x40;
     194        compiler.codeGenerator.op_test_ah( (char)0x40 );
    203195
    204196        //jne (endif、または else まで)
     
    214206
    215207        //pop eax
    216         op_pop(REG_EAX);
     208        compiler.codeGenerator.op_pop(REG_EAX);
    217209
    218210        //pop ebx
    219         op_pop(REG_EBX);
     211        compiler.codeGenerator.op_pop(REG_EBX);
    220212
    221213        //cmp eax,0
     
    258250
    259251        //pop eax
    260         op_pop(REG_EAX);
     252        compiler.codeGenerator.op_pop(REG_EAX);
    261253
    262254        //cmp eax,0
     
    401393    else if( tempType.IsDouble() ){
    402394        //fld qword ptr[esp]
    403         op_fld_ptr_esp(DEF_DOUBLE);
     395        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    404396
    405397        //push 0
    406         op_push_V(0);
     398        compiler.codeGenerator.op_push_V(0);
    407399
    408400        //fild dword ptr[esp]
    409         op_fld_ptr_esp(DEF_LONG);
     401        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    410402
    411403        //add esp,sizeof(double)+sizeof(long)
    412         op_add_esp(sizeof(double)+sizeof(long));
     404        compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
    413405
    414406        //fcompp
    415         OpBuffer[obp++]=(char)0xDE;
    416         OpBuffer[obp++]=(char)0xD9;
     407        compiler.codeGenerator.op_fcompp();
    417408
    418409        //fnstsw ax
    419         OpBuffer[obp++]=(char)0xDF;
    420         OpBuffer[obp++]=(char)0xE0;
     410        compiler.codeGenerator.op_fnstsw_ax();
    421411
    422412        //test ah,40
    423         OpBuffer[obp++]=(char)0xF6;
    424         OpBuffer[obp++]=(char)0xC4;
    425         OpBuffer[obp++]=(char)0x40;
     413        compiler.codeGenerator.op_test_ah( (char)0x40 );
    426414
    427415        //jne (Wend まで)
     
    435423    else if( tempType.IsSingle() ){
    436424        //fld dword ptr[esp]
    437         op_fld_ptr_esp(DEF_SINGLE);
     425        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    438426
    439427        //push 0
    440         op_push_V(0);
     428        compiler.codeGenerator.op_push_V(0);
    441429
    442430        //fild dword ptr[esp]
    443         op_fld_ptr_esp(DEF_LONG);
     431        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    444432
    445433        //add esp,sizeof(float)+sizeof(long)
    446         op_add_esp(sizeof(float)+sizeof(long));
     434        compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
    447435
    448436        //fcompp
    449         OpBuffer[obp++]=(char)0xDE;
    450         OpBuffer[obp++]=(char)0xD9;
     437        compiler.codeGenerator.op_fcompp();
    451438
    452439        //fnstsw ax
    453         OpBuffer[obp++]=(char)0xDF;
    454         OpBuffer[obp++]=(char)0xE0;
     440        compiler.codeGenerator.op_fnstsw_ax();
    455441
    456442        //test ah,40
    457         OpBuffer[obp++]=(char)0xF6;
    458         OpBuffer[obp++]=(char)0xC4;
    459         OpBuffer[obp++]=(char)0x40;
     443        compiler.codeGenerator.op_test_ah( (char)0x40 );
    460444
    461445        //jne (Wend まで)
     
    471455
    472456        //pop eax
    473         op_pop(REG_EAX);
     457        compiler.codeGenerator.op_pop(REG_EAX);
    474458
    475459        //pop ebx
    476         op_pop(REG_EBX);
     460        compiler.codeGenerator.op_pop(REG_EBX);
    477461
    478462        //cmp eax,0
     
    514498
    515499        //pop eax
    516         op_pop(REG_EAX);
     500        compiler.codeGenerator.op_pop(REG_EAX);
    517501
    518502        //cmp eax,0
     
    616600
    617601    //pop eax
    618     op_pop(REG_EAX);
     602    compiler.codeGenerator.op_pop(REG_EAX);
    619603
    620604    //cmp eax,0
     
    634618
    635619    //pop eax
    636     op_pop(REG_EAX);
     620    compiler.codeGenerator.op_pop(REG_EAX);
    637621
    638622    //jmp [カウンタ減少の場合の判定を飛び越す]
     
    648632
    649633    //pop eax
    650     op_pop(REG_EAX);
     634    compiler.codeGenerator.op_pop(REG_EAX);
    651635
    652636    *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
     
    737721            if( tempType.IsDouble() ){
    738722                //fld qword ptr[esp]
    739                 op_fld_ptr_esp(DEF_DOUBLE);
     723                compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    740724
    741725                //push 0
    742                 op_push_V(0);
     726                compiler.codeGenerator.op_push_V(0);
    743727
    744728                //fild dword ptr[esp]
    745                 op_fld_ptr_esp(DEF_LONG);
     729                compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    746730
    747731                //add esp,sizeof(double)+sizeof(long)
    748                 op_add_esp(sizeof(double)+sizeof(long));
     732                compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
    749733
    750734                //fcompp
    751                 OpBuffer[obp++]=(char)0xDE;
    752                 OpBuffer[obp++]=(char)0xD9;
     735                compiler.codeGenerator.op_fcompp();
    753736
    754737                //fnstsw ax
    755                 OpBuffer[obp++]=(char)0xDF;
    756                 OpBuffer[obp++]=(char)0xE0;
     738                compiler.codeGenerator.op_fnstsw_ax();
    757739
    758740                //test ah,40
    759                 OpBuffer[obp++]=(char)0xF6;
    760                 OpBuffer[obp++]=(char)0xC4;
    761                 OpBuffer[obp++]=(char)0x40;
     741                compiler.codeGenerator.op_test_ah( (char)0x40 );
    762742
    763743                if(basbuf[i3]=='0'){
     
    778758            else if( tempType.IsSingle() ){
    779759                //fld dword ptr[esp]
    780                 op_fld_ptr_esp(DEF_SINGLE);
     760                compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    781761
    782762                //push 0
    783                 op_push_V(0);
     763                compiler.codeGenerator.op_push_V(0);
    784764
    785765                //fild dword ptr[esp]
    786                 op_fld_ptr_esp(DEF_LONG);
     766                compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    787767
    788768                //add esp,sizeof(float)+sizeof(long)
    789                 op_add_esp(sizeof(float)+sizeof(long));
     769                compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
    790770
    791771                //fcompp
    792                 OpBuffer[obp++]=(char)0xDE;
    793                 OpBuffer[obp++]=(char)0xD9;
     772                compiler.codeGenerator.op_fcompp();
    794773
    795774                //fnstsw ax
    796                 OpBuffer[obp++]=(char)0xDF;
    797                 OpBuffer[obp++]=(char)0xE0;
     775                compiler.codeGenerator.op_fnstsw_ax();
    798776
    799777                //test ah,40
    800                 OpBuffer[obp++]=(char)0xF6;
    801                 OpBuffer[obp++]=(char)0xC4;
    802                 OpBuffer[obp++]=(char)0x40;
     778                compiler.codeGenerator.op_test_ah( (char)0x40 );
    803779
    804780                if(basbuf[i3]=='0'){
     
    821797
    822798                //pop eax
    823                 op_pop(REG_EAX);
     799                compiler.codeGenerator.op_pop(REG_EAX);
    824800
    825801                //pop ebx
    826                 op_pop(REG_EBX);
     802                compiler.codeGenerator.op_pop(REG_EBX);
    827803
    828804                //cmp eax,0
     
    877853            else{
    878854                //pop eax
    879                 op_pop(REG_EAX);
     855                compiler.codeGenerator.op_pop(REG_EAX);
    880856
    881857                //cmp eax,0
     
    10271003            if(sw==0){
    10281004                //add esp,CaseTypeSize
    1029                 op_add_esp(CaseTypeSize);
     1005                compiler.codeGenerator.op_add_esp(CaseTypeSize);
    10301006            }
    10311007            break;
     
    11011077
    11021078                    //pop edx
    1103                     op_pop(REG_EDX);
     1079                    compiler.codeGenerator.op_pop(REG_EDX);
    11041080
    11051081                    //mov ecx,dword ptr[esp]
    1106                     op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
     1082                    compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
    11071083
    11081084                    //push edx
    1109                     op_push(REG_EDX);
     1085                    compiler.codeGenerator.op_push(REG_EDX);
    11101086
    11111087                    //push ecx
    1112                     op_push(REG_ECX);
     1088                    compiler.codeGenerator.op_push(REG_ECX);
    11131089
    11141090                    //call operator_proc    ※ ==演算子
    1115                     op_call(pUserProc);
     1091                    compiler.codeGenerator.op_call(pUserProc);
    11161092
    11171093                    //test eax,eax
    1118                     op_test(REG_EAX,REG_EAX);
     1094                    compiler.codeGenerator.op_test(REG_EAX,REG_EAX);
    11191095
    11201096                    //jne ...
     
    11281104
    11291105                    //fld qword ptr[esp]
    1130                     op_fld_ptr_esp(DEF_DOUBLE);
     1106                    compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    11311107
    11321108                    //add esp,CaseTypeSize
    1133                     op_add_esp(CaseTypeSize);
     1109                    compiler.codeGenerator.op_add_esp(CaseTypeSize);
    11341110
    11351111                    //fld qword ptr[esp]
    1136                     op_fld_ptr_esp(DEF_DOUBLE);
     1112                    compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    11371113
    11381114                    //fcompp
    1139                     OpBuffer[obp++]=(char)0xDE;
    1140                     OpBuffer[obp++]=(char)0xD9;
     1115                    compiler.codeGenerator.op_fcompp();
    11411116
    11421117                    //fnstsw ax
    1143                     OpBuffer[obp++]=(char)0xDF;
    1144                     OpBuffer[obp++]=(char)0xE0;
     1118                    compiler.codeGenerator.op_fnstsw_ax();
    11451119
    11461120                    //test ah,40
    1147                     OpBuffer[obp++]=(char)0xF6;
    1148                     OpBuffer[obp++]=(char)0xC4;
    1149                     OpBuffer[obp++]=(char)0x40;
     1121                    compiler.codeGenerator.op_test_ah( (char)0x40 );
    11501122
    11511123                    //jne ...
     
    11591131
    11601132                    //fld dword ptr[esp]
    1161                     op_fld_ptr_esp(DEF_SINGLE);
     1133                    compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    11621134
    11631135                    //add esp,CaseTypeSize
    1164                     op_add_esp(CaseTypeSize);
     1136                    compiler.codeGenerator.op_add_esp(CaseTypeSize);
    11651137
    11661138                    //fld dword ptr[esp]
    1167                     op_fld_ptr_esp(DEF_SINGLE);
     1139                    compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    11681140
    11691141                    //fcompp
    1170                     OpBuffer[obp++]=(char)0xDE;
    1171                     OpBuffer[obp++]=(char)0xD9;
     1142                    compiler.codeGenerator.op_fcompp();
    11721143
    11731144                    //fnstsw ax
    1174                     OpBuffer[obp++]=(char)0xDF;
    1175                     OpBuffer[obp++]=(char)0xE0;
     1145                    compiler.codeGenerator.op_fnstsw_ax();
    11761146
    11771147                    //test ah,40
    1178                     OpBuffer[obp++]=(char)0xF6;
    1179                     OpBuffer[obp++]=(char)0xC4;
    1180                     OpBuffer[obp++]=(char)0x40;
     1148                    compiler.codeGenerator.op_test_ah( (char)0x40 );
    11811149
    11821150                    //jne ...
     
    11901158
    11911159                    //pop ebx
    1192                     op_pop(REG_EBX);
     1160                    compiler.codeGenerator.op_pop(REG_EBX);
    11931161
    11941162                    //mov eax,dword ptr[esp]
     
    12731241
    12741242    //add esp,CaseTypeSize
    1275     op_add_esp(CaseTypeSize);
     1243    compiler.codeGenerator.op_add_esp(CaseTypeSize);
    12761244}
    12771245
     
    13211289
    13221290        //ret
    1323         op_ret();
     1291        compiler.codeGenerator.op_ret();
    13241292    }
    13251293    else{
     
    13981366
    13991367        //pop eax
    1400         op_pop(REG_EAX);
     1368        compiler.codeGenerator.op_pop(REG_EAX);
    14011369
    14021370        //fstp qword ptr[eax]
     
    14081376
    14091377        //pop ebx
    1410         op_pop(REG_EBX);
     1378        compiler.codeGenerator.op_pop(REG_EBX);
    14111379
    14121380        //pop eax
    1413         op_pop(REG_EAX);
     1381        compiler.codeGenerator.op_pop(REG_EAX);
    14141382
    14151383        //mov dword ptr[eax],ebx
    1416         OpBuffer[obp++]=(char)0x89;
    1417         OpBuffer[obp++]=(char)0x18;
     1384        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
    14181385    }
    14191386    else if(type==DEF_QWORD){
     
    14211388
    14221389        //pop ecx
    1423         op_pop(REG_ECX);
     1390        compiler.codeGenerator.op_pop(REG_ECX);
    14241391
    14251392        //pop ebx
    1426         op_pop(REG_EBX);
     1393        compiler.codeGenerator.op_pop(REG_EBX);
    14271394
    14281395        //pop eax
    1429         op_pop(REG_EAX);
     1396        compiler.codeGenerator.op_pop(REG_EAX);
    14301397
    14311398        //mov dword ptr[eax],ecx
    1432         OpBuffer[obp++]=(char)0x89;
    1433         OpBuffer[obp++]=(char)0x08;
     1399        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
    14341400
    14351401        //mov dword ptr[eax+sizeof(long)],ebx
    1436         OpBuffer[obp++]=(char)0x89;
    1437         OpBuffer[obp++]=(char)0x58;
    1438         OpBuffer[obp++]=(char)0x04;
     1402        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0x04, MOD_BASE_DISP8 );
    14391403    }
    14401404    else if(type==DEF_DWORD){
     
    14421406
    14431407        //pop ebx
    1444         op_pop(REG_EBX);
     1408        compiler.codeGenerator.op_pop(REG_EBX);
    14451409
    14461410        //pop eax
    1447         op_pop(REG_EAX);
     1411        compiler.codeGenerator.op_pop(REG_EAX);
    14481412
    14491413        //mov dword ptr[eax],ebx
    1450         OpBuffer[obp++]=(char)0x89;
    1451         OpBuffer[obp++]=(char)0x18;
     1414        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
    14521415    }
    14531416    else if(type==DEF_WORD){
     
    14551418
    14561419        //pop ebx
    1457         op_pop(REG_EBX);
     1420        compiler.codeGenerator.op_pop(REG_EBX);
    14581421
    14591422        //pop eax
    1460         op_pop(REG_EAX);
     1423        compiler.codeGenerator.op_pop(REG_EAX);
    14611424
    14621425        //mov word ptr[eax],bx
     
    14691432
    14701433        //pop ebx
    1471         op_pop(REG_EBX);
     1434        compiler.codeGenerator.op_pop(REG_EBX);
    14721435
    14731436        //pop eax
    1474         op_pop(REG_EAX);
     1437        compiler.codeGenerator.op_pop(REG_EAX);
    14751438
    14761439        //mov byte ptr[eax],bl
Note: See TracChangeset for help on using the changeset viewer.