Changeset 97 in dev for BasicCompiler64/NumOpe.cpp
- Timestamp:
- Apr 16, 2007, 3:52:40 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/NumOpe.cpp
r94 r97 83 83 } 84 84 85 86 bool VarToReg( RELATIVE_VAR &relativeVar, const Type &baseType, Type &resultType ){ 87 int UseReg=pobj_reg->GetNextReg(); 88 int XmmReg=pobj_reg->GetNextXmmReg(); 89 90 //大きな型への暗黙の変換 91 int bigType = AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType()); 92 93 if(resultType.GetBasicType()&FLAG_PTR){ 94 //配列ポインタ 95 resultType.SetBasicType( GetPtrType(resultType.GetBasicType()^FLAG_PTR) ); 96 97 SetVarPtrToReg(UseReg,&relativeVar); 98 } 99 else if(resultType.IsReal()){ 100 //実数型 101 if( resultType.IsDouble() ) 102 SetXmmReg_DoubleVariable(&relativeVar,XmmReg); 103 if( resultType.IsSingle() ) 104 SetXmmReg_SingleVariable(&relativeVar,XmmReg); 105 } 106 else if( resultType.IsWhole() || resultType.IsObject()){ 107 //整数型 108 SetReg_WholeVariable(resultType.GetBasicType(),&relativeVar,UseReg); 109 } 110 else if( resultType.IsStruct() ){ 111 //構造体ポインタをUseRegへ格納(構造体は値型) 112 SetVarPtrToReg(UseReg,&relativeVar); 113 } 114 else{ 115 return false; 116 } 117 118 if( resultType.GetBasicType() != bigType ){ 119 // 大きな型へ変換された場合 120 // ※レジスタの値をキャストする 121 ExtendRegToBigType( UseReg, bigType, resultType.GetBasicType() ); 122 123 resultType.SetBasicType( bigType ); 124 } 125 126 return true; 127 } 128 bool TermMemberOpe( const CClass &objClass, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member ){ 129 130 int UseReg=pobj_reg->GetNextReg(); 131 int XmmReg=pobj_reg->GetNextXmmReg(); 132 133 134 if( GetMemberType( objClass, member, resultType, 0, false ) ){ 135 // メンバが見つかったとき 136 137 //オブジェクトポインタをr11にコピー 138 op_mov_RR( REG_R11, UseReg ); 139 140 RELATIVE_VAR relativeVar; 141 relativeVar.dwKind=VAR_DIRECTMEM; 142 143 if( !_member_offset( 144 true, //エラー表示あり 145 false, //読み込み専用 146 objClass, 147 member,&relativeVar,resultType,0)){ 148 return false; 149 } 150 151 if( !VarToReg( relativeVar, baseType, resultType ) ){ 152 SetError(11,termFull,cp); 153 } 154 155 return true; 156 } 157 158 159 /////////////////////////////////////////////////////////////////// 160 // 動的メソッドを検索 161 /////////////////////////////////////////////////////////////////// 162 vector<UserProc *> userProcs; 163 164 char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1]; 165 CClass::RefType refType; 166 lstrcpy( methodName, member ); 167 GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType); 168 169 objClass.EnumMethod( methodName, userProcs ); 170 UserProc *pUserProc; 171 if(userProcs.size()){ 172 //オーバーロードを解決 173 pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft); 174 175 if( pUserProc ){ 176 177 resultType = pUserProc->ReturnType(); 178 179 180 ////////////////////////////////////////////////////// 181 ///// レジスタ資源のバックアップ 182 { BACKUP_REGISTER_RESOURCE 183 ////////////////////////////////////////////////////// 184 185 //オブジェクトポインタをスタックに入れておく 186 //mov qword ptr[rsp+offset],reg ※スタックフレームを利用 187 pobj_sf->push( UseReg ); 188 189 if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft,0 ) ){ 190 //レジスタ資源を復元 191 RESTORE_REGISTER_RESOURCE 192 193 return false; 194 } 195 196 pobj_sf->pop(); 197 198 ///////////////////// 199 // 戻り値の処理 200 ///////////////////// 201 202 //大きな型への暗黙の変換 203 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 204 205 if( resultType.GetBasicType() != bigType ){ 206 // 大きな型へ変換された場合 207 // ※レジスタの値をキャストする 208 ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() ); 209 210 resultType.SetBasicType( bigType ); 211 } 212 213 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 214 215 216 ///////////////////////////////////////////// 217 ////// レジスタ資源を復元 218 RESTORE_REGISTER_RESOURCE 219 }//////////////////////////////////////////// 220 221 return true; 222 } 223 } 224 225 return false; 226 } 227 bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName = NULL ){ 228 char parameter[VN_SIZE]; 229 230 // Withを解決 231 char termFull[VN_SIZE]; 232 if(term[0]=='.'){ 233 GetWithName(termFull); 234 lstrcat(termFull,term); 235 } 236 else lstrcpy(termFull,term); 237 238 char termLeft[VN_SIZE]; 239 lstrcpy(termLeft,termFull); 240 241 if( (string)term=="DayOfWeek"){ 242 int test=0; 243 } 244 245 // パース 246 char member[VN_SIZE]; 247 CClass::RefType refType; 248 if( SplitMemberName( termFull, termLeft, member, refType ) ){ 249 /////////////////////////////////////////////////////////////////// 250 // オブジェクトとメンバに分解できるとき 251 // termLeft.member 252 /////////////////////////////////////////////////////////////////// 253 254 isLiteral = false; 255 256 // オブジェクト側の型を取得 257 bool isClassName = false; 258 Type leftType; 259 if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){ 260 return false; 261 } 262 263 if( isClassName ){ 264 // 静的メンバ/メソッドの場合 265 goto globalArea; 266 } 267 268 if( !leftType.HasMember() ){ 269 // メンバを持たない型の場合 270 return false; 271 } 272 273 return TermMemberOpe( leftType.GetClass(), baseType, resultType, termFull, termLeft, member ); 274 } 275 276 277 ////////////////////////////////////////////// 278 // クラス名かどうかをチェック(静的メンバ用) 279 ////////////////////////////////////////////// 280 281 if( pIsClassName ){ 282 if( pobj_DBClass->check( termFull ) ){ 283 *pIsClassName = true; 284 return true; 285 } 286 } 287 288 289 ///////////////////////////////////////////////////////////////// 290 // グローバル属性エリア 291 ///////////////////////////////////////////////////////////////// 292 globalArea: 293 294 int UseReg=pobj_reg->GetNextReg(); 295 int XmmReg=pobj_reg->GetNextXmmReg(); 296 297 298 if(lstrcmpi(termFull,"This")==0){ 299 //Thisオブジェクト 300 resultType.SetType( DEF_OBJECT, pobj_CompilingClass ); 301 302 SetThisPtrToReg( UseReg ); 303 304 isLiteral = false; 305 306 return true; 307 } 308 309 310 ////////////////////////////////////// 311 // 関数(DLL、ユーザー定義、組み込み) 312 ////////////////////////////////////// 313 char procName[VN_SIZE]; 314 char temporary[8192]; 315 316 int i2=GetCallProcName(termFull,procName); 317 if(termFull[i2]=='('){ 318 int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1); 319 320 void *pInfo; 321 int idProc=GetProc(procName,(void **)&pInfo); 322 323 if(idProc){ 324 //閉じカッコ")"に続く文字がNULLでないとき 325 if(termFull[i2+1+i4+1]!='\0'){ 326 SetError(42,NULL,cp); 327 } 328 329 330 ////////////////////////////////////////////////////// 331 ///// レジスタ資源のバックアップ 332 { BACKUP_REGISTER_RESOURCE 333 ////////////////////////////////////////////////////// 334 335 336 //////////////// 337 // 呼び出し 338 //////////////// 339 340 CallProc(idProc,pInfo,procName,parameter,resultType); 341 342 343 ///////////////////// 344 // 戻り値の処理 345 ///////////////////// 346 347 //大きな型への暗黙の変換 348 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 349 350 if( resultType.GetBasicType() != bigType ){ 351 // 大きな型へ変換された場合 352 // ※レジスタの値をキャストする 353 ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() ); 354 355 resultType.SetBasicType( bigType ); 356 } 357 358 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 359 360 ///////////////////////////////////////////// 361 ////// レジスタ資源を復元 362 RESTORE_REGISTER_RESOURCE 363 }//////////////////////////////////////////// 364 365 if(resultType.IsStruct()){ 366 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 367 //※後にfreeする必要あり 368 // TODO: 解放はGCに任せる 369 *pbUseHeap = 1; 370 } 371 372 isLiteral = false; 373 374 return true; 375 } 376 else if(GetConstCalcBuffer(procName,parameter,temporary)){ 377 ///////////////////////// 378 // マクロ関数 379 ///////////////////////// 380 381 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 382 if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 383 384 //マクロ関数の場合 385 NumOpe(&UseReg,temporary,Type(),resultType); 386 387 if(!IS_LITERAL(resultType.GetIndex())){ 388 //リテラル値ではなかったとき 389 isLiteral = false; 390 } 391 392 return true; 393 } 394 } 395 396 397 //////////////////////////////// 398 // インデクサ(getアクセサ) 399 //////////////////////////////// 400 401 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 402 GetArrayElement(termFull,VarName,ArrayElements); 403 if(ArrayElements[0]){ 404 GetVarType(VarName,resultType,false); 405 if( resultType.IsObject() ){ 406 CallIndexerGetterProc(UseReg,&resultType.GetClass(),VarName,ArrayElements,resultType); 407 408 isLiteral = false; 409 410 return true; 411 } 412 } 413 414 415 //////////////////////////////// 416 // 変数 417 //////////////////////////////// 418 419 RELATIVE_VAR relativeVar; 420 if(GetVarOffset( 421 false, //エラー表示なし 422 false, //読み込み専用 423 termFull, 424 &relativeVar,resultType)){ 425 ////////// 426 // 変数 427 ////////// 428 429 if( !VarToReg( relativeVar, baseType, resultType ) ){ 430 SetError(11,termFull,cp); 431 } 432 433 isLiteral = false; 434 435 return true; 436 } 437 438 /* 439 //////////////////////////////// 440 // 型名 441 //////////////////////////////// 442 443 if( Type::StringToType( termFull, resultType ) ){ 444 resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST ); 445 return true; 446 }*/ 447 448 449 ///////////////////////////////// 450 // プロパティ用のメソッド 451 ///////////////////////////////// 452 453 //配列要素を排除 454 GetArrayElement(termFull,VarName,ArrayElements); 455 456 if(GetSubHash(VarName,0)){ 457 458 ////////////////////////////////////////////////////// 459 ///// レジスタ資源のバックアップ 460 { BACKUP_REGISTER_RESOURCE 461 ////////////////////////////////////////////////////// 462 463 CallPropertyMethod(termFull,NULL,resultType); 464 465 //大きな型への暗黙の変換 466 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 467 468 if( resultType.GetBasicType() != bigType ){ 469 // 大きな型へ変換された場合 470 // ※レジスタの値をキャストする 471 ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() ); 472 473 resultType.SetBasicType( bigType ); 474 } 475 476 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 477 478 ///////////////////////////////////////////// 479 ////// レジスタ資源を復元 480 RESTORE_REGISTER_RESOURCE 481 }//////////////////////////////////////////// 482 483 if(resultType.IsStruct()){ 484 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 485 //※後にfreeする必要あり 486 // TODO: 解放はGCに任せる 487 *pbUseHeap = 1; 488 } 489 490 isLiteral = false; 491 492 return true; 493 } 494 495 496 return false; 497 } 498 85 499 bool NumOpe( int *pReg, 86 500 const char *expression, … … 89 503 BOOL *pbUseHeap ){ 90 504 91 int i,i2,i3 ,i4;92 char temporary[1024],temp2[1024] ,temp3[1024];505 int i,i2,i3; 506 char temporary[1024],temp2[1024]; 93 507 94 508 if(expression[0]=='\0'){ … … 289 703 term=values[i]; 290 704 705 if( calc[i+1]%100 == CALC_AS ){ 706 // As演算子の右辺値 707 //型名 708 if( Type::StringToType( term, resultType ) ){ 709 resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST ); 710 } 711 else{ 712 SetError(3, term, cp ); 713 goto error; 714 } 715 716 type_stack[sp] = resultType.GetBasicType(); 717 index_stack[sp] = resultType.GetIndex(); 718 sp++; 719 720 break; 721 } 722 291 723 if(term[0]=='\"'){ 292 724 //リテラル文字列 … … 298 730 StrLiteral: 299 731 300 if( baseType.IsObject() ){ 301 if( baseType.IsStringObject() ){ 302 //要求タイプがStringのとき 303 304 //String型オブジェクトを生成 305 NewStringObject(UseReg,term); 306 307 extern CClass *pobj_StringClass; 308 type_stack[sp]=DEF_OBJECT; 309 index_stack[sp]=(LONG_PTR)pobj_StringClass; 310 bLiteralCalculation=0; 311 312 if(bXmm) pobj_reg->LockXmmReg(); 313 else pobj_reg->LockReg(); 314 315 sp++; 316 break; 317 } 732 if( baseType.IsObject() || baseType.IsNull() ){ 733 //要求タイプがオブジェクト、または未定のとき 734 735 //String型オブジェクトを生成 736 NewStringObject(UseReg,term); 737 738 extern CClass *pobj_StringClass; 739 type_stack[sp]=DEF_OBJECT; 740 index_stack[sp]=(LONG_PTR)pobj_StringClass; 741 bLiteralCalculation=0; 742 743 if(bXmm) pobj_reg->LockXmmReg(); 744 else pobj_reg->LockReg(); 745 746 sp++; 747 break; 318 748 } 319 749 … … 353 783 // 何らかの識別子 354 784 355 ////////////////////////////////////// 356 // 関数(DLL、ユーザー定義、組み込み) 357 ////////////////////////////////////// 358 359 i2=GetCallProcName(term,temporary); 360 if(term[i2]=='('){ 361 i4=GetStringInPare_RemovePare(temp2,term+i2+1); 362 363 void *pInfo; 364 int idProc=GetProc(temporary,(void **)&pInfo); 365 366 Type resultType; 367 if(idProc){ 368 //閉じカッコ")"に続く文字がNULLでないとき 369 if(term[i2+1+i4+1]!='\0'){ 370 if( term[i2+1+i4+1] == '.' 371 || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){ 372 goto NonProc; 373 } 374 else{ 375 SetError(42,NULL,cp); 785 bool isLiteral; 786 if( TermOpe( term, baseType, resultType, isLiteral, &bUseHeap[sp] ) ){ 787 if(resultType.IsNull()){ 788 //戻り値が存在しないとき 789 for(i2=0;;i2++){ 790 if(term[i2]=='('||term[i2]=='\0'){ 791 term[i2]=0; 792 break; 376 793 } 377 794 } 378 379 380 ////////////////////////////////////////////////////// 381 ///// レジスタ資源のバックアップ 382 { BACKUP_REGISTER_RESOURCE 383 ////////////////////////////////////////////////////// 384 385 386 //////////////// 387 // 呼び出し 388 //////////////// 389 390 CallProc(idProc,pInfo,temporary,temp2,resultType); 391 if(resultType.IsNull()){ 392 //戻り値が存在しないとき 393 for(i2=2;;i2++){ 394 if(term[i2]=='('||term[i2]=='\0'){ 395 term[i2]=0; 396 break; 397 } 398 } 399 SetError(38,term,cp); 400 401 //レジスタ資源を復元 402 RESTORE_REGISTER_RESOURCE 403 404 goto error; 795 SetError(38,term,cp); 796 797 goto error; 798 } 799 800 type_stack[sp] = resultType.GetBasicType(); 801 index_stack[sp] = resultType.GetIndex(); 802 803 if( !isLiteral ){ 804 bLiteralCalculation=0; 805 } 806 807 if( resultType.GetBasicType() & FLAG_CAST ){ 808 // 型名のみ 809 SetError(); 810 } 811 else{ 812 if( resultType.IsReal() == false && UseReg==REG_R14 ){ 813 //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用 814 pobj_sf->push(REG_R14); 815 } 816 if( resultType.IsReal() && XmmReg==REG_XMM4 ){ 817 if(resultType.IsDouble()){ 818 //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用 819 pobj_sf->push(REG_XMM4,sizeof(double)); 405 820 } 406 407 408 ///////////////////// 409 // 戻り値の処理 410 ///////////////////// 411 412 //大きな型への暗黙の変換 413 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType()); 414 index_stack[sp] = resultType.GetIndex(); 415 bLiteralCalculation=0; 416 417 if( type_stack[sp] != resultType.GetBasicType() ){ 418 // 大きな型へ変換された場合 419 // ※レジスタの値をキャストする 420 ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() ); 821 if(resultType.IsSingle()){ 822 //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用 823 pobj_sf->push(REG_XMM4,sizeof(float)); 421 824 } 422 423 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);424 425 if(resultType.IsReal()) bXmm=1;426 else bXmm=0;427 428 /////////////////////////////////////////////429 ////// レジスタ資源を復元430 RESTORE_REGISTER_RESOURCE431 }////////////////////////////////////////////432 433 434 if(bXmm) pobj_reg->LockXmmReg();435 else pobj_reg->LockReg();436 437 if(resultType.IsStruct()){438 //構造体が戻ったときはヒープ領域にインスタンスが格納されている439 //※後にfreeする必要あり440 bUseHeap[sp]=1;441 825 } 442 826 443 sp++; 444 break; 445 } 446 else if(GetConstCalcBuffer(temporary,temp2,temp3)){ 447 ///////////////////////// 448 // マクロ関数 449 ///////////////////////// 450 451 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 452 if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 453 454 //マクロ関数の場合 455 NumOpe(&UseReg,temp3,Type(),resultType); 456 457 if(!IS_LITERAL(resultType.GetIndex())){ 458 //リテラル値ではなかったとき 459 bLiteralCalculation=0; 827 if( resultType.IsReal() ){ 828 pobj_reg->LockXmmReg(); 460 829 } 461 462 type_stack[sp] = resultType.GetBasicType(); 463 index_stack[sp] = resultType.GetIndex(); 464 465 if(resultType.IsReal()) pobj_reg->LockXmmReg(); 466 else pobj_reg->LockReg(); 467 468 sp++; 469 break; 470 } 471 } 472 NonProc: 473 474 475 //インデクサ(getアクセサ) 476 char variable[VN_SIZE],array_element[VN_SIZE]; 477 GetArrayElement(term,variable,array_element); 478 if(array_element[0]){ 479 Type resultType; 480 GetVarType(variable,resultType,0); 481 if( resultType.IsObject() ){ 482 CallIndexerGetterProc(UseReg,&resultType.GetClass(),variable,array_element,resultType); 483 type_stack[sp]=resultType.GetBasicType(); 484 index_stack[sp]=resultType.GetIndex(); 485 bLiteralCalculation=0; 486 487 if(resultType.IsReal()) pobj_reg->LockXmmReg(); 488 else pobj_reg->LockReg(); 489 sp++; 490 break; 491 } 830 else{ 831 pobj_reg->LockReg(); 832 } 833 } 834 835 sp++; 836 break; 492 837 } 493 838 … … 516 861 517 862 pobj_reg->LockReg(); 518 sp++;519 break;520 }521 522 523 RELATIVE_VAR RelativeVar;524 Type varType;525 if(GetVarOffset(526 false, //エラー表示あり527 false, //読み込み専用528 term,529 &RelativeVar,varType)){530 //////////531 // 変数532 //////////533 534 //大きな型への暗黙の変換535 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),varType.GetBasicType());536 index_stack[sp] = varType.GetIndex();537 bLiteralCalculation=0;538 539 if(varType.GetBasicType()&FLAG_PTR){540 //配列ポインタ541 type_stack[sp]=GetPtrType(varType.GetBasicType()^FLAG_PTR);542 543 SetVarPtrToReg(UseReg,&RelativeVar);544 }545 else if(varType.IsReal()){546 //実数型547 bXmm=1;548 549 if( varType.IsDouble() )550 SetXmmReg_DoubleVariable(&RelativeVar,XmmReg);551 if( varType.IsSingle() )552 SetXmmReg_SingleVariable(&RelativeVar,XmmReg);553 }554 else if( varType.IsWhole() || varType.IsObject()){555 //整数型556 SetReg_WholeVariable(varType.GetBasicType(),&RelativeVar,UseReg);557 }558 else if( varType.IsStruct() ){559 //構造体ポインタをUseRegへ格納(構造体は値型)560 SetVarPtrToReg(UseReg,&RelativeVar);561 }562 else SetError(11,term,cp);563 564 if( type_stack[sp] != varType.GetBasicType() ){565 // 大きな型へ変換された場合566 // ※レジスタの値をキャストする567 ExtendRegToBigType( UseReg, type_stack[sp], varType.GetBasicType() );568 }569 570 if(bXmm==0&&UseReg==REG_R14){571 //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用572 pobj_sf->push(REG_R14);573 }574 if(bXmm&&XmmReg==REG_XMM4){575 if(varType.IsDouble()){576 //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用577 pobj_sf->push(REG_XMM4,sizeof(double));578 }579 if(varType.IsSingle()){580 //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用581 pobj_sf->push(REG_XMM4,sizeof(float));582 }583 }584 585 if(bXmm) pobj_reg->LockXmmReg();586 else pobj_reg->LockReg();587 863 sp++; 588 864 break; … … 622 898 } 623 899 } 624 625 626 //////////////627 // 型名の場合628 //////////////629 Type tempType;630 if( Type::StringToType( term, tempType ) ){631 type_stack[sp] = tempType.GetBasicType() | FLAG_CAST;632 index_stack[sp] = tempType.GetIndex();633 sp++;634 break;635 }636 637 638 /////////////////////////////////639 // プロパティ用のメソッド640 /////////////////////////////////641 642 //配列要素を排除643 char VarName[VN_SIZE],ArrayElements[VN_SIZE];644 GetArrayElement(term,VarName,ArrayElements);645 646 if(GetSubHash(VarName,0)){647 648 //////////////////////////////////////////////////////649 ///// レジスタ資源のバックアップ650 { BACKUP_REGISTER_RESOURCE651 //////////////////////////////////////////////////////652 653 Type resultType;654 CallPropertyMethod(term,NULL,resultType);655 656 //大きな型への暗黙の変換657 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());658 index_stack[sp]=resultType.GetIndex();659 bLiteralCalculation=0;660 661 if( type_stack[sp] != resultType.GetBasicType() ){662 // 大きな型へ変換された場合663 // ※レジスタの値をキャストする664 ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() );665 }666 667 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);668 669 if(IsRealNumberType(type_stack[sp])) bXmm=1;670 else bXmm=0;671 672 /////////////////////////////////////////////673 ////// レジスタ資源を復元674 RESTORE_REGISTER_RESOURCE675 }////////////////////////////////////////////676 677 if(type_stack[sp]==DEF_STRUCT){678 //構造体が戻ったときはヒープ領域にインスタンスが格納されている679 //※後にfreeする必要あり680 bUseHeap[sp]=1;681 }682 683 if(bXmm) pobj_reg->LockXmmReg();684 else pobj_reg->LockReg();685 sp++;686 break;687 }688 689 900 690 901 … … 735 946 736 947 if(XmmReg==REG_XMM4){ 948 SetError(); // TODO: 未実装 737 949 //push term 738 950 op_push_value(i32data);
Note:
See TracChangeset
for help on using the changeset viewer.