Ignore:
Timestamp:
Aug 5, 2007, 3:47:49 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/stack_frame.cpp

    r232 r263  
    3939
    4040    //add reg,now_sp
    41     compiler.codeGenerator.op_add_RV( reg, now_sp );
    42 
    43     //スケジュールをセット
    44     obp-=sizeof(long);
    45     add();
    46     obp+=sizeof(long);
     41    pertialSchedules.push_back(
     42        compiler.codeGenerator.op_add_RV( reg, now_sp, Schedule::None, true )
     43    );
    4744}
    4845int CStackFrame::push(int reg){
     
    5350
    5451    //mov qword ptr[rsp+offset],reg
    55     compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
    56 
    57     //スケジュールをセット
    58     obp-=sizeof(long);
    59     add();
    60     obp+=sizeof(long);
     52    pertialSchedules.push_back(
     53        compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true)
     54    );
    6155
    6256    return now_sp;
     
    6862    if(varSize==sizeof(double)){
    6963        //movlpd qword ptr[rsp+offset],xmm_reg
    70         compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
     64        pertialSchedules.push_back(
     65            compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
     66        );
    7167    }
    7268    if(varSize==sizeof(float)){
    7369        //movss dword ptr[rsp+offset],xmm_reg
    74         compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
     70        pertialSchedules.push_back(
     71            compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
     72        );
    7573    }
    76 
    77     //スケジュールをセット
    78     obp-=sizeof(long);
    79     add();
    80     obp+=sizeof(long);
    8174}
    8275void CStackFrame::ref_offset_data( int reg, int sp_offset ){
    8376    //mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
    84     compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32);
    85 
    86     //スケジュールをセット
    87     obp-=sizeof(long);
    88     add();
    89     obp+=sizeof(long);
     77    pertialSchedules.push_back(
     78        compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32, Schedule::None, true )
     79    );
    9080}
    9181void CStackFrame::ref(int reg){
     
    9585    if(varSize==sizeof(double)){
    9686        //movlpd xmm_reg,qword ptr[rsp+offset]
    97         compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
     87        pertialSchedules.push_back(
     88            compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
     89        );
    9890    }
    9991    if(varSize==sizeof(float)){
    10092        //movss xmm_reg,dword ptr[rsp+offset]
    101         compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
     93        pertialSchedules.push_back(
     94            compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
     95        );
    10296    }
    103 
    104     //スケジュールをセット
    105     obp-=sizeof(long);
    106     add();
    107     obp+=sizeof(long);
    10897}
    10998void CStackFrame::pop(int reg){
     
    121110}
    122111void CStackFrame::RunningSchedule( int stackFrameSize ){
    123     for(int i=0;i<num;i++){
    124         *((long *)(OpBuffer+pObpValues[i])) += stackFrameSize;
     112    BOOST_FOREACH( const PertialSchedule *pPertialSchedule, pertialSchedules )
     113    {
     114        compiler.codeGenerator.opfix_offset( pPertialSchedule, stackFrameSize );
    125115    }
    126116}
Note: See TracChangeset for help on using the changeset viewer.