Ignore:
Timestamp:
Jul 26, 2007, 3:58:18 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

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

    r235 r237  
    1616    NativeCode *pNativeCode;
    1717
    18     // XMLシリアライズ用
     18public:
     19    class PertialSchedule
     20    {
     21        int codePos;
     22        int typeSize;
     23
     24        int _obpOld;
     25    public:
     26        PertialSchedule( int codePos, int typeSize )
     27            : codePos( codePos )
     28            , typeSize( typeSize )
     29        {
     30            extern int obp;
     31            _obpOld = obp-typeSize;
     32        }
     33        ~PertialSchedule()
     34        {
     35        }
     36
     37        int GetCodePos() const
     38        {
     39            return codePos;
     40        }
     41        int GetTypeSize() const
     42        {
     43            return typeSize;
     44        }
     45        int GetObpOld() const
     46        {
     47            return _obpOld;
     48        }
     49    };
     50
    1951private:
    20     friend class boost::serialization::access;
    21     template<class Archive> void serialize(Archive& ar, const unsigned int version)
    22     {
    23         ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( NativeCode );
    24     }
    25 
    26 public:
     52    typedef std::vector<PertialSchedule> PertialSchedules;
     53    PertialSchedules pertialSchedules;
     54
     55public:
     56
     57    CodeGenerator()
     58        : pNativeCode( 0 )
     59    {
     60    }
     61    ~CodeGenerator()
     62    {
     63        if( pNativeCode )
     64        {
     65            CheckUnresolveSchedule();
     66        }
     67    }
    2768
    2869    void Select( NativeCode &nativeCode )
    2970    {
     71        if( pNativeCode )
     72        {
     73            CheckUnresolveSchedule();
     74        }
    3075        pNativeCode = &nativeCode;
    3176    }
    3277
     78    void CheckUnresolveSchedule();
     79
     80    void opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule )
     81    {
     82        PertialSchedules::iterator it = pertialSchedules.begin();
     83        while( it != pertialSchedules.end() )
     84        {
     85            if( &(*it) == pPertialSchedule )
     86            {
     87                pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), (char)(pNativeCode->GetSize() - pPertialSchedule->GetCodePos()) );
     88
     89                // 未完成
     90                extern int obp;
     91                pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), obp-pPertialSchedule->GetObpOld() );
     92
     93                pertialSchedules.erase( it );
     94            }
     95            else
     96            {
     97                it++;
     98            }
     99        }
     100    }
     101
     102
     103    /////////////////////////////////////////////////////////////////
     104    // 32bit/64bit共通 機械語生成
     105    /////////////////////////////////////////////////////////////////
     106
     107private:
     108    PertialSchedule *__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule = false );
     109public:
     110    void op_jle( long offset, int op_size = sizeof(char) );
     111    void op_jbe( long offset, int op_size = sizeof(char) );
     112    void op_jge( long offset, int op_size = sizeof(char) );
     113    void op_jae( long offset, int op_size = sizeof(char) );
     114    void op_jl( long offset, int op_size = sizeof(char) );
     115    void op_jb( long offset, int op_size = sizeof(char) );
     116    void op_jg( long offset, int op_size = sizeof(char) );
     117    PertialSchedule *op_ja( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     118    PertialSchedule *op_jne( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     119    void op_je( long offset, int op_size = sizeof(char) );
     120    void op_jmp( long offset, int op_size = sizeof(char) );
     121
     122
    33123#ifdef _AMD64_
    34124    /////////////////////////////////////////////////////////////////
    35     // 64ビット
     125    // 64ビット機械語生成
    36126    /////////////////////////////////////////////////////////////////
    37127private:
     
    39129    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 );
    40130    void __op_format(int op_size,char op_prefix,char opcode1,char opcode2,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None );
    41     void __jmp_op_format( char opcode, long offset, int op_size );
    42131public:
    43132    void op_mov_RV                  (int op_size,int reg,long i32data, Schedule::Type scheduleType = Schedule::None );
     
    107196    void op_fld_ptr_esp(int type);
    108197    void op_zero_reg(int reg);
    109     void op_jle( long offset, int op_size = sizeof(char) );
    110     void op_jbe( long offset, int op_size = sizeof(char) );
    111     void op_jge( long offset, int op_size = sizeof(char) );
    112     void op_jae( long offset, int op_size = sizeof(char) );
    113     void op_jl( long offset, int op_size = sizeof(char) );
    114     void op_jb( long offset, int op_size = sizeof(char) );
    115     void op_jg( long offset, int op_size = sizeof(char) );
    116     void op_ja( long offset, int op_size = sizeof(char) );
    117     void op_jne( long offset, int op_size = sizeof(char) );
    118     void op_je( long offset, int op_size = sizeof(char) );
    119     void op_jmp( long offset, int op_size = sizeof(char) );
    120198    void op_call( const UserProc *pUserProc );
    121199    void op_call( const DllProc *pDllProc );
     
    124202#else
    125203    /////////////////////////////////////////////////////////////////
    126     // 32ビット
     204    // 32ビット機械語生成
    127205    /////////////////////////////////////////////////////////////////
    128206private:
     
    169247
    170248    void op_push(int reg);
    171     void op_push_V(long data);
     249    void op_push_V( long data, Schedule::Type scheduleType = Schedule::None );
    172250    void op_push_M( int base_reg );
    173251    void op_push_M( int base_reg, long offset, Schedule::Type scheduleType = Schedule::None );
Note: See TracChangeset for help on using the changeset viewer.