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

    r206 r225  
    22
    33#include <jenga/include/smoothie/Smoothie.h>
     4
     5#include <Compiler.h>
    46
    57#include "../BasicCompiler_Common/common.h"
     
    2123
    2224                //mov ecx,object_size
    23                 op_mov_RV(REG_ECX,object_size);
     25                compiler.codeGenerator.op_mov_RV(REG_ECX,object_size);
    2426
    2527                //pop esi
    26                 op_pop(REG_ESI);
     28                compiler.codeGenerator.op_pop(REG_ESI);
    2729
    2830                //pop edi
    29                 op_pop(REG_EDI);
     31                compiler.codeGenerator.op_pop(REG_EDI);
    3032
    3133                if(bUseHeap){
    3234                    //mov eax,esi
    33                     op_mov_RR(REG_EAX,REG_ESI);
     35                    compiler.codeGenerator.op_mov_RR(REG_EAX,REG_ESI);
    3436                }
    3537
    3638                //rep movs byte ptr[edi],byte ptr[esi]
    37                 op_rep_movs(sizeof(BYTE));
     39                compiler.codeGenerator.op_rep_movs(sizeof(BYTE));
    3840
    3941                if(bUseHeap){
    4042                    //push eax
    41                     op_push(REG_EAX);
     43                    compiler.codeGenerator.op_push(REG_EAX);
    4244
    4345                    //call free
    4446                    extern const UserProc *pSub_free;
    45                     op_call(pSub_free);
     47                    compiler.codeGenerator.op_call(pSub_free);
    4648                }
    4749
     
    6466
    6567            //push edx
    66             op_push( REG_EDX );
     68            compiler.codeGenerator.op_push( REG_EDX );
    6769
    6870            //push eax
    69             op_push( REG_EAX );
     71            compiler.codeGenerator.op_push( REG_EAX );
    7072
    7173            //fild qword ptr[esp]
    72             op_fld_ptr_esp(DEF_INT64);
     74            compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    7375
    7476            //pop
    75             op_pop( REG_NON );
     77            compiler.codeGenerator.op_pop( REG_NON );
    7678
    7779            //pop
    78             op_pop( REG_NON );
     80            compiler.codeGenerator.op_pop( REG_NON );
    7981        }
    8082        else{
    8183            //push eax
    82             op_push( REG_EAX );
     84            compiler.codeGenerator.op_push( REG_EAX );
    8385
    8486            //fild qword ptr[esp]
    85             op_fld_ptr_esp(DEF_LONG);
     87            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    8688
    8789            //pop
    88             op_pop( REG_NON );
     90            compiler.codeGenerator.op_pop( REG_NON );
    8991        }
    9092    }
     
    9395        if(pRelativeVar->bOffsetOffset){
    9496            //fstp ptr[ecx+offset]
    95             op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset);
     97            compiler.codeGenerator.op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset);
    9698            obp-=sizeof(long);
    9799            pobj_GlobalVarSchedule->add();
     
    100102        else{
    101103            //mov ecx,offset
    102             op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
     104            compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
    103105            obp-=sizeof(long);
    104106            pobj_GlobalVarSchedule->add();
     
    106108
    107109            //fstp ptr[ecx]
    108             op_fstp_basereg(VarType,REG_ECX);
     110            compiler.codeGenerator.op_fstp_basereg(VarType,REG_ECX);
    109111        }
    110112    }
     
    112114        if(pRelativeVar->bOffsetOffset){
    113115            //add ecx,qword ptr[offset]
    114             op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     116            compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
    115117        }
    116118        else{
    117119            //mov ecx,qword ptr[offset]
    118             op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     120            compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
    119121        }
    120122        obp-=sizeof(long);
     
    127129        if(pRelativeVar->bOffsetOffset){
    128130            //fstp ptr[ebp+ecx+offset]
    129             op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
     131            compiler.codeGenerator.op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
    130132        }
    131133        else{
    132134            //fstp ptr[ebp+offset]
    133             op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset);
     135            compiler.codeGenerator.op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset);
    134136        }
    135137        obp-=sizeof(long);
     
    140142        if(pRelativeVar->bOffsetOffset){
    141143            //add ecx,qword ptr[ebp+offset]
    142             op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
     144            compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    143145        }
    144146        else{
    145147            //mov ecx,qword ptr[ebp+offset]
    146             op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
     148            compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    147149        }
    148150        obp-=sizeof(long);
     
    155157directmem:
    156158        //fstp ptr[ecx]
    157         op_fstp_basereg(VarType,REG_ECX);
     159        compiler.codeGenerator.op_fstp_basereg(VarType,REG_ECX);
    158160    }
    159161}
     
    170172    else if(type==DEF_INT64||type==DEF_QWORD){
    171173        //cmp eax,0
    172         op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
     174        compiler.codeGenerator.op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
    173175
    174176        //setne al
    175         op_setne( REG_EAX );
     177        compiler.codeGenerator.op_setne( REG_EAX );
    176178
    177179        //cmp edx,0
    178         op_cmp_value(GetTypeSize(type,-1),REG_EDX,0);
     180        compiler.codeGenerator.op_cmp_value(GetTypeSize(type,-1),REG_EDX,0);
    179181
    180182        //setne cl
    181         op_setne( REG_ECX );
     183        compiler.codeGenerator.op_setne( REG_ECX );
    182184
    183185        //or al,cl
    184         op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX );
     186        compiler.codeGenerator.op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX );
    185187    }
    186188    else{
     
    193195
    194196    //cmp eax,0
    195     op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
     197    compiler.codeGenerator.op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
    196198
    197199    //setne al
    198     op_setne( REG_EAX );
     200    compiler.codeGenerator.op_setne( REG_EAX );
    199201
    200202    SetWholeVariable( sizeof(char), DEF_BYTE, pRelative );
     
    209211    if(IsSignedType(type)){
    210212        //cdq
    211         op_cdq();
     213        compiler.codeGenerator.op_cdq();
    212214    }
    213215    else{
    214216        //xor edx,edx
    215         op_zero_reg(REG_EDX);
     217        compiler.codeGenerator.op_zero_reg(REG_EDX);
    216218    }
    217219}
     
    219221    if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){
    220222        //movsx reg32,reg16
    221         op_movsx_R32R16(reg,reg);
     223        compiler.codeGenerator.op_movsx_R32R16(reg,reg);
    222224    }
    223225    else if(type==DEF_WORD){
    224226        //and reg,0000FFFFh
    225         op_and_RV(reg,(int)0x0000FFFF);
     227        compiler.codeGenerator.op_and_RV(reg,(int)0x0000FFFF);
    226228    }
    227229    else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
    228230        //movsx reg32,reg8
    229         op_movsx_R32R8(reg,reg);
     231        compiler.codeGenerator.op_movsx_R32R8(reg,reg);
    230232    }
    231233    else if(type==DEF_BYTE||type==DEF_BOOLEAN){
    232234        //and reg,000000FFh
    233         op_and_RV(reg,(int)0xFF);
     235        compiler.codeGenerator.op_and_RV(reg,(int)0xFF);
    234236    }
    235237}
     
    237239    if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
    238240        //movsx reg16,reg8
    239         op_movsx_R16R8(reg,reg);
     241        compiler.codeGenerator.op_movsx_R16R8(reg,reg);
    240242    }
    241243    else if(type==DEF_BYTE||type==DEF_BOOLEAN){
    242244        //and reg,000000FFh
    243         op_and_RV(reg,(int)0xFF);
     245        compiler.codeGenerator.op_and_RV(reg,(int)0xFF);
    244246    }
    245247}
     
    256258            //push
    257259            //push
    258             op_sub_esp( PTR_SIZE * 2 );
     260            compiler.codeGenerator.op_sub_esp( PTR_SIZE * 2 );
    259261
    260262            //fistp qword ptr[esp]
    261             op_fistp_ptr_esp( sizeof(_int64) );
     263            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
    262264
    263265            //pop eax
    264             op_pop( REG_EAX );
     266            compiler.codeGenerator.op_pop( REG_EAX );
    265267
    266268            //pop edx
    267             op_pop( REG_EDX );
     269            compiler.codeGenerator.op_pop( REG_EDX );
    268270        }
    269271        else{
     
    272274
    273275            //push
    274             op_push( REG_NON );
     276            compiler.codeGenerator.op_push( REG_NON );
    275277
    276278            //fistp dword ptr[esp]
    277             op_fistp_ptr_esp( sizeof(long) );
     279            compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
    278280
    279281            //pop eax
    280             op_pop( REG_EAX );
     282            compiler.codeGenerator.op_pop( REG_EAX );
    281283        }
    282284    }
     
    310312
    311313        //mov ecx,eax
    312         op_mov_RR( REG_ECX, REG_EAX );
     314        compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EAX );
    313315
    314316        //add ecx,sizeof(long)
    315         op_add_RV8( REG_ECX, sizeof(long) );
     317        compiler.codeGenerator.op_add_RV8( REG_ECX, sizeof(long) );
    316318
    317319        //mov eax,edx
    318         op_mov_RR( REG_EAX, REG_EDX );
     320        compiler.codeGenerator.op_mov_RR( REG_EAX, REG_EDX );
    319321
    320322        SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
     
    326328        if(pRelative->bOffsetOffset){
    327329            //mov ptr[ecx+offset],eax/ax/al
    328             op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
     330            compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
    329331        }
    330332        else{
    331333            //mov ptr[offset],eax/ax/al
    332             op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
     334            compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
    333335        }
    334336        obp-=sizeof(long);
     
    342344        if(pRelative->bOffsetOffset){
    343345            //add ecx,qword ptr[offset]
    344             op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
     346            compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
    345347        }
    346348        else{
    347349            //mov ecx,qword ptr[offset]
    348             op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
     350            compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
    349351        }
    350352        obp-=sizeof(long);
     
    357359        if(pRelative->bOffsetOffset){
    358360            //mov ptr[ebp+ecx+offset],eax/ax/al
    359             op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
     361            compiler.codeGenerator.op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
    360362        }
    361363        else{
    362364            //mov ptr[ebp+offset],eax/ax/al
    363             op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     365            compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    364366        }
    365367        obp-=sizeof(long);
     
    370372        if(pRelative->bOffsetOffset){
    371373            //add ecx,ptr[ebp+offset]
    372             op_add_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     374            compiler.codeGenerator.op_add_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    373375        }
    374376        else{
    375377            //mov ecx,ptr[ebp+offset]
    376             op_mov_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     378            compiler.codeGenerator.op_mov_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    377379        }
    378380        obp-=sizeof(long);
     
    386388
    387389        //mov ptr[ecx],eax/ax/al
    388         op_mov_MR(varSize,REG_EAX,REG_ECX,0,MOD_BASE);
    389     }
    390 }
     390        compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,0,MOD_BASE);
     391    }
     392}
Note: See TracChangeset for help on using the changeset viewer.