Changeset 238 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Jul 26, 2007, 5:22:11 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 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
Note: See TracChangeset for help on using the changeset viewer.