Changeset 225 in dev for trunk/abdev/BasicCompiler32/NumOpe_Arithmetic.cpp
- Timestamp:
- Jul 21, 2007, 11:47:40 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/NumOpe_Arithmetic.cpp
r206 r225 1 1 #include "stdafx.h" 2 3 #include <Compiler.h> 2 4 3 5 #include "../BasicCompiler_Common/common.h" … … 10 12 if(type[sp-1]==DEF_DOUBLE){ 11 13 //fld qword ptr[esp] 12 op_fld_ptr_esp(DEF_DOUBLE);14 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 13 15 14 16 //fistp qword ptr[esp] 15 op_fistp_ptr_esp( sizeof(_int64) );17 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 16 18 17 19 //pop ebx 18 op_pop(REG_EBX);20 compiler.codeGenerator.op_pop(REG_EBX); 19 21 20 22 //pop ecx 21 op_pop(REG_ECX);23 compiler.codeGenerator.op_pop(REG_ECX); 22 24 } 23 25 else if(type[sp-1]==DEF_SINGLE){ 24 26 //fld dword ptr[esp] 25 op_fld_ptr_esp(DEF_SINGLE);27 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 26 28 27 29 //sub esp,4 28 op_sub_esp(4);30 compiler.codeGenerator.op_sub_esp(4); 29 31 30 32 //fistp qword ptr[esp] 31 op_fistp_ptr_esp( sizeof(_int64) );33 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 32 34 33 35 //pop ebx 34 op_pop(REG_EBX);36 compiler.codeGenerator.op_pop(REG_EBX); 35 37 36 38 //pop ecx 37 op_pop(REG_ECX);39 compiler.codeGenerator.op_pop(REG_ECX); 38 40 } 39 41 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ 40 42 //pop ebx 41 op_pop(REG_EBX);43 compiler.codeGenerator.op_pop(REG_EBX); 42 44 43 45 //pop ecx 44 op_pop(REG_ECX);46 compiler.codeGenerator.op_pop(REG_ECX); 45 47 } 46 48 else{ 47 49 //pop eax 48 op_pop(REG_EAX);50 compiler.codeGenerator.op_pop(REG_EAX); 49 51 50 52 if(IsSignedType(type[sp-1])){ … … 53 55 54 56 //cdq 55 op_cdq();57 compiler.codeGenerator.op_cdq(); 56 58 } 57 59 else{ … … 60 62 61 63 //xor edx,edx 62 op_zero_reg(REG_EDX);64 compiler.codeGenerator.op_zero_reg(REG_EDX); 63 65 } 64 66 65 67 //mov ebx,eax 66 OpBuffer[obp++]=(char)0x8B; 67 OpBuffer[obp++]=(char)0xD8; 68 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX ); 68 69 69 70 //mov ecx,edx 70 OpBuffer[obp++]=(char)0x8B; 71 OpBuffer[obp++]=(char)0xCA; 71 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX ); 72 72 } 73 73 … … 75 75 if(type[sp-2]==DEF_DOUBLE){ 76 76 //fld qword ptr[esp] 77 op_fld_ptr_esp(DEF_DOUBLE);77 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 78 78 79 79 //fistp qword ptr[esp] 80 op_fistp_ptr_esp( sizeof(_int64) );80 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 81 81 82 82 //pop eax 83 op_pop(REG_EAX);83 compiler.codeGenerator.op_pop(REG_EAX); 84 84 85 85 //pop edx 86 op_pop(REG_EDX);86 compiler.codeGenerator.op_pop(REG_EDX); 87 87 } 88 88 else if(type[sp-2]==DEF_SINGLE){ 89 89 //fld dword ptr[esp] 90 op_fld_ptr_esp(DEF_SINGLE);90 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 91 91 92 92 //sub esp,4 93 op_sub_esp(4);93 compiler.codeGenerator.op_sub_esp(4); 94 94 95 95 //fistp qword ptr[esp] 96 op_fistp_ptr_esp( sizeof(_int64) );96 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 97 97 98 98 //pop eax 99 op_pop(REG_EAX);99 compiler.codeGenerator.op_pop(REG_EAX); 100 100 101 101 //pop edx 102 op_pop(REG_EDX);102 compiler.codeGenerator.op_pop(REG_EDX); 103 103 } 104 104 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ 105 105 //pop eax 106 op_pop(REG_EAX);106 compiler.codeGenerator.op_pop(REG_EAX); 107 107 108 108 //pop edx 109 op_pop(REG_EDX);109 compiler.codeGenerator.op_pop(REG_EDX); 110 110 } 111 111 else{ 112 112 //pop eax 113 op_pop(REG_EAX);113 compiler.codeGenerator.op_pop(REG_EAX); 114 114 115 115 if(IsSignedType(type[sp-2])){ … … 118 118 119 119 //cdq 120 op_cdq();120 compiler.codeGenerator.op_cdq(); 121 121 } 122 122 else{ … … 125 125 126 126 //xor edx,edx 127 op_zero_reg(REG_EDX);127 compiler.codeGenerator.op_zero_reg(REG_EDX); 128 128 } 129 129 } … … 136 136 137 137 //push ecx 138 op_push(REG_ECX);138 compiler.codeGenerator.op_push(REG_ECX); 139 139 140 140 //push ebx 141 op_push(REG_EBX);141 compiler.codeGenerator.op_push(REG_EBX); 142 142 143 143 //push edx 144 op_push(REG_EDX);144 compiler.codeGenerator.op_push(REG_EDX); 145 145 146 146 //push eax 147 op_push(REG_EAX);147 compiler.codeGenerator.op_push(REG_EAX); 148 148 } 149 149 … … 167 167 if(type[sp-1]==DEF_DOUBLE){ 168 168 //fld qword ptr[esp] 169 op_fld_ptr_esp(DEF_DOUBLE);169 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 170 170 171 171 //add esp,8 172 op_add_esp(8);172 compiler.codeGenerator.op_add_esp(8); 173 173 } 174 174 else if(type[sp-1]==DEF_SINGLE){ 175 175 //fld dword ptr[esp] 176 op_fld_ptr_esp(DEF_SINGLE);177 178 //add esp,4 179 op_add_esp(4);176 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 177 178 //add esp,4 179 compiler.codeGenerator.op_add_esp(4); 180 180 } 181 181 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ … … 183 183 184 184 //fild qword ptr[esp] 185 op_fld_ptr_esp(DEF_INT64);185 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 186 186 187 187 //add esp,8 188 op_add_esp(8);188 compiler.codeGenerator.op_add_esp(8); 189 189 } 190 190 else{ … … 192 192 193 193 //fild dword ptr[esp] 194 op_fld_ptr_esp(DEF_LONG);195 196 //add esp,4 197 op_add_esp(4);194 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 195 196 //add esp,4 197 compiler.codeGenerator.op_add_esp(4); 198 198 } 199 199 200 200 if(type[sp-2]==DEF_DOUBLE){ 201 201 //fld qword ptr[esp] 202 op_fld_ptr_esp(DEF_DOUBLE);202 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 203 203 } 204 204 else if(type[sp-2]==DEF_SINGLE){ 205 205 //fld dword ptr[esp] 206 op_fld_ptr_esp(DEF_SINGLE);206 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 207 207 } 208 208 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ 209 209 //64ビット整数値 210 op_fld_ptr_esp(DEF_INT64);210 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 211 211 } 212 212 else{ … … 214 214 215 215 //fild dword ptr[esp] 216 op_fld_ptr_esp(DEF_LONG);216 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 217 217 } 218 218 … … 220 220 if(AnswerType==DEF_SINGLE){ 221 221 //add esp,4 222 op_add_esp(4);222 compiler.codeGenerator.op_add_esp(4); 223 223 } 224 224 } … … 226 226 if(AnswerType==DEF_DOUBLE){ 227 227 //sub esp,4 228 op_sub_esp(4);228 compiler.codeGenerator.op_sub_esp(4); 229 229 } 230 230 } … … 232 232 if(idCalc==CALC_ADDITION){ 233 233 //faddp st(1),st 234 OpBuffer[obp++]=(char)0xDE; 235 OpBuffer[obp++]=(char)0xC1; 234 compiler.codeGenerator.PutOld( 235 (char)0xDE, 236 (char)0xC1 237 ); 236 238 } 237 239 else if(idCalc==CALC_SUBTRACTION){ 238 240 //fsubrp st(1),st 239 OpBuffer[obp++]=(char)0xDE; 240 OpBuffer[obp++]=(char)0xE1; 241 compiler.codeGenerator.PutOld( 242 (char)0xDE, 243 (char)0xE1 244 ); 241 245 } 242 246 else if(idCalc==CALC_PRODUCT){ 243 247 //fmulp st(1),st 244 OpBuffer[obp++]=(char)0xDE; 245 OpBuffer[obp++]=(char)0xC9; 248 compiler.codeGenerator.PutOld( 249 (char)0xDE, 250 (char)0xC9 251 ); 246 252 } 247 253 248 254 if(AnswerType==DEF_DOUBLE){ 249 255 //fstp qword ptr[esp] 250 OpBuffer[obp++]=(char)0xDD; 251 OpBuffer[obp++]=(char)0x1C; 252 OpBuffer[obp++]=(char)0x24; 256 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 253 257 } 254 258 else{ 255 259 //fstp dword ptr[esp] 256 OpBuffer[obp++]=(char)0xD9; 257 OpBuffer[obp++]=(char)0x1C; 258 OpBuffer[obp++]=(char)0x24; 260 compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP ); 259 261 } 260 262 } … … 273 275 //call _allmul 274 276 extern const UserProc *pSub_allmul; 275 op_call(pSub_allmul);277 compiler.codeGenerator.op_call(pSub_allmul); 276 278 277 279 //push edx 278 op_push(REG_EDX);280 compiler.codeGenerator.op_push(REG_EDX); 279 281 280 282 //push eax 281 op_push(REG_EAX);283 compiler.codeGenerator.op_push(REG_EAX); 282 284 } 283 285 else{ … … 286 288 287 289 //pop ebx 288 op_pop(REG_EBX);290 compiler.codeGenerator.op_pop(REG_EBX); 289 291 290 292 //pop ecx 291 op_pop(REG_ECX);293 compiler.codeGenerator.op_pop(REG_ECX); 292 294 } 293 295 else{ … … 295 297 296 298 //pop eax 297 op_pop(REG_EAX);299 compiler.codeGenerator.op_pop(REG_EAX); 298 300 299 301 if(IsSignedType(type[sp-1])){ … … 302 304 303 305 //cdq 304 op_cdq();306 compiler.codeGenerator.op_cdq(); 305 307 } 306 308 else{ … … 309 311 310 312 //xor edx,edx 311 op_zero_reg(REG_EDX);313 compiler.codeGenerator.op_zero_reg(REG_EDX); 312 314 } 313 315 314 316 //mov ebx,eax 315 OpBuffer[obp++]=(char)0x8B; 316 OpBuffer[obp++]=(char)0xD8; 317 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX ); 317 318 318 319 //mov ecx,edx 319 OpBuffer[obp++]=(char)0x8B; 320 OpBuffer[obp++]=(char)0xCA; 320 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX ); 321 321 } 322 322 … … 326 326 if(idCalc==CALC_ADDITION){ 327 327 //add dword ptr[esp],ebx 328 OpBuffer[obp++]=(char)0x01; 329 OpBuffer[obp++]=(char)0x1C; 330 OpBuffer[obp++]=(char)0x24; 328 compiler.codeGenerator.PutOld( 329 (char)0x01, 330 (char)0x1C, 331 (char)0x24 332 ); 331 333 332 334 //adc dword ptr[esp+sizeof(long)],ecx 333 OpBuffer[obp++]=(char)0x11; 334 OpBuffer[obp++]=(char)0x4C; 335 OpBuffer[obp++]=(char)0x24; 336 OpBuffer[obp++]=(char)0x04; 335 compiler.codeGenerator.PutOld( 336 (char)0x11, 337 (char)0x4C, 338 (char)0x24, 339 (char)0x04 340 ); 337 341 } 338 342 else if(idCalc==CALC_SUBTRACTION){ 339 343 //sub dword ptr[esp],ebx 340 OpBuffer[obp++]=(char)0x29; 341 OpBuffer[obp++]=(char)0x1C; 342 OpBuffer[obp++]=(char)0x24; 344 compiler.codeGenerator.PutOld( 345 (char)0x29, 346 (char)0x1C, 347 (char)0x24 348 ); 343 349 344 350 //sbb dword ptr[esp+sizeof(long)],ecx 345 OpBuffer[obp++]=(char)0x19; 346 OpBuffer[obp++]=(char)0x4C; 347 OpBuffer[obp++]=(char)0x24; 348 OpBuffer[obp++]=(char)0x04; 351 compiler.codeGenerator.PutOld( 352 (char)0x19, 353 (char)0x4C, 354 (char)0x24, 355 (char)0x04 356 ); 349 357 } 350 358 } … … 353 361 354 362 //pop eax 355 op_pop(REG_EAX);363 compiler.codeGenerator.op_pop(REG_EAX); 356 364 357 365 if(IsSignedType(type[sp-2])){ … … 360 368 361 369 //cdq 362 op_cdq();370 compiler.codeGenerator.op_cdq(); 363 371 } 364 372 else{ … … 367 375 368 376 //xor edx,edx 369 op_zero_reg(REG_EDX);377 compiler.codeGenerator.op_zero_reg(REG_EDX); 370 378 } 371 379 372 380 if(idCalc==CALC_ADDITION){ 373 381 //add ebx,eax 374 OpBuffer[obp++]=(char)0x03; 375 OpBuffer[obp++]=(char)0xD8; 382 compiler.codeGenerator.op_add_RR( REG_EBX, REG_EAX ); 376 383 377 384 //adc ecx,edx 378 OpBuffer[obp++]=(char)0x13; 379 OpBuffer[obp++]=(char)0xCA; 385 compiler.codeGenerator.op_adc_RR( REG_ECX, REG_EDX ); 380 386 } 381 387 else if(idCalc==CALC_SUBTRACTION){ 382 388 //sub ebx,eax 383 OpBuffer[obp++]=(char)0x2B; 384 OpBuffer[obp++]=(char)0xC3; 389 compiler.codeGenerator.op_sub_RR( REG_EBX, REG_EAX ); 385 390 386 391 //sbb ecx,edx 387 OpBuffer[obp++]=(char)0x1B; 388 OpBuffer[obp++]=(char)0xD1; 392 compiler.codeGenerator.op_sub_RR( REG_ECX, REG_EDX ); 389 393 } 390 394 391 395 //push ecx 392 op_push(REG_ECX);396 compiler.codeGenerator.op_push(REG_ECX); 393 397 394 398 //push ebx 395 op_push(REG_EBX);399 compiler.codeGenerator.op_push(REG_EBX); 396 400 } 397 401 } … … 403 407 404 408 //pop ebx 405 op_pop(REG_EBX);409 compiler.codeGenerator.op_pop(REG_EBX); 406 410 407 411 //pop eax 408 op_pop(REG_EAX);412 compiler.codeGenerator.op_pop(REG_EAX); 409 413 410 414 //sub esp,4 411 op_sub_esp(4);415 compiler.codeGenerator.op_sub_esp(4); 412 416 413 417 if(idCalc==CALC_ADDITION){ 414 418 //add eax,ebx 415 OpBuffer[obp++]=(char)0x03; 416 OpBuffer[obp++]=(char)0xC3; 419 compiler.codeGenerator.op_add_RR( REG_EAX, REG_EBX ); 417 420 } 418 421 else if(idCalc==CALC_SUBTRACTION){ 419 422 //sub eax,ebx 420 OpBuffer[obp++]=(char)0x2B; 421 OpBuffer[obp++]=(char)0xC3; 423 compiler.codeGenerator.op_sub_RR( REG_EAX, REG_EBX ); 422 424 } 423 425 else if(idCalc==CALC_PRODUCT){ 424 426 //imul eax,ebx(64ビット演算ではないので、符号を考慮しない) 425 OpBuffer[obp++]=(char)0x0F; 426 OpBuffer[obp++]=(char)0xAF; 427 OpBuffer[obp++]=(char)0xC3; 427 compiler.codeGenerator.op_imul_RR( REG_EAX, REG_EBX ); 428 428 } 429 429 430 430 //mov dword ptr[esp],eax 431 OpBuffer[obp++]=(char)0x89; 432 OpBuffer[obp++]=(char)0x04; 433 OpBuffer[obp++]=(char)0x24; 431 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 434 432 } 435 433 … … 463 461 //call _aullrem 464 462 extern const UserProc *pSub_aullrem; 465 op_call(pSub_aullrem);463 compiler.codeGenerator.op_call(pSub_aullrem); 466 464 } 467 465 else{ … … 470 468 //call _allrem 471 469 extern const UserProc *pSub_allrem; 472 op_call(pSub_allrem);470 compiler.codeGenerator.op_call(pSub_allrem); 473 471 } 474 472 475 473 //push edx 476 op_push(REG_EDX);474 compiler.codeGenerator.op_push(REG_EDX); 477 475 478 476 //push eax 479 op_push(REG_EAX);477 compiler.codeGenerator.op_push(REG_EAX); 480 478 481 479 sp--; … … 490 488 if(type[sp-1]==DEF_DOUBLE){ 491 489 //fld qword ptr[esp] 492 op_fld_ptr_esp(DEF_DOUBLE);493 494 //add esp,4 495 op_add_esp(4);496 497 //fistp dword ptr[esp] 498 op_fistp_ptr_esp( sizeof(long) );490 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 491 492 //add esp,4 493 compiler.codeGenerator.op_add_esp(4); 494 495 //fistp dword ptr[esp] 496 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 499 497 } 500 498 else if(type[sp-1]==DEF_SINGLE){ 501 499 //fld dword ptr[esp] 502 op_fld_ptr_esp(DEF_SINGLE);503 504 //fistp dword ptr[esp] 505 op_fistp_ptr_esp( sizeof(long) );500 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 501 502 //fistp dword ptr[esp] 503 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 506 504 } 507 505 508 506 //pop ebx 509 op_pop(REG_EBX);507 compiler.codeGenerator.op_pop(REG_EBX); 510 508 511 509 if(type[sp-2]==DEF_DOUBLE){ 512 510 //fld qword ptr[esp] 513 op_fld_ptr_esp(DEF_DOUBLE);514 515 //add esp,4 516 op_add_esp(4);517 518 //fistp dword ptr[esp] 519 op_fistp_ptr_esp( sizeof(long) );511 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 512 513 //add esp,4 514 compiler.codeGenerator.op_add_esp(4); 515 516 //fistp dword ptr[esp] 517 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 520 518 } 521 519 else if(type[sp-2]==DEF_SINGLE){ 522 520 //fld dword ptr[esp] 523 op_fld_ptr_esp(DEF_SINGLE);524 525 //fistp dword ptr[esp] 526 op_fistp_ptr_esp( sizeof(long) );521 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 522 523 //fistp dword ptr[esp] 524 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 527 525 } 528 526 529 527 //pop eax 530 op_pop(REG_EAX);528 compiler.codeGenerator.op_pop(REG_EAX); 531 529 532 530 //sub esp,4 533 op_sub_esp(4);531 compiler.codeGenerator.op_sub_esp(4); 534 532 535 533 if(type[sp-2]==DEF_DWORD&&type[sp-1]==DEF_DWORD){ 536 534 //xor edx,edx 537 op_zero_reg(REG_EDX);535 compiler.codeGenerator.op_zero_reg(REG_EDX); 538 536 539 537 //div ebx (eax=eax/ebx...edx) 540 OpBuffer[obp++]=(char)0xF7; 541 OpBuffer[obp++]=(char)0xF3; 538 compiler.codeGenerator.op_div_R( REG_EBX ); 542 539 } 543 540 else{ 544 541 //cdq 545 op_cdq();542 compiler.codeGenerator.op_cdq(); 546 543 547 544 //idiv ebx (eax=eax/ebx...edx) 548 OpBuffer[obp++]=(char)0xF7; 549 OpBuffer[obp++]=(char)0xFB; 545 compiler.codeGenerator.op_idiv_R( REG_EBX ); 550 546 } 551 547 552 548 //mov dword ptr[esp],edx 553 OpBuffer[obp++]=(char)0x89; 554 OpBuffer[obp++]=(char)0x14; 555 OpBuffer[obp++]=(char)0x24; 549 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EDX, REG_ESP, 0, MOD_BASE ); 556 550 557 551 sp--; … … 581 575 if(type[sp-1]==DEF_DOUBLE){ 582 576 //fld qword ptr[esp] 583 op_fld_ptr_esp(DEF_DOUBLE);577 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 584 578 585 579 //add esp,8 586 op_add_esp(8);580 compiler.codeGenerator.op_add_esp(8); 587 581 } 588 582 else if(type[sp-1]==DEF_SINGLE){ 589 583 //fld dword ptr[esp] 590 op_fld_ptr_esp(DEF_SINGLE);584 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 591 585 592 586 //add esp,4 593 op_add_esp(4);587 compiler.codeGenerator.op_add_esp(4); 594 588 } 595 589 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ … … 597 591 598 592 //fild qword ptr[esp] 599 op_fld_ptr_esp(DEF_INT64);593 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 600 594 601 595 //add esp,8 602 op_add_esp(8);596 compiler.codeGenerator.op_add_esp(8); 603 597 } 604 598 else if(type[sp-1]==DEF_DWORD){ 605 599 //pop eax 606 op_pop(REG_EAX);600 compiler.codeGenerator.op_pop(REG_EAX); 607 601 608 602 //push 0 609 op_push_V(0);603 compiler.codeGenerator.op_push_V(0); 610 604 611 605 //push eax 612 op_push(REG_EAX);606 compiler.codeGenerator.op_push(REG_EAX); 613 607 614 608 //fild qword ptr[esp] 615 OpBuffer[obp++]=(char)0xDF; 616 OpBuffer[obp++]=(char)0x2C; 617 OpBuffer[obp++]=(char)0x24; 609 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 618 610 619 611 //add esp,8 620 op_add_esp(8);612 compiler.codeGenerator.op_add_esp(8); 621 613 } 622 614 else{ 623 615 //fild dword ptr[esp] 624 op_fld_ptr_esp(DEF_LONG);616 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 625 617 626 618 //add esp,4 627 op_add_esp(4);619 compiler.codeGenerator.op_add_esp(4); 628 620 } 629 621 630 622 if(type[sp-2]==DEF_DOUBLE){ 631 623 //fld qword ptr[esp] 632 op_fld_ptr_esp(DEF_DOUBLE);624 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 633 625 } 634 626 else if(type[sp-2]==DEF_SINGLE){ 635 627 //fld dword ptr[esp] 636 op_fld_ptr_esp(DEF_SINGLE);628 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 637 629 } 638 630 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ … … 640 632 641 633 //fild qword ptr[esp] 642 op_fld_ptr_esp(DEF_INT64);634 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 643 635 } 644 636 else if(type[sp-2]==DEF_DWORD){ 645 637 //pop eax 646 op_pop(REG_EAX);638 compiler.codeGenerator.op_pop(REG_EAX); 647 639 648 640 //push 0 649 op_push_V(0);641 compiler.codeGenerator.op_push_V(0); 650 642 651 643 //push eax 652 op_push(REG_EAX);644 compiler.codeGenerator.op_push(REG_EAX); 653 645 654 646 //fild qword ptr[esp] 655 OpBuffer[obp++]=(char)0xDF; 656 OpBuffer[obp++]=(char)0x2C; 657 OpBuffer[obp++]=(char)0x24; 647 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 658 648 } 659 649 else{ //Long 660 650 //fild dword ptr[esp] 661 op_fld_ptr_esp(DEF_LONG);651 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 662 652 } 663 653 //↓ここだけ例外DWord … … 665 655 if(AnswerType==DEF_SINGLE){ 666 656 //add esp,4 667 op_add_esp(4);657 compiler.codeGenerator.op_add_esp(4); 668 658 } 669 659 } … … 671 661 if(AnswerType==DEF_DOUBLE){ 672 662 //sub esp,4 673 op_sub_esp(4);663 compiler.codeGenerator.op_sub_esp(4); 674 664 } 675 665 } 676 666 677 667 //fdivrp st(1),st 678 OpBuffer[obp++]=(char)0xDE; 679 OpBuffer[obp++]=(char)0xF1; 668 compiler.codeGenerator.PutOld( 669 (char)0xDE, 670 (char)0xF1 671 ); 680 672 681 673 sp--; 682 674 if(AnswerType==DEF_DOUBLE){ 683 675 //fstp qword ptr[esp] 684 OpBuffer[obp++]=(char)0xDD; 685 OpBuffer[obp++]=(char)0x1C; 686 OpBuffer[obp++]=(char)0x24; 676 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 687 677 688 678 type[sp-1]=DEF_DOUBLE; … … 690 680 else{ 691 681 //fstp dword ptr[esp] 692 OpBuffer[obp++]=(char)0xD9; 693 OpBuffer[obp++]=(char)0x1C; 694 OpBuffer[obp++]=(char)0x24; 682 compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP ); 695 683 696 684 type[sp-1]=DEF_SINGLE; … … 723 711 //call _aulldiv 724 712 extern const UserProc *pSub_aulldiv; 725 op_call(pSub_aulldiv);713 compiler.codeGenerator.op_call(pSub_aulldiv); 726 714 } 727 715 else{ … … 730 718 //call _alldiv 731 719 extern const UserProc *pSub_alldiv; 732 op_call(pSub_alldiv);720 compiler.codeGenerator.op_call(pSub_alldiv); 733 721 } 734 722 735 723 //push edx 736 op_push(REG_EDX);724 compiler.codeGenerator.op_push(REG_EDX); 737 725 738 726 //push eax 739 op_push(REG_EAX);727 compiler.codeGenerator.op_push(REG_EAX); 740 728 741 729 sp--; … … 750 738 if(type[sp-1]==DEF_DOUBLE){ 751 739 //fld qword ptr[esp] 752 op_fld_ptr_esp(DEF_DOUBLE);753 754 //add esp,4 755 op_add_esp(4);756 757 //fistp dword ptr[esp] 758 op_fistp_ptr_esp( sizeof(long) );740 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 741 742 //add esp,4 743 compiler.codeGenerator.op_add_esp(4); 744 745 //fistp dword ptr[esp] 746 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 759 747 } 760 748 else if(type[sp-1]==DEF_SINGLE){ 761 749 //fld dword ptr[esp] 762 op_fld_ptr_esp(DEF_SINGLE);763 764 //fistp dword ptr[esp] 765 op_fistp_ptr_esp( sizeof(long) );750 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 751 752 //fistp dword ptr[esp] 753 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 766 754 } 767 755 768 756 //pop ebx 769 op_pop(REG_EBX);757 compiler.codeGenerator.op_pop(REG_EBX); 770 758 771 759 if(type[sp-2]==DEF_DOUBLE){ 772 760 //fld qword ptr[esp] 773 op_fld_ptr_esp(DEF_DOUBLE);774 775 //add esp,4 776 op_add_esp(4);777 778 //fistp dword ptr[esp] 779 op_fistp_ptr_esp( sizeof(long) );761 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 762 763 //add esp,4 764 compiler.codeGenerator.op_add_esp(4); 765 766 //fistp dword ptr[esp] 767 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 780 768 } 781 769 else if(type[sp-2]==DEF_SINGLE){ 782 770 //fld dword ptr[esp] 783 op_fld_ptr_esp(DEF_SINGLE);784 785 //fistp dword ptr[esp] 786 op_fistp_ptr_esp( sizeof(long) );771 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 772 773 //fistp dword ptr[esp] 774 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 787 775 } 788 776 789 777 //pop eax 790 op_pop(REG_EAX);778 compiler.codeGenerator.op_pop(REG_EAX); 791 779 792 780 //sub esp,4 793 op_sub_esp(4);781 compiler.codeGenerator.op_sub_esp(4); 794 782 795 783 if((type[sp-2]==DEF_DWORD&&type[sp-1]==DEF_DWORD)|| … … 797 785 (type[sp-2]==DEF_DWORD&&IS_POSITIVE_LITERAL(index_stack[sp-1]))){ 798 786 //xor edx,edx 799 op_zero_reg(REG_EDX);787 compiler.codeGenerator.op_zero_reg(REG_EDX); 800 788 801 789 //div ebx (eax=eax/ebx...edx) 802 OpBuffer[obp++]=(char)0xF7; 803 OpBuffer[obp++]=(char)0xF3; 790 compiler.codeGenerator.op_div_R( REG_EBX ); 804 791 } 805 792 else{ 806 793 //cdq 807 op_cdq();794 compiler.codeGenerator.op_cdq(); 808 795 809 796 //idiv ebx (eax=eax/ebx...edx) 810 OpBuffer[obp++]=(char)0xF7; 811 OpBuffer[obp++]=(char)0xFB; 797 compiler.codeGenerator.op_idiv_R( REG_EBX ); 812 798 } 813 799 814 800 //mov dword ptr[esp],eax 815 OpBuffer[obp++]=(char)0x89; 816 OpBuffer[obp++]=(char)0x04; 817 OpBuffer[obp++]=(char)0x24; 801 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 818 802 819 803 sp--; … … 833 817 if(type[sp-1]==DEF_DOUBLE){ 834 818 //fld qword ptr[esp] 835 op_fld_ptr_esp(DEF_DOUBLE);819 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 836 820 837 821 //push -1 838 op_push_V(-1);822 compiler.codeGenerator.op_push_V(-1); 839 823 840 824 //fild dword ptr[esp] 841 op_fld_ptr_esp(DEF_LONG);825 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 842 826 843 827 //add esp,4 844 op_add_esp(4);828 compiler.codeGenerator.op_add_esp(4); 845 829 846 830 //fmulp st(1),st 847 OpBuffer[obp++]=(char)0xDE; 848 OpBuffer[obp++]=(char)0xC9; 831 compiler.codeGenerator.PutOld( 832 (char)0xDE, 833 (char)0xC9 834 ); 849 835 850 836 //fstp qword ptr[esp] 851 OpBuffer[obp++]=(char)0xDD; 852 OpBuffer[obp++]=(char)0x1C; 853 OpBuffer[obp++]=(char)0x24; 837 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 854 838 } 855 839 else if(type[sp-1]==DEF_SINGLE){ 856 840 //fld dword ptr[esp] 857 op_fld_ptr_esp(DEF_SINGLE);841 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 858 842 859 843 //push -1 860 op_push_V(-1);844 compiler.codeGenerator.op_push_V(-1); 861 845 862 846 //fild dword ptr[esp] 863 op_fld_ptr_esp(DEF_LONG);847 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 864 848 865 849 //add esp,4 866 op_add_esp(4);850 compiler.codeGenerator.op_add_esp(4); 867 851 868 852 //fmulp st(1),st 869 OpBuffer[obp++]=(char)0xDE; 870 OpBuffer[obp++]=(char)0xC9; 853 compiler.codeGenerator.PutOld( 854 (char)0xDE, 855 (char)0xC9 856 ); 871 857 872 858 //fstp dword ptr[esp] 873 OpBuffer[obp++]=(char)0xD9; 874 OpBuffer[obp++]=(char)0x1C; 875 OpBuffer[obp++]=(char)0x24; 859 compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP ); 876 860 } 877 861 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ 878 862 //pop eax 879 op_pop(REG_EAX);863 compiler.codeGenerator.op_pop(REG_EAX); 880 864 881 865 //neg eax 882 OpBuffer[obp++]=(char)0xF7; 883 OpBuffer[obp++]=(char)0xD8; 866 compiler.codeGenerator.op_neg( REG_EAX ); 884 867 885 868 //pop edx 886 op_pop(REG_EDX);869 compiler.codeGenerator.op_pop(REG_EDX); 887 870 888 871 //adc edx,0 889 OpBuffer[obp++]=(char)0x83; 890 OpBuffer[obp++]=(char)0xD2; 891 OpBuffer[obp++]=(char)0x00; 872 compiler.codeGenerator.op_adc_RV8(REG_EDX,0); 892 873 893 874 //neg edx 894 OpBuffer[obp++]=(char)0xF7; 895 OpBuffer[obp++]=(char)0xDA; 875 compiler.codeGenerator.op_neg( REG_EDX ); 896 876 897 877 //push edx 898 op_push(REG_EDX);878 compiler.codeGenerator.op_push(REG_EDX); 899 879 900 880 //push eax 901 op_push(REG_EAX);881 compiler.codeGenerator.op_push(REG_EAX); 902 882 903 883 type[sp-1]=DEF_INT64; //QWordはInt64へ … … 905 885 else if(IsWholeNumberType(type[sp-1])){ 906 886 //pop eax 907 op_pop(REG_EAX);887 compiler.codeGenerator.op_pop(REG_EAX); 908 888 909 889 //imul eax,-1 910 OpBuffer[obp++]=(char)0x6B; 911 OpBuffer[obp++]=(char)0xC0; 912 OpBuffer[obp++]=(char)0xFF; 890 compiler.codeGenerator.op_imul_RV8( REG_EAX, -1 ); 913 891 914 892 //push eax 915 op_push(REG_EAX);893 compiler.codeGenerator.op_push(REG_EAX); 916 894 917 895 type[sp-1]=GetSignedType(type[sp-1]); … … 929 907 if(type[sp-1]==DEF_DOUBLE){ 930 908 //fld qword ptr[esp] 931 op_fld_ptr_esp(DEF_DOUBLE);909 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 932 910 933 911 //add esp,8 934 op_add_esp(8);912 compiler.codeGenerator.op_add_esp(8); 935 913 } 936 914 else if(type[sp-1]==DEF_SINGLE){ 937 915 //fld dword ptr[esp] 938 op_fld_ptr_esp(DEF_SINGLE);916 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 939 917 940 918 //add esp,4 941 op_add_esp(4);919 compiler.codeGenerator.op_add_esp(4); 942 920 } 943 921 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ … … 945 923 946 924 //fild qword ptr[esp] 947 op_fld_ptr_esp(DEF_INT64);925 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 948 926 949 927 //add esp,8 950 op_add_esp(8);928 compiler.codeGenerator.op_add_esp(8); 951 929 } 952 930 else{ … … 954 932 955 933 //fild dword ptr[esp] 956 op_fld_ptr_esp(DEF_LONG);934 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 957 935 958 936 //add esp,4 959 op_add_esp(4);937 compiler.codeGenerator.op_add_esp(4); 960 938 } 961 939 962 940 if(type[sp-2]==DEF_DOUBLE){ 963 941 //fld qword ptr[esp] 964 op_fld_ptr_esp(DEF_DOUBLE);942 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 965 943 } 966 944 else if(type[sp-2]==DEF_SINGLE){ 967 945 //fld dword ptr[esp] 968 op_fld_ptr_esp(DEF_SINGLE);946 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 969 947 970 948 //sub esp,4 971 op_sub_esp(4);949 compiler.codeGenerator.op_sub_esp(4); 972 950 } 973 951 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ … … 975 953 976 954 //fild qword ptr[esp] 977 op_fld_ptr_esp(DEF_INT64);955 compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64); 978 956 } 979 957 else{ … … 981 959 982 960 //fild dword ptr[esp] 983 op_fld_ptr_esp(DEF_LONG);961 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG); 984 962 985 963 //sub esp,4 986 op_sub_esp(4);964 compiler.codeGenerator.op_sub_esp(4); 987 965 } 988 966 989 967 //sub esp,8 990 op_sub_esp(8);968 compiler.codeGenerator.op_sub_esp(8); 991 969 992 970 //fstp qword ptr[esp] 993 OpBuffer[obp++]=(char)0xDD; 994 OpBuffer[obp++]=(char)0x1C; 995 OpBuffer[obp++]=(char)0x24; 971 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 996 972 997 973 //fstp qword ptr[esp+8] 998 OpBuffer[obp++]=(char)0xDD; 999 OpBuffer[obp++]=(char)0x5C; 1000 OpBuffer[obp++]=(char)0x24; 1001 OpBuffer[obp++]=(char)0x08; 974 compiler.codeGenerator.op_fstp_base_offset(DEF_DOUBLE,REG_ESP,8); 1002 975 1003 976 //call pow 1004 977 extern const UserProc *pSub_pow; 1005 op_call(pSub_pow);978 compiler.codeGenerator.op_call(pSub_pow); 1006 979 1007 980 //sub esp,8 1008 op_sub_esp(8);981 compiler.codeGenerator.op_sub_esp(8); 1009 982 1010 983 //fstp qword ptr[esp] 1011 OpBuffer[obp++]=(char)0xDD; 1012 OpBuffer[obp++]=(char)0x1C; 1013 OpBuffer[obp++]=(char)0x24; 984 compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP ); 1014 985 1015 986 sp--; … … 1067 1038 if(type[sp-1]==DEF_DOUBLE){ 1068 1039 //fld qword ptr[esp] 1069 op_fld_ptr_esp(DEF_DOUBLE);1070 1071 //add esp,4 1072 op_add_esp(4);1073 1074 //fistp dword ptr[esp] 1075 op_fistp_ptr_esp( sizeof(long) );1076 1077 //pop ecx 1078 op_pop(REG_ECX);1040 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1041 1042 //add esp,4 1043 compiler.codeGenerator.op_add_esp(4); 1044 1045 //fistp dword ptr[esp] 1046 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1047 1048 //pop ecx 1049 compiler.codeGenerator.op_pop(REG_ECX); 1079 1050 } 1080 1051 else if(type[sp-1]==DEF_SINGLE){ 1081 1052 //fld dword ptr[esp] 1082 op_fld_ptr_esp(DEF_SINGLE);1083 1084 //fistp dword ptr[esp] 1085 op_fistp_ptr_esp( sizeof(long) );1086 1087 //pop ecx 1088 op_pop(REG_ECX);1053 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1054 1055 //fistp dword ptr[esp] 1056 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1057 1058 //pop ecx 1059 compiler.codeGenerator.op_pop(REG_ECX); 1089 1060 } 1090 1061 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ 1091 1062 //pop ecx 1092 op_pop(REG_ECX);1093 1094 //add esp,4 1095 op_add_esp(4);1096 } 1097 else{ 1098 //pop ecx 1099 op_pop(REG_ECX);1063 compiler.codeGenerator.op_pop(REG_ECX); 1064 1065 //add esp,4 1066 compiler.codeGenerator.op_add_esp(4); 1067 } 1068 else{ 1069 //pop ecx 1070 compiler.codeGenerator.op_pop(REG_ECX); 1100 1071 } 1101 1072 … … 1103 1074 if(type[sp-2]==DEF_DOUBLE){ 1104 1075 //fld qword ptr[esp] 1105 op_fld_ptr_esp(DEF_DOUBLE);1076 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1106 1077 1107 1078 //fistp qword ptr[esp] 1108 op_fistp_ptr_esp( sizeof(_int64) );1079 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 1109 1080 1110 1081 //pop eax 1111 op_pop(REG_EAX);1082 compiler.codeGenerator.op_pop(REG_EAX); 1112 1083 1113 1084 //pop edx 1114 op_pop(REG_EDX);1085 compiler.codeGenerator.op_pop(REG_EDX); 1115 1086 } 1116 1087 else if(type[sp-2]==DEF_SINGLE){ 1117 1088 //fld dword ptr[esp] 1118 op_fld_ptr_esp(DEF_SINGLE);1089 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1119 1090 1120 1091 //sub esp,4 1121 op_sub_esp(4);1092 compiler.codeGenerator.op_sub_esp(4); 1122 1093 1123 1094 //fistp qword ptr[esp] 1124 op_fistp_ptr_esp( sizeof(_int64) );1095 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 1125 1096 1126 1097 //pop eax 1127 op_pop(REG_EAX);1098 compiler.codeGenerator.op_pop(REG_EAX); 1128 1099 1129 1100 //pop edx 1130 op_pop(REG_EDX);1101 compiler.codeGenerator.op_pop(REG_EDX); 1131 1102 } 1132 1103 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ 1133 1104 //pop eax 1134 op_pop(REG_EAX);1105 compiler.codeGenerator.op_pop(REG_EAX); 1135 1106 1136 1107 //pop edx 1137 op_pop(REG_EDX);1108 compiler.codeGenerator.op_pop(REG_EDX); 1138 1109 } 1139 1110 else{ 1140 1111 //pop eax 1141 op_pop(REG_EAX);1112 compiler.codeGenerator.op_pop(REG_EAX); 1142 1113 1143 1114 if(IsSignedType(type[sp-2])){ … … 1146 1117 1147 1118 //cdq 1148 op_cdq();1119 compiler.codeGenerator.op_cdq(); 1149 1120 } 1150 1121 else{ … … 1153 1124 1154 1125 //xor edx,edx 1155 op_zero_reg(REG_EDX);1126 compiler.codeGenerator.op_zero_reg(REG_EDX); 1156 1127 } 1157 1128 } … … 1159 1130 //call _allshl 1160 1131 extern const UserProc *pSub_allshl; 1161 op_call(pSub_allshl);1132 compiler.codeGenerator.op_call(pSub_allshl); 1162 1133 1163 1134 //push edx 1164 op_push(REG_EDX);1135 compiler.codeGenerator.op_push(REG_EDX); 1165 1136 1166 1137 //push eax 1167 op_push(REG_EAX);1138 compiler.codeGenerator.op_push(REG_EAX); 1168 1139 1169 1140 sp--; … … 1177 1148 if(type[sp-1]==DEF_DOUBLE){ 1178 1149 //fld qword ptr[esp] 1179 op_fld_ptr_esp(DEF_DOUBLE);1180 1181 //add esp,4 1182 op_add_esp(4);1183 1184 //fistp dword ptr[esp] 1185 op_fistp_ptr_esp( sizeof(long) );1186 1187 //pop ecx 1188 op_pop(REG_ECX);1150 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1151 1152 //add esp,4 1153 compiler.codeGenerator.op_add_esp(4); 1154 1155 //fistp dword ptr[esp] 1156 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1157 1158 //pop ecx 1159 compiler.codeGenerator.op_pop(REG_ECX); 1189 1160 } 1190 1161 else if(type[sp-1]==DEF_SINGLE){ 1191 1162 //fld dword ptr[esp] 1192 op_fld_ptr_esp(DEF_SINGLE);1193 1194 //fistp dword ptr[esp] 1195 op_fistp_ptr_esp( sizeof(long) );1196 1197 //pop ecx 1198 op_pop(REG_ECX);1163 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1164 1165 //fistp dword ptr[esp] 1166 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1167 1168 //pop ecx 1169 compiler.codeGenerator.op_pop(REG_ECX); 1199 1170 } 1200 1171 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ 1201 1172 //pop ecx 1202 op_pop(REG_ECX);1203 1204 //add esp,4 1205 op_add_esp(4);1206 } 1207 else{ 1208 //pop ecx 1209 op_pop(REG_ECX);1173 compiler.codeGenerator.op_pop(REG_ECX); 1174 1175 //add esp,4 1176 compiler.codeGenerator.op_add_esp(4); 1177 } 1178 else{ 1179 //pop ecx 1180 compiler.codeGenerator.op_pop(REG_ECX); 1210 1181 } 1211 1182 1212 1183 if(type[sp-2]==DEF_DOUBLE){ 1213 1184 //fld qword ptr[esp] 1214 op_fld_ptr_esp(DEF_DOUBLE);1215 1216 //add esp,4 1217 op_add_esp(4);1218 1219 //fistp dword ptr[esp] 1220 op_fistp_ptr_esp( sizeof(long) );1185 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1186 1187 //add esp,4 1188 compiler.codeGenerator.op_add_esp(4); 1189 1190 //fistp dword ptr[esp] 1191 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1221 1192 } 1222 1193 else if(type[sp-2]==DEF_SINGLE){ 1223 1194 //fld dword ptr[esp] 1224 op_fld_ptr_esp(DEF_SINGLE);1225 1226 //fistp dword ptr[esp] 1227 op_fistp_ptr_esp( sizeof(long) );1195 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1196 1197 //fistp dword ptr[esp] 1198 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1228 1199 } 1229 1200 1230 1201 //pop eax 1231 op_pop(REG_EAX);1202 compiler.codeGenerator.op_pop(REG_EAX); 1232 1203 1233 1204 //sub esp,4 1234 op_sub_esp(4);1205 compiler.codeGenerator.op_sub_esp(4); 1235 1206 1236 1207 //shl eax,cl 1237 OpBuffer[obp++]=(char)0xD3; 1238 OpBuffer[obp++]=(char)0xE0; 1208 compiler.codeGenerator.PutOld( 1209 (char)0xD3, 1210 (char)0xE0 1211 ); 1239 1212 1240 1213 //mov dword ptr[esp],eax 1241 OpBuffer[obp++]=(char)0x89; 1242 OpBuffer[obp++]=(char)0x04; 1243 OpBuffer[obp++]=(char)0x24; 1214 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 1244 1215 1245 1216 sp--; … … 1269 1240 if(type[sp-1]==DEF_DOUBLE){ 1270 1241 //fld qword ptr[esp] 1271 op_fld_ptr_esp(DEF_DOUBLE);1272 1273 //add esp,4 1274 op_add_esp(4);1275 1276 //fistp dword ptr[esp] 1277 op_fistp_ptr_esp( sizeof(long) );1278 1279 //pop ecx 1280 op_pop(REG_ECX);1242 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1243 1244 //add esp,4 1245 compiler.codeGenerator.op_add_esp(4); 1246 1247 //fistp dword ptr[esp] 1248 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1249 1250 //pop ecx 1251 compiler.codeGenerator.op_pop(REG_ECX); 1281 1252 } 1282 1253 else if(type[sp-1]==DEF_SINGLE){ 1283 1254 //fld dword ptr[esp] 1284 op_fld_ptr_esp(DEF_SINGLE);1285 1286 //fistp dword ptr[esp] 1287 op_fistp_ptr_esp( sizeof(long) );1288 1289 //pop ecx 1290 op_pop(REG_ECX);1255 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1256 1257 //fistp dword ptr[esp] 1258 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1259 1260 //pop ecx 1261 compiler.codeGenerator.op_pop(REG_ECX); 1291 1262 } 1292 1263 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ 1293 1264 //pop ecx 1294 op_pop(REG_ECX);1295 1296 //add esp,4 1297 op_add_esp(4);1298 } 1299 else{ 1300 //pop ecx 1301 op_pop(REG_ECX);1265 compiler.codeGenerator.op_pop(REG_ECX); 1266 1267 //add esp,4 1268 compiler.codeGenerator.op_add_esp(4); 1269 } 1270 else{ 1271 //pop ecx 1272 compiler.codeGenerator.op_pop(REG_ECX); 1302 1273 } 1303 1274 … … 1305 1276 if(type[sp-2]==DEF_DOUBLE){ 1306 1277 //fld qword ptr[esp] 1307 op_fld_ptr_esp(DEF_DOUBLE);1278 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1308 1279 1309 1280 //fistp qword ptr[esp] 1310 op_fistp_ptr_esp( sizeof(_int64) );1281 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 1311 1282 1312 1283 //pop eax 1313 op_pop(REG_EAX);1284 compiler.codeGenerator.op_pop(REG_EAX); 1314 1285 1315 1286 //pop edx 1316 op_pop(REG_EDX);1287 compiler.codeGenerator.op_pop(REG_EDX); 1317 1288 } 1318 1289 else if(type[sp-2]==DEF_SINGLE){ 1319 1290 //fld dword ptr[esp] 1320 op_fld_ptr_esp(DEF_SINGLE);1291 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1321 1292 1322 1293 //sub esp,4 1323 op_sub_esp(4);1294 compiler.codeGenerator.op_sub_esp(4); 1324 1295 1325 1296 //fistp qword ptr[esp] 1326 op_fistp_ptr_esp( sizeof(_int64) );1297 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) ); 1327 1298 1328 1299 //pop eax 1329 op_pop(REG_EAX);1300 compiler.codeGenerator.op_pop(REG_EAX); 1330 1301 1331 1302 //pop edx 1332 op_pop(REG_EDX);1303 compiler.codeGenerator.op_pop(REG_EDX); 1333 1304 } 1334 1305 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ 1335 1306 //pop eax 1336 op_pop(REG_EAX);1307 compiler.codeGenerator.op_pop(REG_EAX); 1337 1308 1338 1309 //pop edx 1339 op_pop(REG_EDX);1310 compiler.codeGenerator.op_pop(REG_EDX); 1340 1311 } 1341 1312 else{ 1342 1313 //pop eax 1343 op_pop(REG_EAX);1314 compiler.codeGenerator.op_pop(REG_EAX); 1344 1315 1345 1316 if(IsSignedType(type[sp-2])){ … … 1348 1319 1349 1320 //cdq 1350 op_cdq();1321 compiler.codeGenerator.op_cdq(); 1351 1322 } 1352 1323 else{ … … 1355 1326 1356 1327 //xor edx,edx 1357 op_zero_reg(REG_EDX);1328 compiler.codeGenerator.op_zero_reg(REG_EDX); 1358 1329 } 1359 1330 } … … 1364 1335 //call _aullshr 1365 1336 extern const UserProc *pSub_aullshr; 1366 op_call(pSub_aullshr);1337 compiler.codeGenerator.op_call(pSub_aullshr); 1367 1338 } 1368 1339 else{ … … 1371 1342 //call _allshr 1372 1343 extern const UserProc *pSub_allshr; 1373 op_call(pSub_allshr);1344 compiler.codeGenerator.op_call(pSub_allshr); 1374 1345 } 1375 1346 1376 1347 //push edx 1377 op_push(REG_EDX);1348 compiler.codeGenerator.op_push(REG_EDX); 1378 1349 1379 1350 //push eax 1380 op_push(REG_EAX);1351 compiler.codeGenerator.op_push(REG_EAX); 1381 1352 1382 1353 sp--; … … 1390 1361 if(type[sp-1]==DEF_DOUBLE){ 1391 1362 //fld qword ptr[esp] 1392 op_fld_ptr_esp(DEF_DOUBLE);1393 1394 //add esp,4 1395 op_add_esp(4);1396 1397 //fistp dword ptr[esp] 1398 op_fistp_ptr_esp( sizeof(long) );1399 1400 //pop ecx 1401 op_pop(REG_ECX);1363 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1364 1365 //add esp,4 1366 compiler.codeGenerator.op_add_esp(4); 1367 1368 //fistp dword ptr[esp] 1369 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1370 1371 //pop ecx 1372 compiler.codeGenerator.op_pop(REG_ECX); 1402 1373 } 1403 1374 else if(type[sp-1]==DEF_SINGLE){ 1404 1375 //fld dword ptr[esp] 1405 op_fld_ptr_esp(DEF_SINGLE);1406 1407 //fistp dword ptr[esp] 1408 op_fistp_ptr_esp( sizeof(long) );1409 1410 //pop ecx 1411 op_pop(REG_ECX);1376 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1377 1378 //fistp dword ptr[esp] 1379 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1380 1381 //pop ecx 1382 compiler.codeGenerator.op_pop(REG_ECX); 1412 1383 } 1413 1384 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ 1414 1385 //pop ecx 1415 op_pop(REG_ECX);1416 1417 //add esp,4 1418 op_add_esp(4);1419 } 1420 else{ 1421 //pop ecx 1422 op_pop(REG_ECX);1386 compiler.codeGenerator.op_pop(REG_ECX); 1387 1388 //add esp,4 1389 compiler.codeGenerator.op_add_esp(4); 1390 } 1391 else{ 1392 //pop ecx 1393 compiler.codeGenerator.op_pop(REG_ECX); 1423 1394 } 1424 1395 1425 1396 if(type[sp-2]==DEF_DOUBLE){ 1426 1397 //fld qword ptr[esp] 1427 op_fld_ptr_esp(DEF_DOUBLE);1428 1429 //add esp,4 1430 op_add_esp(4);1431 1432 //fistp dword ptr[esp] 1433 op_fistp_ptr_esp( sizeof(long) );1398 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE); 1399 1400 //add esp,4 1401 compiler.codeGenerator.op_add_esp(4); 1402 1403 //fistp dword ptr[esp] 1404 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1434 1405 } 1435 1406 else if(type[sp-2]==DEF_SINGLE){ 1436 1407 //fld dword ptr[esp] 1437 op_fld_ptr_esp(DEF_SINGLE);1438 1439 //fistp dword ptr[esp] 1440 op_fistp_ptr_esp( sizeof(long) );1408 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE); 1409 1410 //fistp dword ptr[esp] 1411 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) ); 1441 1412 } 1442 1413 1443 1414 //pop eax 1444 op_pop(REG_EAX);1415 compiler.codeGenerator.op_pop(REG_EAX); 1445 1416 1446 1417 //sub esp,4 1447 op_sub_esp(4);1418 compiler.codeGenerator.op_sub_esp(4); 1448 1419 1449 1420 if(type[sp-2]==DEF_DWORD){ 1450 1421 //shr eax,cl 1451 OpBuffer[obp++]=(char)0xD3; 1452 OpBuffer[obp++]=(char)0xE8; 1422 compiler.codeGenerator.PutOld( 1423 (char)0xD3, 1424 (char)0xE8 1425 ); 1453 1426 } 1454 1427 else{ 1455 1428 //sar eax,cl 1456 OpBuffer[obp++]=(char)0xD3; 1457 OpBuffer[obp++]=(char)0xF8; 1429 compiler.codeGenerator.PutOld( 1430 (char)0xD3, 1431 (char)0xF8 1432 ); 1458 1433 } 1459 1434 1460 1435 //mov dword ptr[esp],eax 1461 OpBuffer[obp++]=(char)0x89; 1462 OpBuffer[obp++]=(char)0x04; 1463 OpBuffer[obp++]=(char)0x24; 1436 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 1464 1437 1465 1438 sp--;
Note:
See TracChangeset
for help on using the changeset viewer.