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 } }
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 ) ; } }
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 ; }