Changeset 308 in dev for trunk/abdev/BasicCompiler64/NumOpe_TypeOperation.cpp
- Timestamp:
- Aug 29, 2007, 9:05:22 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/NumOpe_TypeOperation.cpp
r266 r308 8 8 #include "Opcode.h" 9 9 10 void ExtendTypeTo64(int type,int reg){ 11 if(type==DEF_LONG){ 10 void ExtendTypeTo64( const Type &oldType, int reg ){ 11 if( oldType.IsLong() ) 12 { 12 13 //movsxd reg64,reg32 13 14 compiler.codeGenerator.op_movsxd(reg,reg); 14 15 } 15 else if(type==DEF_DWORD){ 16 else if( oldType.IsDWord() ) 17 { 16 18 //and reg,00000000FFFFFFFFh 17 19 } 18 else if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){ 20 else if( oldType.IsInteger() ) 21 { 19 22 //movsx reg64,reg16 20 23 compiler.codeGenerator.op_movsx64_FromReg16(reg,reg); 21 24 } 22 else if(type==DEF_WORD){ 25 else if( oldType.IsWord() ) 26 { 23 27 //and reg,000000000000FFFFh 24 28 compiler.codeGenerator.op_and64_value(reg,(int)0xFFFF); 25 29 } 26 else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){ 30 else if( oldType.IsSByte() ) 31 { 27 32 //movsx reg64,reg8 28 33 compiler.codeGenerator.op_movsx64_FromReg8(reg,reg); 29 34 } 30 else if(type==DEF_BYTE || type==DEF_BOOLEAN){ 35 else if( oldType.IsByte() || oldType.IsBoolean() ) 36 { 31 37 //and reg,00000000000000FFh 32 38 compiler.codeGenerator.op_and64_value(reg,(int)0x00FF); 33 39 } 34 40 } 35 void ExtendTypeTo32(int type,int reg){ 36 if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){ 41 void ExtendTypeTo32( const Type &oldType, int reg ){ 42 if( oldType.IsInteger() ) 43 { 37 44 //movsx reg32,reg16 38 45 compiler.codeGenerator.op_movsx32_FromReg16(reg,reg); 39 46 } 40 else if(type==DEF_WORD){ 47 else if( oldType.IsWord() ) 48 { 41 49 //and reg,0000FFFFh 42 50 compiler.codeGenerator.op_and32_value(reg,(int)0xFFFF); 43 51 } 44 else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){ 52 else if( oldType.IsSByte() ) 53 { 45 54 //movsx reg32,reg8 46 55 compiler.codeGenerator.op_movsx32_FromReg8(reg,reg); 47 56 } 48 else if(type==DEF_BYTE || type==DEF_BOOLEAN){ 57 else if( oldType.IsByte() || oldType.IsBoolean() ) 58 { 49 59 //and reg,000000FFh 50 60 compiler.codeGenerator.op_and32_value(reg,(int)0xFF); 51 61 } 52 62 } 53 void ExtendTypeTo16(int type,int reg){ 54 if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){ 63 void ExtendTypeTo16( const Type &oldType, int reg ){ 64 if( oldType.IsSByte() ) 65 { 55 66 //movsx reg16,reg8 56 67 compiler.codeGenerator.op_movsx16_FromReg8(reg,reg); 57 68 } 58 else if(type==DEF_BYTE){ 69 else if( oldType.IsByte() || oldType.IsBoolean() ) 70 { 59 71 //and reg,000000FFh 60 72 compiler.codeGenerator.op_and32_value(reg,(int)0xFF); … … 183 195 } 184 196 185 void ChangeTypeToWhole(int OldType,int NewType,int reg,int xmm_reg){ 186 if(OldType==DEF_DOUBLE){ 187 if(Is64Type(NewType)){ 197 void ChangeTypeToWhole( const Type &oldType, const Type &newType, int reg, int xmm_reg ) 198 { 199 if( oldType.IsDouble() ) 200 { 201 if( newType.Is64() ) 202 { 188 203 //cvttsd2si reg,xmm_reg 189 204 compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(_int64),reg,xmm_reg); 190 205 } 191 else{ 206 else 207 { 192 208 //cvttsd2si reg,xmm_reg 193 209 compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(long),reg,xmm_reg); 194 210 } 195 211 } 196 else if(OldType==DEF_SINGLE){ 197 if(Is64Type(NewType)){ 212 if( oldType.IsSingle() ) 213 { 214 if( newType.Is64() ) 215 { 198 216 //cvttss2si reg,xmm_reg 199 217 compiler.codeGenerator.op_cvttss2si_xmm(sizeof(_int64),reg,xmm_reg); 200 218 } 201 else{ 219 else 220 { 202 221 //cvttss2si reg,xmm_reg 203 222 compiler.codeGenerator.op_cvttss2si_xmm(sizeof(long),reg,xmm_reg); … … 207 226 //整数から整数へ変換 208 227 209 if(Is64Type(NewType)){ 210 ExtendTypeTo64(OldType,reg); 211 } 212 else if(GetTypeSize(NewType,-1)==sizeof(long)){ 213 ExtendTypeTo32(OldType,reg); 214 } 215 else if(GetTypeSize(NewType,-1)==sizeof(short)){ 216 ExtendTypeTo16(OldType,reg); 228 if( newType.Is64() ) 229 { 230 ExtendTypeTo64(oldType,reg); 231 } 232 if( newType.GetSize() == sizeof(long) ) 233 { 234 ExtendTypeTo32(oldType,reg); 235 } 236 if( newType.GetSize() == sizeof(short) ) 237 { 238 ExtendTypeTo16(oldType,reg); 217 239 } 218 240 } … … 477 499 sp=*pStackPointer; 478 500 479 int CastType; 480 CastType=type[sp-1]; 481 if((CastType&FLAG_CAST)==0){ 501 int castBasicType = type[sp-1]; 502 if((castBasicType&FLAG_CAST)==0){ 482 503 SetError(47,NULL,cp); 483 504 return 0; 484 505 } 485 CastType=CastType&(~FLAG_CAST); 506 castBasicType = castBasicType&(~FLAG_CAST); 507 508 Type oldType( type[sp-2], index_stack[sp-2] ); 509 Type castType( castBasicType, index_stack[sp-1] ); 486 510 487 511 int xmm_reg,reg; 488 489 if(IsRealNumberType(CastType)){512 if( castType.IsReal() ) 513 { 490 514 //実数型へキャスト 491 515 492 if(IsRealNumberType(type[sp-2])){ 493 SetOneTermToReg_RealCalc(type[sp-2],&xmm_reg); 494 } 495 else{ 496 if(Is64Type(type[sp-2])) 497 SetOneTermToReg_Whole64Calc(type[sp-2],®); 498 else if(IsWholeNumberType(type[sp-2])) 499 SetOneTermToReg_Whole32Calc(type[sp-2],®); 516 if( oldType.IsReal() ) 517 { 518 SetOneTermToReg_RealCalc(oldType.GetBasicType(),&xmm_reg); 519 } 520 else 521 { 522 if( oldType.Is64() ) 523 { 524 SetOneTermToReg_Whole64Calc(oldType.GetBasicType(),®); 525 } 526 else if( oldType.IsWhole() ) 527 { 528 SetOneTermToReg_Whole32Calc(oldType.GetBasicType(),®); 529 } 500 530 501 531 pobj_reg->UnlockReg(); … … 504 534 } 505 535 506 if(CastType==DEF_DOUBLE){ 536 if( castType.IsDouble() ) 537 { 507 538 //Double型にデータ変換 508 ChangeTypeToXmm_Double(type[sp-2],xmm_reg,reg); 509 } 510 else if(CastType==DEF_SINGLE){ 539 ChangeTypeToXmm_Double(oldType.GetBasicType(),xmm_reg,reg); 540 } 541 else if( castType.IsSingle() ) 542 { 511 543 //Single型にデータ変換 512 ChangeTypeToXmm_Single( type[sp-2],xmm_reg,reg);544 ChangeTypeToXmm_Single(oldType.GetBasicType(),xmm_reg,reg); 513 545 } 514 546 … … 521 553 //その他整数型へ変換 522 554 523 if(IsRealNumberType(type[sp-2])){ 524 SetOneTermToReg_RealCalc(type[sp-2],&xmm_reg); 555 if( oldType.IsReal() ) 556 { 557 SetOneTermToReg_RealCalc(oldType.GetBasicType(),&xmm_reg); 525 558 526 559 pobj_reg->UnlockXmmReg(); … … 529 562 530 563 //整数型へデータ変換 531 ChangeTypeToWhole( type[sp-2],CastType,reg,xmm_reg);564 ChangeTypeToWhole(oldType,castType,reg,xmm_reg); 532 565 533 566 if(reg==REG_R14){ … … 545 578 546 579 //整数型へデータ変換 547 ChangeTypeToWhole( type[sp-2],CastType,reg,0);580 ChangeTypeToWhole(oldType,castType,reg,0); 548 581 549 582 if(reg==REG_R14){ … … 554 587 } 555 588 556 type[sp-2] =CastType;557 index_stack[sp-2] =index_stack[sp-1];589 type[sp-2] = castType.GetBasicType(); 590 index_stack[sp-2] = castType.GetIndex(); 558 591 559 592 sp--;
Note:
See TracChangeset
for help on using the changeset viewer.