Changeset 231 in dev


Ignore:
Timestamp:
Jul 25, 2007, 12:02:30 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Calc_PushVar.cpp

    r229 r231  
    162162        if(pRelativeVar->bOffsetOffset){
    163163            //add ecx,offset
    164             OpBuffer[obp++]=(char)0x81;
    165             OpBuffer[obp++]=(char)0xC1;
    166             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    167             AddLocalVarAddrSchedule();
    168             obp+=sizeof(long);
     164            compiler.codeGenerator.op_add_RV( REG_ECX, pRelativeVar->offset, Schedule::LocalVar );
    169165
    170166            //push dword ptr[ebp+ecx]
     
    178174        else{
    179175            //push dword ptr[ebp+offset]
    180             OpBuffer[obp++]=(char)0xFF;
    181             OpBuffer[obp++]=(char)0xB5;
    182             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    183             AddLocalVarAddrSchedule();
    184             obp+=sizeof(long);
     176            compiler.codeGenerator.op_push_M( REG_EBP, pRelativeVar->offset, Schedule::LocalVar );
    185177        }
    186178    }
    187179    else if(pRelativeVar->dwKind==VAR_REFLOCAL){
    188180        //mov eax,dword ptr[ebp+offset]
    189         OpBuffer[obp++]=(char)0x8B;
    190         OpBuffer[obp++]=(char)0x85;
    191         *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    192         AddLocalVarAddrSchedule();
    193         obp+=sizeof(long);
     181        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    194182
    195183        if(pRelativeVar->bOffsetOffset){
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r225 r231  
    677677            }
    678678        }
    679         else if(i3==DEF_DOUBLE){
     679        else if( i3==DEF_DOUBLE
     680            || i3 == DEF_SINGLE )
     681        {
    680682            //fld qword ptr[ebp+offset]
    681             OpBuffer[obp++]=(char)0xDD;
    682             OpBuffer[obp++]=(char)0x85;
    683             *((long *)(OpBuffer+obp))=RelativeVar.offset;
    684             AddLocalVarAddrSchedule();
    685             obp+=sizeof(long);
    686         }
    687         else if(i3==DEF_SINGLE){
    688             //fld dword ptr[ebp+offset]
    689             OpBuffer[obp++]=(char)0xD9;
    690             OpBuffer[obp++]=(char)0x85;
    691             *((long *)(OpBuffer+obp))=RelativeVar.offset;
    692             AddLocalVarAddrSchedule();
    693             obp+=sizeof(long);
     683            compiler.codeGenerator.op_fld_base_offset( i3, REG_EBP, RelativeVar.offset, Schedule::LocalVar );
    694684        }
    695685        else if(i3==DEF_INT64||i3==DEF_QWORD){
    696686            //mov eax,dword ptr[ebp+offset]
    697             OpBuffer[obp++]=(char)0x8B;
    698             OpBuffer[obp++]=(char)0x85;
    699             *((long *)(OpBuffer+obp))=RelativeVar.offset;
    700             AddLocalVarAddrSchedule();
    701             obp+=sizeof(long);
     687            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
    702688
    703689            //mov edx,dword ptr[ebp+offset+sizeof(long)]
    704             OpBuffer[obp++]=(char)0x8B;
    705             OpBuffer[obp++]=(char)0x95;
    706             *((long *)(OpBuffer+obp))=RelativeVar.offset+sizeof(long);
    707             AddLocalVarAddrSchedule();
    708             obp+=sizeof(long);
     690            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EBP, RelativeVar.offset+sizeof(long), MOD_BASE_DISP32, Schedule::LocalVar );
    709691        }
    710692        else if(i3==DEF_LONG||i3==DEF_DWORD||
    711693            IsPtrType(i3)){
    712694            //mov eax,dword ptr[ebp+offset]
    713             OpBuffer[obp++]=(char)0x8B;
    714             OpBuffer[obp++]=(char)0x85;
    715             *((long *)(OpBuffer+obp))=RelativeVar.offset;
    716             AddLocalVarAddrSchedule();
    717             obp+=sizeof(long);
     695            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
    718696        }
    719697        else if(i3==DEF_INTEGER||i3==DEF_WORD || (Smoothie::IsUnicode()&&i3==DEF_CHAR)){
     
    722700
    723701            //mov ax,word ptr[ebp+offset]
    724             OpBuffer[obp++]=(char)0x66;
    725             OpBuffer[obp++]=(char)0x8B;
    726             OpBuffer[obp++]=(char)0x85;
    727             *((long *)(OpBuffer+obp))=RelativeVar.offset;
    728             AddLocalVarAddrSchedule();
    729             obp+=sizeof(long);
     702            compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
    730703        }
    731704        else if(i3==DEF_SBYTE||i3==DEF_BYTE||i3==DEF_BOOLEAN || (Smoothie::IsUnicode()==false&&i3==DEF_CHAR)){
     
    734707
    735708            //mov al,byte ptr[ebp+offset]
    736             OpBuffer[obp++]=(char)0x8A;
    737             OpBuffer[obp++]=(char)0x85;
    738             *((long *)(OpBuffer+obp))=RelativeVar.offset;
    739             AddLocalVarAddrSchedule();
    740             obp+=sizeof(long);
     709            compiler.codeGenerator.op_mov_RM( sizeof(char), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::LocalVar );
    741710        }
    742711    }
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r230 r231  
    978978
    979979        //mov dword ptr[ebp+offset+sizeof(long)],eax
    980         OpBuffer[obp++]=(char)0x89;
    981         OpBuffer[obp++]=(char)0x85;
    982         *((long *)(OpBuffer+obp))=offset+sizeof(long);
    983         AddLocalVarAddrSchedule();
    984         obp+=sizeof(long);
     980        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset+sizeof(long), MOD_BASE_DISP32, Schedule::LocalVar );
    985981
    986982        //mov eax,LOLONG(dbl)
    987         OpBuffer[obp++]=(char)0xB8;
    988         *((long *)(OpBuffer+obp))=*(long *)(&dbl);
    989         obp+=sizeof(long);
     983        compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(&dbl) );
    990984
    991985        //mov dword ptr[ebp+offset],eax
    992         OpBuffer[obp++]=(char)0x89;
    993         OpBuffer[obp++]=(char)0x85;
    994         *((long *)(OpBuffer+obp))=offset;
    995         AddLocalVarAddrSchedule();
    996         obp+=sizeof(long);
     986        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, Schedule::LocalVar );
    997987    }
    998988    else if( type.IsSingle() ){
    999989        float flt;
    1000990        flt=(float)dbl;
     991
    1001992        //mov eax,InitValue
    1002         OpBuffer[obp++]=(char)0xB8;
    1003         *((long *)(OpBuffer+obp))=*(long *)&flt;
    1004         obp+=sizeof(long);
     993        compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)&flt );
    1005994
    1006995        //mov dword ptr[ebp+offset],eax
    1007         OpBuffer[obp++]=(char)0x89;
    1008         OpBuffer[obp++]=(char)0x85;
    1009         *((long *)(OpBuffer+obp))=offset;
    1010         AddLocalVarAddrSchedule();
    1011         obp+=sizeof(long);
     996        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, MOD_BASE_DISP32, Schedule::LocalVar );
    1012997    }
    1013998    else if( type.Is64() ){
    1014999        //mov eax,HILONG(i64data)
    1015         OpBuffer[obp++]=(char)0xB8;
    1016         *((long *)(OpBuffer+obp))=(long)*(long *)(((char *)(&i64data))+4);
    1017         obp+=sizeof(long);
     1000        compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(((char *)(&i64data))+4) );
    10181001
    10191002        //mov dword ptr[ebp+offset+sizeof(long)],eax
    1020         OpBuffer[obp++]=(char)0x89;
    1021         OpBuffer[obp++]=(char)0x85;
    1022         *((long *)(OpBuffer+obp))=offset+sizeof(long);
    1023         AddLocalVarAddrSchedule();
    1024         obp+=sizeof(long);
     1003        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset+sizeof(long), MOD_BASE_DISP32, Schedule::LocalVar );
    10251004
    10261005        //mov eax,LOLONG(i64data)
    1027         OpBuffer[obp++]=(char)0xB8;
    1028         *((long *)(OpBuffer+obp))=*(long *)(&i64data);
    1029         obp+=sizeof(long);
     1006        compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(&i64data) );
    10301007
    10311008        //mov dword ptr[ebp+offset],eax
    1032         OpBuffer[obp++]=(char)0x89;
    1033         OpBuffer[obp++]=(char)0x85;
    1034         *((long *)(OpBuffer+obp))=offset;
    1035         AddLocalVarAddrSchedule();
    1036         obp+=sizeof(long);
     1009        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, Schedule::LocalVar );
    10371010    }
    10381011    else if( type.IsDWord() || type.IsLong() || type.IsPointer() ){
     
    10531026        else{
    10541027            //mov eax,InitValue
    1055             OpBuffer[obp++]=(char)0xB8;
    1056             *((long *)(OpBuffer+obp))=(long)i64data;
    1057             obp+=sizeof(long);
     1028            compiler.codeGenerator.op_mov_RV( REG_EAX, (long)i64data );
    10581029        }
    10591030
    10601031        //mov dword ptr[ebp+offset],eax
    1061         OpBuffer[obp++]=(char)0x89;
    1062         OpBuffer[obp++]=(char)0x85;
    1063         *((long *)(OpBuffer+obp))=offset;
    1064         AddLocalVarAddrSchedule();
    1065         obp+=sizeof(long);
     1032        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, MOD_BASE_DISP32, Schedule::LocalVar );
    10661033    }
    10671034    else if( type.IsWord() || type.IsInteger() ){
     
    10731040
    10741041        //mov word ptr[ebp+offset],ax
    1075         OpBuffer[obp++]=(char)0x66;
    1076         OpBuffer[obp++]=(char)0x89;
    1077         OpBuffer[obp++]=(char)0x85;
    1078         *((long *)(OpBuffer+obp))=offset;
    1079         AddLocalVarAddrSchedule();
    1080         obp+=sizeof(long);
     1042        compiler.codeGenerator.op_mov_MR( sizeof(short), REG_EAX, REG_EBP, offset, MOD_BASE_DISP32, Schedule::LocalVar );
    10811043    }
    10821044    else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){
     
    12871249        if(pRelativeVar->bOffsetOffset){
    12881250            //mov eax,ecx
    1289             OpBuffer[obp++]=(char)0x8B;
    1290             OpBuffer[obp++]=(char)0xC1;
     1251            compiler.codeGenerator.op_mov_RR( REG_EAX, REG_ECX );
    12911252
    12921253            //add eax,dword ptr[ebp+offset]
    1293             OpBuffer[obp++]=(char)0x03;
    1294             OpBuffer[obp++]=(char)0x85;
    1295             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    1296             AddLocalVarAddrSchedule();
    1297             obp+=sizeof(long);
     1254            compiler.codeGenerator.op_add_RM( sizeof(long), REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    12981255        }
    12991256        else{
    13001257            //mov eax,dword ptr[ebp+offset]
    1301             OpBuffer[obp++]=(char)0x8B;
    1302             OpBuffer[obp++]=(char)0x85;
    1303             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    1304             AddLocalVarAddrSchedule();
    1305             obp+=sizeof(long);
     1258            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    13061259        }
    13071260    }
    13081261    else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
    13091262        //mov eax,ecx
    1310         OpBuffer[obp++]=(char)0x8B;
    1311         OpBuffer[obp++]=(char)0xC1;
     1263        compiler.codeGenerator.op_mov_RR( REG_EAX, REG_ECX );
    13121264    }
    13131265}
     
    13401292
    13411293            //mov eax,offset
    1342             compiler.codeGenerator.op_mov_RV(REG_EAX,(int)pVar->GetOffsetAddress());
    1343             obp-=sizeof(long);
    1344             pobj_GlobalVarSchedule->add();
    1345             obp+=sizeof(long);
     1294            compiler.codeGenerator.op_mov_RV(REG_EAX,(int)pVar->GetOffsetAddress(), Schedule::GlobalVar );
    13461295
    13471296            //push eax
Note: See TracChangeset for help on using the changeset viewer.