Press enter to see results or esc to cancel.

Arithmetic System Functions

This procedure processes system functions Int, Frac, Sqrt, Sin, Cos, Ln, Exp and ArcTan.

Procedure Func_Trunc_Round; Far;
begin
  Expression^.ExpectIntegerOrFloatingPointExpressionInParentheses;
  With Expression^ do
    begin
      If Location = elConstant then
        begin
          Expression^.ConvertIntegerToExtended;
          Case FuncParameter of
            8: Value.LongInt := Trunc (Value.Extended);
            9: Value.LongInt := Round (Value.Extended);
          end;
          If Value.LongInt = $80000000 then Error (ConstantOutOfRange); { ??? !!! }
          Expression^.CheckOrdinalOverflowAndStore (Value.LongInt, False);
          TypeDefPtr := Ptr (SystemUnitSegment, LongInt_TypeOffset);
          Exit;
        end;
      ArithmeticFunctions;
      Location := elRegister;
      DataType := [it32Bit, it16Bit, itSigned];
      LocationData.B9 := 0;
      TypeDefPtr := Ptr (SystemUnitSegment, LongInt_TypeOffset);
    end;
end;

This procedure prepares expression and generates a call to compiler routine for system functions Int, Frac, Sqrt, Sin, Cos, Ln, Exp, ArcTan, Trunc and Round.

Procedure ArithmeticFunctions;
Const Table: Array [0..9, Boolean] of Word = (
        (SysProc_RInt,    SysProc_FInt),
        (SysProc_RFrac,   SysProc_FFrac),
        (SysProc_RSqrt,   SysProc_FSqrt),
        (SysProc_RSin,    SysProc_FSin),
        (SysProc_RCos,    SysProc_FCos),
        (SysProc_RLn,     SysProc_FLn),
        (SysProc_RExp,    SysProc_FExp),
        (SysProc_RArcTan, SysProc_FArcTan),
        (SysProc_RTrunc,  SysProc_FTrunc),
        (SysProc_RRound,  SysProc_FRound));

begin
  If Instructions80x87 in StatementCompilerSwitches then
    begin
      Expression^.ConvertIntegerToExtended;
      Expression^.ConvertRealToExtended;
      Expression^.LoadExpressionToFPU;
      Expression^.Calculate;
    end else begin
               Expression^.ConvertIntegerToReal;
               Expression^.ConvertExtendedToReal;
               Expression^.Calculate;
               Expression^.LoadRealExpressionToRegisterSet (rAX_BX_DX);
             end;
  GenerateInstruction_CALL_FAR (Table [FuncParameter, Instructions80x87 in StatementCompilerSwitches]);
  Expression^.EndIntermediateCodeSubroutine;
  Expression^.UsedRegisters := [urSP, urDX, urAX];
end;