Changeset 75 in dev for BasicCompiler64/CParameter.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/CParameter.cpp
r73 r75 2 2 #include "opcode.h" 3 3 4 int ParamImpl::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 4 int ParamImpl::NewTempParameters( const string &procName, const Parameters ¶ms, int SecondParmNum ){ 5 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size(); 6 5 7 /////////////////////////////////////////////////////// 6 8 // 一時オブジェクトをあらかじめスタックに積んでおく … … 12 14 13 15 BOOL bEllipse; 14 if(p i_num){15 if(p pi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;16 if(params.size()){ 17 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 16 18 else bEllipse=0; 17 19 } … … 21 23 useTempParameters[i2] = false; 22 24 23 if(bEllipse&&i2<= pi_num-2) bEllipse=0;24 25 if(i2==0 &&ppi[i2].name){26 if( lstrcmp(ppi[i2].name,"_System_LocalThis")==0){25 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 26 27 if(i2==0){ 28 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 27 29 //オブジェクトメンバの第一パラメータのThisポインタ 28 30 continue; 29 31 } 30 32 } 31 if( (i2==0||i2==1)&&ppi[i2].name){32 if( lstrcmp(ppi[i2].name,FuncName)==0){33 if( i2==0||i2==1 ){ 34 if( params[i2]->GetVarName() == procName ){ 33 35 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 34 36 continue; … … 36 38 } 37 39 38 T YPEINFO DummyTypeInfo;40 Type dummyType; 39 41 BOOL bByVal; 40 42 if(bEllipse){ 41 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);43 NumOpe_GetType( Parms[i2], Type(), dummyType ); 42 44 bByVal=1; 43 45 } 44 46 else{ 45 DummyTypeInfo.type=ppi[i2].type; 46 DummyTypeInfo.u.lpIndex=ppi[i2].u.index; 47 bByVal=ppi[i2].bByVal; 47 dummyType = *params[i2]; 48 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 48 49 } 49 50 … … 56 57 } 57 58 58 LONG_PTR lpVarIndex; 59 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 59 if( !GetVarType( Parms[i2], Type(), FALSE ) ){ 60 60 //変数ではないとき 61 61 int reg = REG_RAX; 62 int type = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 63 64 if( type != DEF_STRUCT ){ 62 Type calcType; 63 NumOpe( ®, Parms[i2], dummyType, calcType ); 64 65 if( !calcType.IsStruct() ){ 65 66 //一時参照を作成 66 67 pobj_sf->push( reg ); … … 76 77 77 78 bool result = CheckDifferentType( 78 DummyTypeInfo.type, 79 DummyTypeInfo.u.lpIndex, 80 type, 81 lpVarIndex, 82 FuncName, 79 dummyType, 80 calcType, 81 procName.c_str(), 83 82 i2); 84 83 … … 87 86 useTempObject = true; 88 87 89 types[i2].type = type; 90 types[i2].u.lpIndex = lpVarIndex; 88 types[i2] = calcType; 91 89 } 92 90 } … … 104 102 for(int i2=ParmsNum-1;i2>=0;i2--){ 105 103 if( useTempParameters[i2] ){ 106 if( types[i2]. type == DEF_STRUCT){104 if( types[i2].IsStruct() ){ 107 105 // 構造体の一時メモリ 108 106 … … 112 110 113 111 //call free 114 extern SubInfo*pSub_free;112 extern UserProc *pSub_free; 115 113 op_call(pSub_free); 116 114 } … … 123 121 } 124 122 125 void ParamImpl::SetStructParameter( int reg,CClass *pobj_Class,LPSTR Parameter){123 void ParamImpl::SetStructParameter( int reg, const Type &baseType, const char *expression ){ 126 124 ////////////////////////////////////////////////////// 127 125 ///// レジスタ資源のバックアップ … … 129 127 ////////////////////////////////////////////////////// 130 128 131 int object_size = pobj_Class->GetSize();129 int object_size = baseType.GetClass().GetSize(); 132 130 133 131 //mov rcx,object_size … … 135 133 136 134 //call calloc 137 extern SubInfo*pSub_calloc;135 extern UserProc *pSub_calloc; 138 136 op_call(pSub_calloc); 139 137 … … 144 142 pobj_sf->push(REG_R11); 145 143 146 TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 147 TYPEINFO CalcType; 148 CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex); 149 150 /* 151 TODO: 消す 152 if( pobj_Class->GetCopyConstructorMethod() 153 && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){ 154 //////////////////////////////////// 155 // コピーコンストラクタを呼び出す 156 //////////////////////////////////// 157 158 BOOL bUseHeap; 159 int temp_reg=REG_RDX; 160 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 161 162 if(bUseHeap){ 163 //mov r14,rdx 164 op_mov_RR(REG_R14,REG_RDX); 165 } 166 167 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 168 pobj_sf->ref(REG_R11); 169 170 //mov rcx,this 171 op_mov_RR(REG_RCX,REG_R11); 172 173 //call constructor 174 op_call(pobj_Class->GetCopyConstructorMethod()->psi); 175 176 177 if(bUseHeap){ 178 FreeTempObject(REG_R14,pobj_Class); 179 } 180 } 181 else{ 182 if( pobj_Class->GetConstructorMethod() ){ 183 //////////////////////////////// 184 // コンストラクタを呼び出す 185 //////////////////////////////// 186 187 //mov rcx,this 188 op_mov_RR(REG_RCX,REG_R11); 189 190 //call constructor 191 op_call(pobj_Class->GetConstructorMethod()->psi); 192 } 193 */ 194 195 196 BOOL bUseHeap; 197 int temp_reg=REG_RAX; 198 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 199 200 201 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 202 pobj_sf->ref(REG_R11); 203 204 205 RELATIVE_VAR RelativeVar; 206 RelativeVar.bOffsetOffset=0; 207 RelativeVar.offset=0; 208 RelativeVar.dwKind=VAR_DIRECTMEM; 209 210 SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap); 211 212 //} 144 145 Type calcType; 146 BOOL bUseHeap; 147 int temp_reg=REG_RAX; 148 NumOpe( &temp_reg, 149 expression, 150 baseType, 151 calcType, 152 &bUseHeap ); 153 154 155 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 156 pobj_sf->ref(REG_R11); 157 158 159 RELATIVE_VAR RelativeVar; 160 RelativeVar.bOffsetOffset=0; 161 RelativeVar.offset=0; 162 RelativeVar.dwKind=VAR_DIRECTMEM; 163 164 SetStructVariableFromRax( 165 baseType, 166 calcType, 167 &RelativeVar,bUseHeap); 168 213 169 214 170 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 … … 225 181 226 182 227 void ParamImpl::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ 183 void ParamImpl::SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum ){ 184 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size(); 185 228 186 /////////////////////////////////////////////////////////// 229 187 // パラメータをレジスタ及びスタックフレームにセット … … 232 190 233 191 BOOL bEllipse; 234 if( pi_num){235 if(p pi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;192 if( params.size() ){ 193 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 236 194 else bEllipse=0; 237 195 } … … 240 198 BOOL bHas_System_LocalThis=0; 241 199 if(ParmsNum>=1){ 242 if( lstrcmp(ppi[0].name,"_System_LocalThis")==0)200 if( params[0]->GetVarName() == "_System_LocalThis" ){ 243 201 bHas_System_LocalThis=1; 202 } 244 203 } 245 204 246 205 //戻り値用の変数名を取得 247 const char *lpszVarNameToReturn = ( FuncName[0]==1&&FuncName[1]==ESC_OPERATOR)?"_System_ReturnValue":FuncName;206 const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName.c_str(); 248 207 249 208 //パラメータをレジスタとスタックに格納 250 int CalcType;251 LONG_PTR lpCalcIndex;252 BOOL bCalcUseHeap;253 209 int ParmSize=0; 254 210 int reg,temp_reg; 255 211 RELATIVE_VAR RelativeVar; 256 212 for(i2=ParmsNum-1;i2>=0;i2--){ 257 if(bEllipse&&i2<= pi_num-2) bEllipse=0;258 259 if(i2==0 &&ppi[i2].name){260 if( lstrcmp(ppi[i2].name,"_System_LocalThis")==0){213 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 214 215 if(i2==0){ 216 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 261 217 //オブジェクトメンバの第一パラメータのThisポインタ 262 218 continue; 263 219 } 264 220 } 265 if( (i2==0||i2==1)&&ppi[i2].name){266 if( lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){221 if(i2==0||i2==1){ 222 if( params[i2]->GetVarName() == lpszVarNameToReturn ){ 267 223 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 268 224 continue; … … 270 226 } 271 227 272 T YPEINFO DummyTypeInfo;228 Type dummyType; 273 229 BOOL bByVal; 274 230 if(bEllipse){ 275 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);231 NumOpe_GetType( Parms[i2], Type(), dummyType ); 276 232 bByVal=1; 277 233 } 278 234 else{ 279 DummyTypeInfo.type=ppi[i2].type; 280 DummyTypeInfo.u.lpIndex=ppi[i2].u.index; 281 bByVal=ppi[i2].bByVal; 235 dummyType = *params[i2]; 236 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 282 237 } 283 238 284 239 int xmm_temp_sw=0; 285 if( IsRealNumberType(DummyTypeInfo.type)&&bByVal){240 if(dummyType.IsReal()&&bByVal){ 286 241 //実数型 287 242 if(i2==0) reg=REG_XMM0; … … 308 263 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 309 264 char temp2[255]; 310 sprintf(temp2,"%s関数の第%dパラメータ", FuncName,i2+1);265 sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1); 311 266 SetError(19,temp2,cp); 312 267 continue; 313 268 } 314 269 315 if( DummyTypeInfo.type==DEF_STRUCT){316 SetStructParameter( reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);270 if( dummyType.IsStruct() ){ 271 SetStructParameter( reg, dummyType, Parms[i2] ); 317 272 goto next; 318 273 } … … 321 276 322 277 extern LONG_PTR ProcPtr_BaseIndex; 323 LONG_PTR back_ProcPtr_BaseIndex; 324 back_ProcPtr_BaseIndex=ProcPtr_BaseIndex; 325 if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex; 326 else ProcPtr_BaseIndex=-1; 327 328 CalcType=NumOpe(&temp_reg,Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap); 278 LONG_PTR back_ProcPtr_BaseIndex = ProcPtr_BaseIndex; 279 if( dummyType.IsProcPtr() ){ 280 ProcPtr_BaseIndex = dummyType.GetIndex(); 281 } 282 else{ 283 ProcPtr_BaseIndex=-1; 284 } 285 286 BOOL bCalcUseHeap; 287 Type calcType; 288 if( !NumOpe( &temp_reg, Parms[i2], dummyType, calcType, &bCalcUseHeap ) ){ 289 break; 290 } 329 291 330 292 ProcPtr_BaseIndex=back_ProcPtr_BaseIndex; 331 293 332 if(CalcType==-1) break; 333 334 if(CalcType==DEF_OBJECT){ 335 if( DummyTypeInfo.type != DEF_OBJECT 294 if( calcType.IsObject() ){ 295 if( !dummyType.IsObject() 336 296 || 337 DummyTypeInfo.type == DEF_OBJECT&&338 ! DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex) ){297 dummyType.IsObject() && 298 !dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){ 339 299 //キャスト演算子のオーバーロードに対応する 340 CallCastOperatorProc( reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);300 CallCastOperatorProc( reg, calcType, bCalcUseHeap,dummyType ); 341 301 } 342 302 } … … 344 304 345 305 if(bEllipse){ 346 if( IsRealNumberType(CalcType)){306 if( calcType.IsReal() ){ 347 307 //整数レジスタへコピー 348 308 //※cdeclの拡張パラメータは実数の場合も汎用レジスタで引渡し … … 358 318 } 359 319 } 360 else if( IsWholeNumberType(CalcType)){320 else if( calcType.IsWhole() ){ 361 321 //整数型の場合は、64ビットへ拡張する 362 ExtendTypeTo64( CalcType,temp_reg);322 ExtendTypeTo64( calcType.GetBasicType(), temp_reg ); 363 323 } 364 324 } … … 369 329 else i3=i2; 370 330 CheckDifferentType( 371 DummyTypeInfo.type, 372 DummyTypeInfo.u.lpIndex, 373 CalcType, 374 lpCalcIndex, 375 FuncName, 331 dummyType, 332 calcType, 333 procName.c_str(), 376 334 i3); 377 335 378 379 if(DummyTypeInfo.type==DEF_DOUBLE){ 336 if( dummyType.IsDouble() ){ 380 337 //Double型へ変換 381 ChangeTypeToXmm_Double( CalcType,reg,temp_reg);382 } 383 else if( DummyTypeInfo.type==DEF_SINGLE){338 ChangeTypeToXmm_Double(calcType.GetBasicType(),reg,temp_reg); 339 } 340 else if( dummyType.IsSingle() ){ 384 341 //Single型へ変換 385 ChangeTypeToXmm_Single( CalcType,reg,temp_reg);386 } 387 else if( IsWholeNumberType(DummyTypeInfo.type)){342 ChangeTypeToXmm_Single(calcType.GetBasicType(),reg,temp_reg); 343 } 344 else if( dummyType.IsWhole() ){ 388 345 //実数型 → 整数型 389 ChangeTypeToWhole( CalcType,DummyTypeInfo.type,reg,temp_reg);346 ChangeTypeToWhole(calcType.GetBasicType(),dummyType.GetBasicType(),reg,temp_reg); 390 347 } 391 348 } … … 397 354 398 355 temp_reg=reg; 399 CalcType=NumOpe(&temp_reg,Parms[i2]+2,0,0,&lpCalcIndex); 400 if(CalcType==-1) break; 401 402 int ptr_type; 403 ptr_type=GetPtrType(DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 356 Type calcType; 357 if( !NumOpe(&temp_reg, Parms[i2]+2, dummyType, calcType) ){ 358 break; 359 } 360 361 dummyType.PtrLevelUp(); 404 362 405 363 //型チェック … … 407 365 else i3=i2; 408 366 CheckDifferentType( 409 ptr_type, 410 DummyTypeInfo.u.lpIndex, 411 CalcType, 412 lpCalcIndex, 413 FuncName, 367 dummyType, 368 calcType, 369 procName.c_str(), 414 370 i3); 415 371 416 if( IsRealNumberType(CalcType)){372 if( calcType.IsReal() ){ 417 373 //実数型 → 整数型 418 ChangeTypeToWhole( CalcType,DEF_QWORD,reg,temp_reg);374 ChangeTypeToWhole( calcType.GetBasicType(), DEF_QWORD,reg,temp_reg); 419 375 } 420 376 } … … 428 384 else{ 429 385 //変数のアドレスを取得 430 int VarType; 431 LONG_PTR lpVarIndex; 386 Type varType; 432 387 if(GetVarOffset( 433 388 false, 434 389 false, 435 390 Parms[i2], 436 &VarType,437 391 &RelativeVar, 438 &lpVarIndex)){439 440 if( DummyTypeInfo.type!=DEF_ANY){392 varType)){ 393 394 if( !dummyType.IsAny() ){ 441 395 //型チェックを行う 442 if( DummyTypeInfo.type==VarType){443 if( DummyTypeInfo.type==DEF_OBJECT){444 if( ! DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex) ){396 if( dummyType.GetBasicType() == varType.GetBasicType() ){ 397 if( dummyType.IsObject() ){ 398 if( !dummyType.GetClass().IsEqualsOrSubClass( &varType.GetClass() ) ){ 445 399 SetError(11,Parms[i2],cp); 446 400 } 447 401 } 448 else if( DummyTypeInfo.type==DEF_STRUCT){449 if( ! DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex) ){402 else if( dummyType.IsStruct() ){ 403 if( !dummyType.GetClass().IsEquals( &varType.GetClass() ) ){ 450 404 SetError(11,Parms[i2],cp); 451 405 } 452 406 } 453 407 } 454 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ 408 else if( (varType.GetBasicType()&FLAG_PTR) 409 &&((varType.GetBasicType()^FLAG_PTR)==dummyType.GetBasicType())){ 455 410 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 456 411 } … … 494 449 495 450 //パラメータが収まるだけのスタックフレームを確保 496 pobj_sf->parameter_allocate( pi_num*sizeof(_int64)+ sizeof(_int64)/*ret用*/ );451 pobj_sf->parameter_allocate((int)params.size()*sizeof(_int64)+ sizeof(_int64)/*ret用*/ ); 497 452 } 498 453 void ParamImpl::BackupParameter(int pi_num){
Note:
See TracChangeset
for help on using the changeset viewer.