Ignore:
Timestamp:
Jul 30, 2007, 4:12:54 PM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r252 r253  
    1212void ReallocNativeCodeBuffer();
    1313
    14 //Goto未知ラベル
    15 class GotoLabelSchedule
    16 {
    17     std::string name;
    18     int line;
    19     int nativeCodePos;
    20     int sourceCodePos;
    21 public:
    22     GotoLabelSchedule( const std::string &name, int nativeCodePos, int sourceCodePos )
    23         : name( name )
    24         , line( -1 )
    25         , nativeCodePos( nativeCodePos )
    26         , sourceCodePos( sourceCodePos )
    27     {
    28     }
    29     GotoLabelSchedule( int line, int nativeCodePos, int sourceCodePos )
    30         : line( line )
    31         , nativeCodePos( nativeCodePos )
    32         , sourceCodePos( sourceCodePos )
    33     {
    34     }
    35     const std::string &GetName() const
    36     {
    37         return name;
    38     }
    39     int GetLineNum() const
    40     {
    41         return line;
    42     }
    43     int GetNativeCodePos() const
    44     {
    45         return nativeCodePos;
    46     }
    47     int GetSourceCodePos() const
    48     {
    49         return sourceCodePos;
    50     }
    51 };
    52 
    5314// コード生成時の部分的なスケジューリング
    5415class PertialSchedule
     
    8546typedef std::vector<const PertialSchedule *> PertialSchedules;
    8647
     48//Goto未知ラベル
     49class GotoLabelSchedule : public PertialSchedule
     50{
     51    std::string name;
     52    int line;
     53    int sourceCodePos;
     54public:
     55    GotoLabelSchedule( const std::string &name, int nativeCodePos, int sourceCodePos )
     56        : PertialSchedule( nativeCodePos, sizeof(long) )
     57        , name( name )
     58        , line( -1 )
     59        , sourceCodePos( sourceCodePos )
     60    {
     61    }
     62    GotoLabelSchedule( int line, int nativeCodePos, int sourceCodePos )
     63        : PertialSchedule( nativeCodePos, sizeof(long) )
     64        , line( line )
     65        , sourceCodePos( sourceCodePos )
     66    {
     67    }
     68    const std::string &GetName() const
     69    {
     70        return name;
     71    }
     72    int GetLineNum() const
     73    {
     74        return line;
     75    }
     76    int GetSourceCodePos() const
     77    {
     78        return sourceCodePos;
     79    }
     80};
     81typedef std::vector<const GotoLabelSchedule *> GotoLabelSchedules;
     82
    8783class LexicalScope
    8884{
     
    186182public:
    187183
     184    // ローカル変数用スケジュールの管理
     185    PertialSchedules localVarPertialSchedules;
     186
    188187    // Exit Subスケジュールの管理
    189188    std::vector<long> exitSubCodePositions;
     
    191190
    192191    // Gotoスケジュールの管理
    193     std::vector<GotoLabelSchedule> gotoLabelSchedules;
     192    GotoLabelSchedules gotoLabelSchedules;
    194193
    195194    // レキシカルスコープの管理
     
    256255
    257256    void opfix( const PertialSchedule *pPertialSchedule, long newValue );
     257    void opfix_offset( const PertialSchedule *pPertialSchedule, long offset );
    258258    void opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule );
    259259
     
    279279    void op_jmp_continue();
    280280    void op_jmp_exitsub();
    281     void op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule );
     281    void op_jmp_goto_schedule( const std::string &name, int lineNum, int sourceCodePos );
    282282
    283283
     
    370370    const PertialSchedule *__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    371371public:
    372     void op_mov_MV          ( int op_size, int base_reg, long offset, Schedule::Type offsetScheduleType, long value, Schedule::Type valueScheduleType = Schedule::None );
    373     void op_mov_RV          (int reg,long offset, Schedule::Type scheduleType = Schedule::None );
    374     void op_mov_RR          (int reg1,int reg2);
    375     void op_mov_RM          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    376     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 );
    377     void op_mov_MR          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    378     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 );
    379     void op_movsx_R32R16    (int reg32,int reg16 = REG_NON);
    380     void op_movsx_R32R8     (int reg32,int reg8 = REG_NON);
    381     void op_movsx_R16R8     (int reg16,int reg8 = REG_NON);
    382     void op_lea_RM          ( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType = Schedule::None );
    383     void op_inc             (int reg);
    384     void op_dec             (int reg);
    385     void op_add_RV8         (int reg,char cValue);
    386     void op_add_RV          ( int reg, long offset, Schedule::Type scheduleType = Schedule::None );
    387     void op_add_RR          ( int reg1, int reg2 );
    388     void op_add_RM          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
     372    const PertialSchedule *op_mov_MV        ( int op_size, int base_reg, long offset, Schedule::Type offsetScheduleType, bool isPertialSchedule, long value, Schedule::Type valueScheduleType = Schedule::None );
     373    void op_mov_RV                          ( int reg,long offset, Schedule::Type scheduleType = Schedule::None );
     374    void op_mov_RR                          ( int reg1,int reg2);
     375    const PertialSchedule *op_mov_RM        ( int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     376    const PertialSchedule *op_mov_RM_ex     ( int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     377    const PertialSchedule *op_mov_MR        ( int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     378    const PertialSchedule *op_mov_MR_ex     ( int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     379    void op_movsx_R32R16                    ( int reg32,int reg16 = REG_NON);
     380    void op_movsx_R32R8                     ( int reg32,int reg8 = REG_NON);
     381    void op_movsx_R16R8                     ( int reg16,int reg8 = REG_NON);
     382    const PertialSchedule *op_lea_RM        ( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     383    void op_inc                             (int reg);
     384    void op_dec                             (int reg);
     385    void op_add_RV8                         (int reg,char cValue);
     386    const PertialSchedule *op_add_RV        ( int reg, long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     387    void op_add_RR                          ( int reg1, int reg2 );
     388    const PertialSchedule *op_add_RM        (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    389389    void op_adc_RV8         (int reg,char cValue);
    390390    void op_adc_RR          ( int reg1, int reg2 );
     
    413413    void op_pop(int reg = REG_NON);
    414414    void op_add_esp(long num);
    415     void op_sub_esp(long num);
     415    const PertialSchedule *op_sub_esp( long num, bool isPertialSchedule = false );
    416416    void op_cmp_RR( int reg1, int reg2 );
    417417    void op_cmp_value(int op_size,int reg,char byte_data);
     
    421421    void op_fld_ptr_esp(int type);
    422422    void op_fld_basereg         (int type,int base_reg);
    423     void op_fld_base_offset     (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None );
    424     void op_fld_base_offset_ex  (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None);
     423    const PertialSchedule *op_fld_base_offset       (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     424    const PertialSchedule *op_fld_base_offset_ex    (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    425425    void op_fstp_basereg        (int type,int base_reg);
    426     void op_fstp_base_offset    (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None);
    427     void op_fstp_base_offset_ex (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None);
     426    const PertialSchedule *op_fstp_base_offset      (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     427    const PertialSchedule *op_fstp_base_offset_ex   (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    428428    void op_fistp_ptr_esp       ( int typeSize );
    429429    void op_fstp_push           ( Type &type );
     
    452452        pNativeCode->Put( nativeCode );
    453453    }
     454    void PutOld( char c )
     455    {
     456        pNativeCode->Put( c );
     457    }
    454458    void PutOld( char c1, char c2 )
    455459    {
Note: See TracChangeset for help on using the changeset viewer.