void _Compile_Rsp_Fetch ( ) { _Compile_Move_Reg_To_Reg ( EAX, ESP ) ; _Compile_Move_Rm_To_Reg ( EAX, EAX, 0 * CELL ) ; _Compile_Stack_PushReg ( DSP, EAX ) ; }
void _Compile_LocalOrStackVar_RValue_To_Reg ( Word * word, int32 reg ) { word->Coding = Here ; // we don't need the word's code if compiling -- this is an optimization though if ( word->CProperty & REGISTER_VARIABLE ) { if ( word->RegToUse == reg ) return ; else _Compile_Move_Reg_To_Reg ( reg, word->RegToUse ) ; } else if ( word->CProperty & LOCAL_VARIABLE ) { _Compile_Move_StackN_To_Reg ( reg, FP, LocalVarOffset ( word ) ) ; // 2 : account for saved fp and return slot } else if ( word->CProperty & PARAMETER_VARIABLE ) { _Compile_Move_StackN_To_Reg ( reg, FP, ParameterVarOffset ( word ) ) ; // account for stored bp and return value } else if ( word->CProperty & ( OBJECT | THIS ) ) { _Compile_Move_Literal_Immediate_To_Reg ( reg, ( int32 ) * word->W_PtrToValue ) ; } }
void _Compile_GetVarLitObj_LValue_To_Reg ( Word * word, int32 reg, int32 index ) { _Set_SCA ( index ) ; word->Coding = Here ; if ( word->CProperty & REGISTER_VARIABLE ) { if ( word->RegToUse == reg ) return ; else _Compile_Move_Reg_To_Reg ( reg, word->RegToUse ) ; } else if ( word->CProperty & ( OBJECT | THIS ) || ( word->WProperty & WT_QID ) ) //pointers { _Compile_LocalOrStackVar_RValue_To_Reg ( word, reg ) ; } else if ( word->CProperty & LOCAL_VARIABLE ) { _Compile_LEA ( reg, FP, 0, LocalVarIndex_Disp ( LocalVarOffset ( word ) ) ) ; // 2 : account for saved fp and return slot } else if ( word->CProperty & PARAMETER_VARIABLE ) { _Compile_LEA ( reg, FP, 0, LocalVarIndex_Disp ( ParameterVarOffset ( word ) ) ) ; } else if ( word->CProperty & NAMESPACE_VARIABLE ) { int32 value ; if ( GetState ( _Context_, C_SYNTAX ) && ( ! Is_LValue ( word ) ) ) //GetState ( _Context_, C_RHS ) ) { value = ( int32 ) * word->W_PtrToValue ; } else value = ( int32 ) word->W_PtrToValue ; _Compile_Move_Literal_Immediate_To_Reg ( reg, ( int32 ) value ) ; } else SyntaxError ( QUIT ) ; if ( word->CProperty & ( OBJECT | THIS ) || ( word->WProperty & WT_QID ) ) { Do_ObjectOffset ( word, reg ) ; } }
void _Compile_SetVarLitObj_With_Reg ( Word * word, int32 reg, int32 thruReg ) { word->Coding = Here ; // we don't need the word's code if compiling -- this is an optimization though if ( word->CProperty & REGISTER_VARIABLE ) { if ( word->RegToUse == reg ) return ; else _Compile_Move_Reg_To_Reg ( word->RegToUse, reg ) ; } else if ( word->CProperty & LOCAL_VARIABLE ) { _Compile_Move_Reg_To_StackN ( FP, LocalVarOffset ( word ), reg ) ; } else if ( word->CProperty & PARAMETER_VARIABLE ) { _Compile_Move_Reg_To_StackN ( FP, ParameterVarOffset ( word ), reg ) ; } else if ( word->CProperty & NAMESPACE_VARIABLE ) { //_Compile_Move_Literal_Immediate_To_Reg ( thruReg, ( int32 ) word->W_PtrToValue ) ; //_Compile_Move_Reg_To_Rm ( thruReg, reg, 0 ) ; _Compile_SetAtAddress_WithReg ( (int*) word->W_PtrToValue, reg, thruReg ) ; } }
void Compile_Poke ( Compiler * compiler, int32 stackReg ) // = { //if ( CheckOptimizeOperands ( compiler, 3 ) ) int optFlag = CheckOptimizeOperands ( compiler, 4 ) ; if ( optFlag == OPTIMIZE_DONE ) return ; else if ( optFlag ) { // _Compile_MoveImm ( cell direction, cell rm, cell disp, cell imm, cell operandSize ) if ( compiler->Optimizer->OptimizeFlag & OPTIMIZE_IMM ) _Compile_MoveImm ( compiler->Optimizer->Optimize_Dest_RegOrMem, compiler->Optimizer->Optimize_Rm, 0, compiler->Optimizer->Optimize_Disp, compiler->Optimizer->Optimize_Imm, CELL ) ; else if ( compiler->Optimizer->OptimizeFlag & OPTIMIZE_REGISTER ) { // allow for one of these to be EAX which is 0 if ( compiler->Optimizer->Optimize_SrcReg || compiler->Optimizer->Optimize_DstReg ) _Compile_Move_Reg_To_Reg ( compiler->Optimizer->Optimize_DstReg, compiler->Optimizer->Optimize_SrcReg ) ; //_Compile_Move ( int32 direction, int32 reg, int32 rm, int32 sib, int32 disp ) else _Compile_Move ( compiler->Optimizer->Optimize_Dest_RegOrMem, compiler->Optimizer->Optimize_Reg, compiler->Optimizer->Optimize_Rm, 0, 0 ) ; } else _Compile_Move_Reg_To_Rm ( compiler->Optimizer->Optimize_Rm, compiler->Optimizer->Optimize_Disp, compiler->Optimizer->Optimize_Reg ) ; } else { _Compile_Move_Rm_To_Reg ( ECX, stackReg, 0 ) ; _Compile_Move_Rm_To_Reg ( EAX, stackReg, - CELL_SIZE ) ; _Compile_Move_Reg_To_Rm ( EAX, 0, ECX ) ; Compile_SUBI ( REG, stackReg, 0, 8, BYTE ) ; } }