Changeset 254 in dev for trunk/abdev/BasicCompiler64/NumOpe.cpp
- Timestamp:
- Jul 31, 2007, 4:30:31 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/NumOpe.cpp
r242 r254 533 533 } 534 534 535 if(expression[0]==1&& expression[1]==ESC_NEW ){536 //New演算子(オブジェクト生成)537 538 if( pobj_BlockReg->check(REG_RAX) ){539 SetError();540 }541 542 //////////////////////////////////////////////////////543 ///// レジスタ資源のバックアップ544 { BACKUP_REGISTER_RESOURCE545 //////////////////////////////////////////////////////546 547 if( !Operator_New( expression+2, baseType, resultType ) ){548 return false;549 }550 551 /////////////////////////////////////////////552 ////// レジスタ資源を復元553 RESTORE_REGISTER_RESOURCE554 }////////////////////////////////////////////555 556 //mov reg,rax557 compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX );558 559 return true;560 }561 562 535 if( !baseType.IsNull() && expression[0] == '[' ){ 563 536 // リテラル配列の場合 … … 608 581 609 582 resultType = baseType; 583 584 return true; 585 } 586 587 bool isLiteralCalculation; 588 if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) ) 589 { 590 return false; 591 } 592 if( isLiteralCalculation ) 593 { 594 //右辺値が数値の定数式の場合 595 _int64 i64data; 596 StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType); 597 598 if(resultType.IsReal()){ 599 if(baseType.IsReal()) resultType=baseType; 600 601 int xmmReg = REG_XMM0; 602 603 if(resultType.IsDouble()){ 604 i3 = compiler.GetDataTable().Add( i64data ); 605 606 //movlpd xmm_reg,qword ptr[data table offset] 607 compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable ); 608 } 609 if(resultType.IsSingle()){ 610 double dbl; 611 memcpy(&dbl,&i64data,sizeof(_int64)); 612 613 float flt; 614 int i32data; 615 flt=(float)dbl; 616 memcpy(&i32data,&flt,sizeof(long)); 617 618 i3 = compiler.GetDataTable().Add( i32data ); 619 620 //movss xmm_reg,dword ptr[data table offset] 621 compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable ); 622 } 623 } 624 else{ 625 if(!resultType.Is64()){ 626 //整数(符号有り/無し) 627 628 i3=(long)i64data; 629 630 if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF; 631 if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF; 632 633 i64data=(_int64)i3; 634 } 635 636 //mov reg,i64data 637 compiler.codeGenerator.op_mov_RV64(*pReg,i64data); 638 } 639 return true; 640 } 641 642 if(expression[0]==1&& expression[1]==ESC_NEW ){ 643 //New演算子(オブジェクト生成) 644 645 if( pobj_BlockReg->check(REG_RAX) ){ 646 SetError(); 647 } 648 649 ////////////////////////////////////////////////////// 650 ///// レジスタ資源のバックアップ 651 { BACKUP_REGISTER_RESOURCE 652 ////////////////////////////////////////////////////// 653 654 if( !Operator_New( expression+2, baseType, resultType ) ){ 655 return false; 656 } 657 658 ///////////////////////////////////////////// 659 ////// レジスタ資源を復元 660 RESTORE_REGISTER_RESOURCE 661 }//////////////////////////////////////////// 662 663 //mov reg,rax 664 compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX ); 610 665 611 666 return true;
Note:
See TracChangeset
for help on using the changeset viewer.