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

    r206 r225  
    1414    if(OldType==DEF_DOUBLE){
    1515        //fld qword ptr[esp]
    16         op_fld_ptr_esp(DEF_DOUBLE);
     16        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    1717
    1818        //add esp,8
    19         op_add_esp(8);
     19        compiler.codeGenerator.op_add_esp(8);
    2020    }
    2121    else if(OldType==DEF_SINGLE){
    2222        //fld dword ptr[esp]
    23         op_fld_ptr_esp(DEF_SINGLE);
     23        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    2424
    2525        //add esp,4
    26         op_add_esp(4);
     26        compiler.codeGenerator.op_add_esp(4);
    2727    }
    2828    else if(OldType==DEF_LONG){
    2929        //fild dword ptr[esp]
    30         op_fld_ptr_esp(DEF_LONG);
     30        compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    3131
    3232        //add esp,4
    33         op_add_esp(4);
     33        compiler.codeGenerator.op_add_esp(4);
    3434    }
    3535    else if(OldType==DEF_DWORD){
    3636        //pop eax
    37         op_pop(REG_EAX);
     37        compiler.codeGenerator.op_pop(REG_EAX);
    3838
    3939        //push 0
    40         op_push_V(0);
     40        compiler.codeGenerator.op_push_V(0);
    4141
    4242        //push eax
    43         op_push(REG_EAX);
     43        compiler.codeGenerator.op_push(REG_EAX);
    4444
    4545        //fild qword ptr[esp]
    46         OpBuffer[obp++]=(char)0xDF;
    47         OpBuffer[obp++]=(char)0x2C;
    48         OpBuffer[obp++]=(char)0x24;
     46        compiler.codeGenerator.PutOld(
     47            (char)0xDF,
     48            (char)0x2C,
     49            (char)0x24
     50        );
    4951
    5052        //add esp,8
    51         op_add_esp(8);
     53        compiler.codeGenerator.op_add_esp(8);
    5254    }
    5355}
     
    5860    else if(OldType==DEF_SINGLE){
    5961        //fld dword ptr[esp]
    60         op_fld_ptr_esp(DEF_SINGLE);
     62        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    6163
    6264        //sub esp,4
    63         op_sub_esp(4);
     65        compiler.codeGenerator.op_sub_esp(4);
    6466
    6567        //fstp qword ptr[esp]
    66         OpBuffer[obp++]=(char)0xDD;
    67         OpBuffer[obp++]=(char)0x1C;
    68         OpBuffer[obp++]=(char)0x24;
     68        compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    6969    }
    7070    else if(OldType==DEF_INT64||OldType==DEF_QWORD){
     
    7272
    7373        //fild qword ptr[esp]
    74         op_fld_ptr_esp(DEF_INT64);
     74        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    7575
    7676        //fstp qword ptr[esp]
    77         OpBuffer[obp++]=(char)0xDD;
    78         OpBuffer[obp++]=(char)0x1C;
    79         OpBuffer[obp++]=(char)0x24;
     77        compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    8078    }
    8179    else if(IsWholeNumberType(OldType)){
     
    8785            if(OldType==DEF_INTEGER || (Smoothie::IsUnicode()&&OldType==DEF_CHAR)){
    8886                //pop eax
    89                 op_pop(REG_EAX);
     87                compiler.codeGenerator.op_pop(REG_EAX);
    9088
    9189                //movsx eax,ax
    92                 OpBuffer[obp++]=(char)0x0F;
    93                 OpBuffer[obp++]=(char)0xBF;
    94                 OpBuffer[obp++]=(char)0xC0;
     90                compiler.codeGenerator.op_movsx_R32R16( REG_EAX );
    9591
    9692                //push eax
    97                 op_push(REG_EAX);
     93                compiler.codeGenerator.op_push(REG_EAX);
    9894            }
    9995            else if(OldType==DEF_SBYTE || (Smoothie::IsUnicode()==false&&OldType==DEF_CHAR)){
    10096                //pop eax
    101                 op_pop(REG_EAX);
     97                compiler.codeGenerator.op_pop(REG_EAX);
    10298
    10399                //movsx eax,al
    104                 OpBuffer[obp++]=(char)0x0F;
    105                 OpBuffer[obp++]=(char)0xBE;
    106                 OpBuffer[obp++]=(char)0xC0;
     100                compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
    107101
    108102                //push eax
    109                 op_push(REG_EAX);
     103                compiler.codeGenerator.op_push(REG_EAX);
    110104            }
    111105
    112106            //fild dword ptr[esp]
    113             op_fld_ptr_esp(DEF_LONG);
     107            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    114108
    115109            //sub esp,4
    116             op_sub_esp(4);
     110            compiler.codeGenerator.op_sub_esp(4);
    117111        }
    118112        else{
     
    120114
    121115            //pop eax
    122             op_pop(REG_EAX);
     116            compiler.codeGenerator.op_pop(REG_EAX);
    123117
    124118            //push 0
    125             op_push_V(0);
     119            compiler.codeGenerator.op_push_V(0);
    126120
    127121            //push eax
    128             op_push(REG_EAX);
     122            compiler.codeGenerator.op_push(REG_EAX);
    129123
    130124            //fild qword ptr[esp]
    131             OpBuffer[obp++]=(char)0xDF;
    132             OpBuffer[obp++]=(char)0x2C;
    133             OpBuffer[obp++]=(char)0x24;
     125            compiler.codeGenerator.PutOld(
     126                (char)0xDF,
     127                (char)0x2C,
     128                (char)0x24
     129            );
    134130        }
    135131
    136132        //fstp qword ptr[esp]
    137         OpBuffer[obp++]=(char)0xDD;
    138         OpBuffer[obp++]=(char)0x1C;
    139         OpBuffer[obp++]=(char)0x24;
     133        compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
    140134    }
    141135    else SetError(9,NULL,cp);
     
    147141    else if(OldType==DEF_DOUBLE){
    148142        //fld qword ptr[esp]
    149         op_fld_ptr_esp(DEF_DOUBLE);
     143        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    150144
    151145        //add esp,4
    152         op_add_esp(4);
     146        compiler.codeGenerator.op_add_esp(4);
    153147
    154148        //fstp dword ptr[esp]
    155         OpBuffer[obp++]=(char)0xD9;
    156         OpBuffer[obp++]=(char)0x1C;
    157         OpBuffer[obp++]=(char)0x24;
     149        compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
    158150    }
    159151    else if(OldType==DEF_INT64||OldType==DEF_QWORD){
     
    161153
    162154        //fild qword ptr[esp]
    163         op_fld_ptr_esp(DEF_INT64);
     155        compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    164156
    165157        //add esp,4
    166         op_add_esp(4);
     158        compiler.codeGenerator.op_add_esp(4);
    167159
    168160        //fstp dword ptr[esp]
    169         OpBuffer[obp++]=(char)0xD9;
    170         OpBuffer[obp++]=(char)0x1C;
    171         OpBuffer[obp++]=(char)0x24;
     161        compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
    172162    }
    173163    else if(IsWholeNumberType(OldType)){
     
    179169            if(OldType==DEF_INTEGER || (Smoothie::IsUnicode()&&OldType==DEF_CHAR)){
    180170                //pop eax
    181                 op_pop(REG_EAX);
     171                compiler.codeGenerator.op_pop(REG_EAX);
    182172
    183173                //movsx eax,ax
    184                 OpBuffer[obp++]=(char)0x0F;
    185                 OpBuffer[obp++]=(char)0xBF;
    186                 OpBuffer[obp++]=(char)0xC0;
     174                compiler.codeGenerator.op_movsx_R32R16( REG_EAX );
    187175
    188176                //push eax
    189                 op_push(REG_EAX);
     177                compiler.codeGenerator.op_push(REG_EAX);
    190178            }
    191179            else if(OldType==DEF_SBYTE || (Smoothie::IsUnicode()==false&&OldType==DEF_CHAR)){
    192180                //pop eax
    193                 op_pop(REG_EAX);
     181                compiler.codeGenerator.op_pop(REG_EAX);
    194182
    195183                //movsx eax,al
    196                 OpBuffer[obp++]=(char)0x0F;
    197                 OpBuffer[obp++]=(char)0xBE;
    198                 OpBuffer[obp++]=(char)0xC0;
     184                compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
    199185
    200186                //push eax
    201                 op_push(REG_EAX);
     187                compiler.codeGenerator.op_push(REG_EAX);
    202188            }
    203189
    204190            //fild dword ptr[esp]
    205             op_fld_ptr_esp(DEF_LONG);
     191            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    206192        }
    207193        else{
     
    209195
    210196            //fild dword ptr[esp]
    211             op_fld_ptr_esp(DEF_LONG);
     197            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    212198        }
    213199
    214200        //fstp dword ptr[esp]
    215         OpBuffer[obp++]=(char)0xD9;
    216         OpBuffer[obp++]=(char)0x1C;
    217         OpBuffer[obp++]=(char)0x24;
     201        compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
    218202    }
    219203    else SetError(9,NULL,cp);
     
    227211    else if(OldType==DEF_DOUBLE){
    228212        //fld qword ptr[esp]
    229         op_fld_ptr_esp(DEF_DOUBLE);
     213        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    230214
    231215        //fistp qword ptr[esp]
    232         op_fistp_ptr_esp( sizeof(_int64) );
     216        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    233217    }
    234218    else if(OldType==DEF_SINGLE){
    235219        //fld dword ptr[esp]
    236         op_fld_ptr_esp(DEF_SINGLE);
     220        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    237221
    238222        //sub esp,4
    239         op_sub_esp(4);
     223        compiler.codeGenerator.op_sub_esp(4);
    240224
    241225        //fistp qword ptr[esp]
    242         op_fistp_ptr_esp( sizeof(_int64) );
     226        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    243227    }
    244228    else if(IsWholeNumberType(OldType)){
     
    249233
    250234            //pop eax
    251             op_pop(REG_EAX);
     235            compiler.codeGenerator.op_pop(REG_EAX);
    252236
    253237            //cdq
    254             op_cdq();
     238            compiler.codeGenerator.op_cdq();
    255239
    256240            //push edx
    257             op_push(REG_EDX);
     241            compiler.codeGenerator.op_push(REG_EDX);
    258242
    259243            //push eax
    260             op_push(REG_EAX);
     244            compiler.codeGenerator.op_push(REG_EAX);
    261245        }
    262246        else{
     
    264248
    265249            //pop eax
    266             op_pop(REG_EAX);
     250            compiler.codeGenerator.op_pop(REG_EAX);
    267251
    268252            //push 0
    269             op_push_V(0);
     253            compiler.codeGenerator.op_push_V(0);
    270254
    271255            //push eax
    272             op_push(REG_EAX);
     256            compiler.codeGenerator.op_push(REG_EAX);
    273257        }
    274258    }
     
    281265
    282266        //fld qword ptr[esp]
    283         op_fld_ptr_esp(DEF_DOUBLE);
     267        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    284268
    285269        //add esp,4
    286         op_add_esp(4);
     270        compiler.codeGenerator.op_add_esp(4);
    287271
    288272        //fistp dword ptr[esp]
    289         op_fistp_ptr_esp( sizeof(long) );
     273        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    290274    }
    291275    else if(OldType==DEF_SINGLE){
    292276        //fld dword ptr[esp]
    293         op_fld_ptr_esp(DEF_SINGLE);
     277        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    294278
    295279        //fistp dword ptr[esp]
    296         op_fistp_ptr_esp( sizeof(long) );
     280        compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    297281    }
    298282    else if(OldType==DEF_INT64||OldType==DEF_QWORD){
    299283        //pop eax
    300         op_pop(REG_EAX);
     284        compiler.codeGenerator.op_pop(REG_EAX);
    301285
    302286        //add esp,4
    303         op_add_esp(4);
     287        compiler.codeGenerator.op_add_esp(4);
    304288
    305289        //push eax
    306         op_push(REG_EAX);
     290        compiler.codeGenerator.op_push(REG_EAX);
    307291    }
    308292}
     
    314298    else if(OldType==DEF_SBYTE || (Smoothie::IsUnicode()==false&&OldType==DEF_CHAR)){
    315299        //pop eax
    316         op_pop(REG_EAX);
     300        compiler.codeGenerator.op_pop(REG_EAX);
    317301
    318302        //movsx eax,al
    319         OpBuffer[obp++]=(char)0x0F;
    320         OpBuffer[obp++]=(char)0xBE;
    321         OpBuffer[obp++]=(char)0xC0;
     303        compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
    322304
    323305        //push eax
    324         op_push(REG_EAX);
     306        compiler.codeGenerator.op_push(REG_EAX);
    325307    }
    326308    else{
     
    328310
    329311        //pop eax
    330         op_pop(REG_EAX);
     312        compiler.codeGenerator.op_pop(REG_EAX);
    331313
    332314        //and eax,0000FFFFh
    333         OpBuffer[obp++]=(char)0x25;
    334         *((long *)(OpBuffer+obp))=0x0000FFFF;
    335         obp+=sizeof(long);
     315        compiler.codeGenerator.op_and_RV( REG_EAX, 0x0000FFFF );
    336316
    337317        //push eax
    338         op_push(REG_EAX);
     318        compiler.codeGenerator.op_push(REG_EAX);
    339319    }
    340320}
     
    346326
    347327    //pop eax
    348     op_pop(REG_EAX);
     328    compiler.codeGenerator.op_pop(REG_EAX);
    349329
    350330    //and eax,000000FFh
    351     OpBuffer[obp++]=(char)0x25;
    352     *((long *)(OpBuffer+obp))=0x000000FF;
    353     obp+=sizeof(long);
     331    compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
    354332
    355333    //push eax
    356     op_push(REG_EAX);
     334    compiler.codeGenerator.op_push(REG_EAX);
    357335}
    358336
     
    370348    if(type==DEF_DOUBLE){
    371349        //fld qword ptr[esp]
    372         op_fld_ptr_esp(DEF_DOUBLE);
     350        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    373351
    374352        //add esp,8
    375         op_add_esp(8);
     353        compiler.codeGenerator.op_add_esp(8);
    376354    }
    377355    else if(type==DEF_SINGLE){
    378356        //fld dword ptr[esp]
    379         op_fld_ptr_esp(DEF_SINGLE);
     357        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    380358
    381359        //add esp,4
    382         op_add_esp(4);
     360        compiler.codeGenerator.op_add_esp(4);
    383361    }
    384362    else if( Is64Type( type ) ){
    385363        //pop eax
    386         op_pop(REG_EAX);
     364        compiler.codeGenerator.op_pop(REG_EAX);
    387365
    388366        //pop edx
    389         op_pop(REG_EDX);
     367        compiler.codeGenerator.op_pop(REG_EDX);
    390368    }
    391369    else{
    392370        //pop eax
    393         op_pop(REG_EAX);
     371        compiler.codeGenerator.op_pop(REG_EAX);
    394372    }
    395373}
     
    586564
    587565        //push eax
    588         op_push(REG_EAX);
     566        compiler.codeGenerator.op_push(REG_EAX);
    589567    }
    590568
     
    639617
    640618        // call System.[TypeClass]._Create
    641         op_call( pUserProc );
     619        compiler.codeGenerator.op_call( pUserProc );
    642620
    643621        // push eax
    644         op_push( REG_EAX );
     622        compiler.codeGenerator.op_push( REG_EAX );
    645623
    646624        calcType = pUserProc->ReturnType();
Note: See TracChangeset for help on using the changeset viewer.