Changeset 19 in dev
- Timestamp:
- Dec 26, 2006, 8:17:10 AM (18 years ago)
- Location:
- BasicCompiler64
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/Compile_CallProc.cpp
r18 r19 511 511 Call_DebugSys_SaveContext(); 512 512 513 pdi->bUse=1;514 513 515 514 … … 539 538 540 539 //call dword ptr[ImportTable] 541 OpBuffer[obp++]=(char)0xFF; 542 OpBuffer[obp++]=(char)0x15; 543 pobj_ImportAddrSchedule->add(pdi); 544 obp+=sizeof(long); 540 op_call( pdi ); 545 541 546 542 /* 64コンパイラでは不要 -
BasicCompiler64/Compile_ProcOp.cpp
r18 r19 617 617 } 618 618 } 619 if(psi->name[0]=='~'){619 else if(psi->name[0]=='~'){ 620 620 //デストラクタをコンパイルしたとき 621 621 … … 646 646 pobj_CompilingClass->NotifyFinishConstructorCompile(); 647 647 } 648 649 if(psi->name[0]=='~'){ 648 else if(psi->name[0]=='~'){ 650 649 //////////////////////////////////// 651 650 //デストラクタをコンパイルしたとき -
BasicCompiler64/Compile_Var.cpp
r18 r19 1181 1181 } 1182 1182 else{ 1183 //0初期化未完成 1183 //0初期化 1184 1185 //mov r8, 0 1186 op_zero_reg( REG_R8 ); 1187 1188 //mov rdx, VarSize 1189 op_mov_RV( sizeof(_int64), REG_RDX, VarSize ); 1190 1191 //mov rcx, rsp 1192 op_mov_RR( REG_RCX, REG_RSP ); 1193 1194 //add rcx, offset 1195 op_add64_value( REG_RCX, -pVar->offset ); 1196 obp-=sizeof(long); 1197 AddLocalVarAddrSchedule(); 1198 obp+=sizeof(long); 1199 1200 //call FillMemory 1201 DECLAREINFO *pdi; 1202 pdi=GetDeclareHash("FillMemory"); 1203 op_call( pdi ); 1184 1204 } 1185 1205 } -
BasicCompiler64/NumOpe.cpp
r15 r19 566 566 SetUseRegFromRax(RetTypeInfo.type,UseReg,XmmReg); 567 567 568 if(IsRealNumberType( i2)) bXmm=1;568 if(IsRealNumberType(type[sp])) bXmm=1; 569 569 else bXmm=0; 570 570 -
BasicCompiler64/NumOpe_Arithmetic.cpp
r3 r19 1 1 #include "../BasicCompiler_Common/common.h" 2 2 #include "Opcode.h" 3 4 void GetStackData_ToRegister(int *type,int sp){5 /*NumOpeポーランドのスタック蓄積による演算内容(2つのデータ)を6 レジスタedx:eax、ecx:ebxに取得する*/7 8 if(type[sp-1]==DEF_DOUBLE){9 //fld qword ptr[esp]10 op_fld_ptr_esp(DEF_DOUBLE);11 12 //fistp qword ptr[esp]13 OpBuffer[obp++]=(char)0xDF;14 OpBuffer[obp++]=(char)0x3C;15 OpBuffer[obp++]=(char)0x24;16 17 //pop ebx18 op_pop(REG_EBX);19 20 //pop ecx21 op_pop(REG_ECX);22 }23 else if(type[sp-1]==DEF_SINGLE){24 //fld dword ptr[esp]25 op_fld_ptr_esp(DEF_SINGLE);26 27 //sub esp,428 op_sub_esp(4);29 30 //fistp qword ptr[esp]31 OpBuffer[obp++]=(char)0xDF;32 OpBuffer[obp++]=(char)0x3C;33 OpBuffer[obp++]=(char)0x24;34 35 //pop ebx36 op_pop(REG_EBX);37 38 //pop ecx39 op_pop(REG_ECX);40 }41 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){42 //pop ebx43 op_pop(REG_EBX);44 45 //pop ecx46 op_pop(REG_ECX);47 }48 else{49 //pop eax50 op_pop(REG_EAX);51 52 if(IsSignedType(type[sp-1])){53 //符号拡張54 //edx:eax ← eax55 56 //cdq57 OpBuffer[obp++]=(char)0x99;58 }59 else{60 //ビット拡張61 //edx:eax ← eax62 63 //xor rdx,rdx64 op_zero_reg(REG_RDX);65 }66 67 //mov ebx,eax68 OpBuffer[obp++]=(char)0x8B;69 OpBuffer[obp++]=(char)0xD8;70 71 //mov ecx,edx72 OpBuffer[obp++]=(char)0x8B;73 OpBuffer[obp++]=(char)0xCA;74 }75 76 //第1項を64ビットに対応させる77 if(type[sp-2]==DEF_DOUBLE){78 //fld qword ptr[esp]79 op_fld_ptr_esp(DEF_DOUBLE);80 81 //fistp qword ptr[esp]82 OpBuffer[obp++]=(char)0xDF;83 OpBuffer[obp++]=(char)0x3C;84 OpBuffer[obp++]=(char)0x24;85 86 //pop eax87 op_pop(REG_EAX);88 89 //pop edx90 op_pop(REG_EDX);91 }92 else if(type[sp-2]==DEF_SINGLE){93 //fld dword ptr[esp]94 op_fld_ptr_esp(DEF_SINGLE);95 96 //sub esp,497 op_sub_esp(4);98 99 //fistp qword ptr[esp]100 OpBuffer[obp++]=(char)0xDF;101 OpBuffer[obp++]=(char)0x3C;102 OpBuffer[obp++]=(char)0x24;103 104 //pop eax105 op_pop(REG_EAX);106 107 //pop edx108 op_pop(REG_EDX);109 }110 else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){111 //pop eax112 op_pop(REG_EAX);113 114 //pop edx115 op_pop(REG_EDX);116 }117 else{118 //pop eax119 op_pop(REG_EAX);120 121 if(IsSignedType(type[sp-2])){122 //符号拡張123 //edx:eax ← eax124 125 //cdq126 OpBuffer[obp++]=(char)0x99;127 }128 else{129 //ビット拡張130 //edx:eax ← eax131 132 //xor rdx,rdx133 op_zero_reg(REG_RDX);134 }135 }136 }137 3 138 4 BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){ … … 316 182 } 317 183 318 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 319 pobj_sf->push(REG_RAX); 320 321 if(reg1!=REG_RDX){ 184 //raxまたはrdxが使用中かどうかを調べる( true/使用中, false/未使用 ) 185 bool isUsingRax = pobj_reg->IsUsing( REG_RAX ); 186 bool isUsingRdx = pobj_reg->IsUsing( REG_RDX ); 187 188 if(reg1!=REG_RDX && isUsingRdx){ 189 //結果レジスタがrdxでない場合(使用されている可能性があるとき) 190 322 191 //mov qword ptr[rsp+offset],rdx ※スタックフレームを利用 323 192 pobj_sf->push(REG_RDX); 324 193 } 325 194 326 //mov rax,reg1 327 op_mov64_ToReg_FromReg(REG_RAX,reg1); 328 329 if(IsSignedType(type[sp-2])){ 330 //符号拡張 331 //rdx:rax ← rax 332 333 //cqo 334 OpBuffer[obp++]=(char)0x48; 335 OpBuffer[obp++]=(char)0x99; 336 } 337 else{ 338 //ビット拡張 339 //rdx:rax ← rax 340 341 //xor rdx,rdx 342 op_zero_reg(REG_RDX); 343 } 344 345 if(IsSignedType(AnswerType)){ 346 //idiv reg2 347 op_idiv64_reg(reg2); 348 } 349 else{ 350 //div reg2 351 op_div64_reg(reg2); 352 } 353 354 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 355 pobj_sf->pop(REG_RAX); 356 357 //mov reg1,rdx 358 op_mov64_ToReg_FromReg(reg1,REG_RDX); 359 360 if(reg1!=REG_RDX){ 195 if(reg1!=REG_RAX && isUsingRax){ 196 //結果レジスタがraxでない場合(使用されている可能性があるとき) 197 198 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 199 pobj_sf->push(REG_RAX); 200 } 201 202 { 203 204 //mov rax,reg1 205 op_mov64_ToReg_FromReg(REG_RAX,reg1); 206 207 if(IsSignedType(type[sp-2])){ 208 //符号拡張 209 //rdx:rax ← rax 210 211 //cqo 212 OpBuffer[obp++]=(char)0x48; 213 OpBuffer[obp++]=(char)0x99; 214 } 215 else{ 216 //ビット拡張 217 //rdx:rax ← rax 218 219 //xor rdx,rdx 220 op_zero_reg(REG_RDX); 221 } 222 223 if(IsSignedType(AnswerType)){ 224 //idiv reg2 225 op_idiv64_reg(reg2); 226 } 227 else{ 228 //div reg2 229 op_div64_reg(reg2); 230 } 231 232 //mov reg1,rdx 233 op_mov64_ToReg_FromReg(reg1,REG_RDX); 234 235 } 236 237 if(reg1!=REG_RAX && isUsingRax){ 238 //結果レジスタがraxでない場合(使用されている可能性があるとき) 239 240 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 241 pobj_sf->pop(REG_RAX); 242 } 243 244 if(reg1!=REG_RDX && isUsingRdx){ 245 //結果レジスタがrdxでない場合(使用されている可能性があるとき) 246 361 247 //mov rdx,qword ptr[rsp+offset] ※スタックフレームを利用 362 248 pobj_sf->pop(REG_RDX); 363 249 } 250 364 251 365 252 if(reg1==REG_R14){ … … 471 358 } 472 359 473 //mov qword ptr[rsp+offset],rdx ※スタックフレームを利用 474 pobj_sf->push(REG_RDX); 475 476 if(reg1!=REG_RAX){ 360 //raxまたはrdxが使用中かどうかを調べる( true/使用中, false/未使用 ) 361 bool isUsingRax = pobj_reg->IsUsing( REG_RAX ); 362 bool isUsingRdx = pobj_reg->IsUsing( REG_RDX ); 363 364 if(reg1!=REG_RDX && isUsingRdx){ 365 //結果レジスタがrdxでない場合(使用されている可能性があるとき) 366 367 //mov qword ptr[rsp+offset],rdx ※スタックフレームを利用 368 pobj_sf->push(REG_RDX); 369 } 370 371 if(reg1!=REG_RAX && isUsingRax){ 372 //結果レジスタがraxでない場合(使用されている可能性があるとき) 373 477 374 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 478 375 pobj_sf->push(REG_RAX); 479 376 } 480 377 481 //mov rax,reg1 482 op_mov64_ToReg_FromReg(REG_RAX,reg1); 483 484 if(IsSignedType(type[sp-2])){ 485 //符号拡張 486 //rdx:rax ← rax 487 488 //cqo 489 OpBuffer[obp++]=(char)0x48; 490 OpBuffer[obp++]=(char)0x99; 491 } 492 else{ 493 //ビット拡張 494 //rdx:rax ← rax 495 496 //xor rdx,rdx 497 op_zero_reg(REG_RDX); 498 } 499 500 if(IsSignedType(AnswerType)){ 501 //idiv reg2 502 op_idiv64_reg(reg2); 503 } 504 else{ 505 //div reg2 506 op_div64_reg(reg2); 507 } 508 509 //mov reg1,rax 510 op_mov64_ToReg_FromReg(reg1,REG_RAX); 511 512 if(reg1!=REG_RAX){ 378 { 379 380 //mov rax,reg1 381 op_mov64_ToReg_FromReg(REG_RAX,reg1); 382 383 if(IsSignedType(type[sp-2])){ 384 //符号拡張 385 //rdx:rax ← rax 386 387 //cqo 388 OpBuffer[obp++]=(char)0x48; 389 OpBuffer[obp++]=(char)0x99; 390 } 391 else{ 392 //ビット拡張 393 //rdx:rax ← rax 394 395 //xor rdx,rdx 396 op_zero_reg(REG_RDX); 397 } 398 399 if(IsSignedType(AnswerType)){ 400 //idiv reg2 401 op_idiv64_reg(reg2); 402 } 403 else{ 404 //div reg2 405 op_div64_reg(reg2); 406 } 407 408 //mov reg1,rax 409 op_mov64_ToReg_FromReg(reg1,REG_RAX); 410 411 } 412 413 if(reg1!=REG_RAX && isUsingRax){ 414 //結果レジスタがraxでない場合(使用されている可能性があるとき) 415 513 416 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 514 417 pobj_sf->pop(REG_RAX); 515 418 } 516 419 517 //mov rdx,qword ptr[rsp+offset] ※スタックフレームを利用 518 pobj_sf->pop(REG_RDX); 420 if(reg1!=REG_RDX && isUsingRdx){ 421 //結果レジスタがrdxでない場合(使用されている可能性があるとき) 422 423 //mov rdx,qword ptr[rsp+offset] ※スタックフレームを利用 424 pobj_sf->pop(REG_RDX); 425 } 519 426 520 427 … … 526 433 sp--; 527 434 type[sp-1]=AnswerType; 528 529 435 530 436 *pStackPointer=sp; -
BasicCompiler64/Opcode.h
r17 r19 185 185 int UnlockXmmReg(); 186 186 187 //レジスタが利用中かどうかを調べる 188 bool IsUsing( int reg ); 189 187 190 //レジスタのバックアップと復旧 188 191 void backup(); … … 253 256 254 257 //NumOpe_Arithmetic.cpp 255 void GetStackData_ToRegister(int *type,int sp);256 258 BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer); 257 259 BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer); … … 503 505 void op_fld_ptr_esp(int type); 504 506 void op_zero_reg(int reg); 505 void op_call(SUBINFO *psi); 507 void op_call( SUBINFO *psi ); 508 void op_call( DECLAREINFO *pdi ); -
BasicCompiler64/Register.cpp
r3 r19 226 226 return GetNextXmmReg(); 227 227 } 228 bool CRegister::IsUsing( int reg ){ 229 int i; 230 231 //汎用レジスタを調べる 232 for(i=init_sp_reg;i>sp_UseReg;i--){ 233 if( array_UseReg[i] == reg ) return true; 234 } 235 236 //XMMレジスタを調べる 237 for(i=init_sp_xmm_reg;i>sp_XmmReg;i--){ 238 if( array_XmmReg[i] == reg ) return true; 239 } 240 241 //ブロックされている場合を考慮 242 if( pobj_BlockReg->check( reg ) ) return true; 243 244 //使用中でないとき 245 return false; 246 } 228 247 void CRegister::backup(){ 229 248 int i; -
BasicCompiler64/amd64_main.cpp
r3 r19 1765 1765 ///////////////////////////// 1766 1766 1767 void op_call(SUBINFO *psi){ 1768 OpBuffer[obp++]=(char)0xE8; 1769 pobj_SubAddrSchedule->add(psi,1); 1770 psi->bUse=1; 1771 obp+=sizeof(long); 1772 } 1767 void op_call( SUBINFO *psi ){ 1768 OpBuffer[obp++] = (char)0xE8; 1769 pobj_SubAddrSchedule->add( psi, 1 ); 1770 psi->bUse = 1; 1771 obp += sizeof(long); 1772 } 1773 void op_call( DECLAREINFO *pdi ){ 1774 OpBuffer[obp++] = (char)0xFF; 1775 OpBuffer[obp++] = (char)0x15; 1776 pobj_ImportAddrSchedule->add(pdi); 1777 obp += sizeof(long); 1778 1779 pdi->bUse=1; 1780 }
Note:
See TracChangeset
for help on using the changeset viewer.