Changeset 225 in dev for trunk/abdev/BasicCompiler32/NumOpe_Logical.cpp
- Timestamp:
- Jul 21, 2007, 11:47:40 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/NumOpe_Logical.cpp
r206 r225 1 1 #include "stdafx.h" 2 3 #include <Compiler.h> 2 4 3 5 #include "../BasicCompiler_Common/common.h" … … 28 30 29 31 //pop ebx 30 op_pop(REG_EBX);32 compiler.codeGenerator.op_pop(REG_EBX); 31 33 32 34 //pop ecx 33 op_pop(REG_ECX);35 compiler.codeGenerator.op_pop(REG_ECX); 34 36 } 35 37 else{ … … 37 39 38 40 //pop eax 39 op_pop(REG_EAX);41 compiler.codeGenerator.op_pop(REG_EAX); 40 42 41 43 if(IsSignedType(type[sp-1])){ … … 44 46 45 47 //cdq 46 op_cdq();48 compiler.codeGenerator.op_cdq(); 47 49 } 48 50 else{ … … 51 53 52 54 //xor edx,edx 53 op_zero_reg(REG_EDX);55 compiler.codeGenerator.op_zero_reg(REG_EDX); 54 56 } 55 57 56 58 //mov ebx,eax 57 OpBuffer[obp++]=(char)0x8B; 58 OpBuffer[obp++]=(char)0xD8; 59 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX ); 59 60 60 61 //mov ecx,edx 61 OpBuffer[obp++]=(char)0x8B; 62 OpBuffer[obp++]=(char)0xCA; 62 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX ); 63 63 } 64 64 … … 67 67 68 68 //xor dword ptr[esp],ebx 69 OpBuffer[obp++]=(char)0x31; 70 OpBuffer[obp++]=(char)0x1C; 71 OpBuffer[obp++]=(char)0x24; 69 compiler.codeGenerator.PutOld( 70 (char)0x31, 71 (char)0x1C, 72 (char)0x24 73 ); 72 74 73 75 //xor dword ptr[esp+sizeof(long)],ecx 74 OpBuffer[obp++]=(char)0x31; 75 OpBuffer[obp++]=(char)0x4C; 76 OpBuffer[obp++]=(char)0x24; 77 OpBuffer[obp++]=(char)0x04; 76 compiler.codeGenerator.PutOld( 77 (char)0x31, 78 (char)0x4C, 79 (char)0x24, 80 (char)0x04 81 ); 78 82 } 79 83 else{ … … 81 85 if(IsSignedType(type[sp-2])){ 82 86 //pop eax 83 op_pop(REG_EAX);87 compiler.codeGenerator.op_pop(REG_EAX); 84 88 85 89 //符号拡張 … … 87 91 88 92 //cdq 89 op_cdq();93 compiler.codeGenerator.op_cdq(); 90 94 } 91 95 else{ 92 96 //pop eax 93 op_pop(REG_EAX);97 compiler.codeGenerator.op_pop(REG_EAX); 94 98 95 99 //ビット拡張 … … 97 101 98 102 //xor edx,edx 99 op_zero_reg(REG_EDX);103 compiler.codeGenerator.op_zero_reg(REG_EDX); 100 104 } 101 105 102 106 //xor ebx,eax 103 OpBuffer[obp++]=(char)0x33; 104 OpBuffer[obp++]=(char)0xD8; 107 compiler.codeGenerator.op_xor_RR( REG_EBX, REG_EAX ); 105 108 106 109 //xor ecx,edx 107 OpBuffer[obp++]=(char)0x33; 108 OpBuffer[obp++]=(char)0xCA; 110 compiler.codeGenerator.op_xor_RR( REG_ECX, REG_EDX ); 109 111 110 112 //push ecx 111 op_push(REG_ECX);113 compiler.codeGenerator.op_push(REG_ECX); 112 114 113 115 //push ebx 114 op_push(REG_EBX);116 compiler.codeGenerator.op_push(REG_EBX); 115 117 } 116 118 … … 125 127 126 128 //pop ebx 127 op_pop(REG_EBX);129 compiler.codeGenerator.op_pop(REG_EBX); 128 130 129 131 //pop eax 130 op_pop(REG_EAX);132 compiler.codeGenerator.op_pop(REG_EAX); 131 133 132 134 //sub esp,4 133 op_sub_esp(4);135 compiler.codeGenerator.op_sub_esp(4); 134 136 135 137 //xor eax,ebx 136 OpBuffer[obp++]=(char)0x33; 137 OpBuffer[obp++]=(char)0xC3; 138 compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX ); 138 139 139 140 //mov dword ptr[esp],eax 140 OpBuffer[obp++]=(char)0x89; 141 OpBuffer[obp++]=(char)0x04; 142 OpBuffer[obp++]=(char)0x24; 141 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 143 142 144 143 sp--; … … 174 173 175 174 //pop ebx 176 op_pop(REG_EBX);175 compiler.codeGenerator.op_pop(REG_EBX); 177 176 178 177 //pop ecx 179 op_pop(REG_ECX);178 compiler.codeGenerator.op_pop(REG_ECX); 180 179 } 181 180 else{ … … 183 182 184 183 //pop eax 185 op_pop(REG_EAX);184 compiler.codeGenerator.op_pop(REG_EAX); 186 185 187 186 if(IsSignedType(type[sp-1])){ … … 190 189 191 190 //cdq 192 op_cdq();191 compiler.codeGenerator.op_cdq(); 193 192 } 194 193 else{ … … 197 196 198 197 //xor edx,edx 199 op_zero_reg(REG_EDX);198 compiler.codeGenerator.op_zero_reg(REG_EDX); 200 199 } 201 200 202 201 //mov ebx,eax 203 OpBuffer[obp++]=(char)0x8B; 204 OpBuffer[obp++]=(char)0xD8; 202 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX ); 205 203 206 204 //mov ecx,edx 207 OpBuffer[obp++]=(char)0x8B; 208 OpBuffer[obp++]=(char)0xCA; 205 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX ); 209 206 } 210 207 … … 213 210 214 211 //or dword ptr[esp],ebx 215 OpBuffer[obp++]=(char)0x09; 216 OpBuffer[obp++]=(char)0x1C; 217 OpBuffer[obp++]=(char)0x24; 212 compiler.codeGenerator.PutOld( 213 (char)0x09, 214 (char)0x1C, 215 (char)0x24 216 ); 218 217 219 218 //or dword ptr[esp+sizeof(long)],ecx 220 OpBuffer[obp++]=(char)0x09; 221 OpBuffer[obp++]=(char)0x4C; 222 OpBuffer[obp++]=(char)0x24; 223 OpBuffer[obp++]=(char)0x04; 219 compiler.codeGenerator.PutOld( 220 (char)0x09, 221 (char)0x4C, 222 (char)0x24, 223 (char)0x04 224 ); 224 225 } 225 226 else{ … … 227 228 if(IsSignedType(type[sp-2])){ 228 229 //pop eax 229 op_pop(REG_EAX);230 compiler.codeGenerator.op_pop(REG_EAX); 230 231 231 232 //符号拡張 … … 233 234 234 235 //cdq 235 op_cdq();236 compiler.codeGenerator.op_cdq(); 236 237 } 237 238 else{ 238 239 //pop eax 239 op_pop(REG_EAX);240 compiler.codeGenerator.op_pop(REG_EAX); 240 241 241 242 //ビット拡張 … … 243 244 244 245 //xor edx,edx 245 op_zero_reg(REG_EDX);246 compiler.codeGenerator.op_zero_reg(REG_EDX); 246 247 } 247 248 248 249 //or ebx,eax 249 OpBuffer[obp++]=(char)0x0B; 250 OpBuffer[obp++]=(char)0xD8; 250 compiler.codeGenerator.op_or_RR( sizeof(long), REG_EBX, REG_EAX ); 251 251 252 252 //or ecx,edx 253 OpBuffer[obp++]=(char)0x0B; 254 OpBuffer[obp++]=(char)0xCA; 253 compiler.codeGenerator.op_or_RR( sizeof(long), REG_ECX, REG_EDX ); 255 254 256 255 //push ecx 257 op_push(REG_ECX);256 compiler.codeGenerator.op_push(REG_ECX); 258 257 259 258 //push ebx 260 op_push(REG_EBX);259 compiler.codeGenerator.op_push(REG_EBX); 261 260 } 262 261 … … 271 270 272 271 //pop ebx 273 op_pop(REG_EBX);272 compiler.codeGenerator.op_pop(REG_EBX); 274 273 275 274 //pop eax 276 op_pop(REG_EAX);275 compiler.codeGenerator.op_pop(REG_EAX); 277 276 278 277 //sub esp,4 279 op_sub_esp(4);278 compiler.codeGenerator.op_sub_esp(4); 280 279 281 280 //or eax,ebx 282 OpBuffer[obp++]=(char)0x0B; 283 OpBuffer[obp++]=(char)0xC3; 281 compiler.codeGenerator.op_or_RR( sizeof(long), REG_EAX, REG_EBX ); 284 282 285 283 //mov dword ptr[esp],eax 286 OpBuffer[obp++]=(char)0x89; 287 OpBuffer[obp++]=(char)0x04; 288 OpBuffer[obp++]=(char)0x24; 284 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 289 285 290 286 sp--; … … 320 316 321 317 //pop ebx 322 op_pop(REG_EBX);318 compiler.codeGenerator.op_pop(REG_EBX); 323 319 324 320 //pop ecx 325 op_pop(REG_ECX);321 compiler.codeGenerator.op_pop(REG_ECX); 326 322 } 327 323 else{ … … 329 325 330 326 //pop eax 331 op_pop(REG_EAX);327 compiler.codeGenerator.op_pop(REG_EAX); 332 328 333 329 if(IsSignedType(type[sp-1])){ … … 336 332 337 333 //cdq 338 op_cdq();334 compiler.codeGenerator.op_cdq(); 339 335 } 340 336 else{ … … 343 339 344 340 //xor edx,edx 345 op_zero_reg(REG_EDX);341 compiler.codeGenerator.op_zero_reg(REG_EDX); 346 342 } 347 343 348 344 //mov ebx,eax 349 OpBuffer[obp++]=(char)0x8B; 350 OpBuffer[obp++]=(char)0xD8; 345 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX ); 351 346 352 347 //mov ecx,edx 353 OpBuffer[obp++]=(char)0x8B; 354 OpBuffer[obp++]=(char)0xCA; 348 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX ); 355 349 } 356 350 … … 359 353 360 354 //and dword ptr[esp],ebx 361 OpBuffer[obp++]=(char)0x21; 362 OpBuffer[obp++]=(char)0x1C; 363 OpBuffer[obp++]=(char)0x24; 355 compiler.codeGenerator.PutOld( 356 (char)0x21, 357 (char)0x1C, 358 (char)0x24 359 ); 364 360 365 361 //and dword ptr[esp+sizeof(long)],ecx 366 OpBuffer[obp++]=(char)0x21; 367 OpBuffer[obp++]=(char)0x4C; 368 OpBuffer[obp++]=(char)0x24; 369 OpBuffer[obp++]=(char)0x04; 362 compiler.codeGenerator.PutOld( 363 (char)0x21, 364 (char)0x4C, 365 (char)0x24, 366 (char)0x04 367 ); 370 368 } 371 369 else{ … … 373 371 if(IsSignedType(type[sp-2])){ 374 372 //pop eax 375 op_pop(REG_EAX);373 compiler.codeGenerator.op_pop(REG_EAX); 376 374 377 375 //符号拡張 … … 379 377 380 378 //cdq 381 op_cdq();379 compiler.codeGenerator.op_cdq(); 382 380 } 383 381 else{ 384 382 //pop eax 385 op_pop(REG_EAX);383 compiler.codeGenerator.op_pop(REG_EAX); 386 384 387 385 //ビット拡張 … … 389 387 390 388 //xor edx,edx 391 op_zero_reg(REG_EDX);389 compiler.codeGenerator.op_zero_reg(REG_EDX); 392 390 } 393 391 394 392 //and ebx,eax 395 OpBuffer[obp++]=(char)0x23; 396 OpBuffer[obp++]=(char)0xD8; 393 compiler.codeGenerator.op_and_RR( REG_EBX, REG_EAX ); 397 394 398 395 //and ecx,edx 399 OpBuffer[obp++]=(char)0x23; 400 OpBuffer[obp++]=(char)0xCA; 396 compiler.codeGenerator.op_and_RR( REG_ECX, REG_EDX ); 401 397 402 398 //push ecx 403 op_push(REG_ECX);399 compiler.codeGenerator.op_push(REG_ECX); 404 400 405 401 //push ebx 406 op_push(REG_EBX);402 compiler.codeGenerator.op_push(REG_EBX); 407 403 } 408 404 … … 417 413 418 414 //pop ebx 419 op_pop(REG_EBX);415 compiler.codeGenerator.op_pop(REG_EBX); 420 416 421 417 //pop eax 422 op_pop(REG_EAX);418 compiler.codeGenerator.op_pop(REG_EAX); 423 419 424 420 //sub esp,4 425 op_sub_esp(4);421 compiler.codeGenerator.op_sub_esp(4); 426 422 427 423 //and eax,ebx 428 OpBuffer[obp++]=(char)0x23; 429 OpBuffer[obp++]=(char)0xC3; 424 compiler.codeGenerator.op_and_RR( REG_EAX, REG_EBX ); 430 425 431 426 //mov dword ptr[esp],eax 432 OpBuffer[obp++]=(char)0x89; 433 OpBuffer[obp++]=(char)0x04; 434 OpBuffer[obp++]=(char)0x24; 427 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE ); 435 428 436 429 sp--; … … 454 447 if( type[sp - 1] == DEF_BOOLEAN ){ 455 448 //pop eax 456 op_pop( REG_EAX );449 compiler.codeGenerator.op_pop( REG_EAX ); 457 450 458 451 //cmp eax,0 459 op_cmp_value(GetTypeSize(type[sp-1],-1),REG_EAX,0);452 compiler.codeGenerator.op_cmp_value(GetTypeSize(type[sp-1],-1),REG_EAX,0); 460 453 461 454 //setne al 462 op_setne( REG_EAX );455 compiler.codeGenerator.op_setne( REG_EAX ); 463 456 464 457 //and eax,000000FFh 465 op_and_RV(REG_EAX,(int)0xFF);458 compiler.codeGenerator.op_and_RV(REG_EAX,(int)0xFF); 466 459 467 460 //neg 468 op_neg( REG_EAX );461 compiler.codeGenerator.op_neg( REG_EAX ); 469 462 470 463 //sbb eax, eax 471 op_sbb_RR( REG_EAX, REG_EAX );464 compiler.codeGenerator.op_sbb_RR( REG_EAX, REG_EAX ); 472 465 473 466 //add eax, 1 474 op_add_RV8( REG_EAX, 1 );467 compiler.codeGenerator.op_add_RV8( REG_EAX, 1 ); 475 468 476 469 //push eax 477 op_push( REG_EAX );470 compiler.codeGenerator.op_push( REG_EAX ); 478 471 } 479 472 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ … … 483 476 484 477 //not dword ptr[esp] 485 OpBuffer[obp++]=(char)0xF7; 486 OpBuffer[obp++]=(char)0x14; 487 OpBuffer[obp++]=(char)0x24; 478 compiler.codeGenerator.PutOld( 479 (char)0xF7, 480 (char)0x14, 481 (char)0x24 482 ); 488 483 489 484 //not dword ptr[esp+4] 490 OpBuffer[obp++]=(char)0xF7; 491 OpBuffer[obp++]=(char)0x54; 492 OpBuffer[obp++]=(char)0x24; 493 OpBuffer[obp++]=(char)0x04; 485 compiler.codeGenerator.PutOld( 486 (char)0xF7, 487 (char)0x54, 488 (char)0x24, 489 (char)0x04 490 ); 494 491 } 495 492 else{ … … 499 496 500 497 //not dword ptr[esp] 501 OpBuffer[obp++]=(char)0xF7; 502 OpBuffer[obp++]=(char)0x14; 503 OpBuffer[obp++]=(char)0x24; 498 compiler.codeGenerator.PutOld( 499 (char)0xF7, 500 (char)0x14, 501 (char)0x24 502 ); 504 503 } 505 504
Note:
See TracChangeset
for help on using the changeset viewer.