Changeset 240 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Jul 26, 2007, 3:27:29 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler32
Files:
3 edited

Legend:

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

    r237 r240  
    732732        compiler.codeGenerator.op_cmp_RR( REG_ESP, REG_EBP );
    733733
    734         //jz 6(次のcallとbreakpointを飛び越す)
    735         OpBuffer[obp++]=(char)0x74;
    736         OpBuffer[obp++]=(char)0x06;
     734        //je 6(次のcallとbreakpointを飛び越す)
     735        compiler.codeGenerator.op_je( 6 );
    737736
    738737        //call _esp_error
     
    758757    else{
    759758        //ret BaseOffset(パラメータ分のスタック領域を解放)
    760         OpBuffer[obp++]=(char)0xC2;
    761         *((_int16 *)(OpBuffer+obp))=(_int16)BaseOffset;
    762         obp+=sizeof(_int16);
     759        compiler.codeGenerator.op_ret( (_int16)BaseOffset );
    763760    }
    764761
  • trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp

    r238 r240  
    329329
    330330        //je 2(次のxorを飛び越す)
    331         OpBuffer[obp++]=(char)0x74;
    332         OpBuffer[obp++]=(char)0x02;
     331        compiler.codeGenerator.op_je( 2 );
    333332
    334333        //xor ecx,ecx
     
    342341        // 64ビット整数演算
    343342        ////////////////////
    344         int TrueSchedule,
    345             FalseSchedule1,
    346             FalseSchedule2;
    347343
    348344        // 第1項 >= 第2項
     
    355351        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    356352
     353        CodeGenerator::PertialSchedule *pFalsePertialSchedule1;
    357354        if(IsSignedType(AnswerType)){
    358355            //符号あり演算
    359356
    360357            //jl FalseSchedule1(偽へジャンプ)
    361             OpBuffer[obp++]=(char)0x7C;
     358            pFalsePertialSchedule1 = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
    362359        }
    363360        else{
     
    365362
    366363            //jb FalseSchedule1(偽へジャンプ)
    367             OpBuffer[obp++]=(char)0x72;
    368         }
    369         FalseSchedule1=obp;
    370         obp++;
    371 
     364            pFalsePertialSchedule1 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
     365        }
     366
     367        CodeGenerator::PertialSchedule *pTruePertialSchedule;
    372368        if(IsSignedType(AnswerType)){
    373369            //符号あり演算
    374370
    375371            //jg TrueSchedule(真へジャンプ)
    376             OpBuffer[obp++]=(char)0x7F;
     372            pTruePertialSchedule = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
    377373        }
    378374        else{
     
    380376
    381377            //ja TrueSchedule(真へジャンプ)
    382             OpBuffer[obp++]=(char)0x77;
    383         }
    384         TrueSchedule=obp;
    385         obp++;
     378            pTruePertialSchedule = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
     379        }
    386380
    387381        //cmp eax,ebx
     
    389383
    390384        //jb FalseSchedule2(偽へジャンプ)
    391         OpBuffer[obp++]=(char)0x72;
    392         FalseSchedule2=obp;
    393         obp++;
     385        CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
    394386
    395387        //TrueScheduleのジャンプ先の設定
    396         OpBuffer[TrueSchedule]=obp-(TrueSchedule+1);
     388        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule );
    397389
    398390        //mov eax,1
     
    400392
    401393        //jmp 2(演算終了位置へジャンプ)
    402         OpBuffer[obp++]=(char)0xEB;
    403         OpBuffer[obp++]=(char)0x02;
     394        compiler.codeGenerator.op_jmp( 2 );
    404395
    405396        //FalseScheduleのジャンプ先の設定
    406         OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);
    407         OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1);
     397        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 );
     398        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 );
    408399
    409400        //xor eax,eax(eaxを0にする)
     
    440431
    441432            //jge 2(次のxorを飛び越す)符号有り
    442             OpBuffer[obp++]=(char)0x7D;
    443             OpBuffer[obp++]=(char)0x02;
     433            compiler.codeGenerator.op_jge( 2 );
    444434        }
    445435        else{
     
    447437
    448438            //jae 2(次のxorを飛び越す)
    449             OpBuffer[obp++]=(char)0x73;
    450             OpBuffer[obp++]=(char)0x02;
     439            compiler.codeGenerator.op_jae( 2 );
    451440        }
    452441
     
    552541
    553542        //jne 2
    554         OpBuffer[obp++]=(char)0x75;
    555         OpBuffer[obp++]=(char)0x02;
     543        compiler.codeGenerator.op_jne( 2 );
    556544
    557545        //xor ecx,ecx
     
    565553        // 64ビット整数演算
    566554        ////////////////////
    567         int TrueSchedule1,
    568             TrueSchedule2,
    569             FalseSchedule;
    570555
    571556        // 第1項 < 第2項
     
    578563        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    579564
     565        CodeGenerator::PertialSchedule *pTruePertialSchedule1;
    580566        if(IsSignedType(AnswerType)){
    581567            //符号あり演算
    582568
    583569            //jl TrueSchedule1(真へジャンプ)
    584             OpBuffer[obp++]=(char)0x7C;
     570            pTruePertialSchedule1 = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
    585571        }
    586572        else{
     
    588574
    589575            //jb TrueSchedule1(真へジャンプ)
    590             OpBuffer[obp++]=(char)0x72;
    591         }
    592         TrueSchedule1=obp;
    593         obp++;
    594 
     576            pTruePertialSchedule1 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
     577        }
     578
     579        CodeGenerator::PertialSchedule *pFalsePertialSchedule;
    595580        if(IsSignedType(AnswerType)){
    596581            //符号あり演算
    597582
    598583            //jg FalseSchedule(偽へジャンプ)
    599             OpBuffer[obp++]=(char)0x7F;
     584            pFalsePertialSchedule = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
    600585        }
    601586        else{
     
    603588
    604589            //ja FalseSchedule(偽へジャンプ)
    605             OpBuffer[obp++]=(char)0x77;
    606         }
    607         FalseSchedule=obp;
    608         obp++;
     590            pFalsePertialSchedule = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
     591        }
    609592
    610593        //cmp eax,ebx
     
    612595
    613596        //jb TrueSchedule2(真へジャンプ)
    614         OpBuffer[obp++]=(char)0x72;
    615         TrueSchedule2=obp;
    616         obp++;
     597        CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
    617598
    618599        //FalseScheduleのジャンプ先の設定
    619         OpBuffer[FalseSchedule]=obp-(FalseSchedule+1);
     600        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule );
    620601
    621602        //xor eax,eax(eaxを0にする)
     
    623604
    624605        //jmp 5(演算終了位置へジャンプ)
    625         OpBuffer[obp++]=(char)0xEB;
    626         OpBuffer[obp++]=(char)0x05;
     606        compiler.codeGenerator.op_jmp( 5 );
    627607
    628608        //TrueScheduleのジャンプ先の設定
    629         OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1);
    630         OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1);
     609        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule1 );
     610        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule2 );
    631611
    632612        //mov eax,1
     
    663643
    664644            //jl 2(次のxorを飛び越す)
    665             OpBuffer[obp++]=(char)0x7C;
    666             OpBuffer[obp++]=(char)0x02;
     645            compiler.codeGenerator.op_jl( 2 );
    667646        }
    668647        else{
     
    670649
    671650            //jb 2(次のxorを飛び越す)
    672             OpBuffer[obp++]=(char)0x72;
    673             OpBuffer[obp++]=(char)0x02;
     651            compiler.codeGenerator.op_jb( 2 );
    674652        }
    675653
     
    771749
    772750        //je 2(次のxorを飛び越す)
    773         OpBuffer[obp++]=(char)0x74;
    774         OpBuffer[obp++]=(char)0x02;
     751        compiler.codeGenerator.op_je( 2 );
    775752
    776753        //xor ecx,ecx
     
    784761        // 64ビット整数演算
    785762        ////////////////////
    786         int FalseSchedule,
    787             TrueSchedule1,
    788             TrueSchedule2;
    789763
    790764        // 第1項 > 第2項
     
    797771        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    798772
     773        CodeGenerator::PertialSchedule *pTruePertialSchedule1;
    799774        if(IsSignedType(AnswerType)){
    800775            //符号有り
    801776
    802777            //jg TrueSchedule1(真へジャンプ)
    803             OpBuffer[obp++]=(char)0x7F;
     778            pTruePertialSchedule1 = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
    804779        }
    805780        else{
     
    807782
    808783            //ja TrueSchedule1(真へジャンプ)
    809             OpBuffer[obp++]=(char)0x77;
    810         }
    811         TrueSchedule1=obp;
    812         obp++;
    813 
     784            pTruePertialSchedule1 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
     785        }
     786
     787        CodeGenerator::PertialSchedule *pFalsePertialSchedule;
    814788        if(IsSignedType(AnswerType)){
    815789            //符号有り
    816790
    817791            //jl FalseSchedule(偽へジャンプ)
    818             OpBuffer[obp++]=(char)0x7C;
     792            pFalsePertialSchedule = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
    819793        }
    820794        else{
     
    822796
    823797            //jb FalseSchedule(偽へジャンプ)
    824             OpBuffer[obp++]=(char)0x72;
    825         }
    826         FalseSchedule=obp;
    827         obp++;
     798            pFalsePertialSchedule = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
     799        }
    828800
    829801        //cmp eax,ebx
     
    831803
    832804        //ja TrueSchedule2(真へジャンプ)
    833         OpBuffer[obp++]=(char)0x77;
    834         TrueSchedule2=obp;
    835         obp++;
     805        CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
    836806
    837807        //FalseScheduleのジャンプ先の設定
    838         OpBuffer[FalseSchedule]=obp-(FalseSchedule+1);
     808        compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule );
    839809
    840810        //xor eax,eax(eaxを0にする)
     
    842812
    843813        //jmp 5(演算終了位置へジャンプ)
    844         OpBuffer[obp++]=(char)0xEB;
    845         OpBuffer[obp++]=(char)0x05;
     814        compiler.codeGenerator.op_jmp( 5 );
    846815
    847816        //TrueScheduleのジャンプ先の設定
    848         OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1);
    849         OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1);
     817        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule1 );
     818        compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule2 );
    850819
    851820        //mov eax,1
     
    880849        if(IsSignedType(AnswerType)){
    881850            //jg 2(次のxorを飛び越す)
    882             OpBuffer[obp++]=(char)0x7F;
    883             OpBuffer[obp++]=(char)0x02;
     851            compiler.codeGenerator.op_jg( 2 );
    884852        }
    885853        else{
    886854            //ja 2(次のxorを飛び越す)
    887             OpBuffer[obp++]=(char)0x77;
    888             OpBuffer[obp++]=(char)0x02;
     855            compiler.codeGenerator.op_ja( 2 );
    889856        }
    890857
  • trunk/abdev/BasicCompiler32/x86CodeGenerator.cpp

    r237 r240  
    11891189    pNativeCode->Put( (char)0xC3 );
    11901190}
     1191void CodeGenerator::op_ret( short stackFrameSize )
     1192{
     1193    pNativeCode->Put( (char)0xC2 );
     1194    pNativeCode->Put( stackFrameSize );
     1195}
Note: See TracChangeset for help on using the changeset viewer.