Changeset 225 in dev for trunk/abdev/BasicCompiler32/Compile_Statement.cpp
- Timestamp:
- Jul 21, 2007, 11:47:40 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Statement.cpp
r206 r225 110 110 else if( resultType.IsStruct() ){ 111 111 //mov ebx,eax 112 op_mov_RR(REG_EBX,REG_EAX);112 compiler.codeGenerator.op_mov_RR(REG_EBX,REG_EAX); 113 113 114 114 FreeTempObject(REG_EBX,&resultType.GetClass()); … … 144 144 else if( tempType.IsDouble() ){ 145 145 //fld qword ptr[esp] 146 op_fld_ptr_esp(DEF_DOUBLE);146 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 147 147 148 148 //push 0 149 op_push_V(0);149 compiler.codeGenerator.op_push_V(0); 150 150 151 151 //fild dword ptr[esp] 152 op_fld_ptr_esp(DEF_LONG);152 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 153 153 154 154 //add esp,sizeof(double)+sizeof(long) 155 op_add_esp(sizeof(double)+sizeof(long));155 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long)); 156 156 157 157 //fcompp 158 OpBuffer[obp++]=(char)0xDE; 159 OpBuffer[obp++]=(char)0xD9; 158 compiler.codeGenerator.op_fcompp(); 160 159 161 160 //fnstsw ax 162 OpBuffer[obp++]=(char)0xDF; 163 OpBuffer[obp++]=(char)0xE0; 161 compiler.codeGenerator.op_fnstsw_ax(); 164 162 165 163 //test ah,40 166 OpBuffer[obp++]=(char)0xF6; 167 OpBuffer[obp++]=(char)0xC4; 168 OpBuffer[obp++]=(char)0x40; 164 compiler.codeGenerator.op_test_ah( (char)0x40 ); 169 165 170 166 //jne (endif、または else まで) … … 178 174 else if( tempType.IsSingle() ){ 179 175 //fld dword ptr[esp] 180 op_fld_ptr_esp(DEF_SINGLE);176 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 181 177 182 178 //push 0 183 op_push_V(0);179 compiler.codeGenerator.op_push_V(0); 184 180 185 181 //fild dword ptr[esp] 186 op_fld_ptr_esp(DEF_LONG);182 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 187 183 188 184 //add esp,sizeof(float)+sizeof(long) 189 op_add_esp(sizeof(float)+sizeof(long));185 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long)); 190 186 191 187 //fcompp 192 OpBuffer[obp++]=(char)0xDE; 193 OpBuffer[obp++]=(char)0xD9; 188 compiler.codeGenerator.op_fcompp(); 194 189 195 190 //fnstsw ax 196 OpBuffer[obp++]=(char)0xDF; 197 OpBuffer[obp++]=(char)0xE0; 191 compiler.codeGenerator.op_fnstsw_ax(); 198 192 199 193 //test ah,40 200 OpBuffer[obp++]=(char)0xF6; 201 OpBuffer[obp++]=(char)0xC4; 202 OpBuffer[obp++]=(char)0x40; 194 compiler.codeGenerator.op_test_ah( (char)0x40 ); 203 195 204 196 //jne (endif、または else まで) … … 214 206 215 207 //pop eax 216 op_pop(REG_EAX);208 compiler.codeGenerator.op_pop(REG_EAX); 217 209 218 210 //pop ebx 219 op_pop(REG_EBX);211 compiler.codeGenerator.op_pop(REG_EBX); 220 212 221 213 //cmp eax,0 … … 258 250 259 251 //pop eax 260 op_pop(REG_EAX);252 compiler.codeGenerator.op_pop(REG_EAX); 261 253 262 254 //cmp eax,0 … … 401 393 else if( tempType.IsDouble() ){ 402 394 //fld qword ptr[esp] 403 op_fld_ptr_esp(DEF_DOUBLE);395 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 404 396 405 397 //push 0 406 op_push_V(0);398 compiler.codeGenerator.op_push_V(0); 407 399 408 400 //fild dword ptr[esp] 409 op_fld_ptr_esp(DEF_LONG);401 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 410 402 411 403 //add esp,sizeof(double)+sizeof(long) 412 op_add_esp(sizeof(double)+sizeof(long));404 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long)); 413 405 414 406 //fcompp 415 OpBuffer[obp++]=(char)0xDE; 416 OpBuffer[obp++]=(char)0xD9; 407 compiler.codeGenerator.op_fcompp(); 417 408 418 409 //fnstsw ax 419 OpBuffer[obp++]=(char)0xDF; 420 OpBuffer[obp++]=(char)0xE0; 410 compiler.codeGenerator.op_fnstsw_ax(); 421 411 422 412 //test ah,40 423 OpBuffer[obp++]=(char)0xF6; 424 OpBuffer[obp++]=(char)0xC4; 425 OpBuffer[obp++]=(char)0x40; 413 compiler.codeGenerator.op_test_ah( (char)0x40 ); 426 414 427 415 //jne (Wend まで) … … 435 423 else if( tempType.IsSingle() ){ 436 424 //fld dword ptr[esp] 437 op_fld_ptr_esp(DEF_SINGLE);425 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 438 426 439 427 //push 0 440 op_push_V(0);428 compiler.codeGenerator.op_push_V(0); 441 429 442 430 //fild dword ptr[esp] 443 op_fld_ptr_esp(DEF_LONG);431 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 444 432 445 433 //add esp,sizeof(float)+sizeof(long) 446 op_add_esp(sizeof(float)+sizeof(long));434 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long)); 447 435 448 436 //fcompp 449 OpBuffer[obp++]=(char)0xDE; 450 OpBuffer[obp++]=(char)0xD9; 437 compiler.codeGenerator.op_fcompp(); 451 438 452 439 //fnstsw ax 453 OpBuffer[obp++]=(char)0xDF; 454 OpBuffer[obp++]=(char)0xE0; 440 compiler.codeGenerator.op_fnstsw_ax(); 455 441 456 442 //test ah,40 457 OpBuffer[obp++]=(char)0xF6; 458 OpBuffer[obp++]=(char)0xC4; 459 OpBuffer[obp++]=(char)0x40; 443 compiler.codeGenerator.op_test_ah( (char)0x40 ); 460 444 461 445 //jne (Wend まで) … … 471 455 472 456 //pop eax 473 op_pop(REG_EAX);457 compiler.codeGenerator.op_pop(REG_EAX); 474 458 475 459 //pop ebx 476 op_pop(REG_EBX);460 compiler.codeGenerator.op_pop(REG_EBX); 477 461 478 462 //cmp eax,0 … … 514 498 515 499 //pop eax 516 op_pop(REG_EAX);500 compiler.codeGenerator.op_pop(REG_EAX); 517 501 518 502 //cmp eax,0 … … 616 600 617 601 //pop eax 618 op_pop(REG_EAX);602 compiler.codeGenerator.op_pop(REG_EAX); 619 603 620 604 //cmp eax,0 … … 634 618 635 619 //pop eax 636 op_pop(REG_EAX);620 compiler.codeGenerator.op_pop(REG_EAX); 637 621 638 622 //jmp [カウンタ減少の場合の判定を飛び越す] … … 648 632 649 633 //pop eax 650 op_pop(REG_EAX);634 compiler.codeGenerator.op_pop(REG_EAX); 651 635 652 636 *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値 … … 737 721 if( tempType.IsDouble() ){ 738 722 //fld qword ptr[esp] 739 op_fld_ptr_esp(DEF_DOUBLE);723 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 740 724 741 725 //push 0 742 op_push_V(0);726 compiler.codeGenerator.op_push_V(0); 743 727 744 728 //fild dword ptr[esp] 745 op_fld_ptr_esp(DEF_LONG);729 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 746 730 747 731 //add esp,sizeof(double)+sizeof(long) 748 op_add_esp(sizeof(double)+sizeof(long));732 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long)); 749 733 750 734 //fcompp 751 OpBuffer[obp++]=(char)0xDE; 752 OpBuffer[obp++]=(char)0xD9; 735 compiler.codeGenerator.op_fcompp(); 753 736 754 737 //fnstsw ax 755 OpBuffer[obp++]=(char)0xDF; 756 OpBuffer[obp++]=(char)0xE0; 738 compiler.codeGenerator.op_fnstsw_ax(); 757 739 758 740 //test ah,40 759 OpBuffer[obp++]=(char)0xF6; 760 OpBuffer[obp++]=(char)0xC4; 761 OpBuffer[obp++]=(char)0x40; 741 compiler.codeGenerator.op_test_ah( (char)0x40 ); 762 742 763 743 if(basbuf[i3]=='0'){ … … 778 758 else if( tempType.IsSingle() ){ 779 759 //fld dword ptr[esp] 780 op_fld_ptr_esp(DEF_SINGLE);760 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 781 761 782 762 //push 0 783 op_push_V(0);763 compiler.codeGenerator.op_push_V(0); 784 764 785 765 //fild dword ptr[esp] 786 op_fld_ptr_esp(DEF_LONG);766 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 787 767 788 768 //add esp,sizeof(float)+sizeof(long) 789 op_add_esp(sizeof(float)+sizeof(long));769 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long)); 790 770 791 771 //fcompp 792 OpBuffer[obp++]=(char)0xDE; 793 OpBuffer[obp++]=(char)0xD9; 772 compiler.codeGenerator.op_fcompp(); 794 773 795 774 //fnstsw ax 796 OpBuffer[obp++]=(char)0xDF; 797 OpBuffer[obp++]=(char)0xE0; 775 compiler.codeGenerator.op_fnstsw_ax(); 798 776 799 777 //test ah,40 800 OpBuffer[obp++]=(char)0xF6; 801 OpBuffer[obp++]=(char)0xC4; 802 OpBuffer[obp++]=(char)0x40; 778 compiler.codeGenerator.op_test_ah( (char)0x40 ); 803 779 804 780 if(basbuf[i3]=='0'){ … … 821 797 822 798 //pop eax 823 op_pop(REG_EAX);799 compiler.codeGenerator.op_pop(REG_EAX); 824 800 825 801 //pop ebx 826 op_pop(REG_EBX);802 compiler.codeGenerator.op_pop(REG_EBX); 827 803 828 804 //cmp eax,0 … … 877 853 else{ 878 854 //pop eax 879 op_pop(REG_EAX);855 compiler.codeGenerator.op_pop(REG_EAX); 880 856 881 857 //cmp eax,0 … … 1027 1003 if(sw==0){ 1028 1004 //add esp,CaseTypeSize 1029 op_add_esp(CaseTypeSize);1005 compiler.codeGenerator.op_add_esp(CaseTypeSize); 1030 1006 } 1031 1007 break; … … 1101 1077 1102 1078 //pop edx 1103 op_pop(REG_EDX);1079 compiler.codeGenerator.op_pop(REG_EDX); 1104 1080 1105 1081 //mov ecx,dword ptr[esp] 1106 op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);1082 compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE); 1107 1083 1108 1084 //push edx 1109 op_push(REG_EDX);1085 compiler.codeGenerator.op_push(REG_EDX); 1110 1086 1111 1087 //push ecx 1112 op_push(REG_ECX);1088 compiler.codeGenerator.op_push(REG_ECX); 1113 1089 1114 1090 //call operator_proc ※ ==演算子 1115 op_call(pUserProc);1091 compiler.codeGenerator.op_call(pUserProc); 1116 1092 1117 1093 //test eax,eax 1118 op_test(REG_EAX,REG_EAX);1094 compiler.codeGenerator.op_test(REG_EAX,REG_EAX); 1119 1095 1120 1096 //jne ... … … 1128 1104 1129 1105 //fld qword ptr[esp] 1130 op_fld_ptr_esp(DEF_DOUBLE);1106 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1131 1107 1132 1108 //add esp,CaseTypeSize 1133 op_add_esp(CaseTypeSize);1109 compiler.codeGenerator.op_add_esp(CaseTypeSize); 1134 1110 1135 1111 //fld qword ptr[esp] 1136 op_fld_ptr_esp(DEF_DOUBLE);1112 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1137 1113 1138 1114 //fcompp 1139 OpBuffer[obp++]=(char)0xDE; 1140 OpBuffer[obp++]=(char)0xD9; 1115 compiler.codeGenerator.op_fcompp(); 1141 1116 1142 1117 //fnstsw ax 1143 OpBuffer[obp++]=(char)0xDF; 1144 OpBuffer[obp++]=(char)0xE0; 1118 compiler.codeGenerator.op_fnstsw_ax(); 1145 1119 1146 1120 //test ah,40 1147 OpBuffer[obp++]=(char)0xF6; 1148 OpBuffer[obp++]=(char)0xC4; 1149 OpBuffer[obp++]=(char)0x40; 1121 compiler.codeGenerator.op_test_ah( (char)0x40 ); 1150 1122 1151 1123 //jne ... … … 1159 1131 1160 1132 //fld dword ptr[esp] 1161 op_fld_ptr_esp(DEF_SINGLE);1133 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1162 1134 1163 1135 //add esp,CaseTypeSize 1164 op_add_esp(CaseTypeSize);1136 compiler.codeGenerator.op_add_esp(CaseTypeSize); 1165 1137 1166 1138 //fld dword ptr[esp] 1167 op_fld_ptr_esp(DEF_SINGLE);1139 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1168 1140 1169 1141 //fcompp 1170 OpBuffer[obp++]=(char)0xDE; 1171 OpBuffer[obp++]=(char)0xD9; 1142 compiler.codeGenerator.op_fcompp(); 1172 1143 1173 1144 //fnstsw ax 1174 OpBuffer[obp++]=(char)0xDF; 1175 OpBuffer[obp++]=(char)0xE0; 1145 compiler.codeGenerator.op_fnstsw_ax(); 1176 1146 1177 1147 //test ah,40 1178 OpBuffer[obp++]=(char)0xF6; 1179 OpBuffer[obp++]=(char)0xC4; 1180 OpBuffer[obp++]=(char)0x40; 1148 compiler.codeGenerator.op_test_ah( (char)0x40 ); 1181 1149 1182 1150 //jne ... … … 1190 1158 1191 1159 //pop ebx 1192 op_pop(REG_EBX);1160 compiler.codeGenerator.op_pop(REG_EBX); 1193 1161 1194 1162 //mov eax,dword ptr[esp] … … 1273 1241 1274 1242 //add esp,CaseTypeSize 1275 op_add_esp(CaseTypeSize);1243 compiler.codeGenerator.op_add_esp(CaseTypeSize); 1276 1244 } 1277 1245 … … 1321 1289 1322 1290 //ret 1323 op_ret();1291 compiler.codeGenerator.op_ret(); 1324 1292 } 1325 1293 else{ … … 1398 1366 1399 1367 //pop eax 1400 op_pop(REG_EAX);1368 compiler.codeGenerator.op_pop(REG_EAX); 1401 1369 1402 1370 //fstp qword ptr[eax] … … 1408 1376 1409 1377 //pop ebx 1410 op_pop(REG_EBX);1378 compiler.codeGenerator.op_pop(REG_EBX); 1411 1379 1412 1380 //pop eax 1413 op_pop(REG_EAX);1381 compiler.codeGenerator.op_pop(REG_EAX); 1414 1382 1415 1383 //mov dword ptr[eax],ebx 1416 OpBuffer[obp++]=(char)0x89; 1417 OpBuffer[obp++]=(char)0x18; 1384 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE ); 1418 1385 } 1419 1386 else if(type==DEF_QWORD){ … … 1421 1388 1422 1389 //pop ecx 1423 op_pop(REG_ECX);1390 compiler.codeGenerator.op_pop(REG_ECX); 1424 1391 1425 1392 //pop ebx 1426 op_pop(REG_EBX);1393 compiler.codeGenerator.op_pop(REG_EBX); 1427 1394 1428 1395 //pop eax 1429 op_pop(REG_EAX);1396 compiler.codeGenerator.op_pop(REG_EAX); 1430 1397 1431 1398 //mov dword ptr[eax],ecx 1432 OpBuffer[obp++]=(char)0x89; 1433 OpBuffer[obp++]=(char)0x08; 1399 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 1434 1400 1435 1401 //mov dword ptr[eax+sizeof(long)],ebx 1436 OpBuffer[obp++]=(char)0x89; 1437 OpBuffer[obp++]=(char)0x58; 1438 OpBuffer[obp++]=(char)0x04; 1402 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0x04, MOD_BASE_DISP8 ); 1439 1403 } 1440 1404 else if(type==DEF_DWORD){ … … 1442 1406 1443 1407 //pop ebx 1444 op_pop(REG_EBX);1408 compiler.codeGenerator.op_pop(REG_EBX); 1445 1409 1446 1410 //pop eax 1447 op_pop(REG_EAX);1411 compiler.codeGenerator.op_pop(REG_EAX); 1448 1412 1449 1413 //mov dword ptr[eax],ebx 1450 OpBuffer[obp++]=(char)0x89; 1451 OpBuffer[obp++]=(char)0x18; 1414 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE ); 1452 1415 } 1453 1416 else if(type==DEF_WORD){ … … 1455 1418 1456 1419 //pop ebx 1457 op_pop(REG_EBX);1420 compiler.codeGenerator.op_pop(REG_EBX); 1458 1421 1459 1422 //pop eax 1460 op_pop(REG_EAX);1423 compiler.codeGenerator.op_pop(REG_EAX); 1461 1424 1462 1425 //mov word ptr[eax],bx … … 1469 1432 1470 1433 //pop ebx 1471 op_pop(REG_EBX);1434 compiler.codeGenerator.op_pop(REG_EBX); 1472 1435 1473 1436 //pop eax 1474 op_pop(REG_EAX);1437 compiler.codeGenerator.op_pop(REG_EAX); 1475 1438 1476 1439 //mov byte ptr[eax],bl
Note:
See TracChangeset
for help on using the changeset viewer.