Ignore:
Timestamp:
Aug 1, 2007, 3:37:09 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

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

    r254 r255  
    519519}
    520520
    521 bool NumOpe( int *pReg,
     521bool _numope( int *pReg,
    522522            const char *expression,
    523523            const Type &baseType,
    524524            Type &resultType,
    525             BOOL *pbUseHeap ){
     525            BOOL *pbUseHeap )
     526{
    526527
    527528    int i,i2,i3;
     
    684685
    685686
    686     BOOL bInitRegSwitch=0;
    687     if(!pobj_reg){
    688         bInitRegSwitch=1;
    689 
    690         //作業用レジスタを取得
    691         pobj_reg=new CRegister(*pReg);
    692     }
    693 
    694     //エラー時の復旧用
    695     CRegister objReg_Backup;
    696     objReg_Backup=*pobj_reg;
    697 
    698 
    699687
    700688    ////////////////////////////////
     
    707695    //リテラル値のみの計算かどうかを判別するためのフラグ
    708696    BOOL bLiteralCalculation=1;
    709 
    710     //リテラル演算の場合を考慮した演算前のバッファ位置
    711     int BeforeObp;
    712     BeforeObp=obp;
    713 
    714     //リテラル演算の場合を考慮した演算前のプロシージャスケジュール位置
    715     //※64ビットの掛け算、除算などで特殊関数が呼ばれるため
    716     int Before_ProcAddrScheduleNum;
    717     Before_ProcAddrScheduleNum=pobj_SubAddrSchedule->num;
    718 
    719     //リテラル演算の場合を考慮した演算前のデータテーブルスケジュール位置
    720     int Before_DataTableScheduleNum;
    721     Before_DataTableScheduleNum=pobj_DataTableSchedule->num;
    722 
    723     //リテラル演算の場合を考慮した演算前の再配置スケジュール
    724     CReloc *pobj_BackReloc;
    725     pobj_BackReloc=new CReloc();
    726     pobj_BackReloc->copy(pobj_Reloc);
    727 
    728     //リテラル演算の場合を考慮した演算前のスタックフレームスケジュール位置
    729     int Before_StackFrameScheduleNum;
    730     Before_StackFrameScheduleNum=pobj_sf->num;
    731697
    732698    double dbl;
     
    11641130
    11651131    if(bLiteralCalculation){
    1166         //右辺値が数値の定数式の場合
    1167         Type resultType;
    1168         StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
    1169 
    1170         obp=BeforeObp;
    1171         pobj_SubAddrSchedule->num=Before_ProcAddrScheduleNum;
    1172         pobj_DataTableSchedule->num=Before_DataTableScheduleNum;
    1173         pobj_Reloc->copy(pobj_BackReloc);
    1174         pobj_sf->num=Before_StackFrameScheduleNum;
    1175         *pobj_reg=objReg_Backup;
    1176 
    1177         if(resultType.IsReal()){
    1178             if(baseType.IsReal()) resultType=baseType;
    1179 
    1180             XmmReg=pobj_reg->LockXmmReg();
    1181 
    1182             if(resultType.IsDouble()){
    1183                 i3 = compiler.GetDataTable().Add( i64data );
    1184 
    1185                 //movlpd xmm_reg,qword ptr[data table offset]
    1186                 compiler.codeGenerator.op_movlpd_RM( XmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
    1187             }
    1188             if(resultType.IsSingle()){
    1189                 memcpy(&dbl,&i64data,sizeof(_int64));
    1190 
    1191                 float flt;
    1192                 int i32data;
    1193                 flt=(float)dbl;
    1194                 memcpy(&i32data,&flt,sizeof(long));
    1195 
    1196                 i3 = compiler.GetDataTable().Add( i32data );
    1197 
    1198                 //movss xmm_reg,dword ptr[data table offset]
    1199                 compiler.codeGenerator.op_movss_RM( XmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
    1200             }
    1201         }
    1202         else{
    1203             if(!resultType.Is64()){
    1204                 //整数(符号有り/無し)
    1205 
    1206                 i3=(long)i64data;
    1207 
    1208                 if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
    1209                 if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
    1210 
    1211                 i64data=(_int64)i3;
    1212             }
    1213 
    1214             UseReg=pobj_reg->LockReg();
    1215 
    1216             //mov reg,i64data
    1217             compiler.codeGenerator.op_mov_RV64(UseReg,i64data);
    1218         }
    1219 
    1220         type_stack[0]=resultType.GetBasicType();
    1221         index_stack[0]=resultType.GetIndex();
     1132        SetError();
    12221133    }
    12231134    else{
     
    12341145
    12351146
     1147    resultType.SetType( type_stack[0], index_stack[0] );
     1148
     1149    bool isSuccessful = true;
     1150    goto finish;
     1151
     1152
     1153
     1154    //////////////////
     1155    // エラー処理
     1156    //////////////////
     1157
     1158error:
     1159
     1160    isSuccessful = false;
     1161    goto finish;
     1162
     1163
     1164
     1165
     1166finish:
     1167
     1168    for(i=0;i<pnum;i++){
     1169        if(values[i]) HeapDefaultFree(values[i]);
     1170    }
     1171
     1172    return isSuccessful;
     1173}
     1174
     1175bool NumOpe( int *pReg,
     1176            const char *expression,
     1177            const Type &baseType,
     1178            Type &resultType,
     1179            BOOL *pbUseHeap )
     1180{
     1181    BOOL bInitRegSwitch=0;
     1182    if(!pobj_reg){
     1183        bInitRegSwitch=1;
     1184
     1185        //作業用レジスタを取得
     1186        pobj_reg=new CRegister(*pReg);
     1187    }
     1188
     1189    //エラー時の復旧用
     1190    CRegister objReg_Backup;
     1191    objReg_Backup=*pobj_reg;
     1192
     1193    *pReg = pobj_reg->GetNextReg();
     1194
     1195
     1196    bool result = _numope( pReg, expression, baseType, resultType, pbUseHeap );
     1197
     1198
     1199    if( !result )
     1200    {
     1201        *pobj_reg=objReg_Backup;
     1202    }
     1203
    12361204    if(bInitRegSwitch){
    12371205        //整合性をチェック(バグ回避)
    1238         pobj_reg->bug_check();
     1206        if( result )
     1207        {
     1208            pobj_reg->bug_check();
     1209        }
    12391210
    12401211        //作業レジスタを解放
     
    12431214    }
    12441215
    1245     resultType.SetType( type_stack[0], index_stack[0] );
    1246 
    1247     bool isSuccessful = true;
    1248     goto finish;
    1249 
    1250 
    1251 
    1252     //////////////////
    1253     // エラー処理
    1254     //////////////////
    1255 
    1256 error:
    1257 
    1258     *pobj_reg=objReg_Backup;
    1259 
    1260     if(bInitRegSwitch){
    1261         //作業レジスタを解放
    1262         delete pobj_reg;
    1263         pobj_reg=0;
    1264     }
    1265 
    1266     isSuccessful = false;
    1267     goto finish;
    1268 
    1269 
    1270 
    1271 
    1272 finish:
    1273 
    1274     for(i=0;i<pnum;i++){
    1275         if(values[i]) HeapDefaultFree(values[i]);
    1276     }
    1277 
    1278     //再配置スケジュールバックアップ情報を解放
    1279     delete pobj_BackReloc;
    1280 
    1281     return isSuccessful;
     1216    return result;
    12821217}
Note: See TracChangeset for help on using the changeset viewer.