Changeset 225 in dev for trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp
- Timestamp:
- Jul 21, 2007, 11:47:40 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp
r206 r225 1 1 #include "stdafx.h" 2 3 #include <Compiler.h> 2 4 3 5 #include "../BasicCompiler_Common/common.h" … … 44 46 if(type_stack[sp-1]==DEF_DOUBLE){ 45 47 //fld qword ptr[esp] 46 op_fld_ptr_esp(DEF_DOUBLE);48 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 47 49 48 50 //add esp,8 49 op_add_esp(8);51 compiler.codeGenerator.op_add_esp(8); 50 52 } 51 53 else if(type_stack[sp-1]==DEF_SINGLE){ 52 54 //fld dword ptr[esp] 53 op_fld_ptr_esp(DEF_SINGLE);54 55 //add esp,4 56 op_add_esp(4);55 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 56 57 //add esp,4 58 compiler.codeGenerator.op_add_esp(4); 57 59 } 58 60 else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){ … … 60 62 61 63 //fild qword ptr[esp] 62 op_fld_ptr_esp(DEF_INT64);64 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 63 65 64 66 //add esp,8 65 op_add_esp(8);67 compiler.codeGenerator.op_add_esp(8); 66 68 } 67 69 else{ … … 69 71 70 72 //fild dword ptr[esp] 71 op_fld_ptr_esp(DEF_LONG);72 73 //add esp,4 74 op_add_esp(4);73 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 74 75 //add esp,4 76 compiler.codeGenerator.op_add_esp(4); 75 77 } 76 78 77 79 if(type_stack[sp-2]==DEF_DOUBLE){ 78 80 //fld qword ptr[esp] 79 op_fld_ptr_esp(DEF_DOUBLE);80 81 //add esp,4 82 op_add_esp(4);81 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 82 83 //add esp,4 84 compiler.codeGenerator.op_add_esp(4); 83 85 } 84 86 else if(type_stack[sp-2]==DEF_SINGLE){ 85 87 //fld dword ptr[esp] 86 op_fld_ptr_esp(DEF_SINGLE);88 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 87 89 } 88 90 else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){ … … 90 92 91 93 //fild qword ptr[esp] 92 op_fld_ptr_esp(DEF_INT64);93 94 //add esp,4 95 op_add_esp(4);94 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 95 96 //add esp,4 97 compiler.codeGenerator.op_add_esp(4); 96 98 } 97 99 else{ … … 99 101 100 102 //fild dword ptr[esp] 101 op_fld_ptr_esp(DEF_LONG);103 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 102 104 } 103 105 104 106 //fcompp 105 OpBuffer[obp++]=(char)0xDE; 106 OpBuffer[obp++]=(char)0xD9; 107 compiler.codeGenerator.op_fcompp(); 107 108 108 109 //fnstsw ax 109 OpBuffer[obp++]=(char)0xDF; 110 OpBuffer[obp++]=(char)0xE0; 110 compiler.codeGenerator.op_fnstsw_ax(); 111 111 112 112 //mov ecx,1 113 OpBuffer[obp++]=(char)0xB9; 114 *((long *)(OpBuffer+obp))=1; 115 obp+=sizeof(long); 113 compiler.codeGenerator.op_mov_RV( REG_ECX, 1 ); 116 114 117 115 //test ah,41h 118 OpBuffer[obp++]=(char)0xF6; 119 OpBuffer[obp++]=(char)0xC4; 120 OpBuffer[obp++]=(char)0x41; 116 compiler.codeGenerator.op_test_ah( (char)0x41 ); 121 117 122 118 //jne 5 123 OpBuffer[obp++]=(char)0x75; 124 OpBuffer[obp++]=(char)0x02; 119 compiler.codeGenerator.PutOld( 120 (char)0x75, 121 (char)0x02 122 ); 125 123 126 124 //xor ecx,ecx(ecxを0にする) 127 op_zero_reg(REG_ECX);125 compiler.codeGenerator.op_zero_reg(REG_ECX); 128 126 129 127 //mov dword ptr[esp],ecx 130 OpBuffer[obp++]=(char)0x89; 131 OpBuffer[obp++]=(char)0x0C; 132 OpBuffer[obp++]=(char)0x24; 128 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 133 129 } 134 130 else if(Is64Type(AnswerType)){ … … 147 143 148 144 //cmp edx,ecx 149 OpBuffer[obp++]=(char)0x3B; 150 OpBuffer[obp++]=(char)0xD1; 145 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 151 146 152 147 if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ … … 206 201 207 202 //xor eax,eax(eaxを0にする) 208 op_zero_reg(REG_EAX);203 compiler.codeGenerator.op_zero_reg(REG_EAX); 209 204 210 205 //push eax 211 op_push(REG_EAX);206 compiler.codeGenerator.op_push(REG_EAX); 212 207 } 213 208 else{ … … 217 212 218 213 //pop ebx 219 op_pop(REG_EBX);214 compiler.codeGenerator.op_pop(REG_EBX); 220 215 221 216 //pop eax 222 op_pop(REG_EAX);217 compiler.codeGenerator.op_pop(REG_EAX); 223 218 224 219 // どちらかのサイズが足りない場合は自動拡張する … … 226 221 227 222 //sub esp,4 228 op_sub_esp(4);223 compiler.codeGenerator.op_sub_esp(4); 229 224 230 225 //mov ecx,1 … … 258 253 259 254 //mov dword ptr[esp],ecx 260 OpBuffer[obp++]=(char)0x89; 261 OpBuffer[obp++]=(char)0x0C; 262 OpBuffer[obp++]=(char)0x24; 255 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 263 256 } 264 257 … … 283 276 if(type_stack[sp-1]==DEF_DOUBLE){ 284 277 //fld qword ptr[esp] 285 op_fld_ptr_esp(DEF_DOUBLE);278 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 286 279 287 280 //add esp,8 288 op_add_esp(8);281 compiler.codeGenerator.op_add_esp(8); 289 282 } 290 283 else if(type_stack[sp-1]==DEF_SINGLE){ 291 284 //fld dword ptr[esp] 292 op_fld_ptr_esp(DEF_SINGLE);293 294 //add esp,4 295 op_add_esp(4);285 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 286 287 //add esp,4 288 compiler.codeGenerator.op_add_esp(4); 296 289 } 297 290 else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){ … … 299 292 300 293 //fild qword ptr[esp] 301 op_fld_ptr_esp(DEF_INT64);294 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 302 295 303 296 //add esp,8 304 op_add_esp(8);297 compiler.codeGenerator.op_add_esp(8); 305 298 } 306 299 else{ … … 308 301 309 302 //fild dword ptr[esp] 310 op_fld_ptr_esp(DEF_LONG);311 312 //add esp,4 313 op_add_esp(4);303 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 304 305 //add esp,4 306 compiler.codeGenerator.op_add_esp(4); 314 307 } 315 308 316 309 if(type_stack[sp-2]==DEF_DOUBLE){ 317 310 //fld qword ptr[esp] 318 op_fld_ptr_esp(DEF_DOUBLE);319 320 //add esp,4 321 op_add_esp(4);311 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 312 313 //add esp,4 314 compiler.codeGenerator.op_add_esp(4); 322 315 } 323 316 else if(type_stack[sp-2]==DEF_SINGLE){ 324 317 //fld dword ptr[esp] 325 op_fld_ptr_esp(DEF_SINGLE);318 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 326 319 } 327 320 else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){ … … 329 322 330 323 //fild qword ptr[esp] 331 op_fld_ptr_esp(DEF_INT64);332 333 //add esp,4 334 op_add_esp(4);324 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 325 326 //add esp,4 327 compiler.codeGenerator.op_add_esp(4); 335 328 } 336 329 else{ … … 338 331 339 332 //fild dword ptr[esp] 340 op_fld_ptr_esp(DEF_LONG);333 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 341 334 } 342 335 … … 346 339 347 340 //fnstsw ax 348 OpBuffer[obp++]=(char)0xDF; 349 OpBuffer[obp++]=(char)0xE0; 341 compiler.codeGenerator.op_fnstsw_ax(); 350 342 351 343 //mov ecx,1 … … 355 347 356 348 //test ah,1 357 OpBuffer[obp++]=(char)0xF6; 358 OpBuffer[obp++]=(char)0xC4; 359 OpBuffer[obp++]=(char)0x01; 349 compiler.codeGenerator.op_test_ah( (char)0x01 ); 360 350 361 351 //je 5 … … 369 359 370 360 //mov dword ptr[esp],ecx 371 OpBuffer[obp++]=(char)0x89; 372 OpBuffer[obp++]=(char)0x0C; 373 OpBuffer[obp++]=(char)0x24; 361 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 374 362 } 375 363 else if(Is64Type(AnswerType)){ … … 447 435 448 436 //xor eax,eax(eaxを0にする) 449 op_zero_reg(REG_EAX);437 compiler.codeGenerator.op_zero_reg(REG_EAX); 450 438 451 439 //push eax 452 op_push(REG_EAX);440 compiler.codeGenerator.op_push(REG_EAX); 453 441 } 454 442 else{ … … 458 446 459 447 //pop ebx 460 op_pop(REG_EBX);448 compiler.codeGenerator.op_pop(REG_EBX); 461 449 462 450 //pop eax 463 op_pop(REG_EAX);451 compiler.codeGenerator.op_pop(REG_EAX); 464 452 465 453 // どちらかのサイズが足りない場合は自動拡張する … … 467 455 468 456 //sub esp,4 469 op_sub_esp(4);457 compiler.codeGenerator.op_sub_esp(4); 470 458 471 459 //mov ecx,1 … … 499 487 500 488 //mov dword ptr[esp],ecx 501 OpBuffer[obp++]=(char)0x89; 502 OpBuffer[obp++]=(char)0x0C; 503 OpBuffer[obp++]=(char)0x24; 489 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 504 490 } 505 491 … … 527 513 if(type_stack[sp-1]==DEF_DOUBLE){ 528 514 //fld qword ptr[esp] 529 op_fld_ptr_esp(DEF_DOUBLE);515 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 530 516 531 517 //add esp,8 532 op_add_esp(8);518 compiler.codeGenerator.op_add_esp(8); 533 519 } 534 520 else if(type_stack[sp-1]==DEF_SINGLE){ 535 521 //fld dword ptr[esp] 536 op_fld_ptr_esp(DEF_SINGLE);537 538 //add esp,4 539 op_add_esp(4);522 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 523 524 //add esp,4 525 compiler.codeGenerator.op_add_esp(4); 540 526 } 541 527 else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){ … … 543 529 544 530 //fild qword ptr[esp] 545 op_fld_ptr_esp(DEF_INT64);531 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 546 532 547 533 //add esp,8 548 op_add_esp(8);534 compiler.codeGenerator.op_add_esp(8); 549 535 } 550 536 else{ … … 552 538 553 539 //fild dword ptr[esp] 554 op_fld_ptr_esp(DEF_LONG);555 556 //add esp,4 557 op_add_esp(4);540 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 541 542 //add esp,4 543 compiler.codeGenerator.op_add_esp(4); 558 544 } 559 545 560 546 if(type_stack[sp-2]==DEF_DOUBLE){ 561 547 //fld qword ptr[esp] 562 op_fld_ptr_esp(DEF_DOUBLE);563 564 //add esp,4 565 op_add_esp(4);548 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 549 550 //add esp,4 551 compiler.codeGenerator.op_add_esp(4); 566 552 } 567 553 else if(type_stack[sp-2]==DEF_SINGLE){ 568 554 //fld dword ptr[esp] 569 op_fld_ptr_esp(DEF_SINGLE);555 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 570 556 } 571 557 else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){ … … 573 559 574 560 //fild qword ptr[esp] 575 op_fld_ptr_esp(DEF_INT64);576 577 //add esp,4 578 op_add_esp(4);561 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 562 563 //add esp,4 564 compiler.codeGenerator.op_add_esp(4); 579 565 } 580 566 else{ … … 582 568 583 569 //fild dword ptr[esp] 584 op_fld_ptr_esp(DEF_LONG);570 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 585 571 } 586 572 587 573 //fcompp 588 OpBuffer[obp++]=(char)0xDE; 589 OpBuffer[obp++]=(char)0xD9; 574 compiler.codeGenerator.op_fcompp(); 590 575 591 576 //fnstsw ax 592 OpBuffer[obp++]=(char)0xDF; 593 OpBuffer[obp++]=(char)0xE0; 577 compiler.codeGenerator.op_fnstsw_ax(); 594 578 595 579 //mov ecx,1 … … 599 583 600 584 //test ah,01h 601 OpBuffer[obp++]=(char)0xF6; 602 OpBuffer[obp++]=(char)0xC4; 603 OpBuffer[obp++]=(char)0x01; 585 compiler.codeGenerator.op_test_ah( (char)0x41 ); 604 586 605 587 //jne 5 … … 613 595 614 596 //mov dword ptr[esp],ecx 615 OpBuffer[obp++]=(char)0x89; 616 OpBuffer[obp++]=(char)0x0C; 617 OpBuffer[obp++]=(char)0x24; 597 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 618 598 } 619 599 else if(Is64Type(AnswerType)){ … … 678 658 679 659 //xor eax,eax(eaxを0にする) 680 op_zero_reg(REG_EAX);660 compiler.codeGenerator.op_zero_reg(REG_EAX); 681 661 682 662 //jmp 5(演算終了位置へジャンプ) … … 694 674 695 675 //push eax 696 op_push(REG_EAX);676 compiler.codeGenerator.op_push(REG_EAX); 697 677 } 698 678 else{ … … 702 682 703 683 //pop ebx 704 op_pop(REG_EBX);684 compiler.codeGenerator.op_pop(REG_EBX); 705 685 706 686 //pop eax 707 op_pop(REG_EAX);687 compiler.codeGenerator.op_pop(REG_EAX); 708 688 709 689 // どちらかのサイズが足りない場合は自動拡張する … … 711 691 712 692 //sub esp,4 713 op_sub_esp(4);693 compiler.codeGenerator.op_sub_esp(4); 714 694 715 695 //mov ecx,1 … … 743 723 744 724 //mov dword ptr[esp],ecx 745 OpBuffer[obp++]=(char)0x89; 746 OpBuffer[obp++]=(char)0x0C; 747 OpBuffer[obp++]=(char)0x24; 725 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 748 726 } 749 727 … … 771 749 if(type_stack[sp-1]==DEF_DOUBLE){ 772 750 //fld qword ptr[esp] 773 op_fld_ptr_esp(DEF_DOUBLE);751 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 774 752 775 753 //add esp,8 776 op_add_esp(8);754 compiler.codeGenerator.op_add_esp(8); 777 755 } 778 756 else if(type_stack[sp-1]==DEF_SINGLE){ 779 757 //fld dword ptr[esp] 780 op_fld_ptr_esp(DEF_SINGLE);781 782 //add esp,4 783 op_add_esp(4);758 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 759 760 //add esp,4 761 compiler.codeGenerator.op_add_esp(4); 784 762 } 785 763 else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){ … … 787 765 788 766 //fild qword ptr[esp] 789 op_fld_ptr_esp(DEF_INT64);767 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 790 768 791 769 //add esp,8 792 op_add_esp(8);770 compiler.codeGenerator.op_add_esp(8); 793 771 } 794 772 else{ //Long、DWord 795 773 //fild dword ptr[esp] 796 op_fld_ptr_esp(DEF_LONG);797 798 //add esp,4 799 op_add_esp(4);774 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 775 776 //add esp,4 777 compiler.codeGenerator.op_add_esp(4); 800 778 } 801 779 802 780 if(type_stack[sp-2]==DEF_DOUBLE){ 803 781 //fld qword ptr[esp] 804 op_fld_ptr_esp(DEF_DOUBLE);805 806 //add esp,4 807 op_add_esp(4);782 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 783 784 //add esp,4 785 compiler.codeGenerator.op_add_esp(4); 808 786 } 809 787 else if(type_stack[sp-2]==DEF_SINGLE){ 810 788 //fld dword ptr[esp] 811 op_fld_ptr_esp(DEF_SINGLE);789 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 812 790 } 813 791 else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){ … … 815 793 816 794 //fild qword ptr[esp] 817 op_fld_ptr_esp(DEF_INT64);818 819 //add esp,4 820 op_add_esp(4);795 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 796 797 //add esp,4 798 compiler.codeGenerator.op_add_esp(4); 821 799 } 822 800 else{ //Long、DWord 823 801 //fild dword ptr[esp] 824 op_fld_ptr_esp(DEF_LONG);802 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 825 803 } 826 804 827 805 //fcompp 828 OpBuffer[obp++]=(char)0xDE; 829 OpBuffer[obp++]=(char)0xD9; 806 compiler.codeGenerator.op_fcompp(); 830 807 831 808 //fnstsw ax 832 OpBuffer[obp++]=(char)0xDF; 833 OpBuffer[obp++]=(char)0xE0; 809 compiler.codeGenerator.op_fnstsw_ax(); 834 810 835 811 //mov ecx,1 … … 839 815 840 816 //test ah,41 841 OpBuffer[obp++]=(char)0xF6; 842 OpBuffer[obp++]=(char)0xC4; 843 OpBuffer[obp++]=(char)0x41; 817 compiler.codeGenerator.op_test_ah( (char)0x41 ); 844 818 845 819 //je 5 … … 853 827 854 828 //mov dword ptr[esp],ecx 855 OpBuffer[obp++]=(char)0x89; 856 OpBuffer[obp++]=(char)0x0C; 857 OpBuffer[obp++]=(char)0x24; 829 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 858 830 } 859 831 else if(Is64Type(AnswerType)){ … … 918 890 919 891 //xor eax,eax(eaxを0にする) 920 op_zero_reg(REG_EAX);892 compiler.codeGenerator.op_zero_reg(REG_EAX); 921 893 922 894 //jmp 5(演算終了位置へジャンプ) … … 934 906 935 907 //push eax 936 op_push(REG_EAX);908 compiler.codeGenerator.op_push(REG_EAX); 937 909 } 938 910 else{ … … 942 914 943 915 //pop ebx 944 op_pop(REG_EBX);916 compiler.codeGenerator.op_pop(REG_EBX); 945 917 946 918 //pop eax 947 op_pop(REG_EAX);919 compiler.codeGenerator.op_pop(REG_EAX); 948 920 949 921 // どちらかのサイズが足りない場合は自動拡張する … … 951 923 952 924 //sub esp,4 953 op_sub_esp(4);925 compiler.codeGenerator.op_sub_esp(4); 954 926 955 927 //mov ecx,1 … … 979 951 980 952 //mov dword ptr[esp],ecx 981 OpBuffer[obp++]=(char)0x89; 982 OpBuffer[obp++]=(char)0x0C; 983 OpBuffer[obp++]=(char)0x24; 953 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 984 954 } 985 955 … … 1005 975 if(type[sp-1]==DEF_DOUBLE){ 1006 976 //fld qword ptr[esp] 1007 op_fld_ptr_esp(DEF_DOUBLE);977 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1008 978 1009 979 //add esp,8 1010 op_add_esp(8);980 compiler.codeGenerator.op_add_esp(8); 1011 981 } 1012 982 else if(type[sp-1]==DEF_SINGLE){ 1013 983 //fld dword ptr[esp] 1014 op_fld_ptr_esp(DEF_SINGLE);1015 1016 //add esp,4 1017 op_add_esp(4);984 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 985 986 //add esp,4 987 compiler.codeGenerator.op_add_esp(4); 1018 988 } 1019 989 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ … … 1021 991 1022 992 //fild qword ptr[esp] 1023 op_fld_ptr_esp(DEF_INT64);993 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 1024 994 1025 995 //add esp,8 1026 op_add_esp(8);996 compiler.codeGenerator.op_add_esp(8); 1027 997 } 1028 998 else{ //Long、DWord 1029 999 //fild dword ptr[esp] 1030 op_fld_ptr_esp(DEF_LONG);1031 1032 //add esp,4 1033 op_add_esp(4);1000 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 1001 1002 //add esp,4 1003 compiler.codeGenerator.op_add_esp(4); 1034 1004 } 1035 1005 1036 1006 if(type[sp-2]==DEF_DOUBLE){ 1037 1007 //fld qword ptr[esp] 1038 op_fld_ptr_esp(DEF_DOUBLE);1039 1040 //add esp,4 1041 op_add_esp(4);1008 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1009 1010 //add esp,4 1011 compiler.codeGenerator.op_add_esp(4); 1042 1012 } 1043 1013 else if(type[sp-2]==DEF_SINGLE){ 1044 1014 //fld dword ptr[esp] 1045 op_fld_ptr_esp(DEF_SINGLE);1015 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1046 1016 } 1047 1017 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ … … 1049 1019 1050 1020 //fild qword ptr[esp] 1051 op_fld_ptr_esp(DEF_INT64);1052 1053 //add esp,4 1054 op_add_esp(4);1021 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 1022 1023 //add esp,4 1024 compiler.codeGenerator.op_add_esp(4); 1055 1025 } 1056 1026 else{ //Long、DWord 1057 1027 //fild dword ptr[esp] 1058 op_fld_ptr_esp(DEF_LONG);1028 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 1059 1029 } 1060 1030 1061 1031 //fcompp 1062 OpBuffer[obp++]=(char)0xDE; 1063 OpBuffer[obp++]=(char)0xD9; 1032 compiler.codeGenerator.op_fcompp(); 1064 1033 1065 1034 //fnstsw ax 1066 OpBuffer[obp++]=(char)0xDF; 1067 OpBuffer[obp++]=(char)0xE0; 1035 compiler.codeGenerator.op_fnstsw_ax(); 1068 1036 1069 1037 //mov ecx,1 … … 1073 1041 1074 1042 //test ah,40 1075 OpBuffer[obp++]=(char)0xF6; 1076 OpBuffer[obp++]=(char)0xC4; 1077 OpBuffer[obp++]=(char)0x40; 1043 compiler.codeGenerator.op_test_ah( (char)0x40 ); 1078 1044 1079 1045 //je 5 … … 1087 1053 1088 1054 //mov dword ptr[esp],ecx 1089 OpBuffer[obp++]=(char)0x89; 1090 OpBuffer[obp++]=(char)0x0C; 1091 OpBuffer[obp++]=(char)0x24; 1055 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 1092 1056 } 1093 1057 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD|| … … 1124 1088 1125 1089 //xor eax,eax(eaxを0にする) 1126 op_zero_reg(REG_EAX);1090 compiler.codeGenerator.op_zero_reg(REG_EAX); 1127 1091 1128 1092 //jmp 5(演算終了位置へジャンプ) … … 1140 1104 1141 1105 //push eax 1142 op_push(REG_EAX);1106 compiler.codeGenerator.op_push(REG_EAX); 1143 1107 } 1144 1108 else{ … … 1148 1112 1149 1113 //pop eax 1150 op_pop(REG_EAX);1114 compiler.codeGenerator.op_pop(REG_EAX); 1151 1115 1152 1116 //pop ebx 1153 op_pop(REG_EBX);1117 compiler.codeGenerator.op_pop(REG_EBX); 1154 1118 1155 1119 // どちらかのサイズが足りない場合は自動拡張する … … 1157 1121 1158 1122 //sub esp,4 1159 op_sub_esp(4);1123 compiler.codeGenerator.op_sub_esp(4); 1160 1124 1161 1125 //xor eax,ebx … … 1173 1137 1174 1138 //mov dword ptr[esp],eax 1175 OpBuffer[obp++]=(char)0x89; 1176 OpBuffer[obp++]=(char)0x04; 1177 OpBuffer[obp++]=(char)0x24; 1139 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 1178 1140 } 1179 1141 … … 1199 1161 if(type[sp-1]==DEF_DOUBLE){ 1200 1162 //fld qword ptr[esp] 1201 op_fld_ptr_esp(DEF_DOUBLE);1163 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1202 1164 1203 1165 //add esp,8 1204 op_add_esp(8);1166 compiler.codeGenerator.op_add_esp(8); 1205 1167 } 1206 1168 else if(type[sp-1]==DEF_SINGLE){ 1207 1169 //fld dword ptr[esp] 1208 op_fld_ptr_esp(DEF_SINGLE);1209 1210 //add esp,4 1211 op_add_esp(4);1170 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1171 1172 //add esp,4 1173 compiler.codeGenerator.op_add_esp(4); 1212 1174 } 1213 1175 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ … … 1215 1177 1216 1178 //fild qword ptr[esp] 1217 op_fld_ptr_esp(DEF_INT64);1179 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 1218 1180 1219 1181 //add esp,8 1220 op_add_esp(8);1182 compiler.codeGenerator.op_add_esp(8); 1221 1183 } 1222 1184 else{ //Long、DWord 1223 1185 //fild dword ptr[esp] 1224 op_fld_ptr_esp(DEF_LONG);1225 1226 //add esp,4 1227 op_add_esp(4);1186 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 1187 1188 //add esp,4 1189 compiler.codeGenerator.op_add_esp(4); 1228 1190 } 1229 1191 1230 1192 if(type[sp-2]==DEF_DOUBLE){ 1231 1193 //fld qword ptr[esp] 1232 op_fld_ptr_esp(DEF_DOUBLE);1233 1234 //add esp,4 1235 op_add_esp(4);1194 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1195 1196 //add esp,4 1197 compiler.codeGenerator.op_add_esp(4); 1236 1198 } 1237 1199 else if(type[sp-2]==DEF_SINGLE){ 1238 1200 //fld dword ptr[esp] 1239 op_fld_ptr_esp(DEF_SINGLE);1201 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1240 1202 } 1241 1203 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ … … 1243 1205 1244 1206 //fild qword ptr[esp] 1245 op_fld_ptr_esp(DEF_INT64);1246 1247 //add esp,4 1248 op_add_esp(4);1207 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 1208 1209 //add esp,4 1210 compiler.codeGenerator.op_add_esp(4); 1249 1211 } 1250 1212 else{ //Long、DWord 1251 1213 //fild dword ptr[esp] 1252 op_fld_ptr_esp(DEF_LONG);1214 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 1253 1215 } 1254 1216 1255 1217 //fcompp 1256 OpBuffer[obp++]=(char)0xDE; 1257 OpBuffer[obp++]=(char)0xD9; 1218 compiler.codeGenerator.op_fcompp(); 1258 1219 1259 1220 //fnstsw ax 1260 OpBuffer[obp++]=(char)0xDF; 1261 OpBuffer[obp++]=(char)0xE0; 1221 compiler.codeGenerator.op_fnstsw_ax(); 1262 1222 1263 1223 //mov ecx,1 … … 1267 1227 1268 1228 //test ah,40 1269 OpBuffer[obp++]=(char)0xF6; 1270 OpBuffer[obp++]=(char)0xC4; 1271 OpBuffer[obp++]=(char)0x40; 1229 compiler.codeGenerator.op_test_ah( (char)0x40 ); 1272 1230 1273 1231 //jne 5 … … 1281 1239 1282 1240 //mov dword ptr[esp],ecx 1283 OpBuffer[obp++]=(char)0x89; 1284 OpBuffer[obp++]=(char)0x0C; 1285 OpBuffer[obp++]=(char)0x24; 1241 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE ); 1286 1242 } 1287 1243 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD|| … … 1331 1287 1332 1288 //xor eax,eax(eaxを0にする) 1333 op_zero_reg(REG_EAX);1289 compiler.codeGenerator.op_zero_reg(REG_EAX); 1334 1290 1335 1291 //push eax 1336 op_push(REG_EAX);1292 compiler.codeGenerator.op_push(REG_EAX); 1337 1293 } 1338 1294 else{ … … 1342 1298 1343 1299 //pop eax 1344 op_pop(REG_EAX);1300 compiler.codeGenerator.op_pop(REG_EAX); 1345 1301 1346 1302 //pop ebx 1347 op_pop(REG_EBX);1303 compiler.codeGenerator.op_pop(REG_EBX); 1348 1304 1349 1305 // どちらかのサイズが足りない場合は自動拡張する … … 1351 1307 1352 1308 //sub esp,4 1353 op_sub_esp(4);1309 compiler.codeGenerator.op_sub_esp(4); 1354 1310 1355 1311 //xor eax,ebx … … 1375 1331 1376 1332 //mov dword ptr[esp],eax 1377 OpBuffer[obp++]=(char)0x89; 1378 OpBuffer[obp++]=(char)0x04; 1379 OpBuffer[obp++]=(char)0x24; 1333 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 1380 1334 } 1381 1335
Note:
See TracChangeset
for help on using the changeset viewer.