Ignore:
Timestamp:
Mar 9, 2007, 4:59:13 AM (18 years ago)
Author:
dai_9181
Message:

参照型の整数型パラメータに実数を代入すると「内部エラー」になってしまうバグを修正。
参照型の整数型にリテラル値を直接指定すると「内部エラー」になってしまうバグを修正。
バージョンをβ15にした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Set_Var.cpp

    r64 r66  
    274274}
    275275
    276 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative){
    277     if(type==DEF_DOUBLE){
    278         //Double型
    279         // st(0)の内容をedx:eaxに変換
    280 
    281         //TODO: 実装
    282         SetError();
    283     }
    284     else if(type==DEF_SINGLE){
    285         //Single型
    286         // st(0)の内容をeaxに変換
    287 
    288         //TODO: 実装
    289         SetError();
     276void SetWholeVariable(int varSize,int calcType,RELATIVE_VAR *pRelative){
     277    if( IsRealNumberType( calcType ) ){
     278        // 実数型から整数型へ変換する
     279
     280        if( varSize == sizeof(_int64) ){
     281            // 64bitへ
     282            // st(0) -> edx:eax
     283            breakpoint;
     284
     285            //push
     286            //push
     287            op_sub_esp( PTR_SIZE * 2 );
     288
     289            //fistp qword ptr[esp]
     290            op_fistp_ptr_esp( sizeof(_int64) );
     291
     292            //pop eax
     293            op_pop( REG_EAX );
     294
     295            //pop edx
     296            op_pop( REG_EDX );
     297        }
     298        else{
     299            // 32bit
     300            // st(0) -> eax
     301
     302            //push
     303            op_push( REG_NON );
     304
     305            //fistp dword ptr[esp]
     306            op_fistp_ptr_esp( sizeof(long) );
     307
     308            //pop eax
     309            op_pop( REG_EAX );
     310        }
    290311    }
    291312    else{
    292313        //その他の整数
    293314
    294         if(var_size==sizeof(_int64)){
     315        if(varSize==sizeof(_int64)){
    295316            //eaxの値を64ビット(edx:eax)に拡張する
    296             ExtendTypeTo64(type);
    297         }
    298         else if(var_size==sizeof(long)){
     317            ExtendTypeTo64(calcType);
     318        }
     319        else if(varSize==sizeof(long)){
    299320            //レジスタの値を32ビット(eax)に拡張する
    300             ExtendTypeTo32(type,REG_EAX);
    301         }
    302         else if(var_size==sizeof(short)){
     321            ExtendTypeTo32(calcType,REG_EAX);
     322        }
     323        else if(varSize==sizeof(short)){
    303324            //レジスタの値を16ビット(ax)に拡張する
    304             ExtendTypeTo16(type,REG_EAX);
     325            ExtendTypeTo16(calcType,REG_EAX);
    305326        }
    306327        //8ビットは拡張なし
    307328    }
    308329
    309     if(var_size==sizeof(_int64)){
     330    if(varSize==sizeof(_int64)){
    310331        //下位32ビット
    311332        SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
    312333
     334        //上位32ビット
     335
     336        //直接参照に切り替え
     337        SetVarPtrToEax(pRelative);
     338        pRelative->dwKind=VAR_DIRECTMEM;
     339
     340        //mov ecx,eax
     341        op_mov_RR( REG_ECX, REG_EAX );
     342
     343        //add ecx,sizeof(long)
     344        op_add_RV8( REG_ECX, sizeof(long) );
     345
    313346        //mov eax,edx
    314347        op_mov_RR( REG_EAX, REG_EDX );
    315348
    316         //上位32ビット
    317         if( pRelative->dwKind == VAR_DIRECTMEM ){
    318             //add ecx,sizeof(long)
    319             op_add_RV8( REG_ECX, sizeof(long) );
    320         }
    321         pRelative->offset+=sizeof(long);
    322349        SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
    323         pRelative->offset-=sizeof(long);
    324350
    325351        return;
     
    329355        if(pRelative->bOffsetOffset){
    330356            //mov ptr[ecx+offset],eax/ax/al
    331             op_mov_MR(var_size,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
     357            op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
    332358        }
    333359        else{
    334360            //mov ptr[offset],eax/ax/al
    335             op_mov_MR(var_size,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
     361            op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
    336362        }
    337363        obp-=sizeof(long);
     
    342368        if(pRelative->bOffsetOffset){
    343369            //add ecx,qword ptr[offset]
    344             op_add_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
     370            op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
    345371        }
    346372        else{
    347373            //mov ecx,qword ptr[offset]
    348             op_mov_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
     374            op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
    349375        }
    350376        obp-=sizeof(long);
     
    357383        if(pRelative->bOffsetOffset){
    358384            //mov ptr[ebp+ecx+offset],eax/ax/al
    359             op_mov_MR_ex(var_size,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
     385            op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
    360386        }
    361387        else{
    362388            //mov ptr[ebp+offset],eax/ax/al
    363             op_mov_MR(var_size,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     389            op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    364390        }
    365391        obp-=sizeof(long);
     
    370396        if(pRelative->bOffsetOffset){
    371397            //add ecx,qword ptr[ebp+offset]
    372             op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     398            op_add_RM(varSize,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    373399        }
    374400        else{
    375401            //mov ecx,qword ptr[ebp+offset]
    376             op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     402            op_mov_RM(varSize,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    377403        }
    378404        obp-=sizeof(long);
     
    386412
    387413        //mov ptr[ecx],eax/ax/al
    388         op_mov_MR(var_size,REG_EAX,REG_ECX,0,MOD_BASE);
     414        op_mov_MR(varSize,REG_EAX,REG_ECX,0,MOD_BASE);
    389415    }
    390416}
Note: See TracChangeset for help on using the changeset viewer.