Ignore:
Timestamp:
Aug 29, 2007, 9:05:22 AM (17 years ago)
Author:
dai_9181
Message:

静的リンクライブラリにより、複数のグローバル領域が存在することになったのでそれぞれを関数ベースに分けた

File:
1 edited

Legend:

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

    r266 r308  
    88#include "Opcode.h"
    99
    10 void ExtendTypeTo64(int type,int reg){
    11     if(type==DEF_LONG){
     10void ExtendTypeTo64( const Type &oldType, int reg ){
     11    if( oldType.IsLong() )
     12    {
    1213        //movsxd reg64,reg32
    1314        compiler.codeGenerator.op_movsxd(reg,reg);
    1415    }
    15     else if(type==DEF_DWORD){
     16    else if( oldType.IsDWord() )
     17    {
    1618        //and reg,00000000FFFFFFFFh
    1719    }
    18     else if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){
     20    else if( oldType.IsInteger() )
     21    {
    1922        //movsx reg64,reg16
    2023        compiler.codeGenerator.op_movsx64_FromReg16(reg,reg);
    2124    }
    22     else if(type==DEF_WORD){
     25    else if( oldType.IsWord() )
     26    {
    2327        //and reg,000000000000FFFFh
    2428        compiler.codeGenerator.op_and64_value(reg,(int)0xFFFF);
    2529    }
    26     else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
     30    else if( oldType.IsSByte() )
     31    {
    2732        //movsx reg64,reg8
    2833        compiler.codeGenerator.op_movsx64_FromReg8(reg,reg);
    2934    }
    30     else if(type==DEF_BYTE || type==DEF_BOOLEAN){
     35    else if( oldType.IsByte() || oldType.IsBoolean() )
     36    {
    3137        //and reg,00000000000000FFh
    3238        compiler.codeGenerator.op_and64_value(reg,(int)0x00FF);
    3339    }
    3440}
    35 void ExtendTypeTo32(int type,int reg){
    36     if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){
     41void ExtendTypeTo32( const Type &oldType, int reg ){
     42    if( oldType.IsInteger() )
     43    {
    3744        //movsx reg32,reg16
    3845        compiler.codeGenerator.op_movsx32_FromReg16(reg,reg);
    3946    }
    40     else if(type==DEF_WORD){
     47    else if( oldType.IsWord() )
     48    {
    4149        //and reg,0000FFFFh
    4250        compiler.codeGenerator.op_and32_value(reg,(int)0xFFFF);
    4351    }
    44     else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
     52    else if( oldType.IsSByte() )
     53    {
    4554        //movsx reg32,reg8
    4655        compiler.codeGenerator.op_movsx32_FromReg8(reg,reg);
    4756    }
    48     else if(type==DEF_BYTE || type==DEF_BOOLEAN){
     57    else if( oldType.IsByte() || oldType.IsBoolean() )
     58    {
    4959        //and reg,000000FFh
    5060        compiler.codeGenerator.op_and32_value(reg,(int)0xFF);
    5161    }
    5262}
    53 void ExtendTypeTo16(int type,int reg){
    54     if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
     63void ExtendTypeTo16( const Type &oldType, int reg ){
     64    if( oldType.IsSByte() )
     65    {
    5566        //movsx reg16,reg8
    5667        compiler.codeGenerator.op_movsx16_FromReg8(reg,reg);
    5768    }
    58     else if(type==DEF_BYTE){
     69    else if( oldType.IsByte() || oldType.IsBoolean() )
     70    {
    5971        //and reg,000000FFh
    6072        compiler.codeGenerator.op_and32_value(reg,(int)0xFF);
     
    183195}
    184196
    185 void ChangeTypeToWhole(int OldType,int NewType,int reg,int xmm_reg){
    186     if(OldType==DEF_DOUBLE){
    187         if(Is64Type(NewType)){
     197void ChangeTypeToWhole( const Type &oldType, const Type &newType, int reg, int xmm_reg )
     198{
     199    if( oldType.IsDouble() )
     200    {
     201        if( newType.Is64() )
     202        {
    188203            //cvttsd2si reg,xmm_reg
    189204            compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(_int64),reg,xmm_reg);
    190205        }
    191         else{
     206        else
     207        {
    192208            //cvttsd2si reg,xmm_reg
    193209            compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(long),reg,xmm_reg);
    194210        }
    195211    }
    196     else if(OldType==DEF_SINGLE){
    197         if(Is64Type(NewType)){
     212    if( oldType.IsSingle() )
     213    {
     214        if( newType.Is64() )
     215        {
    198216            //cvttss2si reg,xmm_reg
    199217            compiler.codeGenerator.op_cvttss2si_xmm(sizeof(_int64),reg,xmm_reg);
    200218        }
    201         else{
     219        else
     220        {
    202221            //cvttss2si reg,xmm_reg
    203222            compiler.codeGenerator.op_cvttss2si_xmm(sizeof(long),reg,xmm_reg);
     
    207226        //整数から整数へ変換
    208227
    209         if(Is64Type(NewType)){
    210             ExtendTypeTo64(OldType,reg);
    211         }
    212         else if(GetTypeSize(NewType,-1)==sizeof(long)){
    213             ExtendTypeTo32(OldType,reg);
    214         }
    215         else if(GetTypeSize(NewType,-1)==sizeof(short)){
    216             ExtendTypeTo16(OldType,reg);
     228        if( newType.Is64() )
     229        {
     230            ExtendTypeTo64(oldType,reg);
     231        }
     232        if( newType.GetSize() == sizeof(long) )
     233        {
     234            ExtendTypeTo32(oldType,reg);
     235        }
     236        if( newType.GetSize() == sizeof(short) )
     237        {
     238            ExtendTypeTo16(oldType,reg);
    217239        }
    218240    }
     
    477499    sp=*pStackPointer;
    478500
    479     int CastType;
    480     CastType=type[sp-1];
    481     if((CastType&FLAG_CAST)==0){
     501    int castBasicType = type[sp-1];
     502    if((castBasicType&FLAG_CAST)==0){
    482503        SetError(47,NULL,cp);
    483504        return 0;
    484505    }
    485     CastType=CastType&(~FLAG_CAST);
     506    castBasicType = castBasicType&(~FLAG_CAST);
     507
     508    Type oldType( type[sp-2], index_stack[sp-2] );
     509    Type castType( castBasicType, index_stack[sp-1] );
    486510
    487511    int xmm_reg,reg;
    488 
    489     if(IsRealNumberType(CastType)){
     512    if( castType.IsReal() )
     513    {
    490514        //実数型へキャスト
    491515
    492         if(IsRealNumberType(type[sp-2])){
    493             SetOneTermToReg_RealCalc(type[sp-2],&xmm_reg);
    494         }
    495         else{
    496             if(Is64Type(type[sp-2]))
    497                 SetOneTermToReg_Whole64Calc(type[sp-2],&reg);
    498             else if(IsWholeNumberType(type[sp-2]))
    499                 SetOneTermToReg_Whole32Calc(type[sp-2],&reg);
     516        if( oldType.IsReal() )
     517        {
     518            SetOneTermToReg_RealCalc(oldType.GetBasicType(),&xmm_reg);
     519        }
     520        else
     521        {
     522            if( oldType.Is64() )
     523            {
     524                SetOneTermToReg_Whole64Calc(oldType.GetBasicType(),&reg);
     525            }
     526            else if( oldType.IsWhole() )
     527            {
     528                SetOneTermToReg_Whole32Calc(oldType.GetBasicType(),&reg);
     529            }
    500530
    501531            pobj_reg->UnlockReg();
     
    504534        }
    505535
    506         if(CastType==DEF_DOUBLE){
     536        if( castType.IsDouble() )
     537        {
    507538            //Double型にデータ変換
    508             ChangeTypeToXmm_Double(type[sp-2],xmm_reg,reg);
    509         }
    510         else if(CastType==DEF_SINGLE){
     539            ChangeTypeToXmm_Double(oldType.GetBasicType(),xmm_reg,reg);
     540        }
     541        else if( castType.IsSingle() )
     542        {
    511543            //Single型にデータ変換
    512             ChangeTypeToXmm_Single(type[sp-2],xmm_reg,reg);
     544            ChangeTypeToXmm_Single(oldType.GetBasicType(),xmm_reg,reg);
    513545        }
    514546
     
    521553        //その他整数型へ変換
    522554
    523         if(IsRealNumberType(type[sp-2])){
    524             SetOneTermToReg_RealCalc(type[sp-2],&xmm_reg);
     555        if( oldType.IsReal() )
     556        {
     557            SetOneTermToReg_RealCalc(oldType.GetBasicType(),&xmm_reg);
    525558
    526559            pobj_reg->UnlockXmmReg();
     
    529562
    530563            //整数型へデータ変換
    531             ChangeTypeToWhole(type[sp-2],CastType,reg,xmm_reg);
     564            ChangeTypeToWhole(oldType,castType,reg,xmm_reg);
    532565
    533566            if(reg==REG_R14){
     
    545578
    546579            //整数型へデータ変換
    547             ChangeTypeToWhole(type[sp-2],CastType,reg,0);
     580            ChangeTypeToWhole(oldType,castType,reg,0);
    548581
    549582            if(reg==REG_R14){
     
    554587    }
    555588
    556     type[sp-2]=CastType;
    557     index_stack[sp-2]=index_stack[sp-1];
     589    type[sp-2] = castType.GetBasicType();
     590    index_stack[sp-2] = castType.GetIndex();
    558591
    559592    sp--;
Note: See TracChangeset for help on using the changeset viewer.