Ignore:
Timestamp:
Jul 31, 2007, 4:30:31 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r242 r254  
    533533    }
    534534
    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_RESOURCE
    545         //////////////////////////////////////////////////////
    546 
    547             if( !Operator_New( expression+2, baseType, resultType ) ){
    548                 return false;
    549             }
    550 
    551         /////////////////////////////////////////////
    552         //////   レジスタ資源を復元
    553             RESTORE_REGISTER_RESOURCE
    554         }////////////////////////////////////////////
    555 
    556         //mov reg,rax
    557         compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX );
    558 
    559         return true;
    560     }
    561 
    562535    if( !baseType.IsNull() && expression[0] == '[' ){
    563536        // リテラル配列の場合
     
    608581
    609582        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 );
    610665
    611666        return true;
Note: See TracChangeset for help on using the changeset viewer.