Changeset 240 in dev
- Timestamp:
- Jul 26, 2007, 3:27:29 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r237 r240 732 732 compiler.codeGenerator.op_cmp_RR( REG_ESP, REG_EBP ); 733 733 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 ); 737 736 738 737 //call _esp_error … … 758 757 else{ 759 758 //ret BaseOffset(パラメータ分のスタック領域を解放) 760 OpBuffer[obp++]=(char)0xC2; 761 *((_int16 *)(OpBuffer+obp))=(_int16)BaseOffset; 762 obp+=sizeof(_int16); 759 compiler.codeGenerator.op_ret( (_int16)BaseOffset ); 763 760 } 764 761 -
trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp
r238 r240 329 329 330 330 //je 2(次のxorを飛び越す) 331 OpBuffer[obp++]=(char)0x74; 332 OpBuffer[obp++]=(char)0x02; 331 compiler.codeGenerator.op_je( 2 ); 333 332 334 333 //xor ecx,ecx … … 342 341 // 64ビット整数演算 343 342 //////////////////// 344 int TrueSchedule,345 FalseSchedule1,346 FalseSchedule2;347 343 348 344 // 第1項 >= 第2項 … … 355 351 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 356 352 353 CodeGenerator::PertialSchedule *pFalsePertialSchedule1; 357 354 if(IsSignedType(AnswerType)){ 358 355 //符号あり演算 359 356 360 357 //jl FalseSchedule1(偽へジャンプ) 361 OpBuffer[obp++]=(char)0x7C;358 pFalsePertialSchedule1 = compiler.codeGenerator.op_jl( 0, sizeof(char), true ); 362 359 } 363 360 else{ … … 365 362 366 363 //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; 372 368 if(IsSignedType(AnswerType)){ 373 369 //符号あり演算 374 370 375 371 //jg TrueSchedule(真へジャンプ) 376 OpBuffer[obp++]=(char)0x7F;372 pTruePertialSchedule = compiler.codeGenerator.op_jg( 0, sizeof(char), true ); 377 373 } 378 374 else{ … … 380 376 381 377 //ja TrueSchedule(真へジャンプ) 382 OpBuffer[obp++]=(char)0x77; 383 } 384 TrueSchedule=obp; 385 obp++; 378 pTruePertialSchedule = compiler.codeGenerator.op_ja( 0, sizeof(char), true ); 379 } 386 380 387 381 //cmp eax,ebx … … 389 383 390 384 //jb FalseSchedule2(偽へジャンプ) 391 OpBuffer[obp++]=(char)0x72; 392 FalseSchedule2=obp; 393 obp++; 385 CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true ); 394 386 395 387 //TrueScheduleのジャンプ先の設定 396 OpBuffer[TrueSchedule]=obp-(TrueSchedule+1);388 compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule ); 397 389 398 390 //mov eax,1 … … 400 392 401 393 //jmp 2(演算終了位置へジャンプ) 402 OpBuffer[obp++]=(char)0xEB; 403 OpBuffer[obp++]=(char)0x02; 394 compiler.codeGenerator.op_jmp( 2 ); 404 395 405 396 //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 ); 408 399 409 400 //xor eax,eax(eaxを0にする) … … 440 431 441 432 //jge 2(次のxorを飛び越す)符号有り 442 OpBuffer[obp++]=(char)0x7D; 443 OpBuffer[obp++]=(char)0x02; 433 compiler.codeGenerator.op_jge( 2 ); 444 434 } 445 435 else{ … … 447 437 448 438 //jae 2(次のxorを飛び越す) 449 OpBuffer[obp++]=(char)0x73; 450 OpBuffer[obp++]=(char)0x02; 439 compiler.codeGenerator.op_jae( 2 ); 451 440 } 452 441 … … 552 541 553 542 //jne 2 554 OpBuffer[obp++]=(char)0x75; 555 OpBuffer[obp++]=(char)0x02; 543 compiler.codeGenerator.op_jne( 2 ); 556 544 557 545 //xor ecx,ecx … … 565 553 // 64ビット整数演算 566 554 //////////////////// 567 int TrueSchedule1,568 TrueSchedule2,569 FalseSchedule;570 555 571 556 // 第1項 < 第2項 … … 578 563 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 579 564 565 CodeGenerator::PertialSchedule *pTruePertialSchedule1; 580 566 if(IsSignedType(AnswerType)){ 581 567 //符号あり演算 582 568 583 569 //jl TrueSchedule1(真へジャンプ) 584 OpBuffer[obp++]=(char)0x7C;570 pTruePertialSchedule1 = compiler.codeGenerator.op_jl( 0, sizeof(char), true ); 585 571 } 586 572 else{ … … 588 574 589 575 //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; 595 580 if(IsSignedType(AnswerType)){ 596 581 //符号あり演算 597 582 598 583 //jg FalseSchedule(偽へジャンプ) 599 OpBuffer[obp++]=(char)0x7F;584 pFalsePertialSchedule = compiler.codeGenerator.op_jg( 0, sizeof(char), true ); 600 585 } 601 586 else{ … … 603 588 604 589 //ja FalseSchedule(偽へジャンプ) 605 OpBuffer[obp++]=(char)0x77; 606 } 607 FalseSchedule=obp; 608 obp++; 590 pFalsePertialSchedule = compiler.codeGenerator.op_ja( 0, sizeof(char), true ); 591 } 609 592 610 593 //cmp eax,ebx … … 612 595 613 596 //jb TrueSchedule2(真へジャンプ) 614 OpBuffer[obp++]=(char)0x72; 615 TrueSchedule2=obp; 616 obp++; 597 CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true ); 617 598 618 599 //FalseScheduleのジャンプ先の設定 619 OpBuffer[FalseSchedule]=obp-(FalseSchedule+1);600 compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule ); 620 601 621 602 //xor eax,eax(eaxを0にする) … … 623 604 624 605 //jmp 5(演算終了位置へジャンプ) 625 OpBuffer[obp++]=(char)0xEB; 626 OpBuffer[obp++]=(char)0x05; 606 compiler.codeGenerator.op_jmp( 5 ); 627 607 628 608 //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 ); 631 611 632 612 //mov eax,1 … … 663 643 664 644 //jl 2(次のxorを飛び越す) 665 OpBuffer[obp++]=(char)0x7C; 666 OpBuffer[obp++]=(char)0x02; 645 compiler.codeGenerator.op_jl( 2 ); 667 646 } 668 647 else{ … … 670 649 671 650 //jb 2(次のxorを飛び越す) 672 OpBuffer[obp++]=(char)0x72; 673 OpBuffer[obp++]=(char)0x02; 651 compiler.codeGenerator.op_jb( 2 ); 674 652 } 675 653 … … 771 749 772 750 //je 2(次のxorを飛び越す) 773 OpBuffer[obp++]=(char)0x74; 774 OpBuffer[obp++]=(char)0x02; 751 compiler.codeGenerator.op_je( 2 ); 775 752 776 753 //xor ecx,ecx … … 784 761 // 64ビット整数演算 785 762 //////////////////// 786 int FalseSchedule,787 TrueSchedule1,788 TrueSchedule2;789 763 790 764 // 第1項 > 第2項 … … 797 771 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 798 772 773 CodeGenerator::PertialSchedule *pTruePertialSchedule1; 799 774 if(IsSignedType(AnswerType)){ 800 775 //符号有り 801 776 802 777 //jg TrueSchedule1(真へジャンプ) 803 OpBuffer[obp++]=(char)0x7F;778 pTruePertialSchedule1 = compiler.codeGenerator.op_jg( 0, sizeof(char), true ); 804 779 } 805 780 else{ … … 807 782 808 783 //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; 814 788 if(IsSignedType(AnswerType)){ 815 789 //符号有り 816 790 817 791 //jl FalseSchedule(偽へジャンプ) 818 OpBuffer[obp++]=(char)0x7C;792 pFalsePertialSchedule = compiler.codeGenerator.op_jl( 0, sizeof(char), true ); 819 793 } 820 794 else{ … … 822 796 823 797 //jb FalseSchedule(偽へジャンプ) 824 OpBuffer[obp++]=(char)0x72; 825 } 826 FalseSchedule=obp; 827 obp++; 798 pFalsePertialSchedule = compiler.codeGenerator.op_jb( 0, sizeof(char), true ); 799 } 828 800 829 801 //cmp eax,ebx … … 831 803 832 804 //ja TrueSchedule2(真へジャンプ) 833 OpBuffer[obp++]=(char)0x77; 834 TrueSchedule2=obp; 835 obp++; 805 CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true ); 836 806 837 807 //FalseScheduleのジャンプ先の設定 838 OpBuffer[FalseSchedule]=obp-(FalseSchedule+1);808 compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule ); 839 809 840 810 //xor eax,eax(eaxを0にする) … … 842 812 843 813 //jmp 5(演算終了位置へジャンプ) 844 OpBuffer[obp++]=(char)0xEB; 845 OpBuffer[obp++]=(char)0x05; 814 compiler.codeGenerator.op_jmp( 5 ); 846 815 847 816 //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 ); 850 819 851 820 //mov eax,1 … … 880 849 if(IsSignedType(AnswerType)){ 881 850 //jg 2(次のxorを飛び越す) 882 OpBuffer[obp++]=(char)0x7F; 883 OpBuffer[obp++]=(char)0x02; 851 compiler.codeGenerator.op_jg( 2 ); 884 852 } 885 853 else{ 886 854 //ja 2(次のxorを飛び越す) 887 OpBuffer[obp++]=(char)0x77; 888 OpBuffer[obp++]=(char)0x02; 855 compiler.codeGenerator.op_ja( 2 ); 889 856 } 890 857 -
trunk/abdev/BasicCompiler32/x86CodeGenerator.cpp
r237 r240 1189 1189 pNativeCode->Put( (char)0xC3 ); 1190 1190 } 1191 void CodeGenerator::op_ret( short stackFrameSize ) 1192 { 1193 pNativeCode->Put( (char)0xC2 ); 1194 pNativeCode->Put( stackFrameSize ); 1195 } -
trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
r239 r240 258 258 void op_call(const UserProc *pUserProc); 259 259 void op_ret(); 260 void op_ret( short stackFrameSize ); 260 261 #endif 261 262
Note:
See TracChangeset
for help on using the changeset viewer.