Changeset 230 in dev for trunk/abdev


Ignore:
Timestamp:
Jul 24, 2007, 7:11:26 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
4 edited

Legend:

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

    r229 r230  
    300300
    301301//////////////////////////////////
     302// lea関連
     303//////////////////////////////////
     304
     305void CodeGenerator::op_lea_RM( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType )
     306{
     307    //16ビット演算の命令プリフィックス
     308    char op_prefix=0;
     309
     310    //オペコード
     311    char opcode=(char)0x8D;
     312
     313    __op_format( op_prefix, opcode, 0, reg, base_reg, offset, mod, scheduleType );
     314}
     315
     316
     317
     318//////////////////////////////////
    302319// インクリメント・デクリメント
    303320//////////////////////////////////
     
    338355    pNativeCode->Put( (char)(0xC0|REGISTER_OPERAND(reg)) );
    339356    pNativeCode->Put( cValue );
     357}
     358void CodeGenerator::op_add_RV( int reg, long offset, Schedule::Type scheduleType )
     359{
     360    // add reg,offset
     361    pNativeCode->Put( (char)0x81 );
     362    pNativeCode->Put( (char)(0xC0|REGISTER_OPERAND(reg)) );
     363    pNativeCode->Put( offset, scheduleType );
    340364}
    341365void CodeGenerator::op_add_RR( int reg1, int reg2 )
  • trunk/abdev/BasicCompiler32/Compile_Set_Var.cpp

    r225 r230  
    9595        if(pRelativeVar->bOffsetOffset){
    9696            //fstp ptr[ecx+offset]
    97             compiler.codeGenerator.op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset);
    98             obp-=sizeof(long);
    99             pobj_GlobalVarSchedule->add();
    100             obp+=sizeof(long);
     97            compiler.codeGenerator.op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
    10198        }
    10299        else{
    103100            //mov ecx,offset
    104             compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
    105             obp-=sizeof(long);
    106             pobj_GlobalVarSchedule->add();
    107             obp+=sizeof(long);
     101            compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
    108102
    109103            //fstp ptr[ecx]
     
    114108        if(pRelativeVar->bOffsetOffset){
    115109            //add ecx,qword ptr[offset]
    116             compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     110            compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
    117111        }
    118112        else{
    119113            //mov ecx,qword ptr[offset]
    120             compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
    121         }
    122         obp-=sizeof(long);
    123         pobj_GlobalVarSchedule->add();
    124         obp+=sizeof(long);
     114            compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
     115        }
    125116
    126117        goto directmem;
     
    129120        if(pRelativeVar->bOffsetOffset){
    130121            //fstp ptr[ebp+ecx+offset]
    131             compiler.codeGenerator.op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
     122            compiler.codeGenerator.op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET, Schedule::LocalVar );
    132123        }
    133124        else{
    134125            //fstp ptr[ebp+offset]
    135             compiler.codeGenerator.op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset);
    136         }
    137         obp-=sizeof(long);
    138         AddLocalVarAddrSchedule();
    139         obp+=sizeof(long);
     126            compiler.codeGenerator.op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset, Schedule::LocalVar );
     127        }
    140128    }
    141129    else if(pRelativeVar->dwKind==VAR_REFLOCAL){
    142130        if(pRelativeVar->bOffsetOffset){
    143131            //add ecx,qword ptr[ebp+offset]
    144             compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
     132            compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    145133        }
    146134        else{
    147135            //mov ecx,qword ptr[ebp+offset]
    148             compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    149         }
    150         obp-=sizeof(long);
    151         AddLocalVarAddrSchedule();
    152         obp+=sizeof(long);
     136            compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
     137        }
    153138
    154139        goto directmem;
     
    328313        if(pRelative->bOffsetOffset){
    329314            //mov ptr[ecx+offset],eax/ax/al
    330             compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
     315            compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::GlobalVar );
    331316        }
    332317        else{
    333318            //mov ptr[offset],eax/ax/al
    334             compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
    335         }
    336         obp-=sizeof(long);
    337         pobj_GlobalVarSchedule->add();
    338         obp+=sizeof(long);
     319            compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
     320        }
    339321    }
    340322    else if(pRelative->dwKind==VAR_REFGLOBAL){
     
    344326        if(pRelative->bOffsetOffset){
    345327            //add ecx,qword ptr[offset]
    346             compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
     328            compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
    347329        }
    348330        else{
    349331            //mov ecx,qword ptr[offset]
    350             compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
    351         }
    352         obp-=sizeof(long);
    353         pobj_GlobalVarSchedule->add();
    354         obp+=sizeof(long);
     332            compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
     333        }
    355334
    356335        goto directmem;
     
    359338        if(pRelative->bOffsetOffset){
    360339            //mov ptr[ebp+ecx+offset],eax/ax/al
    361             compiler.codeGenerator.op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
     340            compiler.codeGenerator.op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET, Schedule::LocalVar );
    362341        }
    363342        else{
    364343            //mov ptr[ebp+offset],eax/ax/al
    365             compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    366         }
    367         obp-=sizeof(long);
    368         AddLocalVarAddrSchedule();
    369         obp+=sizeof(long);
     344            compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
     345        }
    370346    }
    371347    else if(pRelative->dwKind==VAR_REFLOCAL){
    372348        if(pRelative->bOffsetOffset){
    373349            //add ecx,ptr[ebp+offset]
    374             compiler.codeGenerator.op_add_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     350            compiler.codeGenerator.op_add_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    375351        }
    376352        else{
    377353            //mov ecx,ptr[ebp+offset]
    378             compiler.codeGenerator.op_mov_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    379         }
    380         obp-=sizeof(long);
    381         AddLocalVarAddrSchedule();
    382         obp+=sizeof(long);
     354            compiler.codeGenerator.op_mov_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
     355        }
    383356
    384357        goto directmem;
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r225 r230  
    857857
    858858            //mov dword ptr[offset],eax
    859             OpBuffer[obp++]=(char)0xA3;
    860             *((long *)(OpBuffer+obp))=offset;
    861             pobj_GlobalVarSchedule->add();
    862             obp+=sizeof(long);
     859            compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, 0, offset, MOD_DISP32, Schedule::GlobalVar );
    863860        }
    864861        else{
     
    12501247        if(pRelativeVar->bOffsetOffset){
    12511248            //lea eax,dword ptr[ecx+offset]
    1252             OpBuffer[obp++]=(char)0x8D;
    1253             OpBuffer[obp++]=(char)0x81;
    1254             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    1255             pobj_GlobalVarSchedule->add();
    1256             obp+=sizeof(long);
     1249            compiler.codeGenerator.op_lea_RM( REG_EAX, REG_ECX, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
    12571250        }
    12581251        else{
    12591252            //mov eax,offset
    1260             OpBuffer[obp++]=(char)0xB8;
    1261             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    1262             pobj_GlobalVarSchedule->add();
    1263             obp+=sizeof(long);
     1253            compiler.codeGenerator.op_mov_RV( REG_EAX, pRelativeVar->offset, Schedule::GlobalVar );
    12641254        }
    12651255    }
     
    12711261
    12721262            //add eax,dword ptr[offset]
    1273             compiler.codeGenerator.op_add_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32 );
     1263            compiler.codeGenerator.op_add_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
    12741264        }
    12751265        else{
    12761266            //mov eax,dword ptr[offset]
    1277             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32 );
    1278         }
    1279         obp-=sizeof(long);
    1280         pobj_GlobalVarSchedule->add();
    1281         obp+=sizeof(long);
     1267            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
     1268        }
    12821269    }
    12831270    else if(pRelativeVar->dwKind==VAR_LOCAL){
    12841271        if(pRelativeVar->bOffsetOffset){
    12851272            //add ecx,offset
    1286             OpBuffer[obp++]=(char)0x81;
    1287             OpBuffer[obp++]=(char)0xC1;
    1288             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    1289             AddLocalVarAddrSchedule();
    1290             obp+=sizeof(long);
     1273            compiler.codeGenerator.op_add_RV( REG_ECX, pRelativeVar->offset, Schedule::LocalVar );
    12911274
    12921275            //lea eax,dword ptr[ebp+ecx]
     
    12971280        }
    12981281        else{
    1299             //lea eax,dword ptr[ebp+offset]
    1300             OpBuffer[obp++]=(char)0x8D;
    1301             OpBuffer[obp++]=(char)0x85;
    1302             *((long *)(OpBuffer+obp))=pRelativeVar->offset;
    1303             AddLocalVarAddrSchedule();
    1304             obp+=sizeof(long);
     1282            //lea eax,dword ptr[ecx+offset]
     1283            compiler.codeGenerator.op_lea_RM( REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    13051284        }
    13061285    }
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r229 r230  
    142142    void op_movsx_R32R8     (int reg32,int reg8 = REG_NON);
    143143    void op_movsx_R16R8     (int reg16,int reg8 = REG_NON);
     144    void op_lea_RM          ( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType = Schedule::None );
    144145    void op_inc             (int reg);
    145146    void op_dec             (int reg);
    146147    void op_add_RV8         (int reg,char cValue);
     148    void op_add_RV          ( int reg, long offset, Schedule::Type scheduleType = Schedule::None );
    147149    void op_add_RR          ( int reg1, int reg2 );
    148150    void op_add_RM          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
Note: See TracChangeset for help on using the changeset viewer.