Changeset 676 in dev for trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp
- Timestamp:
- Jun 29, 2008, 3:20:40 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp
r537 r676 136 136 137 137 const PertialSchedule *pIfPertialSchedule = NULL; 138 if( !NumOpe(Parameter,Type(DEF_BOOLEAN),tempType) ){ 139 //NumOpe内でエラー 140 } 141 else if( tempType.IsDouble() ){ 142 //fld qword ptr[esp] 143 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 144 145 //push 0 146 compiler.codeGenerator.op_push_V(0); 147 148 //fild dword ptr[esp] 149 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 150 151 //add esp,sizeof(double)+sizeof(long) 152 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long)); 153 154 //fcompp 155 compiler.codeGenerator.op_fcompp(); 156 157 //fnstsw ax 158 compiler.codeGenerator.op_fnstsw_ax(); 159 160 //test ah,40 161 compiler.codeGenerator.op_test_ah( (char)0x40 ); 162 163 //jne (endif、または else まで) 164 pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 165 } 166 else if( tempType.IsSingle() ){ 167 //fld dword ptr[esp] 168 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 169 170 //push 0 171 compiler.codeGenerator.op_push_V(0); 172 173 //fild dword ptr[esp] 174 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 175 176 //add esp,sizeof(float)+sizeof(long) 177 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long)); 178 179 //fcompp 180 compiler.codeGenerator.op_fcompp(); 181 182 //fnstsw ax 183 compiler.codeGenerator.op_fnstsw_ax(); 184 185 //test ah,40 186 compiler.codeGenerator.op_test_ah( (char)0x40 ); 187 188 //jne (endif、または else まで) 189 pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 190 } 191 else if( tempType.Is64() ){ 192 //64ビット型 193 194 //pop eax 195 compiler.codeGenerator.op_pop(REG_EAX); 196 197 //pop ebx 198 compiler.codeGenerator.op_pop(REG_EBX); 199 200 //cmp eax,0 201 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 202 203 //jne 204 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 205 206 //cmp ebx,0 207 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 ); 208 209 //jne 210 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 211 212 //jmp (endif、または else までジャンプ) 213 pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 214 215 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 ); 216 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 ); 217 } 218 else{ 219 //32ビット型 220 221 //pop eax 222 compiler.codeGenerator.op_pop(REG_EAX); 223 224 //cmp eax,0 225 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 226 227 //je (endif、または else まで条件ジャンプ) 228 pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true ); 138 bool isNeedHeapFreeStructure; 139 if( NumOpe( Parameter, Type(DEF_BOOLEAN), tempType, &isNeedHeapFreeStructure ) ) 140 { 141 if( tempType.IsObject() ) 142 { 143 // Boolean型にキャストする 144 Type booleanType( DEF_BOOLEAN ); 145 CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType ); 146 tempType = booleanType; 147 } 148 149 if( tempType.IsDouble() ){ 150 //fld qword ptr[esp] 151 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 152 153 //push 0 154 compiler.codeGenerator.op_push_V(0); 155 156 //fild dword ptr[esp] 157 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 158 159 //add esp,sizeof(double)+sizeof(long) 160 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long)); 161 162 //fcompp 163 compiler.codeGenerator.op_fcompp(); 164 165 //fnstsw ax 166 compiler.codeGenerator.op_fnstsw_ax(); 167 168 //test ah,40 169 compiler.codeGenerator.op_test_ah( (char)0x40 ); 170 171 //jne (endif、または else まで) 172 pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 173 } 174 else if( tempType.IsSingle() ){ 175 //fld dword ptr[esp] 176 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 177 178 //push 0 179 compiler.codeGenerator.op_push_V(0); 180 181 //fild dword ptr[esp] 182 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 183 184 //add esp,sizeof(float)+sizeof(long) 185 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long)); 186 187 //fcompp 188 compiler.codeGenerator.op_fcompp(); 189 190 //fnstsw ax 191 compiler.codeGenerator.op_fnstsw_ax(); 192 193 //test ah,40 194 compiler.codeGenerator.op_test_ah( (char)0x40 ); 195 196 //jne (endif、または else まで) 197 pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 198 } 199 else if( tempType.Is64() ){ 200 //64ビット型 201 202 //pop eax 203 compiler.codeGenerator.op_pop(REG_EAX); 204 205 //pop ebx 206 compiler.codeGenerator.op_pop(REG_EBX); 207 208 //cmp eax,0 209 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 210 211 //jne 212 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 213 214 //cmp ebx,0 215 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 ); 216 217 //jne 218 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 219 220 //jmp (endif、または else までジャンプ) 221 pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 222 223 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 ); 224 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 ); 225 } 226 else{ 227 //32ビット型 228 229 //pop eax 230 compiler.codeGenerator.op_pop(REG_EAX); 231 232 //cmp eax,0 233 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 234 235 //je (endif、または else まで条件ジャンプ) 236 pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true ); 237 } 229 238 } 230 239 … … 359 368 const PertialSchedule *pWhilePertialSchedule = NULL; 360 369 Type tempType; 361 if( !NumOpe(Parameter,Type(),tempType) ){ 362 //ダミー 363 } 364 else if( tempType.IsDouble() ){ 365 //fld qword ptr[esp] 366 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 367 368 //push 0 369 compiler.codeGenerator.op_push_V(0); 370 371 //fild dword ptr[esp] 372 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 373 374 //add esp,sizeof(double)+sizeof(long) 375 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long)); 376 377 //fcompp 378 compiler.codeGenerator.op_fcompp(); 379 380 //fnstsw ax 381 compiler.codeGenerator.op_fnstsw_ax(); 382 383 //test ah,40 384 compiler.codeGenerator.op_test_ah( (char)0x40 ); 385 386 //jne (Wend まで) 387 pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 388 } 389 else if( tempType.IsSingle() ){ 390 //fld dword ptr[esp] 391 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 392 393 //push 0 394 compiler.codeGenerator.op_push_V(0); 395 396 //fild dword ptr[esp] 397 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 398 399 //add esp,sizeof(float)+sizeof(long) 400 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long)); 401 402 //fcompp 403 compiler.codeGenerator.op_fcompp(); 404 405 //fnstsw ax 406 compiler.codeGenerator.op_fnstsw_ax(); 407 408 //test ah,40h 409 compiler.codeGenerator.op_test_ah( (char)0x40 ); 410 411 //jne (Wend まで) 412 pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 413 } 414 else if( tempType.Is64() ){ 415 //64ビット型 416 417 //pop eax 418 compiler.codeGenerator.op_pop(REG_EAX); 419 420 //pop ebx 421 compiler.codeGenerator.op_pop(REG_EBX); 422 423 //cmp eax,0 424 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 425 426 //jne 427 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 428 429 //cmp ebx,0 430 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 ); 431 432 //jne 433 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 434 435 //jmp (Wendまでジャンプ) 436 pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 437 438 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 ); 439 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 ); 440 } 441 else{ 442 //その他整数型 443 444 //pop eax 445 compiler.codeGenerator.op_pop(REG_EAX); 446 447 //cmp eax,0 448 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 449 450 //je (Wend まで) 451 pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true ); 370 bool isNeedHeapFreeStructure; 371 if( NumOpe( Parameter, Type(), tempType, &isNeedHeapFreeStructure ) ) 372 { 373 if( tempType.IsObject() ) 374 { 375 // Boolean型にキャストする 376 Type booleanType( DEF_BOOLEAN ); 377 CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType ); 378 tempType = booleanType; 379 } 380 381 if( tempType.IsDouble() ){ 382 //fld qword ptr[esp] 383 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 384 385 //push 0 386 compiler.codeGenerator.op_push_V(0); 387 388 //fild dword ptr[esp] 389 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 390 391 //add esp,sizeof(double)+sizeof(long) 392 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long)); 393 394 //fcompp 395 compiler.codeGenerator.op_fcompp(); 396 397 //fnstsw ax 398 compiler.codeGenerator.op_fnstsw_ax(); 399 400 //test ah,40 401 compiler.codeGenerator.op_test_ah( (char)0x40 ); 402 403 //jne (Wend まで) 404 pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 405 } 406 else if( tempType.IsSingle() ){ 407 //fld dword ptr[esp] 408 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 409 410 //push 0 411 compiler.codeGenerator.op_push_V(0); 412 413 //fild dword ptr[esp] 414 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 415 416 //add esp,sizeof(float)+sizeof(long) 417 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long)); 418 419 //fcompp 420 compiler.codeGenerator.op_fcompp(); 421 422 //fnstsw ax 423 compiler.codeGenerator.op_fnstsw_ax(); 424 425 //test ah,40h 426 compiler.codeGenerator.op_test_ah( (char)0x40 ); 427 428 //jne (Wend まで) 429 pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true ); 430 } 431 else if( tempType.Is64() ){ 432 //64ビット型 433 434 //pop eax 435 compiler.codeGenerator.op_pop(REG_EAX); 436 437 //pop ebx 438 compiler.codeGenerator.op_pop(REG_EBX); 439 440 //cmp eax,0 441 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 442 443 //jne 444 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 445 446 //cmp ebx,0 447 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 ); 448 449 //jne 450 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 451 452 //jmp (Wendまでジャンプ) 453 pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 454 455 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 ); 456 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 ); 457 } 458 else{ 459 //その他整数型 460 461 //pop eax 462 compiler.codeGenerator.op_pop(REG_EAX); 463 464 //cmp eax,0 465 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 466 467 //je (Wend まで) 468 pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true ); 469 } 452 470 } 453 471 … … 726 744 727 745 Type tempType; 728 NumOpe(temporary,Type(),tempType); 746 bool isNeedHeapFreeStructure; 747 NumOpe( temporary, Type(), tempType, &isNeedHeapFreeStructure ); 748 749 if( tempType.IsObject() ) 750 { 751 // Boolean型にキャストする 752 Type booleanType( DEF_BOOLEAN ); 753 CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType ); 754 tempType = booleanType; 755 } 729 756 730 757 if( tempType.IsDouble() ){
Note:
See TracChangeset
for help on using the changeset viewer.