Changeset 255 in dev for trunk/abdev/BasicCompiler64/NumOpe.cpp
- Timestamp:
- Aug 1, 2007, 3:37:09 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/NumOpe.cpp
r254 r255 519 519 } 520 520 521 bool NumOpe( int *pReg,521 bool _numope( int *pReg, 522 522 const char *expression, 523 523 const Type &baseType, 524 524 Type &resultType, 525 BOOL *pbUseHeap ){ 525 BOOL *pbUseHeap ) 526 { 526 527 527 528 int i,i2,i3; … … 684 685 685 686 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 699 687 700 688 //////////////////////////////// … … 707 695 //リテラル値のみの計算かどうかを判別するためのフラグ 708 696 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;731 697 732 698 double dbl; … … 1164 1130 1165 1131 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(); 1222 1133 } 1223 1134 else{ … … 1234 1145 1235 1146 1147 resultType.SetType( type_stack[0], index_stack[0] ); 1148 1149 bool isSuccessful = true; 1150 goto finish; 1151 1152 1153 1154 ////////////////// 1155 // エラー処理 1156 ////////////////// 1157 1158 error: 1159 1160 isSuccessful = false; 1161 goto finish; 1162 1163 1164 1165 1166 finish: 1167 1168 for(i=0;i<pnum;i++){ 1169 if(values[i]) HeapDefaultFree(values[i]); 1170 } 1171 1172 return isSuccessful; 1173 } 1174 1175 bool 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 1236 1204 if(bInitRegSwitch){ 1237 1205 //整合性をチェック(バグ回避) 1238 pobj_reg->bug_check(); 1206 if( result ) 1207 { 1208 pobj_reg->bug_check(); 1209 } 1239 1210 1240 1211 //作業レジスタを解放 … … 1243 1214 } 1244 1215 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; 1282 1217 }
Note:
See TracChangeset
for help on using the changeset viewer.