Changeset 229 in dev


Ignore:
Timestamp:
Jul 24, 2007, 11:35:33 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
4 edited

Legend:

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

    r225 r229  
    1919#define INDEX_NON   0x04
    2020
    21 void CodeGenerator::set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp){
     21void CodeGenerator::set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType ){
    2222    if(mod==MOD_DISP32){
    2323        //ModR/Mバイト
     
    5959    else
    6060    {
    61         pNativeCode->Put( disp );
     61        pNativeCode->Put( disp, scheduleType );
    6262    }
    6363}
     
    7575    pNativeCode->Put( (char)(opcode|REGISTER_OPERAND(reg)) );
    7676}
    77 void CodeGenerator::__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod){
     77void CodeGenerator::__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    7878    //命令プリフィックス
    7979    if(op_prefix)
     
    9090
    9191    //ModR/M, SIB, disp
    92     set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset);
     92    set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset, scheduleType );
    9393}
    9494
     
    9999///////////////////
    100100
    101 void CodeGenerator::op_mov_RV(int reg,long offset){
     101void CodeGenerator::op_mov_RV(int reg,long offset, Schedule::Type scheduleType ){
    102102    //mov reg,value
    103103
     
    106106
    107107    //DISP32
    108     pNativeCode->Put( offset );
    109 }
    110 void CodeGenerator::op_mov_RV(int op_size,int reg,int offset){
    111     if(op_size==PTR_SIZE) op_mov_RV(reg,offset);
    112     else SetError(300,NULL,cp);
     108    pNativeCode->Put( offset, scheduleType );
    113109}
    114110void CodeGenerator::op_mov_RR(int reg1,int reg2){
     
    121117    pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
    122118}
    123 void CodeGenerator::op_mov_RM(int op_size,int reg,int base_reg,int offset,char mod){
     119void CodeGenerator::op_mov_RM(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    124120    //mov reg32,dword ptr[base_reg+offset]
    125121    //mov reg16,word ptr[base_reg+offset]
     
    135131    else opcode=(char)0x8B;
    136132
    137     __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod);
    138 }
    139 void CodeGenerator::op_mov_RM_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset){
     133    __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType );
     134}
     135void CodeGenerator::op_mov_RM_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType ){
    140136    //mov reg32,dword ptr[base_reg1+base_reg2+offset]
    141137    //mov reg16,word ptr[base_reg1+base_reg2+offset]
     
    167163
    168164        //オフセット値
    169         pNativeCode->Put( offset );
     165        pNativeCode->Put( offset, scheduleType );
    170166    }
    171167    else{
     
    181177    }
    182178}
    183 void CodeGenerator::op_mov_MR(int op_size,int reg,int base_reg,int offset,char mod){
     179void CodeGenerator::op_mov_MR(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    184180    //mov dword ptr[base_reg+offset],reg32
    185181    //mov word ptr[base_reg+offset],reg16
     
    195191    else opcode=(char)0x89;
    196192
    197     __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod);
    198 }
    199 void CodeGenerator::op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset){
     193    __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType );
     194}
     195void CodeGenerator::op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType ){
    200196    //mov dword ptr[base_reg1+base_reg2+offset],reg32
    201197    //mov word ptr[base_reg1+base_reg2+offset],reg16
     
    227223
    228224        //オフセット値
    229         pNativeCode->Put( offset );
     225        pNativeCode->Put( offset, scheduleType );
    230226    }
    231227    else{
     
    353349    __op_format(op_prefix,opcode,0,reg1,reg2,0,MOD_REG);
    354350}
    355 void CodeGenerator::op_add_RM(int op_size,int reg,int base_reg,int offset,char mod){
     351void CodeGenerator::op_add_RM(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    356352    //add reg32,dword ptr[base_reg+offset]
    357353    //add reg16,word ptr[base_reg+offset]
     
    367363    else opcode=(char)0x03;
    368364
    369     __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod);
     365    __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType );
    370366}
    371367void CodeGenerator::op_adc_RV8(int reg,char cValue){
     
    656652    __op_format( (char)0xFF, (char)0x30, base_reg );
    657653}
     654void CodeGenerator::op_push_M( int base_reg, long offset, Schedule::Type scheduleType )
     655{
     656    if( base_reg == REG_NON )
     657    {
     658        // push dword ptr[offset]
     659        __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, 0, offset, MOD_DISP32, scheduleType );
     660    }
     661    else
     662    {
     663        // push dword ptr[base_reg+offset]
     664        __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, base_reg, offset, MOD_BASE_DISP32, scheduleType );
     665    }
     666}
    658667void CodeGenerator::op_pop(int reg){
    659668    //pop reg
     
    821830    }
    822831}
    823 void CodeGenerator::op_fld_base_offset(int type,int base_reg,long offset){
     832void CodeGenerator::op_fld_base_offset(int type,int base_reg,long offset, Schedule::Type scheduleType ){
    824833    //fld ptr[reg+offset]
    825834
     
    839848
    840849    //オフセット値
    841     pNativeCode->Put( offset );
    842 }
    843 void CodeGenerator::op_fld_base_offset_ex(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset){
     850    pNativeCode->Put( offset, scheduleType );
     851}
     852void CodeGenerator::op_fld_base_offset_ex(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType ){
    844853    //fld ptr[base_reg1+base_reg2+offset]
    845854
     
    868877
    869878        //オフセット値
    870         pNativeCode->Put( offset );
     879        pNativeCode->Put( offset, scheduleType );
    871880    }
    872881    else{
     
    902911    }
    903912}
    904 void CodeGenerator::op_fstp_base_offset(int type,int base_reg,long offset){
     913void CodeGenerator::op_fstp_base_offset(int type,int base_reg,long offset, Schedule::Type scheduleType ){
    905914    //fstp ptr[reg+offset]
    906915
     
    920929
    921930    //オフセット値
    922     pNativeCode->Put( offset );
    923 }
    924 void CodeGenerator::op_fstp_base_offset_ex(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset){
     931    pNativeCode->Put( offset, scheduleType );
     932}
     933void CodeGenerator::op_fstp_base_offset_ex(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType ){
    925934    //fstp ptr[base_reg1+base_reg2+offset]
    926935
     
    949958
    950959        //オフセット値
    951         pNativeCode->Put( offset );
     960        pNativeCode->Put( offset, scheduleType );
    952961    }
    953962    else{
  • trunk/abdev/BasicCompiler32/Compile_Calc_PushVar.cpp

    r225 r229  
    1010        if(pRelativeVar->bOffsetOffset){
    1111            //fld ptr[ecx+offset]
    12             compiler.codeGenerator.op_fld_base_offset(type,REG_ECX,(int)pRelativeVar->offset);
    13             obp-=sizeof(long);
    14             pobj_GlobalVarSchedule->add();
    15             obp+=sizeof(long);
     12            compiler.codeGenerator.op_fld_base_offset(type,REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
    1613        }
    1714        else{
    1815            //mov ecx,offset
    19             compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
    20             obp-=sizeof(long);
    21             pobj_GlobalVarSchedule->add();
    22             obp+=sizeof(long);
     16            compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
    2317
    2418            //fld ptr[ecx]
     
    3226        if(pRelativeVar->bOffsetOffset){
    3327            //fld ptr[ebp+ecx+offset]
    34             compiler.codeGenerator.op_fld_base_offset_ex(type,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
    35             obp-=sizeof(long);
    36             AddLocalVarAddrSchedule();
    37             obp+=sizeof(long);
     28            compiler.codeGenerator.op_fld_base_offset_ex(type,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET, Schedule::LocalVar );
    3829        }
    3930        else{
    4031            //fld ptr[ebp+offset]
    41             compiler.codeGenerator.op_fld_base_offset(type,REG_EBP,(int)pRelativeVar->offset);
    42             obp-=sizeof(long);
    43             AddLocalVarAddrSchedule();
    44             obp+=sizeof(long);
     32            compiler.codeGenerator.op_fld_base_offset(type,REG_EBP,(int)pRelativeVar->offset, Schedule::LocalVar );
    4533        }
    4634    }
     
    4836        if(pRelativeVar->bOffsetOffset){
    4937            //add ecx,qword ptr[ebp+offset]
    50             compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    51             obp-=sizeof(long);
    52             AddLocalVarAddrSchedule();
    53             obp+=sizeof(long);
     38            compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    5439        }
    5540        else{
    5641            //mov ecx,qword ptr[ebp+offset]
    57             compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    58             obp-=sizeof(long);
    59             AddLocalVarAddrSchedule();
    60             obp+=sizeof(long);
     42            compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    6143        }
    6244
     
    9880        if(pRelativeVar->bOffsetOffset){
    9981            //mov reg, ptr[ecx+offset]
    100             compiler.codeGenerator.op_mov_RM(varSize,reg,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32);
     82            compiler.codeGenerator.op_mov_RM(varSize,reg,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32, Schedule::GlobalVar );
    10183        }
    10284        else{
    10385            //mov reg, ptr[offset]
    104             compiler.codeGenerator.op_mov_RM(varSize,reg,0,(int)pRelativeVar->offset + offsetOf64Head,MOD_DISP32);
    105         }
    106         obp-=sizeof(long);
    107         pobj_GlobalVarSchedule->add();
    108         obp+=sizeof(long);
     86            compiler.codeGenerator.op_mov_RM(varSize,reg,0,(int)pRelativeVar->offset + offsetOf64Head,MOD_DISP32, Schedule::GlobalVar );
     87        }
    10988    }
    11089    else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
    11190        if(pRelativeVar->bOffsetOffset){
    11291            //add ecx,qword ptr[offset]
    113             compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     92            compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
    11493        }
    11594        else{
    11695            //mov ecx,qword ptr[offset]
    117             compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
    118         }
    119         obp-=sizeof(long);
    120         pobj_GlobalVarSchedule->add();
    121         obp+=sizeof(long);
     96            compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
     97        }
    12298
    12399        goto directmem;
     
    126102        if(pRelativeVar->bOffsetOffset){
    127103            //mov reg, ptr[ebp+ecx+offset]
    128             compiler.codeGenerator.op_mov_RM_ex(varSize,reg,REG_EBP,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,USE_OFFSET);
     104            compiler.codeGenerator.op_mov_RM_ex(varSize,reg,REG_EBP,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,USE_OFFSET, Schedule::LocalVar );
    129105        }
    130106        else{
    131107            //mov reg, ptr[ebp+offset]
    132             compiler.codeGenerator.op_mov_RM(varSize,reg,REG_EBP,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32);
    133         }
    134         obp-=sizeof(long);
    135         AddLocalVarAddrSchedule();
    136         obp+=sizeof(long);
     108            compiler.codeGenerator.op_mov_RM(varSize,reg,REG_EBP,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32, Schedule::LocalVar );
     109        }
    137110    }
    138111    else if(pRelativeVar->dwKind==VAR_REFLOCAL){
    139112        if(pRelativeVar->bOffsetOffset){
    140113            //add ecx,qword ptr[ebp+offset]
    141             compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
     114            compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    142115        }
    143116        else{
    144117            //mov ecx,qword ptr[ebp+offset]
    145             compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    146         }
    147         obp-=sizeof(long);
    148         AddLocalVarAddrSchedule();
    149         obp+=sizeof(long);
     118            compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
     119        }
    150120
    151121        goto directmem;
     
    170140        if(pRelativeVar->bOffsetOffset){
    171141            //push dword ptr[ecx+offset]
    172             OpBuffer[obp++]=(char)0xFF;
    173             OpBuffer[obp++]=(char)0xB1;
    174             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    175             pobj_GlobalVarSchedule->add();
    176             obp+=sizeof(long);
     142            compiler.codeGenerator.op_push_M( REG_ECX, pRelativeVar->offset, Schedule::GlobalVar );
    177143        }
    178144        else{
    179145            //push dword ptr[offset]
    180             OpBuffer[obp++]=(char)0xFF;
    181             OpBuffer[obp++]=(char)0x35;
    182             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    183             pobj_GlobalVarSchedule->add();
    184             obp+=sizeof(long);
     146            compiler.codeGenerator.op_push_M( REG_NON, pRelativeVar->offset, Schedule::GlobalVar );
    185147        }
    186148    }
    187149    else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
    188150        //mov eax,dword ptr[offset]
    189         compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32 );
    190         obp-=sizeof(long);
    191         pobj_GlobalVarSchedule->add();
    192         obp+=sizeof(long);
     151        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
    193152
    194153        if(pRelativeVar->bOffsetOffset){
  • trunk/abdev/BasicCompiler_Common/gc.cpp

    r225 r229  
    2828
    2929    //mov ptr[offset],rax/eax
    30     compiler.codeGenerator.op_mov_MR(PTR_SIZE,REG_RAX,0,(int)RelativeVar.offset,MOD_DISP32);
    31     obp-=sizeof(long);
    32     pobj_GlobalVarSchedule->add();
    33     obp+=sizeof(long);
    34 
     30    compiler.codeGenerator.op_mov_MR(PTR_SIZE,REG_RAX,0,(int)RelativeVar.offset,MOD_DISP32, Schedule::GlobalVar );
    3531}
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r228 r229  
    129129    /////////////////////////////////////////////////////////////////
    130130private:
    131     void set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp);
     131    void set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType = Schedule::None );
    132132    void __op_format(char op_prefix,char opcode,int reg);
    133     void __op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod);
     133    void __op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    134134public:
    135     void op_mov_RV          (int reg,long offset);
    136     void op_mov_RV          (int op_size,int reg,int offset);
     135    void op_mov_RV          (int reg,long offset, Schedule::Type scheduleType = Schedule::None );
    137136    void op_mov_RR          (int reg1,int reg2);
    138     void op_mov_RM          (int op_size,int reg,int base_reg,int offset,char mod);
    139     void op_mov_RM_ex       (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset);
    140     void op_mov_MR          (int op_size,int reg,int base_reg,int offset,char mod);
    141     void op_mov_MR_ex       (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset);
     137    void op_mov_RM          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
     138    void op_mov_RM_ex       (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None );
     139    void op_mov_MR          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
     140    void op_mov_MR_ex       (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None );
    142141    void op_movsx_R32R16    (int reg32,int reg16 = REG_NON);
    143142    void op_movsx_R32R8     (int reg32,int reg8 = REG_NON);
     
    147146    void op_add_RV8         (int reg,char cValue);
    148147    void op_add_RR          ( int reg1, int reg2 );
    149     void op_add_RM          (int op_size,int reg,int base_reg,int offset,char mod);
     148    void op_add_RM          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    150149    void op_adc_RV8         (int reg,char cValue);
    151150    void op_adc_RR          ( int reg1, int reg2 );
     
    171170    void op_push_V(long data);
    172171    void op_push_M( int base_reg );
     172    void op_push_M( int base_reg, long offset, Schedule::Type scheduleType = Schedule::None );
    173173    void op_pop(int reg = REG_NON);
    174174    void op_add_esp(long num);
     
    181181    void op_fld_ptr_esp(int type);
    182182    void op_fld_basereg         (int type,int base_reg);
    183     void op_fld_base_offset     (int type,int base_reg,long offset);
    184     void op_fld_base_offset_ex  (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset);
     183    void op_fld_base_offset     (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None );
     184    void op_fld_base_offset_ex  (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None);
    185185    void op_fstp_basereg        (int type,int base_reg);
    186     void op_fstp_base_offset    (int type,int base_reg,long offset);
    187     void op_fstp_base_offset_ex (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset);
     186    void op_fstp_base_offset    (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None);
     187    void op_fstp_base_offset_ex (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None);
    188188    void op_fistp_ptr_esp       ( int typeSize );
    189189    void op_fstp_push           ( Type &type );
Note: See TracChangeset for help on using the changeset viewer.