Changeset 232 in dev for trunk/abdev/BasicCompiler64


Ignore:
Timestamp:
Jul 25, 2007, 4:04:11 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler64
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r226 r232  
    11171117                </File>
    11181118                <File
     1119                    RelativePath="..\BasicCompiler_Common\src\NativeCode.cpp"
     1120                    >
     1121                </File>
     1122                <File
    11191123                    RelativePath="..\BasicCompiler_Common\src\Procedure.cpp"
    11201124                    >
  • trunk/abdev/BasicCompiler64/CodeGenerator.cpp

    r228 r232  
    160160///////////////////
    161161
    162 void CodeGenerator::op_mov_RV(int op_size,int reg,long i32data){
     162void CodeGenerator::op_mov_RV(int op_size,int reg,long i32data, Schedule::Type scheduleType ){
    163163    //mov reg,i32data
    164164
     
    179179
    180180    //即値
    181     pNativeCode->Put( i32data );
     181    pNativeCode->Put( i32data, scheduleType );
    182182}
    183183void CodeGenerator::op_mov_RV64(int reg,_int64 i64data){
     
    258258    }
    259259}
    260 void CodeGenerator::op_mov_MR(int op_size,int reg,int base_reg,long offset,char mod){
     260void CodeGenerator::op_mov_MR(int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType ){
    261261    //mov qword ptr[base_reg+offset],reg64
    262262    //mov dword ptr[base_reg+offset],reg32
     
    273273    else opcode=(char)0x89;
    274274
    275     __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod);
    276 }
    277 void CodeGenerator::op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset){
     275    __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType );
     276}
     277void CodeGenerator::op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType ){
    278278    //mov qword ptr[base_reg1+base_reg2+offset],reg64
    279279    //mov dword ptr[base_reg1+base_reg2+offset],reg32
     
    309309
    310310        //オフセット値
    311         pNativeCode->Put( offset );
     311        pNativeCode->Put( offset, scheduleType );
    312312    }
    313313    else{
     
    389389}
    390390
    391 
    392 
    393 ///////////////////
    394 // mov64関連
    395 ///////////////////
    396 
    397 void CodeGenerator::op_mov64_ToReg(int reg,_int64 i64data){
    398     //mov reg,i64data
    399 
    400     if(REG_RAX<=reg&&reg<=REG_RDI){
    401         /*  rax~rdi
    402             0100 1000 1011 1xxx [64bit data]    */
    403         pNativeCode->Put( (char)0x48 );
    404         pNativeCode->Put( (char)(0xB8| REGISTER_OPERAND(reg) ) );
    405         pNativeCode->Put( i64data );
    406     }
    407     if(REG_R8<=reg&&reg<=REG_R15){
    408         /*  r8~r15
    409             0100 1001 1011 1xxx [64bit data]    */
    410         pNativeCode->Put( (char)0x49 );
    411         pNativeCode->Put( (char)(0xB8| REGISTER_OPERAND(reg) ) );
    412         pNativeCode->Put( i64data );
    413     }
    414 }
    415 void CodeGenerator::op_mov64_ToReg(int reg,long i32data){
    416     //mov reg,i32data
    417 
    418     if(REG_RAX<=reg&&reg<=REG_RDI){
    419         /*  rax~rdi
    420             0100 1000 1100 0111 1100 0xxx [32bit data]  */
    421         pNativeCode->Put( (char)0x48 );
    422         pNativeCode->Put( (char)0xC7 );
    423         pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg) ) );
    424         pNativeCode->Put( i32data );
    425     }
    426     if(REG_R8<=reg&&reg<=REG_R15){
    427         /*  r8~r15
    428             0100 1001 1100 0111 1100 0xxx [32bit data]  */
    429         pNativeCode->Put( (char)0x49 );
    430         pNativeCode->Put( (char)0xC7 );
    431         pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg) ) );
    432         pNativeCode->Put( i32data );
    433     }
    434 }
    435391void CodeGenerator::op_movsxd(int reg64,int reg32){
    436392    //movsxd reg64,reg32
     
    641597}
    642598
    643 void CodeGenerator::op_add_RV(int reg,long offset){
     599void CodeGenerator::op_add_RV(int reg,long offset, Schedule::Type scheduleType ){
    644600    //add reg,offset
    645601    char RexByte=-1;
     
    656612        pNativeCode->Put( (char)RexByte );
    657613        pNativeCode->Put( (char)0x05 );
    658         pNativeCode->Put( offset );
     614        pNativeCode->Put( offset, scheduleType );
    659615    }
    660616    else{
     
    665621        pNativeCode->Put( (char)0x81 );
    666622        pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)) );
    667         pNativeCode->Put( offset );
     623        pNativeCode->Put( offset, scheduleType );
    668624    }
    669625}
     
    13651321////////////////////
    13661322
    1367 void CodeGenerator::op_movlpd_MR(int xmm_reg,int base_reg,int offset,char mod){
     1323void CodeGenerator::op_movlpd_MR(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    13681324    //movlpd qword ptr[base_reg+offset],xmm_reg
    1369     __op_format(0,(char)0x66,(char)0x0F,(char)0x13,xmm_reg,base_reg,offset,mod);
    1370 }
    1371 void CodeGenerator::op_movlpd_RM(int xmm_reg,int base_reg,int offset,char mod){
     1325    __op_format(0,(char)0x66,(char)0x0F,(char)0x13,xmm_reg,base_reg,offset,mod, scheduleType );
     1326}
     1327void CodeGenerator::op_movlpd_RM(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    13721328    //movlpd xmm_reg,qword ptr[base_reg+offset]
    1373     __op_format(0,(char)0x66,(char)0x0F,(char)0x12,xmm_reg,base_reg,offset,mod);
     1329    __op_format(0,(char)0x66,(char)0x0F,(char)0x12,xmm_reg,base_reg,offset,mod, scheduleType );
    13741330}
    13751331void CodeGenerator::op_movsd_RR(int xmm_reg1,int xmm_reg2){
     
    13791335    __op_format(0,(char)0xF2,(char)0x0F,(char)0x10,xmm_reg1,xmm_reg2,0,MOD_REG);
    13801336}
    1381 void CodeGenerator::op_movsd_MR(int xmm_reg,int base_reg,int offset,char mod){
     1337void CodeGenerator::op_movsd_MR(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    13821338    //movsd qword ptr[reg+offset],xmm_reg
    13831339    //movsd qword ptr[reg],xmm_reg
    1384     __op_format(0,(char)0xF2,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod);
     1340    __op_format(0,(char)0xF2,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod, scheduleType );
    13851341}
    13861342void CodeGenerator::op_movss_RR(int xmm_reg1,int xmm_reg2){
     
    13901346    __op_format(0,(char)0xF3,(char)0x0F,(char)0x10,xmm_reg1,xmm_reg2,0,MOD_REG);
    13911347}
    1392 void CodeGenerator::op_movss_RM(int xmm_reg,int base_reg,int offset,char mod){
     1348void CodeGenerator::op_movss_RM(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    13931349    //movss xmm_reg,dword ptr[base_reg+offset]
    1394     __op_format(0,(char)0xF3,(char)0x0F,(char)0x10,xmm_reg,base_reg,offset,mod);
    1395 }
    1396 void CodeGenerator::op_movss_MR(int xmm_reg,int base_reg,int offset,char mod){
     1350    __op_format(0,(char)0xF3,(char)0x0F,(char)0x10,xmm_reg,base_reg,offset,mod, scheduleType );
     1351}
     1352void CodeGenerator::op_movss_MR(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType ){
    13971353    //movss dword ptr[reg+offset],xmm_reg
    13981354    //movss dword ptr[reg],xmm_reg
    1399     __op_format(0,(char)0xF3,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod);
     1355    __op_format(0,(char)0xF3,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod, scheduleType );
    14001356}
    14011357
  • trunk/abdev/BasicCompiler64/Compile_Calc_PushVar.cpp

    r228 r232  
    1111        if(pRelativeVar->bOffsetOffset){
    1212            //movlpd xmm_reg,qword ptr[r11+offset]
    13             OpBuffer[obp++]=(char)0x66;
    14             OpBuffer[obp++]=(char)0x41;
    15             OpBuffer[obp++]=(char)0x0F;
    16             OpBuffer[obp++]=(char)0x12;
    17             OpBuffer[obp++]=(char)(0x83 | REGISTER_OPERAND(xmm_reg)<<3);
    18             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    19             pobj_GlobalVarSchedule->add();
    20             obp+=sizeof(long);
     13            compiler.codeGenerator.op_movlpd_RM( xmm_reg, REG_R11, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
    2114        }
    2215        else{
    2316            //movlpd xmm_reg,qword ptr[offset]
    24             OpBuffer[obp++]=(char)0x66;
    25             OpBuffer[obp++]=(char)0x0F;
    26             OpBuffer[obp++]=(char)0x12;
    27             OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
    28             OpBuffer[obp++]=(char)0x25;
    29             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    30             pobj_GlobalVarSchedule->add();
    31             obp+=sizeof(long);
     17            compiler.codeGenerator.op_movlpd_RM( xmm_reg, 0, (long)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
    3218        }
    3319    }
     
    5036        else{
    5137            //movlpd xmm_reg,qword ptr[rsp+offset]
    52             OpBuffer[obp++]=(char)0x66;
    53             OpBuffer[obp++]=(char)0x0F;
    54             OpBuffer[obp++]=(char)0x12;
    55             OpBuffer[obp++]=(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3);
    56             OpBuffer[obp++]=(char)0x24;
    57             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    58             AddLocalVarAddrSchedule();
    59             obp+=sizeof(long);
     38            compiler.codeGenerator.op_movlpd_RM( xmm_reg, REG_RSP, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    6039        }
    6140    }
     
    6342        if(pRelativeVar->bOffsetOffset){
    6443            //add r11,qword ptr[rsp+offset]
    65             OpBuffer[obp++]=(char)0x4C;
    66             OpBuffer[obp++]=(char)0x03;
    67             OpBuffer[obp++]=(char)0x9C;
    68             OpBuffer[obp++]=(char)0x24;
    69             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    70             AddLocalVarAddrSchedule();
    71             obp+=sizeof(long);
     44            compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    7245        }
    7346        else{
    7447            //mov r11,qword ptr[rsp+offset]
    75             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    76             obp-=sizeof(long);
    77             AddLocalVarAddrSchedule();
    78             obp+=sizeof(long);
     48            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    7949        }
    8050
     
    8454directmem:
    8555        //movlpd xmm_reg,qword ptr[r11]
    86         OpBuffer[obp++]=(char)0x66;
    87         OpBuffer[obp++]=(char)0x41;
    88         OpBuffer[obp++]=(char)0x0F;
    89         OpBuffer[obp++]=(char)0x12;
    90         OpBuffer[obp++]=(char)(0x03 | REGISTER_OPERAND(xmm_reg)<<3);
     56        compiler.codeGenerator.op_movlpd_RM( xmm_reg, REG_R11, 0, MOD_BASE);
    9157    }
    9258}
     
    9561        if(pRelativeVar->bOffsetOffset){
    9662            //movss xmm_reg,dword ptr[r11+offset]
    97             OpBuffer[obp++]=(char)0xF3;
    98             OpBuffer[obp++]=(char)0x41;
    99             OpBuffer[obp++]=(char)0x0F;
    100             OpBuffer[obp++]=(char)0x10;
    101             OpBuffer[obp++]=(char)(0x83 | REGISTER_OPERAND(xmm_reg)<<3);
    102             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    103             pobj_GlobalVarSchedule->add();
    104             obp+=sizeof(long);
     63            compiler.codeGenerator.op_movss_RM( xmm_reg, REG_R11, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
    10564        }
    10665        else{
    10766            //movss xmm_reg,dword ptr[offset]
    108             OpBuffer[obp++]=(char)0xF3;
    109             OpBuffer[obp++]=(char)0x0F;
    110             OpBuffer[obp++]=(char)0x10;
    111             OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
    112             OpBuffer[obp++]=(char)0x25;
    113             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    114             pobj_GlobalVarSchedule->add();
    115             obp+=sizeof(long);
     67            compiler.codeGenerator.op_movss_RM( xmm_reg, 0, (long)pRelativeVar->offset, MOD_BASE, Schedule::GlobalVar );
    11668        }
    11769    }
     
    13486        else{
    13587            //movss xmm_reg,dword ptr[rsp+offset]
    136             OpBuffer[obp++]=(char)0xF3;
    137             OpBuffer[obp++]=(char)0x0F;
    138             OpBuffer[obp++]=(char)0x10;
    139             OpBuffer[obp++]=(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3);
    140             OpBuffer[obp++]=(char)0x24;
    141             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    142             AddLocalVarAddrSchedule();
    143             obp+=sizeof(long);
     88            compiler.codeGenerator.op_movss_RM( xmm_reg, REG_RSP, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    14489        }
    14590    }
     
    14792        if(pRelativeVar->bOffsetOffset){
    14893            //add r11,qword ptr[rsp+offset]
    149             OpBuffer[obp++]=(char)0x4C;
    150             OpBuffer[obp++]=(char)0x03;
    151             OpBuffer[obp++]=(char)0x9C;
    152             OpBuffer[obp++]=(char)0x24;
    153             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    154             AddLocalVarAddrSchedule();
    155             obp+=sizeof(long);
     94            compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    15695        }
    15796        else{
    15897            //mov r11,qword ptr[rsp+offset]
    159             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    160             obp-=sizeof(long);
    161             AddLocalVarAddrSchedule();
    162             obp+=sizeof(long);
     98            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    16399        }
    164100
     
    168104directmem:
    169105        //movss xmm_reg,dword ptr[r11]
    170         OpBuffer[obp++]=(char)0xF3;
    171         OpBuffer[obp++]=(char)0x41;
    172         OpBuffer[obp++]=(char)0x0F;
    173         OpBuffer[obp++]=(char)0x10;
    174         OpBuffer[obp++]=(char)(0x03 | REGISTER_OPERAND(xmm_reg)<<3);
     106        compiler.codeGenerator.op_movss_RM( xmm_reg, REG_R11, 0, MOD_BASE);
    175107    }
    176108}
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r226 r232  
    740740    //ローカル変数領域のサイズをスタックフレームに通知
    741741    int localParmSize = AllLocalVarSize - BaseLocalVar;
    742     int stackFrameSize = pobj_sf->GetFrameSize( AllLocalVarSize );
     742    int stackFrameSize = pobj_sf->GetFrameSize( localParmSize );
    743743
    744744    //ローカル変数アドレススケジュール
  • trunk/abdev/BasicCompiler64/Compile_Set_Var.cpp

    r228 r232  
    105105        if(pRelative->bOffsetOffset){
    106106            //movsd qword ptr[r11+offset],xmm0
    107             OpBuffer[obp++]=(char)0xF2;
    108             OpBuffer[obp++]=(char)0x41;
    109             OpBuffer[obp++]=(char)0x0F;
    110             OpBuffer[obp++]=(char)0x11;
    111             OpBuffer[obp++]=(char)0x83;
    112             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    113             pobj_GlobalVarSchedule->add();
    114             obp+=sizeof(long);
     107            compiler.codeGenerator.op_movsd_MR( REG_XMM0, REG_R11, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
    115108        }
    116109        else{
    117110            //movsd qword ptr[offset],xmm0
    118             OpBuffer[obp++]=(char)0xF2;
    119             OpBuffer[obp++]=(char)0x0F;
    120             OpBuffer[obp++]=(char)0x11;
    121             OpBuffer[obp++]=(char)0x04;
    122             OpBuffer[obp++]=(char)0x25;
    123             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    124             pobj_GlobalVarSchedule->add();
    125             obp+=sizeof(long);
     111            compiler.codeGenerator.op_movsd_MR( REG_XMM0, 0, (long)pRelative->offset, MOD_DISP32, Schedule::GlobalVar );
    126112        }
    127113    }
     
    144130        else{
    145131            //movsd qword ptr[rsp+offset],xmm0
    146             OpBuffer[obp++]=(char)0xF2;
    147             OpBuffer[obp++]=(char)0x0F;
    148             OpBuffer[obp++]=(char)0x11;
    149             OpBuffer[obp++]=(char)0x84;
    150             OpBuffer[obp++]=(char)0x24;
    151             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    152             AddLocalVarAddrSchedule();
    153             obp+=sizeof(long);
     132            compiler.codeGenerator.op_movsd_MR( REG_XMM0, REG_RSP, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    154133        }
    155134    }
     
    157136        if(pRelative->bOffsetOffset){
    158137            //add r11,qword ptr[rsp+offset]
    159             OpBuffer[obp++]=(char)0x4C;
    160             OpBuffer[obp++]=(char)0x03;
    161             OpBuffer[obp++]=(char)0x9C;
    162             OpBuffer[obp++]=(char)0x24;
    163             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    164             AddLocalVarAddrSchedule();
    165             obp+=sizeof(long);
     138            compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    166139        }
    167140        else{
    168141            //mov r11,qword ptr[rsp+offset]
    169             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
    170             obp-=sizeof(long);
    171             AddLocalVarAddrSchedule();
    172             obp+=sizeof(long);
     142            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    173143        }
    174144
     
    192162        if(pRelative->bOffsetOffset){
    193163            //movss dword ptr[r11+offset],xmm0
    194             OpBuffer[obp++]=(char)0xF3;
    195             OpBuffer[obp++]=(char)0x41;
    196             OpBuffer[obp++]=(char)0x0F;
    197             OpBuffer[obp++]=(char)0x11;
    198             OpBuffer[obp++]=(char)0x83;
    199             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    200             pobj_GlobalVarSchedule->add();
    201             obp+=sizeof(long);
     164            compiler.codeGenerator.op_movss_MR( REG_XMM0, REG_R11, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
    202165        }
    203166        else{
    204167            //movss dword ptr[offset],xmm0
    205             OpBuffer[obp++]=(char)0xF3;
    206             OpBuffer[obp++]=(char)0x0F;
    207             OpBuffer[obp++]=(char)0x11;
    208             OpBuffer[obp++]=(char)0x04;
    209             OpBuffer[obp++]=(char)0x25;
    210             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    211             pobj_GlobalVarSchedule->add();
    212             obp+=sizeof(long);
     168            compiler.codeGenerator.op_movss_MR( REG_XMM0, 0, (long)pRelative->offset, MOD_DISP32, Schedule::GlobalVar );
    213169        }
    214170    }
     
    231187        else{
    232188            //movss dword ptr[rsp+offset],xmm0
    233             OpBuffer[obp++]=(char)0xF3;
    234             OpBuffer[obp++]=(char)0x0F;
    235             OpBuffer[obp++]=(char)0x11;
    236             OpBuffer[obp++]=(char)0x84;
    237             OpBuffer[obp++]=(char)0x24;
    238             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    239             AddLocalVarAddrSchedule();
    240             obp+=sizeof(long);
     189            compiler.codeGenerator.op_movss_MR( REG_XMM0, REG_RSP, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    241190        }
    242191    }
     
    244193        if(pRelative->bOffsetOffset){
    245194            //add r11,qword ptr[rsp+offset]
    246             OpBuffer[obp++]=(char)0x4C;
    247             OpBuffer[obp++]=(char)0x03;
    248             OpBuffer[obp++]=(char)0x9C;
    249             OpBuffer[obp++]=(char)0x24;
    250             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
    251             AddLocalVarAddrSchedule();
    252             obp+=sizeof(long);
     195            compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    253196        }
    254197        else{
    255198            //mov r11,qword ptr[rsp+offset]
    256             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
    257             obp-=sizeof(long);
    258             AddLocalVarAddrSchedule();
    259             obp+=sizeof(long);
     199            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    260200        }
    261201
     
    334274        if(pRelative->bOffsetOffset){
    335275            //mov ptr[r11+offset],rax/eax/ax/al
    336             compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,REG_R11,(int)pRelative->offset,MOD_BASE_DISP32);
    337             obp-=sizeof(long);
    338             pobj_GlobalVarSchedule->add();
    339             obp+=sizeof(long);
     276            compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,REG_R11,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::GlobalVar );
    340277        }
    341278        else{
    342279            //mov ptr[offset],rax/eax/ax/al
    343             compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,0,(int)pRelative->offset,MOD_DISP32);
    344             obp-=sizeof(long);
    345             pobj_GlobalVarSchedule->add();
    346             obp+=sizeof(long);
     280            compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,0,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
    347281        }
    348282    }
     
    350284        if(pRelative->bOffsetOffset){
    351285            //add r11,qword ptr[offset]
    352             compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelative->offset, MOD_DISP32 );
    353             obp-=sizeof(long);
    354             pobj_GlobalVarSchedule->add();
    355             obp+=sizeof(long);
     286            compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelative->offset, MOD_DISP32, Schedule::GlobalVar );
    356287        }
    357288        else{
    358289            //mov r11,qword ptr[offset]
    359             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelative->offset,MOD_DISP32);
    360             obp-=sizeof(long);
    361             pobj_GlobalVarSchedule->add();
    362             obp+=sizeof(long);
     290            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
    363291        }
    364292
     
    368296        if(pRelative->bOffsetOffset){
    369297            //mov ptr[rsp+r11+offset],rax/eax/ax/al
    370             compiler.codeGenerator.op_mov_MR_ex(varSize,REG_RAX,REG_RSP,REG_R11,(int)pRelative->offset,USE_OFFSET);
    371             obp-=sizeof(long);
    372             AddLocalVarAddrSchedule();
    373             obp+=sizeof(long);
     298            compiler.codeGenerator.op_mov_MR_ex(varSize,REG_RAX,REG_RSP,REG_R11,(int)pRelative->offset,USE_OFFSET, Schedule::LocalVar );
    374299        }
    375300        else{
    376301            //mov ptr[rsp+offset],rax/eax/ax/al
    377             compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
    378             obp-=sizeof(long);
    379             AddLocalVarAddrSchedule();
    380             obp+=sizeof(long);
     302            compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    381303        }
    382304    }
     
    384306        if(pRelative->bOffsetOffset){
    385307            //add r11,qword ptr[rsp+offset]
    386             compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_RSP, (int)pRelative->offset, MOD_BASE_DISP32 );
    387             obp-=sizeof(long);
    388             AddLocalVarAddrSchedule();
    389             obp+=sizeof(long);
     308            compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_RSP, (int)pRelative->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    390309        }
    391310        else{
    392311            //mov r11,qword ptr[rsp+offset]
    393             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
    394             obp-=sizeof(long);
    395             AddLocalVarAddrSchedule();
    396             obp+=sizeof(long);
     312            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    397313        }
    398314
  • trunk/abdev/BasicCompiler64/Compile_Var.cpp

    r228 r232  
    868868
    869869            //mov qword ptr[offset],rax
    870             compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,0,offset,MOD_DISP32);
    871             obp-=sizeof(long);
    872             pobj_GlobalVarSchedule->add();
    873             obp+=sizeof(long);
     870            compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,0,offset,MOD_DISP32, Schedule::GlobalVar );
    874871        }
    875872        else{
     
    992989
    993990        //mov rax,i64data
    994         compiler.codeGenerator.op_mov64_ToReg(REG_RAX,i64data);
     991        compiler.codeGenerator.op_mov_RV64(REG_RAX,i64data);
    995992
    996993        //mov qword ptr[rsp+offset],rax
     
    10341031            if(i64data&0xFFFFFFFF00000000){
    10351032                //mov rax,i64data
    1036                 compiler.codeGenerator.op_mov64_ToReg(REG_RAX,i64data);
     1033                compiler.codeGenerator.op_mov_RV64(REG_RAX,i64data);
    10371034
    10381035                //mov qword ptr[rsp+offset],rax
     
    11161113        //アラインメントを考慮
    11171114        if( pVar->GetType().IsStruct() ){
    1118             int alignment = pVar->GetType().GetClass().iAlign;
     1115            int alignment = pVar->GetType().GetClass().GetFixedAlignment();
    11191116
    11201117            if( alignment ){
     
    12221219        if(pRelativeVar->bOffsetOffset){
    12231220            //add r11,offset
    1224             OpBuffer[obp++]=(char)0x49;
    1225             OpBuffer[obp++]=(char)0x81;
    1226             OpBuffer[obp++]=(char)0xC3;
    1227             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    1228             pobj_GlobalVarSchedule->add();
    1229             obp+=sizeof(long);
     1221            compiler.codeGenerator.op_add_RV( REG_R11, (long)pRelativeVar->offset, Schedule::GlobalVar );
    12301222
    12311223            //mov reg,r11
     
    12341226        else{
    12351227            //mov reg,offset
    1236             compiler.codeGenerator.op_mov64_ToReg(reg,(long)pRelativeVar->offset);
    1237             obp-=sizeof(long);
    1238             pobj_GlobalVarSchedule->add();
    1239             obp+=sizeof(long);
     1228            compiler.codeGenerator.op_mov_RV( sizeof(_int64), reg, (long)pRelativeVar->offset, Schedule::GlobalVar );
    12401229        }
    12411230    }
     
    12431232        if(pRelativeVar->bOffsetOffset){
    12441233            //add r11,qword ptr[offset]
    1245             compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelativeVar->offset, MOD_DISP32 );
    1246             obp-=sizeof(long);
    1247             pobj_GlobalVarSchedule->add();
    1248             obp+=sizeof(long);
     1234            compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
    12491235        }
    12501236        else{
    12511237            //mov r11,qword ptr[offset]
    1252             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
    1253             obp-=sizeof(long);
    1254             pobj_GlobalVarSchedule->add();
    1255             obp+=sizeof(long);
     1238            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
    12561239        }
    12571240
     
    12611244        if(pRelativeVar->bOffsetOffset){
    12621245            //add r11,offset
    1263             OpBuffer[obp++]=(char)0x49;
    1264             OpBuffer[obp++]=(char)0x81;
    1265             OpBuffer[obp++]=(char)0xC3;
    1266             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    1267             AddLocalVarAddrSchedule();
    1268             obp+=sizeof(long);
     1246            compiler.codeGenerator.op_add_RV( REG_R11, (long)pRelativeVar->offset, Schedule::LocalVar );
    12691247
    12701248            //add r11,rsp
     
    12791257
    12801258            //add reg,offset
    1281             compiler.codeGenerator.op_add_RV(reg,(int)pRelativeVar->offset);
    1282             obp-=sizeof(long);
    1283             AddLocalVarAddrSchedule();
    1284             obp+=sizeof(long);
     1259            compiler.codeGenerator.op_add_RV(reg,(long)pRelativeVar->offset, Schedule::LocalVar );
    12851260        }
    12861261    }
     
    12881263        if(pRelativeVar->bOffsetOffset){
    12891264            //add r11,qword ptr[rsp+offset]
    1290             OpBuffer[obp++]=(char)0x4C;
    1291             OpBuffer[obp++]=(char)0x03;
    1292             OpBuffer[obp++]=(char)0x9C;
    1293             OpBuffer[obp++]=(char)0x24;
    1294             *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
    1295             AddLocalVarAddrSchedule();
    1296             obp+=sizeof(long);
     1265            compiler.codeGenerator.op_add_RM( REG_R11, REG_RSP, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
    12971266        }
    12981267        else{
    12991268            //mov r11,qword ptr[rsp+offset]
    1300             compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    1301             obp-=sizeof(long);
    1302             AddLocalVarAddrSchedule();
    1303             obp+=sizeof(long);
     1269            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
    13041270        }
    13051271
     
    13311297            // ルートポインタを引き渡す
    13321298            //mov rdx,offset
    1333             compiler.codeGenerator.op_mov_RV(sizeof(_int64), REG_RDX,(int)pVar->GetOffsetAddress());
    1334             obp-=sizeof(long);
    1335             pobj_GlobalVarSchedule->add();
    1336             obp+=sizeof(long);
     1299            compiler.codeGenerator.op_mov_RV(sizeof(_int64), REG_RDX,(int)pVar->GetOffsetAddress(), Schedule::GlobalVar );
    13371300
    13381301            // Thisポインタを引き渡す
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r226 r232  
    971971                        if(XmmReg==REG_XMM4){
    972972                            //mov r14,i64data
    973                             compiler.codeGenerator.op_mov64_ToReg(REG_R14,i64data);
     973                            compiler.codeGenerator.op_mov_RV64(REG_R14,i64data);
    974974
    975975
     
    10261026
    10271027                        //mov reg,i64data
    1028                         compiler.codeGenerator.op_mov64_ToReg(UseReg,i64data);
     1028                        compiler.codeGenerator.op_mov_RV64(UseReg,i64data);
    10291029
    10301030                        if(UseReg==REG_R14){
     
    11941194
    11951195            //mov reg,i64data
    1196             compiler.codeGenerator.op_mov64_ToReg(UseReg,i64data);
     1196            compiler.codeGenerator.op_mov_RV64(UseReg,i64data);
    11971197        }
    11981198
  • trunk/abdev/BasicCompiler64/stack_frame.cpp

    r228 r232  
    2525    answer_sp=lowest_sp-max_parm_size;
    2626
    27     if((localParamSize%0x10)){
    28         if((answer_sp%0x10)==0){
    29             //関数のエントリポイントで128ビット境界ラインに合わせるため
    30             return -(answer_sp-0x08);
    31         }
    32         return -(answer_sp-0x10);
     27    if(((answer_sp-localParamSize)%0x10)==0){
     28        //関数のエントリポイントで128ビット境界ラインに合わせるため
     29        return -(answer_sp-0x08);
    3330    }
    34 
    35     if((answer_sp%0x10)==0){
    36         //関数のエントリポイントで128ビット境界ラインに合わせるため
    37         return -(answer_sp-0x10);
    38     }
    39     return -(answer_sp-0x08);
     31    return -(answer_sp-0x10);
    4032}
    4133int CStackFrame::GetNowSp(){
Note: See TracChangeset for help on using the changeset viewer.