Changeset 66 in dev for BasicCompiler32/Compile_Set_Var.cpp
- Timestamp:
- Mar 9, 2007, 4:59:13 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Set_Var.cpp
r64 r66 274 274 } 275 275 276 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative){ 277 if(type==DEF_DOUBLE){ 278 //Double型 279 // st(0)の内容をedx:eaxに変換 280 281 //TODO: 実装 282 SetError(); 283 } 284 else if(type==DEF_SINGLE){ 285 //Single型 286 // st(0)の内容をeaxに変換 287 288 //TODO: 実装 289 SetError(); 276 void SetWholeVariable(int varSize,int calcType,RELATIVE_VAR *pRelative){ 277 if( IsRealNumberType( calcType ) ){ 278 // 実数型から整数型へ変換する 279 280 if( varSize == sizeof(_int64) ){ 281 // 64bitへ 282 // st(0) -> edx:eax 283 breakpoint; 284 285 //push 286 //push 287 op_sub_esp( PTR_SIZE * 2 ); 288 289 //fistp qword ptr[esp] 290 op_fistp_ptr_esp( sizeof(_int64) ); 291 292 //pop eax 293 op_pop( REG_EAX ); 294 295 //pop edx 296 op_pop( REG_EDX ); 297 } 298 else{ 299 // 32bit 300 // st(0) -> eax 301 302 //push 303 op_push( REG_NON ); 304 305 //fistp dword ptr[esp] 306 op_fistp_ptr_esp( sizeof(long) ); 307 308 //pop eax 309 op_pop( REG_EAX ); 310 } 290 311 } 291 312 else{ 292 313 //その他の整数 293 314 294 if(var _size==sizeof(_int64)){315 if(varSize==sizeof(_int64)){ 295 316 //eaxの値を64ビット(edx:eax)に拡張する 296 ExtendTypeTo64( type);297 } 298 else if(var _size==sizeof(long)){317 ExtendTypeTo64(calcType); 318 } 319 else if(varSize==sizeof(long)){ 299 320 //レジスタの値を32ビット(eax)に拡張する 300 ExtendTypeTo32( type,REG_EAX);301 } 302 else if(var _size==sizeof(short)){321 ExtendTypeTo32(calcType,REG_EAX); 322 } 323 else if(varSize==sizeof(short)){ 303 324 //レジスタの値を16ビット(ax)に拡張する 304 ExtendTypeTo16( type,REG_EAX);325 ExtendTypeTo16(calcType,REG_EAX); 305 326 } 306 327 //8ビットは拡張なし 307 328 } 308 329 309 if(var _size==sizeof(_int64)){330 if(varSize==sizeof(_int64)){ 310 331 //下位32ビット 311 332 SetWholeVariable(sizeof(long),DEF_LONG,pRelative); 312 333 334 //上位32ビット 335 336 //直接参照に切り替え 337 SetVarPtrToEax(pRelative); 338 pRelative->dwKind=VAR_DIRECTMEM; 339 340 //mov ecx,eax 341 op_mov_RR( REG_ECX, REG_EAX ); 342 343 //add ecx,sizeof(long) 344 op_add_RV8( REG_ECX, sizeof(long) ); 345 313 346 //mov eax,edx 314 347 op_mov_RR( REG_EAX, REG_EDX ); 315 348 316 //上位32ビット317 if( pRelative->dwKind == VAR_DIRECTMEM ){318 //add ecx,sizeof(long)319 op_add_RV8( REG_ECX, sizeof(long) );320 }321 pRelative->offset+=sizeof(long);322 349 SetWholeVariable(sizeof(long),DEF_LONG,pRelative); 323 pRelative->offset-=sizeof(long);324 350 325 351 return; … … 329 355 if(pRelative->bOffsetOffset){ 330 356 //mov ptr[ecx+offset],eax/ax/al 331 op_mov_MR(var _size,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);357 op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32); 332 358 } 333 359 else{ 334 360 //mov ptr[offset],eax/ax/al 335 op_mov_MR(var _size,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);361 op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32); 336 362 } 337 363 obp-=sizeof(long); … … 342 368 if(pRelative->bOffsetOffset){ 343 369 //add ecx,qword ptr[offset] 344 op_add_RM(var _size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);370 op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32); 345 371 } 346 372 else{ 347 373 //mov ecx,qword ptr[offset] 348 op_mov_RM(var _size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);374 op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32); 349 375 } 350 376 obp-=sizeof(long); … … 357 383 if(pRelative->bOffsetOffset){ 358 384 //mov ptr[ebp+ecx+offset],eax/ax/al 359 op_mov_MR_ex(var _size,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);385 op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET); 360 386 } 361 387 else{ 362 388 //mov ptr[ebp+offset],eax/ax/al 363 op_mov_MR(var _size,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);389 op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32); 364 390 } 365 391 obp-=sizeof(long); … … 370 396 if(pRelative->bOffsetOffset){ 371 397 //add ecx,qword ptr[ebp+offset] 372 op_add_RM(var _size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);398 op_add_RM(varSize,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32); 373 399 } 374 400 else{ 375 401 //mov ecx,qword ptr[ebp+offset] 376 op_mov_RM(var _size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);402 op_mov_RM(varSize,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32); 377 403 } 378 404 obp-=sizeof(long); … … 386 412 387 413 //mov ptr[ecx],eax/ax/al 388 op_mov_MR(var _size,REG_EAX,REG_ECX,0,MOD_BASE);414 op_mov_MR(varSize,REG_EAX,REG_ECX,0,MOD_BASE); 389 415 } 390 416 }
Note:
See TracChangeset
for help on using the changeset viewer.