Changeset 75 in dev for BasicCompiler64/NumOpe.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/NumOpe.cpp
r69 r75 19 19 20 20 extern CClass *pobj_StringClass; 21 TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass }; 22 Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo ); 21 Operator_New( *pobj_StringClass, "", parameter, Type( DEF_OBJECT, *pobj_StringClass ) ); 23 22 24 23 free( parameter ); … … 70 69 } 71 70 72 int NumOpe(int *pReg,const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){ 73 extern HANDLE hHeap; 71 void ExtendRegToBigType( int reg, int bigBasicType, int baseBasicType ){ 72 switch( Type::GetBasicSize( bigBasicType ) ){ 73 case sizeof(_int64): 74 ExtendTypeTo64(baseBasicType,reg); 75 break; 76 case sizeof(long): 77 ExtendTypeTo32(baseBasicType,reg); 78 break; 79 case sizeof(short): 80 ExtendTypeTo16(baseBasicType,reg); 81 break; 82 } 83 } 84 85 bool NumOpe( int *pReg, 86 const char *expression, 87 const Type &baseType, 88 Type &resultType, 89 BOOL *pbUseHeap ){ 90 74 91 int i,i2,i3,i4; 75 92 char temporary[1024],temp2[1024],temp3[1024]; 76 93 77 if( Command[0]=='\0'){94 if(expression[0]=='\0'){ 78 95 SetError(1,NULL,cp); 79 return 0;80 } 81 82 if( Command[0]==1&& Command[1]==ESC_NEW ){96 return false; 97 } 98 99 if(expression[0]==1&& expression[1]==ESC_NEW ){ 83 100 //New演算子(オブジェクト生成) 84 TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex }; 85 int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo ); 101 102 if( !Operator_New( expression+2, baseType, resultType ) ){ 103 return false; 104 } 86 105 87 106 //mov reg,rax 88 107 op_mov_RR( *pReg, REG_RAX ); 89 108 90 return resultType;109 return true; 91 110 } 92 111 … … 100 119 long stack[255]; 101 120 int pnum; 102 if(!GetNumOpeElements( Command,&pnum,values,calc,stack)){121 if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){ 103 122 for(i=0;i<pnum;i++){ 104 123 if(values[i]) HeapDefaultFree(values[i]); … … 156 175 double dbl; 157 176 int sp; 158 int type [255];177 int type_stack[255]; 159 178 LONG_PTR index_stack[255]; 160 179 BOOL bUseHeap[255]; … … 167 186 168 187 if(idCalc){ 169 if(type [sp-2]==DEF_OBJECT){188 if(type_stack[sp-2]==DEF_OBJECT){ 170 189 //オーバーロードされたオペレータを呼び出す 171 TYPEINFO BaseTypeInfo={BaseType,lpBaseIndex}; 172 i2=CallOperatorProc(idCalc,&BaseTypeInfo,type,index_stack,bUseHeap,sp); 190 i2=CallOperatorProc(idCalc,baseType,type_stack,index_stack,bUseHeap,sp); 173 191 if(i2==0){ 174 192 if(idCalc==CALC_EQUAL) lstrcpy(temp2,"=="); … … 183 201 } 184 202 185 if(!CheckCalcType(idCalc,type ,sp)) goto error;203 if(!CheckCalcType(idCalc,type_stack,sp)) goto error; 186 204 } 187 205 … … 209 227 StrLiteral: 210 228 211 if(BaseType==DEF_OBJECT){ 212 CClass *pobj_Class; 213 pobj_Class=(CClass *)lpBaseIndex; 214 TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex}; 215 if(IsStringObjectType(BaseTypeInfo)){ 229 if( baseType.IsObject() ){ 230 if( baseType.IsStringObject() ){ 216 231 //要求タイプがStringのとき 217 232 … … 220 235 221 236 extern CClass *pobj_StringClass; 222 type [sp]=DEF_OBJECT;237 type_stack[sp]=DEF_OBJECT; 223 238 index_stack[sp]=(LONG_PTR)pobj_StringClass; 224 239 bLiteralCalculation=0; … … 232 247 } 233 248 234 type [sp]=typeOfPtrChar;249 type_stack[sp]=typeOfPtrChar; 235 250 bLiteralCalculation=0; 236 251 … … 277 292 int idProc; 278 293 void *pInfo; 279 idProc=GetProc(temporary,&pInfo); 280 294 idProc=GetProc(temporary,(void **)&pInfo); 295 296 Type resultType; 281 297 if(idProc){ 282 298 //閉じカッコ")"に続く文字がNULLでないとき … … 302 318 //////////////// 303 319 304 i2=CallProc(idProc,pInfo,temporary,temp2,&index_stack[sp]);305 if( i2==-1){320 CallProc(idProc,pInfo,temporary,temp2,resultType); 321 if(resultType.IsNull()){ 306 322 //戻り値が存在しないとき 307 323 for(i2=2;;i2++){ … … 325 341 326 342 //大きな型への暗黙の変換 327 type[sp]=AutoBigCast(BaseType,i2); 343 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType()); 344 index_stack[sp] = resultType.GetIndex(); 328 345 bLiteralCalculation=0; 329 346 330 SetUseRegFromRax(i2,UseReg,XmmReg); 331 332 if(IsRealNumberType(i2)) bXmm=1; 347 if( type_stack[sp] != resultType.GetBasicType() ){ 348 // 大きな型へ変換された場合 349 // ※レジスタの値をキャストする 350 ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() ); 351 } 352 353 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 354 355 if(resultType.IsReal()) bXmm=1; 333 356 else bXmm=0; 334 357 … … 342 365 else pobj_reg->LockReg(); 343 366 344 if( i2==DEF_STRUCT){367 if(resultType.IsStruct()){ 345 368 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 346 369 //※後にfreeする必要あり … … 360 383 361 384 //マクロ関数の場合 362 i2=NumOpe(&UseReg,temp3,0,0,&index_stack[sp]);363 364 if(!IS_LITERAL( index_stack[sp])){385 NumOpe(&UseReg,temp3,Type(),resultType); 386 387 if(!IS_LITERAL(resultType.GetIndex())){ 365 388 //リテラル値ではなかったとき 366 389 bLiteralCalculation=0; 367 390 } 368 391 369 type[sp]=i2; 370 371 if(IsRealNumberType(i2)) pobj_reg->LockXmmReg(); 392 type_stack[sp] = resultType.GetBasicType(); 393 index_stack[sp] = resultType.GetIndex(); 394 395 if(resultType.IsReal()) pobj_reg->LockXmmReg(); 372 396 else pobj_reg->LockReg(); 373 397 … … 381 405 //インデクサ(getアクセサ) 382 406 char variable[VN_SIZE],array_element[VN_SIZE]; 383 CClass *pobj_c;384 407 GetArrayElement(term,variable,array_element); 385 408 if(array_element[0]){ 386 i2=GetVarType(variable,(LONG_PTR *)&pobj_c,0);387 if(i2==DEF_OBJECT){388 TYPEINFO RetTypeInfo;389 CallIndexerGetterProc(UseReg, pobj_c,variable,array_element,RetTypeInfo);390 type [sp]=RetTypeInfo.type;391 index_stack[sp]= RetTypeInfo.u.lpIndex;409 Type resultType; 410 GetVarType(variable,resultType,0); 411 if( resultType.IsObject() ){ 412 CallIndexerGetterProc(UseReg,&resultType.GetClass(),variable,array_element,resultType); 413 type_stack[sp]=resultType.GetBasicType(); 414 index_stack[sp]=resultType.GetIndex(); 392 415 bLiteralCalculation=0; 393 416 394 if( IsRealNumberType(RetTypeInfo.type)) pobj_reg->LockXmmReg();417 if(resultType.IsReal()) pobj_reg->LockXmmReg(); 395 418 else pobj_reg->LockReg(); 396 419 sp++; … … 402 425 // Nothing 403 426 if( lstrcmp( term, "Nothing" ) == 0 ){ 404 type [sp] = DEF_OBJECT;405 if( BaseType == DEF_OBJECT){406 index_stack[sp] = lpBaseIndex;427 type_stack[sp] = DEF_OBJECT; 428 if( baseType.IsObject() ){ 429 index_stack[sp] = baseType.GetIndex(); 407 430 } 408 431 else{ … … 427 450 428 451 RELATIVE_VAR RelativeVar; 452 Type varType; 429 453 if(GetVarOffset( 430 454 false, //エラー表示あり 431 455 false, //読み込み専用 432 456 term, 433 & i2,&RelativeVar,&index_stack[sp])){457 &RelativeVar,varType)){ 434 458 ////////// 435 459 // 変数 … … 437 461 438 462 //大きな型への暗黙の変換 439 type[sp]=AutoBigCast(BaseType,i2); 463 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),varType.GetBasicType()); 464 index_stack[sp] = varType.GetIndex(); 440 465 bLiteralCalculation=0; 441 466 442 if(type[sp]!=i2){ 443 //大きな型へ変換された場合(レジスタを0に初期化する) 444 445 //xor reg,reg 446 op_zero_reg(UseReg); 447 } 448 449 if(i2&FLAG_PTR){ 467 if(varType.GetBasicType()&FLAG_PTR){ 450 468 //配列ポインタ 451 type [sp]=GetPtrType(i2^FLAG_PTR,index_stack[sp]);469 type_stack[sp]=GetPtrType(varType.GetBasicType()^FLAG_PTR); 452 470 453 471 SetVarPtrToReg(UseReg,&RelativeVar); 454 472 } 455 else if( IsRealNumberType(i2)){473 else if(varType.IsReal()){ 456 474 //実数型 457 475 bXmm=1; 458 476 459 if( i2==DEF_DOUBLE)477 if( varType.IsDouble() ) 460 478 SetXmmReg_DoubleVariable(&RelativeVar,XmmReg); 461 if( i2==DEF_SINGLE)479 if( varType.IsSingle() ) 462 480 SetXmmReg_SingleVariable(&RelativeVar,XmmReg); 463 481 } 464 else if( IsWholeNumberType(i2) || i2==DEF_OBJECT){482 else if( varType.IsWhole() || varType.IsObject()){ 465 483 //整数型 466 SetReg_WholeVariable( i2,&RelativeVar,UseReg);467 } 468 else if( i2==DEF_STRUCT){484 SetReg_WholeVariable(varType.GetBasicType(),&RelativeVar,UseReg); 485 } 486 else if( varType.IsStruct() ){ 469 487 //構造体ポインタをUseRegへ格納(構造体は値型) 470 488 SetVarPtrToReg(UseReg,&RelativeVar); 471 489 } 472 490 else SetError(11,term,cp); 491 492 if( type_stack[sp] != varType.GetBasicType() ){ 493 // 大きな型へ変換された場合 494 // ※レジスタの値をキャストする 495 ExtendRegToBigType( UseReg, type_stack[sp], varType.GetBasicType() ); 496 } 473 497 474 498 if(bXmm==0&&UseReg==REG_R14){ … … 477 501 } 478 502 if(bXmm&&XmmReg==REG_XMM4){ 479 if( i2==DEF_DOUBLE){503 if(varType.IsDouble()){ 480 504 //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用 481 505 pobj_sf->push(REG_XMM4,sizeof(double)); 482 506 } 483 if( i2==DEF_SINGLE){507 if(varType.IsSingle()){ 484 508 //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用 485 509 pobj_sf->push(REG_XMM4,sizeof(float)); … … 500 524 i3 = CDBConst::obj.GetType(term); 501 525 if(i3){ 502 type [sp] = i3;526 type_stack[sp] = i3; 503 527 if(IsRealNumberType(i3)){ 504 528 //実数 … … 536 560 i3=GetTypeFixed(term,&lp); 537 561 if(i3!=-1){ 538 type [sp]=i3|FLAG_CAST;562 type_stack[sp]=i3|FLAG_CAST; 539 563 index_stack[sp]=lp; 540 564 sp++; … … 559 583 ////////////////////////////////////////////////////// 560 584 561 T YPEINFO RetTypeInfo;562 CallPropertyMethod(term,NULL, &RetTypeInfo);585 Type resultType; 586 CallPropertyMethod(term,NULL,resultType); 563 587 564 588 //大きな型への暗黙の変換 565 type[sp]=AutoBigCast(BaseType,RetTypeInfo.type); 566 567 index_stack[sp]=RetTypeInfo.u.lpIndex; 589 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType()); 590 index_stack[sp]=resultType.GetIndex(); 568 591 bLiteralCalculation=0; 569 592 570 SetUseRegFromRax(RetTypeInfo.type,UseReg,XmmReg); 571 572 if(IsRealNumberType(type[sp])) bXmm=1; 593 if( type_stack[sp] != resultType.GetBasicType() ){ 594 // 大きな型へ変換された場合 595 // ※レジスタの値をキャストする 596 ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() ); 597 } 598 599 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 600 601 if(IsRealNumberType(type_stack[sp])) bXmm=1; 573 602 else bXmm=0; 574 603 … … 578 607 }//////////////////////////////////////////// 579 608 580 if(type [sp]==DEF_STRUCT){609 if(type_stack[sp]==DEF_STRUCT){ 581 610 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 582 611 //※後にfreeする必要あり … … 595 624 bError=1; 596 625 SetError(3,term,cp); 597 type [sp]=DEF_DOUBLE;626 type_stack[sp]=DEF_DOUBLE; 598 627 } 599 628 else{ 600 629 //リテラル値 601 type [sp]=GetLiteralValue(term,&i64data,BaseType);630 type_stack[sp]=GetLiteralValue(term,&i64data,baseType.GetBasicType()); 602 631 Literal: 603 if(type [sp]==DEF_DOUBLE){632 if(type_stack[sp]==DEF_DOUBLE){ 604 633 //64ビット浮動小数型 605 634 bXmm=1; … … 627 656 } 628 657 } 629 else if(type [sp]==DEF_SINGLE){658 else if(type_stack[sp]==DEF_SINGLE){ 630 659 //32ビット浮動小数型 631 660 bXmm=1; … … 680 709 case CALC_OR: 681 710 case CALC_AND: 682 if(!CalcTwoTerm_Logical(idCalc,type ,index_stack,&sp)) goto error;711 if(!CalcTwoTerm_Logical(idCalc,type_stack,index_stack,&sp)) goto error; 683 712 break; 684 713 case CALC_NOT: 685 714 //value[sp-1]=Not value[sp-1] 686 715 //NOT演算子 687 if(!Calc_Not(type ,sp)) goto error;716 if(!Calc_Not(type_stack,sp)) goto error; 688 717 break; 689 718 … … 695 724 case CALC_NOTEQUAL: //value[sp-2] <> value[sp-1] 696 725 case CALC_EQUAL: //value[sp-2] = value[sp-1] 697 if(!CalcTwoTerm_Relational(idCalc,type ,index_stack,&sp)) goto error;726 if(!CalcTwoTerm_Relational(idCalc,type_stack,index_stack,&sp)) goto error; 698 727 break; 699 728 … … 701 730 case CALC_SHL: //value[sp-2] << value[sp-1] 702 731 case CALC_SHR: //value[sp-2] >> value[sp-1] 703 if(!Calc_Shift(idCalc,type ,&sp)) goto error;732 if(!Calc_Shift(idCalc,type_stack,&sp)) goto error; 704 733 break; 705 734 … … 708 737 case CALC_SUBTRACTION: 709 738 case CALC_PRODUCT: 710 if(!CalcTwoTerm_Arithmetic(idCalc,type ,index_stack,&sp)) goto error;739 if(!CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp)) goto error; 711 740 break; 712 741 case CALC_MOD: 713 742 //value[sp-2]%=value[sp-1] 714 743 //剰余演算 715 if(!Calc_Mod(type ,index_stack,&sp)) goto error;744 if(!Calc_Mod(type_stack,index_stack,&sp)) goto error; 716 745 break; 717 746 case CALC_QUOTIENT: 718 747 //value[sp-2]/=value[sp-1]; 719 748 //除算 720 if(!Calc_Divide(type ,&sp,BaseType)) goto error;749 if(!Calc_Divide(type_stack,&sp,baseType.GetBasicType())) goto error; 721 750 break; 722 751 case CALC_INTQUOTIENT: 723 752 //value[sp-2]/=value[sp-1] 724 753 //整数除算 725 if(!Calc_IntDivide(type ,index_stack,&sp)) goto error;754 if(!Calc_IntDivide(type_stack,index_stack,&sp)) goto error; 726 755 break; 727 756 case CALC_MINUSMARK: 728 757 //value[sp-1]=-value[sp-1] 729 758 //符号反転 730 if(!Calc_MinusMark(type ,sp)) goto error;759 if(!Calc_MinusMark(type_stack,sp)) goto error; 731 760 break; 732 761 case CALC_POWER: 733 762 //べき乗演算(浮動小数点演算のみ) 734 if(!Calc_Power(type ,&sp)) goto error;763 if(!Calc_Power(type_stack,&sp)) goto error; 735 764 break; 736 765 case CALC_AS: 737 766 //キャスト 738 if(!Calc_Cast(type ,index_stack,&sp)) goto error;767 if(!Calc_Cast(type_stack,index_stack,&sp)) goto error; 739 768 break; 740 769 case CALC_BYVAL: 741 770 //ポインタ型→参照型 742 if( PTR_LEVEL( type [sp-1] ) <= 0 ){771 if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){ 743 772 //ポインタ型ではないとき 744 773 SetError( 3, NULL, cp ); … … 746 775 } 747 776 748 type [sp-1] = PTR_LEVEL_DOWN( type[sp-1] );777 type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] ); 749 778 750 779 break; … … 765 794 if(bLiteralCalculation){ 766 795 //右辺値が数値の定数式の場合 767 LONG_PTR lpClassIndex;768 i2=StaticCalculation(true, Command,BaseType,&i64data,&lpClassIndex);796 Type resultType; 797 StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType); 769 798 770 799 obp=BeforeObp; … … 775 804 *pobj_reg=objReg_Backup; 776 805 777 if( IsRealNumberType(i2)){778 if( IsRealNumberType(BaseType)) i2=BaseType;806 if(resultType.IsReal()){ 807 if(baseType.IsReal()) resultType=baseType; 779 808 780 809 XmmReg=pobj_reg->LockXmmReg(); 781 810 782 if( i2==DEF_DOUBLE){811 if(resultType.IsDouble()){ 783 812 i3 = dataTable.Add( i64data ); 784 813 … … 793 822 obp+=sizeof(long); 794 823 } 795 if( i2==DEF_SINGLE){824 if(resultType.IsSingle()){ 796 825 memcpy(&dbl,&i64data,sizeof(_int64)); 797 826 … … 815 844 } 816 845 else{ 817 if(! Is64Type(i2)){846 if(!resultType.Is64()){ 818 847 //整数(符号有り/無し) 819 848 820 849 i3=(long)i64data; 821 850 822 if( GetTypeSize(i2,-1)==sizeof(char)) i3=i3&0x000000FF;823 if( GetTypeSize(i2,-1)==sizeof(short)) i3=i3&0x0000FFFF;851 if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF; 852 if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF; 824 853 825 854 i64data=(_int64)i3; … … 832 861 } 833 862 834 type [0]=i2;835 index_stack[0]= lpClassIndex;863 type_stack[0]=resultType.GetBasicType(); 864 index_stack[0]=resultType.GetIndex(); 836 865 } 837 866 else{ … … 840 869 } 841 870 842 if(plpIndex) *plpIndex=index_stack[0];843 871 if(pbUseHeap) *pbUseHeap=bUseHeap[0]; 844 872 845 if(IsRealNumberType(type [0]))873 if(IsRealNumberType(type_stack[0])) 846 874 *pReg=pobj_reg->UnlockXmmReg(); 847 875 else … … 858 886 } 859 887 860 int RetType; 861 RetType=type[0]; 888 resultType.SetType( type_stack[0], index_stack[0] ); 889 890 bool isSuccessful = true; 862 891 goto finish; 863 892 … … 878 907 } 879 908 880 RetType=-1;909 isSuccessful = false; 881 910 goto finish; 882 911 … … 893 922 delete pobj_BackReloc; 894 923 895 return RetType;924 return isSuccessful; 896 925 }
Note:
See TracChangeset
for help on using the changeset viewer.