anchor.diff:      class function Multiply(const Left, Right: BigInteger): BigInteger; overload; static;
   
       /// <summary>Function performing "schoolbook" multiplication.</summary>
  -    class function MultiplyBaseCase(const Left, Right: BigInteger): BigInteger; static;
  +    class procedure MultiplyBaseCase(const Left, Right: BigInteger; var Result: BigInteger); static;
   
       /// <summary>Function performing multiplcation using Karatsuba algorithm. Has more overhead, so only
       ///  applied to large BigIntegers.</summary>
  -    class function MultiplyKaratsuba(const Left, Right: BigInteger): BigInteger; static;
  +    class procedure MultiplyKaratsuba(const Left, Right: BigInteger; var Result: BigInteger); static;
   
       /// <summary>Function performing multiplication using Toom-Cook 3-way algorithm. Faster than Karatsuba, but,
       /// due to its overhead, only for very large BigIntegers.</summary>
  
positive.code: begin
    // Step 1: if n < threshold then return KaratsubaMultiply(A, B)
    if ((Left.FSize and SizeMask) < ToomCook3Threshold) and ((Right.FSize and SizeMask) < ToomCook3Threshold) then
      Exit(MultiplyKaratsuba(Left, Right));
  
    Sign := (Left.FSize xor Right.FSize) and SignMask;
  
  
negative.code:   else
    begin
      if ((Left.FSize and SizeMask) < ToomCook3Threshold) and ((Right.FSize and SizeMask) < ToomCook3Threshold) then
        MultiplyKaratsuba(Left, Right, Result)
      else
        Result := MultiplyToomCook3(Left, Right);
    end;
  end;
  
  class procedure BigInteger.MultiplyBaseCase(const Left, Right: BigInteger; var Result: BigInteger);
  var
    LResult: BigInteger; // Avoid prematurely overwriting result when it is same as one of the operands.
  begin
  