Ignore:
Timestamp:
Jul 30, 2007, 2:00:45 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

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

    r250 r251  
    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, Schedule::Type scheduleType ){
     21const PertialSchedule * CodeGenerator::set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType, bool isPertialSchedule )
     22{
     23    const PertialSchedule *pPertialSchedule = NULL;
    2224
    2325    // エラーチェック
     
    3032        SetError();
    3133    }
     34    if( isPertialSchedule && !( mod == MOD_DISP32 || mod == MOD_BASE_DISP32 ) )
     35    {
     36        SetError();
     37    }
    3238
    3339    if(mod==MOD_DISP32){
     
    4551
    4652    //レジスタモードの場合は、ここで終了
    47     if(mod==MOD_REG) return;
     53    if(mod==MOD_REG) return pPertialSchedule;
    4854
    4955
     
    5763
    5864    //ディスプレースメントを必要としない場合は、ここで終了
    59     if(mod==MOD_BASE) return;
     65    if(mod==MOD_BASE) return pPertialSchedule;
    6066
    6167
     
    7076    else
    7177    {
     78        if( isPertialSchedule )
     79        {
     80            pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
     81            pPertialSchedule = pertialSchedules.back();
     82        }
     83
    7284        pNativeCode->Put( disp, scheduleType );
    7385    }
     86
     87    return pPertialSchedule;
    7488}
    7589
     
    86100    pNativeCode->Put( (char)(opcode|REGISTER_OPERAND(reg)) );
    87101}
    88 void CodeGenerator::__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
     102const PertialSchedule *CodeGenerator::__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
    89103    //命令プリフィックス
    90104    if(op_prefix)
     
    101115
    102116    //ModR/M, SIB, disp
    103     set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset, scheduleType );
     117    return set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset, scheduleType, isPertialSchedule );
    104118}
    105119
     
    731745    }
    732746}
    733 void CodeGenerator::op_push_M( int base_reg, long offset, Schedule::Type scheduleType )
    734 {
     747const PertialSchedule *CodeGenerator::op_push_M( int base_reg, long offset, Schedule::Type scheduleType, bool isPertialSchedule )
     748{
     749    const PertialSchedule *pPertialSchedule = NULL;
    735750    if( base_reg == REG_NON )
    736751    {
    737752        // push dword ptr[offset]
    738         __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, 0, offset, MOD_DISP32, scheduleType );
     753        pPertialSchedule = __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, 0, offset, MOD_DISP32, scheduleType, isPertialSchedule );
    739754    }
    740755    else
    741756    {
    742757        // push dword ptr[base_reg+offset]
    743         __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, base_reg, offset, MOD_BASE_DISP32, scheduleType );
    744     }
     758        pPertialSchedule = __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, base_reg, offset, MOD_BASE_DISP32, scheduleType, isPertialSchedule );
     759    }
     760    return pPertialSchedule;
    745761}
    746762void CodeGenerator::op_pop(int reg){
Note: See TracChangeset for help on using the changeset viewer.