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/NumOpe_Logical.cpp

    r206 r225  
    11#include "stdafx.h"
     2
     3#include <Compiler.h>
    24
    35#include "../BasicCompiler_Common/common.h"
     
    2830
    2931            //pop ebx
    30             op_pop(REG_EBX);
     32            compiler.codeGenerator.op_pop(REG_EBX);
    3133
    3234            //pop ecx
    33             op_pop(REG_ECX);
     35            compiler.codeGenerator.op_pop(REG_ECX);
    3436        }
    3537        else{
     
    3739
    3840            //pop eax
    39             op_pop(REG_EAX);
     41            compiler.codeGenerator.op_pop(REG_EAX);
    4042
    4143            if(IsSignedType(type[sp-1])){
     
    4446               
    4547                //cdq
    46                 op_cdq();
     48                compiler.codeGenerator.op_cdq();
    4749            }
    4850            else{
     
    5153
    5254                //xor edx,edx
    53                 op_zero_reg(REG_EDX);
     55                compiler.codeGenerator.op_zero_reg(REG_EDX);
    5456            }
    5557
    5658            //mov ebx,eax
    57             OpBuffer[obp++]=(char)0x8B;
    58             OpBuffer[obp++]=(char)0xD8;
     59            compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
    5960
    6061            //mov ecx,edx
    61             OpBuffer[obp++]=(char)0x8B;
    62             OpBuffer[obp++]=(char)0xCA;
     62            compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
    6363        }
    6464
     
    6767
    6868            //xor dword ptr[esp],ebx
    69             OpBuffer[obp++]=(char)0x31;
    70             OpBuffer[obp++]=(char)0x1C;
    71             OpBuffer[obp++]=(char)0x24;
     69            compiler.codeGenerator.PutOld(
     70                (char)0x31,
     71                (char)0x1C,
     72                (char)0x24
     73            );
    7274
    7375            //xor dword ptr[esp+sizeof(long)],ecx
    74             OpBuffer[obp++]=(char)0x31;
    75             OpBuffer[obp++]=(char)0x4C;
    76             OpBuffer[obp++]=(char)0x24;
    77             OpBuffer[obp++]=(char)0x04;
     76            compiler.codeGenerator.PutOld(
     77                (char)0x31,
     78                (char)0x4C,
     79                (char)0x24,
     80                (char)0x04
     81            );
    7882        }
    7983        else{
     
    8185            if(IsSignedType(type[sp-2])){
    8286                //pop eax
    83                 op_pop(REG_EAX);
     87                compiler.codeGenerator.op_pop(REG_EAX);
    8488
    8589                //符号拡張
     
    8791
    8892                //cdq
    89                 op_cdq();
     93                compiler.codeGenerator.op_cdq();
    9094            }
    9195            else{
    9296                //pop eax
    93                 op_pop(REG_EAX);
     97                compiler.codeGenerator.op_pop(REG_EAX);
    9498
    9599                //ビット拡張
     
    97101
    98102                //xor edx,edx
    99                 op_zero_reg(REG_EDX);
     103                compiler.codeGenerator.op_zero_reg(REG_EDX);
    100104            }
    101105
    102106            //xor ebx,eax
    103             OpBuffer[obp++]=(char)0x33;
    104             OpBuffer[obp++]=(char)0xD8;
     107            compiler.codeGenerator.op_xor_RR( REG_EBX, REG_EAX );
    105108
    106109            //xor ecx,edx
    107             OpBuffer[obp++]=(char)0x33;
    108             OpBuffer[obp++]=(char)0xCA;
     110            compiler.codeGenerator.op_xor_RR( REG_ECX, REG_EDX );
    109111
    110112            //push ecx
    111             op_push(REG_ECX);
     113            compiler.codeGenerator.op_push(REG_ECX);
    112114
    113115            //push ebx
    114             op_push(REG_EBX);
     116            compiler.codeGenerator.op_push(REG_EBX);
    115117        }
    116118
     
    125127
    126128        //pop ebx
    127         op_pop(REG_EBX);
     129        compiler.codeGenerator.op_pop(REG_EBX);
    128130
    129131        //pop eax
    130         op_pop(REG_EAX);
     132        compiler.codeGenerator.op_pop(REG_EAX);
    131133
    132134        //sub esp,4
    133         op_sub_esp(4);
     135        compiler.codeGenerator.op_sub_esp(4);
    134136
    135137        //xor eax,ebx
    136         OpBuffer[obp++]=(char)0x33;
    137         OpBuffer[obp++]=(char)0xC3;
     138        compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX );
    138139
    139140        //mov dword ptr[esp],eax
    140         OpBuffer[obp++]=(char)0x89;
    141         OpBuffer[obp++]=(char)0x04;
    142         OpBuffer[obp++]=(char)0x24;
     141        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    143142
    144143        sp--;
     
    174173
    175174            //pop ebx
    176             op_pop(REG_EBX);
     175            compiler.codeGenerator.op_pop(REG_EBX);
    177176
    178177            //pop ecx
    179             op_pop(REG_ECX);
     178            compiler.codeGenerator.op_pop(REG_ECX);
    180179        }
    181180        else{
     
    183182
    184183            //pop eax
    185             op_pop(REG_EAX);
     184            compiler.codeGenerator.op_pop(REG_EAX);
    186185
    187186            if(IsSignedType(type[sp-1])){
     
    190189               
    191190                //cdq
    192                 op_cdq();
     191                compiler.codeGenerator.op_cdq();
    193192            }
    194193            else{
     
    197196
    198197                //xor edx,edx
    199                 op_zero_reg(REG_EDX);
     198                compiler.codeGenerator.op_zero_reg(REG_EDX);
    200199            }
    201200
    202201            //mov ebx,eax
    203             OpBuffer[obp++]=(char)0x8B;
    204             OpBuffer[obp++]=(char)0xD8;
     202            compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
    205203
    206204            //mov ecx,edx
    207             OpBuffer[obp++]=(char)0x8B;
    208             OpBuffer[obp++]=(char)0xCA;
     205            compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
    209206        }
    210207
     
    213210
    214211            //or dword ptr[esp],ebx
    215             OpBuffer[obp++]=(char)0x09;
    216             OpBuffer[obp++]=(char)0x1C;
    217             OpBuffer[obp++]=(char)0x24;
     212            compiler.codeGenerator.PutOld(
     213                (char)0x09,
     214                (char)0x1C,
     215                (char)0x24
     216            );
    218217
    219218            //or dword ptr[esp+sizeof(long)],ecx
    220             OpBuffer[obp++]=(char)0x09;
    221             OpBuffer[obp++]=(char)0x4C;
    222             OpBuffer[obp++]=(char)0x24;
    223             OpBuffer[obp++]=(char)0x04;
     219            compiler.codeGenerator.PutOld(
     220                (char)0x09,
     221                (char)0x4C,
     222                (char)0x24,
     223                (char)0x04
     224            );
    224225        }
    225226        else{
     
    227228            if(IsSignedType(type[sp-2])){
    228229                //pop eax
    229                 op_pop(REG_EAX);
     230                compiler.codeGenerator.op_pop(REG_EAX);
    230231
    231232                //符号拡張
     
    233234
    234235                //cdq
    235                 op_cdq();
     236                compiler.codeGenerator.op_cdq();
    236237            }
    237238            else{
    238239                //pop eax
    239                 op_pop(REG_EAX);
     240                compiler.codeGenerator.op_pop(REG_EAX);
    240241
    241242                //ビット拡張
     
    243244
    244245                //xor edx,edx
    245                 op_zero_reg(REG_EDX);
     246                compiler.codeGenerator.op_zero_reg(REG_EDX);
    246247            }
    247248
    248249            //or ebx,eax
    249             OpBuffer[obp++]=(char)0x0B;
    250             OpBuffer[obp++]=(char)0xD8;
     250            compiler.codeGenerator.op_or_RR( sizeof(long), REG_EBX, REG_EAX );
    251251
    252252            //or ecx,edx
    253             OpBuffer[obp++]=(char)0x0B;
    254             OpBuffer[obp++]=(char)0xCA;
     253            compiler.codeGenerator.op_or_RR( sizeof(long), REG_ECX, REG_EDX );
    255254
    256255            //push ecx
    257             op_push(REG_ECX);
     256            compiler.codeGenerator.op_push(REG_ECX);
    258257
    259258            //push ebx
    260             op_push(REG_EBX);
     259            compiler.codeGenerator.op_push(REG_EBX);
    261260        }
    262261
     
    271270
    272271        //pop ebx
    273         op_pop(REG_EBX);
     272        compiler.codeGenerator.op_pop(REG_EBX);
    274273
    275274        //pop eax
    276         op_pop(REG_EAX);
     275        compiler.codeGenerator.op_pop(REG_EAX);
    277276
    278277        //sub esp,4
    279         op_sub_esp(4);
     278        compiler.codeGenerator.op_sub_esp(4);
    280279
    281280        //or eax,ebx
    282         OpBuffer[obp++]=(char)0x0B;
    283         OpBuffer[obp++]=(char)0xC3;
     281        compiler.codeGenerator.op_or_RR( sizeof(long), REG_EAX, REG_EBX );
    284282
    285283        //mov dword ptr[esp],eax
    286         OpBuffer[obp++]=(char)0x89;
    287         OpBuffer[obp++]=(char)0x04;
    288         OpBuffer[obp++]=(char)0x24;
     284        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    289285
    290286        sp--;
     
    320316
    321317            //pop ebx
    322             op_pop(REG_EBX);
     318            compiler.codeGenerator.op_pop(REG_EBX);
    323319
    324320            //pop ecx
    325             op_pop(REG_ECX);
     321            compiler.codeGenerator.op_pop(REG_ECX);
    326322        }
    327323        else{
     
    329325
    330326            //pop eax
    331             op_pop(REG_EAX);
     327            compiler.codeGenerator.op_pop(REG_EAX);
    332328
    333329            if(IsSignedType(type[sp-1])){
     
    336332               
    337333                //cdq
    338                 op_cdq();
     334                compiler.codeGenerator.op_cdq();
    339335            }
    340336            else{
     
    343339
    344340                //xor edx,edx
    345                 op_zero_reg(REG_EDX);
     341                compiler.codeGenerator.op_zero_reg(REG_EDX);
    346342            }
    347343
    348344            //mov ebx,eax
    349             OpBuffer[obp++]=(char)0x8B;
    350             OpBuffer[obp++]=(char)0xD8;
     345            compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
    351346
    352347            //mov ecx,edx
    353             OpBuffer[obp++]=(char)0x8B;
    354             OpBuffer[obp++]=(char)0xCA;
     348            compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
    355349        }
    356350
     
    359353
    360354            //and dword ptr[esp],ebx
    361             OpBuffer[obp++]=(char)0x21;
    362             OpBuffer[obp++]=(char)0x1C;
    363             OpBuffer[obp++]=(char)0x24;
     355            compiler.codeGenerator.PutOld(
     356                (char)0x21,
     357                (char)0x1C,
     358                (char)0x24
     359            );
    364360
    365361            //and dword ptr[esp+sizeof(long)],ecx
    366             OpBuffer[obp++]=(char)0x21;
    367             OpBuffer[obp++]=(char)0x4C;
    368             OpBuffer[obp++]=(char)0x24;
    369             OpBuffer[obp++]=(char)0x04;
     362            compiler.codeGenerator.PutOld(
     363                (char)0x21,
     364                (char)0x4C,
     365                (char)0x24,
     366                (char)0x04
     367            );
    370368        }
    371369        else{
     
    373371            if(IsSignedType(type[sp-2])){
    374372                //pop eax
    375                 op_pop(REG_EAX);
     373                compiler.codeGenerator.op_pop(REG_EAX);
    376374
    377375                //符号拡張
     
    379377
    380378                //cdq
    381                 op_cdq();
     379                compiler.codeGenerator.op_cdq();
    382380            }
    383381            else{
    384382                //pop eax
    385                 op_pop(REG_EAX);
     383                compiler.codeGenerator.op_pop(REG_EAX);
    386384
    387385                //ビット拡張
     
    389387
    390388                //xor edx,edx
    391                 op_zero_reg(REG_EDX);
     389                compiler.codeGenerator.op_zero_reg(REG_EDX);
    392390            }
    393391
    394392            //and ebx,eax
    395             OpBuffer[obp++]=(char)0x23;
    396             OpBuffer[obp++]=(char)0xD8;
     393            compiler.codeGenerator.op_and_RR( REG_EBX, REG_EAX );
    397394
    398395            //and ecx,edx
    399             OpBuffer[obp++]=(char)0x23;
    400             OpBuffer[obp++]=(char)0xCA;
     396            compiler.codeGenerator.op_and_RR( REG_ECX, REG_EDX );
    401397
    402398            //push ecx
    403             op_push(REG_ECX);
     399            compiler.codeGenerator.op_push(REG_ECX);
    404400
    405401            //push ebx
    406             op_push(REG_EBX);
     402            compiler.codeGenerator.op_push(REG_EBX);
    407403        }
    408404
     
    417413
    418414        //pop ebx
    419         op_pop(REG_EBX);
     415        compiler.codeGenerator.op_pop(REG_EBX);
    420416
    421417        //pop eax
    422         op_pop(REG_EAX);
     418        compiler.codeGenerator.op_pop(REG_EAX);
    423419
    424420        //sub esp,4
    425         op_sub_esp(4);
     421        compiler.codeGenerator.op_sub_esp(4);
    426422
    427423        //and eax,ebx
    428         OpBuffer[obp++]=(char)0x23;
    429         OpBuffer[obp++]=(char)0xC3;
     424        compiler.codeGenerator.op_and_RR( REG_EAX, REG_EBX );
    430425
    431426        //mov dword ptr[esp],eax
    432         OpBuffer[obp++]=(char)0x89;
    433         OpBuffer[obp++]=(char)0x04;
    434         OpBuffer[obp++]=(char)0x24;
     427        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    435428
    436429        sp--;
     
    454447    if( type[sp - 1] == DEF_BOOLEAN ){
    455448        //pop eax
    456         op_pop( REG_EAX );
     449        compiler.codeGenerator.op_pop( REG_EAX );
    457450
    458451        //cmp eax,0
    459         op_cmp_value(GetTypeSize(type[sp-1],-1),REG_EAX,0);
     452        compiler.codeGenerator.op_cmp_value(GetTypeSize(type[sp-1],-1),REG_EAX,0);
    460453
    461454        //setne al
    462         op_setne( REG_EAX );
     455        compiler.codeGenerator.op_setne( REG_EAX );
    463456
    464457        //and eax,000000FFh
    465         op_and_RV(REG_EAX,(int)0xFF);
     458        compiler.codeGenerator.op_and_RV(REG_EAX,(int)0xFF);
    466459
    467460        //neg
    468         op_neg( REG_EAX );
     461        compiler.codeGenerator.op_neg( REG_EAX );
    469462
    470463        //sbb eax, eax
    471         op_sbb_RR( REG_EAX, REG_EAX );
     464        compiler.codeGenerator.op_sbb_RR( REG_EAX, REG_EAX );
    472465
    473466        //add eax, 1
    474         op_add_RV8( REG_EAX, 1 );
     467        compiler.codeGenerator.op_add_RV8( REG_EAX, 1 );
    475468
    476469        //push eax
    477         op_push( REG_EAX );
     470        compiler.codeGenerator.op_push( REG_EAX );
    478471    }
    479472    else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
     
    483476
    484477        //not dword ptr[esp]
    485         OpBuffer[obp++]=(char)0xF7;
    486         OpBuffer[obp++]=(char)0x14;
    487         OpBuffer[obp++]=(char)0x24;
     478        compiler.codeGenerator.PutOld(
     479            (char)0xF7,
     480            (char)0x14,
     481            (char)0x24
     482        );
    488483
    489484        //not dword ptr[esp+4]
    490         OpBuffer[obp++]=(char)0xF7;
    491         OpBuffer[obp++]=(char)0x54;
    492         OpBuffer[obp++]=(char)0x24;
    493         OpBuffer[obp++]=(char)0x04;
     485        compiler.codeGenerator.PutOld(
     486            (char)0xF7,
     487            (char)0x54,
     488            (char)0x24,
     489            (char)0x04
     490        );
    494491    }
    495492    else{
     
    499496
    500497        //not dword ptr[esp]
    501         OpBuffer[obp++]=(char)0xF7;
    502         OpBuffer[obp++]=(char)0x14;
    503         OpBuffer[obp++]=(char)0x24;
     498        compiler.codeGenerator.PutOld(
     499            (char)0xF7,
     500            (char)0x14,
     501            (char)0x24
     502        );
    504503    }
    505504
Note: See TracChangeset for help on using the changeset viewer.