Changeset 355 in dev for trunk/abdev/BasicCompiler64/NumOpe.cpp
- Timestamp:
- Nov 2, 2007, 2:53:56 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/NumOpe.cpp
r350 r355 590 590 BOOL *pbUseHeap ) 591 591 { 592 593 592 int i,i2,i3; 594 593 char temporary[1024],temp2[1024]; 594 595 if( (string)expression == "typeInfo=t2" ) 596 { 597 int test=0; 598 } 595 599 596 600 if(expression[0]=='\0'){ … … 602 606 // リテラル配列の場合 603 607 604 if( !baseType.IsPointer() ){ 605 SetError(1,NULL,cp); 608 int dataTableOffset; 609 if( !compiler.GetObjectModule().dataTable.MakeLiteralArrayBuffer( expression, baseType, dataTableOffset ) ) 610 { 606 611 return false; 607 612 } 608 Type tempBaseType( baseType ); 609 tempBaseType.PtrLevelDown(); 610 611 char *buffer = (char *)malloc( lstrlen( expression ) + 1 ); 612 lstrcpy( buffer, expression ); 613 RemoveStringBracket( buffer ); 614 615 void *binary = malloc( 1 ); 616 int num = 0; 617 618 i = 0; 619 while( buffer[i] ){ 620 i = GetOneParameter( buffer, i, temporary ); 621 if( buffer[i] == ',' ){ 622 i++; 623 } 624 625 Type resultType; 613 614 //mov reg,i2 615 compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable ); 616 617 resultType = baseType; 618 619 return true; 620 } 621 622 bool isLiteralCalculation; 623 if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) ) 624 { 625 if( isLiteralCalculation ) 626 { 627 //右辺値が数値の定数式の場合 626 628 _int64 i64data; 627 if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){ 629 StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType); 630 631 if(resultType.IsReal()){ 632 if(baseType.IsReal()) resultType=baseType; 633 634 int xmmReg = pobj_reg->GetNextXmmReg(); 635 *pReg = xmmReg; 636 637 if(resultType.IsDouble()){ 638 i3 = compiler.GetObjectModule().dataTable.Add( i64data ); 639 640 //movlpd xmm_reg,qword ptr[data table offset] 641 compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable ); 642 } 643 if(resultType.IsSingle()){ 644 double dbl; 645 memcpy(&dbl,&i64data,sizeof(_int64)); 646 647 float flt; 648 int i32data; 649 flt=(float)dbl; 650 memcpy(&i32data,&flt,sizeof(long)); 651 652 i3 = compiler.GetObjectModule().dataTable.Add( i32data ); 653 654 //movss xmm_reg,dword ptr[data table offset] 655 compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable ); 656 } 657 } 658 else{ 659 if(!resultType.Is64()){ 660 //整数(符号有り/無し) 661 662 i3=(long)i64data; 663 664 if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF; 665 if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF; 666 667 i64data=(_int64)i3; 668 } 669 670 //mov reg,i64data 671 compiler.codeGenerator.op_mov_RV64(*pReg,i64data); 672 } 673 return true; 674 } 675 } 676 677 if( expression[0] == 1 ) 678 { 679 if( expression[1]==ESC_NEW ) 680 { 681 //New演算子(オブジェクト生成) 682 683 if( pobj_BlockReg->check(REG_RAX) ){ 684 SetError(); 685 } 686 687 ////////////////////////////////////////////////////// 688 ///// レジスタ資源のバックアップ 689 { BACKUP_REGISTER_RESOURCE 690 ////////////////////////////////////////////////////// 691 692 if( !Operator_New( expression+2, baseType, resultType ) ){ 693 return false; 694 } 695 696 ///////////////////////////////////////////// 697 ////// レジスタ資源を復元 698 RESTORE_REGISTER_RESOURCE 699 }//////////////////////////////////////////// 700 701 //mov reg,rax 702 compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX ); 703 704 return true; 705 } 706 else if( expression[1] == ESC_SYSTEM_STATIC_NEW ) 707 { 708 // 静的領域にオブジェクトを作る 709 710 // 静的領域にオブジェクトを生成 711 int dataTableOffset; 712 if( !compiler.GetObjectModule().dataTable.MakeConstObjectToProcessStaticBuffer( expression + 2, resultType, dataTableOffset ) ) 713 { 628 714 return false; 629 715 } 630 if( !resultType.IsWhole() ){ 631 // TODO: 実数に未対応 632 SetError(); 633 return false; 634 } 635 636 binary = realloc( binary, ( num + 1 ) * tempBaseType.GetSize() ); 637 memcpy( (char *)binary + (num * tempBaseType.GetSize()), &i64data, tempBaseType.GetSize() ); 638 num++; 639 } 640 641 i2 = compiler.GetObjectModule().dataTable.AddBinary( binary, num * tempBaseType.GetSize() ); 642 643 //mov reg,i2 644 compiler.codeGenerator.op_mov_RV(sizeof(_int64),*pReg,i2, Schedule::DataTable ); 645 646 free( buffer ); 647 648 resultType = baseType; 649 650 return true; 651 } 652 653 bool isLiteralCalculation; 654 if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) ) 655 { 656 return false; 657 } 658 if( isLiteralCalculation ) 659 { 660 //右辺値が数値の定数式の場合 661 _int64 i64data; 662 StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType); 663 664 if(resultType.IsReal()){ 665 if(baseType.IsReal()) resultType=baseType; 666 667 int xmmReg = pobj_reg->GetNextXmmReg(); 668 *pReg = xmmReg; 669 670 if(resultType.IsDouble()){ 671 i3 = compiler.GetObjectModule().dataTable.Add( i64data ); 672 673 //movlpd xmm_reg,qword ptr[data table offset] 674 compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable ); 675 } 676 if(resultType.IsSingle()){ 677 double dbl; 678 memcpy(&dbl,&i64data,sizeof(_int64)); 679 680 float flt; 681 int i32data; 682 flt=(float)dbl; 683 memcpy(&i32data,&flt,sizeof(long)); 684 685 i3 = compiler.GetObjectModule().dataTable.Add( i32data ); 686 687 //movss xmm_reg,dword ptr[data table offset] 688 compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable ); 689 } 690 } 691 else{ 692 if(!resultType.Is64()){ 693 //整数(符号有り/無し) 694 695 i3=(long)i64data; 696 697 if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF; 698 if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF; 699 700 i64data=(_int64)i3; 701 } 702 703 //mov reg,i64data 704 compiler.codeGenerator.op_mov_RV64(*pReg,i64data); 705 } 706 return true; 707 } 708 709 if(expression[0]==1&& expression[1]==ESC_NEW ){ 710 //New演算子(オブジェクト生成) 711 712 if( pobj_BlockReg->check(REG_RAX) ){ 713 SetError(); 714 } 715 716 ////////////////////////////////////////////////////// 717 ///// レジスタ資源のバックアップ 718 { BACKUP_REGISTER_RESOURCE 719 ////////////////////////////////////////////////////// 720 721 if( !Operator_New( expression+2, baseType, resultType ) ){ 722 return false; 723 } 724 725 ///////////////////////////////////////////// 726 ////// レジスタ資源を復元 727 RESTORE_REGISTER_RESOURCE 728 }//////////////////////////////////////////// 729 730 //mov reg,rax 731 compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX ); 732 733 return true; 716 717 //mov reg,i2 718 compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable); 719 720 return true; 721 } 734 722 } 735 723 … … 850 838 || term[0] == '\"' ) 851 839 { 852 if( !baseType.IsPointer() )853 {854 //要求タイプがオブジェクト、または未定のとき855 856 //String型オブジェクトを生成857 NewStringObject(UseReg,term);858 859 type_stack[sp]=DEF_OBJECT;860 index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();861 bLiteralCalculation=0;862 863 if(bXmm) pobj_reg->LockXmmReg();864 else pobj_reg->LockReg();865 866 sp++;867 break;868 }869 870 840 bool isEx = true; 871 841 if( term[0] == '\"' ) … … 893 863 i3=lstrlen(term); 894 864 } 865 866 if( !baseType.IsPointer() ) 867 { 868 //要求タイプがオブジェクト、または未定のとき 869 870 //String型オブジェクトを生成 871 i2 = compiler.GetObjectModule().dataTable.MakeConstStringObjectToProcessStaticBuffer( term ); 872 873 //mov reg,i2 874 compiler.codeGenerator.op_mov_RV(sizeof(_int64),UseReg,i2, Schedule::DataTable); 875 876 type_stack[sp]=DEF_OBJECT; 877 index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(); 878 bLiteralCalculation=0; 879 880 if(bXmm) pobj_reg->LockXmmReg(); 881 else pobj_reg->LockReg(); 882 883 sp++; 884 break; 885 } 886 895 887 StrLiteral: 896 888
Note:
See TracChangeset
for help on using the changeset viewer.