コード例 #1
0
ファイル: machineCode.c プロジェクト: 8l/openvmtil
void
Compile_X_Group5 ( Compiler * compiler, int32 op, int32 rlFlag )
{
    //if ( CheckOptimizeOperands ( _Context_->Compiler0, 4 ) )
    int optFlag = CheckOptimizeOperands ( compiler, 5 ) ;
    if ( optFlag == OPTIMIZE_DONE ) return ;
    else if ( optFlag )
    {
        if ( compiler->Optimizer->OptimizeFlag & OPTIMIZE_IMM )
        {
            _Compile_MoveImm_To_Reg ( EAX, compiler->Optimizer->Optimize_Imm, CELL ) ;
            compiler->Optimizer->Optimize_Mod = REG ;
            compiler->Optimizer->Optimize_Rm = EAX ;
        }
        _Compile_Group5 ( op, compiler->Optimizer->Optimize_Mod,
            compiler->Optimizer->Optimize_Rm, 0, compiler->Optimizer->Optimize_Disp, 0 ) ;
        _Compiler_Setup_BI_tttn ( _Context_->Compiler0, ZERO, N ) ; // ?? // not less than 0 == greater than 0
        if ( compiler->Optimizer->Optimize_Rm == EAX )
        {
            if ( GetState ( _Context_, C_SYNTAX ) ) _Stack_DropN ( _Context_->Compiler0->WordStack, 2 ) ;
            Word * zero = Compiler_WordStack ( compiler, 0 ) ;
            Word *one = ( Word* ) Compiler_WordStack ( compiler, - 1 ) ; // there is always only one arg for Group 5 instructions
            if ( ! ( one->CType & REGISTER_VARIABLE ) )
            {
                _Word_CompileAndRecord_PushEAX ( zero ) ;
            }
        }

    }
    else
    {
#if 0        
        if ( rlFlag == LVALUE )
        {
            // assume lvalue on stack
            Compile_Move_TOS_To_EAX ( DSP ) ;
            _Compile_Group5 ( op, MEM, EAX, 0, 0, 0 ) ;
        }
        else
        {
            // assume rvalue on stack
            _Compile_Group5 ( op, MEM, DSP, 0, 0, 0 ) ;
        }
#else
        Word *one = ( Word* ) Compiler_WordStack ( compiler, - 1 ) ;
        if ( one->CType & ( STACK_VARIABLE | LOCAL_VARIABLE | VARIABLE ) ) // *( ( cell* ) ( TOS ) ) += 1 ;
        {
            // assume lvalue on stack
            Compile_Move_TOS_To_EAX ( DSP ) ;
            _Compile_Group5 ( op, MEM, EAX, 0, 0, 0 ) ;
            _Compile_Stack_Drop ( DSP ) ;
        }
        else
        {
            // assume rvalue on stack
            _Compile_Group5 ( op, MEM, DSP, 0, 0, 0 ) ;
        }
#endif    
    }
}
コード例 #2
0
ファイル: combinators.c プロジェクト: dennisj001/openvmtil
void
CfrTil_EndCombinator ( int32 quotesUsed, int32 moveFlag )
{
    Compiler * compiler = _Context_->Compiler0 ;
    BlockInfo *bi = ( BlockInfo * ) _Stack_Pick ( compiler->CombinatorBlockInfoStack, quotesUsed - 1 ) ; // -1 : remember - stack is zero based ; stack[0] is top
    _CfrTil_InstallGotoCallPoints_Keyed ( ( BlockInfo* ) bi, GI_BREAK | GI_CONTINUE ) ;
    if ( moveFlag && GetState ( _Q_->OVT_CfrTil, INLINE_ON ) )
    {
        byte * qCodeStart ;
        if ( bi->FrameStart ) qCodeStart = bi->bp_First ; // after the stack frame
        else qCodeStart = bi->ActualCodeStart ;
        Block_Copy ( qCodeStart, bi->CombinatorStartsAt, Here - bi->CombinatorStartsAt ) ;
    }
    _Stack_DropN ( compiler->CombinatorBlockInfoStack, quotesUsed ) ;
    if ( GetState ( compiler, LISP_COMBINATOR_MODE ) )
    {
        _Stack_Pop ( compiler->CombinatorInfoStack ) ;
        if ( ! Stack_Depth ( compiler->CombinatorInfoStack ) ) SetState ( compiler, LISP_COMBINATOR_MODE, false ) ;
    }
}
コード例 #3
0
ファイル: machineCode.c プロジェクト: 8l/openvmtil
void
Compile_X_Group1 ( Compiler * compiler, int32 op, int32 ttt, int32 n )
{
    //byte * afterCodePtr ;
    //if ( CheckOptimizeOperands ( compiler, 5 ) )
    int optFlag = CheckOptimizeOperands ( compiler, 5 ) ;
    if ( optFlag == OPTIMIZE_DONE ) return ;
    else if ( optFlag )
    {
        // Compile_SUBI( mod, operandReg, offset, immediateData, size )
        if ( compiler->Optimizer->OptimizeFlag & OPTIMIZE_IMM )
        {
            _Compile_Group1_Immediate ( op, compiler->Optimizer->Optimize_Mod,
                compiler->Optimizer->Optimize_Rm, compiler->Optimizer->Optimize_Disp,
                compiler->Optimizer->Optimize_Imm, CELL ) ;
        }
        else
        {
            _Compile_Group1 ( op, compiler->Optimizer->Optimize_Dest_RegOrMem, compiler->Optimizer->Optimize_Mod,
                compiler->Optimizer->Optimize_Reg, compiler->Optimizer->Optimize_Rm, 0,
                compiler->Optimizer->Optimize_Disp, CELL ) ;
        }
        _Compiler_Setup_BI_tttn ( _Context_->Compiler0, ttt, n ) ; // not less than 0 == greater than 0
        if ( compiler->Optimizer->Optimize_Rm != DSP ) // if the result is not already tos
        {
            if ( GetState ( _Context_, C_SYNTAX ) ) _Stack_DropN ( _Context_->Compiler0->WordStack, 2 ) ;
            Word * zero = Compiler_WordStack ( compiler, 0 ) ;
            _Word_CompileAndRecord_PushEAX ( zero ) ;
        }
    }
    else
    {
        Compile_Pop_To_EAX ( DSP ) ;
        _Compile_Group1 ( op, MEM, MEM, EAX, DSP, 0, 0, CELL ) ;
        //afterCodePtr = Here ;
    }
    //return afterCodePtr ;
}