Changeset 238 in dev


Ignore:
Timestamp:
Jul 26, 2007, 5:22:11 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
2 edited

Legend:

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

    r237 r238  
    132132        // 64ビット整数演算
    133133        ////////////////////
    134         int TrueSchedule,
    135             FalseSchedule1,
    136             FalseSchedule2;
    137134
    138135        // 第1項 <= 第2項
     
    145142        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    146143
     144        CodeGenerator::PertialSchedule *pFalsePertialSchedule1;
    147145        if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
    148146            //符号なし演算
    149147
    150148            //ja FalseSchedule1(偽へジャンプ)
    151             OpBuffer[obp++]=(char)0x77;
     149            pFalsePertialSchedule1 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
    152150        }
    153151        else{
     
    155153
    156154            //jg FalseSchedule1(偽へジャンプ)
    157             OpBuffer[obp++]=(char)0x7F;
    158         }
    159         FalseSchedule1=obp;
    160         obp++;
    161 
     155            pFalsePertialSchedule1 = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
     156        }
     157
     158        CodeGenerator::PertialSchedule *pTruePertialSchedule;
    162159        if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
    163160            //符号なし演算
    164161
    165162            //jb TrueSchedule(真へジャンプ)
    166             OpBuffer[obp++]=(char)0x72;
     163            pTruePertialSchedule = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
    167164        }
    168165        else{
     
    170167
    171168            //jl TrueSchedule(真へジャンプ)
    172             OpBuffer[obp++]=(char)0x7C;
    173         }
    174         TrueSchedule=obp;
    175         obp++;
     169            pTruePertialSchedule = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
     170        }
    176171
    177172        //cmp eax,ebx
     
    179174
    180175        //ja FalseSchedule2(偽へジャンプ)
    181         OpBuffer[obp++]=(char)0x77;
    182         FalseSchedule2=obp;
    183         obp++;
     176        CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
    184177
    185178        //TrueScheduleのジャンプ先の設定
    186         OpBuffer[TrueSchedule]=obp-(TrueSchedule+1);
     179        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule );
    187180
    188181        //mov eax,1
     
    190183
    191184        //jmp 2(演算終了位置へジャンプ)
    192         OpBuffer[obp++]=(char)0xEB;
    193         OpBuffer[obp++]=(char)0x02;
     185        compiler.codeGenerator.op_jmp( 2 );
    194186
    195187        //FalseScheduleのジャンプ先の設定
    196         OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);
    197         OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1);
     188        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 );
     189        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 );
    198190
    199191        //xor eax,eax(eaxを0にする)
     
    230222
    231223            //jbe 2(次のxorを飛び越す)
    232             OpBuffer[obp++]=(char)0x76;
    233             OpBuffer[obp++]=(char)0x02;
     224            compiler.codeGenerator.op_jbe( 2 );
    234225        }
    235226        else{
     
    237228
    238229            //jle 2(次のxorを飛び越す)
    239             OpBuffer[obp++]=(char)0x7E;
    240             OpBuffer[obp++]=(char)0x02;
     230            compiler.codeGenerator.op_jle( 2 );
    241231        }
    242232
     
    327317
    328318        //fcompp
    329         OpBuffer[obp++]=(char)0xDE;
    330         OpBuffer[obp++]=(char)0xD9;
     319        compiler.codeGenerator.op_fcompp();
    331320
    332321        //fnstsw ax
     
    995984
    996985        //je 2
    997         OpBuffer[obp++]=(char)0x74;
    998         OpBuffer[obp++]=(char)0x02;
     986        compiler.codeGenerator.op_je( 2 );
    999987
    1000988        //xor ecx,ecx
     
    1009997        // 64ビット整数演算
    1010998        ////////////////////
    1011         int TrueSchedule1,
    1012             TrueSchedule2;
    1013999
    10141000        // 第1項 <> 第2項
     
    10211007        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    10221008
    1023         //jnz TrueSchedule1(真へジャンプ)
    1024         OpBuffer[obp++]=(char)0x75;
    1025         TrueSchedule1=obp;
    1026         obp++;
     1009        //jne TrueSchedule1(真へジャンプ)
     1010        CodeGenerator::PertialSchedule *pTruePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    10271011
    10281012        //cmp edx,ecx
    10291013        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    10301014
    1031         //jnz TrueSchedule2(真へジャンプ)
    1032         OpBuffer[obp++]=(char)0x75;
    1033         TrueSchedule2=obp;
    1034         obp++;
     1015        //jne TrueSchedule2(真へジャンプ)
     1016        CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    10351017
    10361018        //xor eax,eax(eaxを0にする)
     
    10381020
    10391021        //jmp 5(演算終了位置へジャンプ)
    1040         OpBuffer[obp++]=(char)0xEB;
    1041         OpBuffer[obp++]=(char)0x05;
     1022        compiler.codeGenerator.op_jmp( 5 );
    10421023
    10431024        //TrueScheduleのジャンプ先の設定
    1044         OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1);
    1045         OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1);
     1025        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule1 );
     1026        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule2 );
    10461027
    10471028        //mov eax,1
     
    10691050
    10701051        //xor eax,ebx
    1071         OpBuffer[obp++]=(char)0x33;
    1072         OpBuffer[obp++]=(char)0xC3;
    1073 
    1074         //jz 5(次のmovを飛び越す)
    1075         OpBuffer[obp++]=(char)0x74;
    1076         OpBuffer[obp++]=(char)0x05;
     1052        compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX );
     1053
     1054        //je 5(次のmovを飛び越す)
     1055        compiler.codeGenerator.op_je( 5 );
    10771056
    10781057        //mov eax,1
     
    11711150
    11721151        //jne 2(次のxorを飛び越す)
    1173         OpBuffer[obp++]=(char)0x75;
    1174         OpBuffer[obp++]=(char)0x02;
     1152        compiler.codeGenerator.op_jne( 2 );
    11751153
    11761154        //xor ecx,ecx
     
    11851163        // 64ビット整数演算
    11861164        ////////////////////
    1187         int FalseSchedule1;
    11881165
    11891166        // 第1項 == 第2項
     
    11961173        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    11971174
    1198         //jnz FalseSchedule1(偽へジャンプ)
    1199         OpBuffer[obp++]=(char)0x75;
    1200         FalseSchedule1=obp;
    1201         obp++;
     1175        //jne FalseSchedule1(偽へジャンプ)
     1176        CodeGenerator::PertialSchedule *pFalsePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    12021177
    12031178        //cmp edx,ecx
     
    12051180
    12061181        //jne FalseSchedule2(偽へジャンプ)
    1207         CodeGenerator::PertialSchedule *pFalsePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
     1182        CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    12081183
    12091184        //mov eax,1
     
    12111186
    12121187        //jmp 2(演算終了位置へジャンプ)
    1213         OpBuffer[obp++]=(char)0xEB;
    1214         OpBuffer[obp++]=(char)0x02;
     1188        compiler.codeGenerator.op_jmp( 2 );
    12151189
    12161190        //FalseScheduleのジャンプ先の設定
    1217         OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);
    1218         compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule );
     1191        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 );
     1192        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 );
    12191193
    12201194        //xor eax,eax(eaxを0にする)
     
    12421216
    12431217        //xor eax,ebx
    1244         OpBuffer[obp++]=(char)0x33;
    1245         OpBuffer[obp++]=(char)0xC3;
    1246 
    1247         //jz 4(次のxorとjmpを飛び越す)
    1248         OpBuffer[obp++]=(char)0x74;
    1249         OpBuffer[obp++]=(char)0x04;
     1218        compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX );
     1219
     1220        //je 4(次のxorとjmpを飛び越す)
     1221        compiler.codeGenerator.op_je( 4 );
    12501222
    12511223        //xor eax,eax
    1252         OpBuffer[obp++]=(char)0x33;
    1253         OpBuffer[obp++]=(char)0xC0;
     1224        compiler.codeGenerator.op_xor_RR( REG_EAX );
    12541225
    12551226        //jmp 5
    1256         OpBuffer[obp++]=(char)0xEB;
    1257         OpBuffer[obp++]=(char)0x05;
     1227        compiler.codeGenerator.op_jmp( 5 );
    12581228
    12591229        //mov eax,1
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r237 r238  
    1717
    1818public:
     19
     20    // コード生成時の部分的なスケジューリング
    1921    class PertialSchedule
    2022    {
    21         int codePos;
    22         int typeSize;
    23 
    24         int _obpOld;
     23        int id;         // 通し番号
     24
     25        int codePos;    // バッファ位置
     26        int typeSize;   // 対象サイズ(一般的には8bit/32bit)
     27
     28        int _obpOld;    // 未完成
    2529    public:
    2630        PertialSchedule( int codePos, int typeSize )
     
    2832            , typeSize( typeSize )
    2933        {
     34            static int _id = 0;
     35            id = _id++;
     36
    3037            extern int obp;
    31             _obpOld = obp-typeSize;
     38            _obpOld = obp;
    3239        }
    3340        ~PertialSchedule()
    3441        {
     42        }
     43
     44        bool IsEquals( const PertialSchedule &pertialSchedule )
     45        {
     46            return ( this->id == pertialSchedule.id );
    3547        }
    3648
     
    7890    void CheckUnresolveSchedule();
    7991
    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     }
     92    void opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule );
    10193
    10294
     
    108100    PertialSchedule *__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule = false );
    109101public:
    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) );
     102    PertialSchedule *op_jle( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     103    PertialSchedule *op_jbe( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     104    PertialSchedule *op_jge( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     105    PertialSchedule *op_jae( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     106    PertialSchedule *op_jl( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     107    PertialSchedule *op_jb( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     108    PertialSchedule *op_jg( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
    117109    PertialSchedule *op_ja( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
    118110    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) );
     111    PertialSchedule *op_je( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     112    PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
    121113
    122114
Note: See TracChangeset for help on using the changeset viewer.