anchor.diff:    MultiplyKaratsuba(x[1] - x[0], y[0] - y[1], z1);
     Add(z1, z2 + z0, z1);
   
  -  Result := z0;
  -  Result.AddWithOffset(z2, k * 2);
  -  Result.AddWithOffset(z1, k);
  -
  +  Shift := k * CLimbBits;
  +
  +  Result := z0 + ((z1 + z2 shl Shift) shl Shift);
     Result.FSize := (Result.FSize and SizeMask) or LSign;
   end;
   
  
positive.code: end;
  {$ENDIF WIN64}
  {$ENDIF !PUREPASCAL}
  
  // Needed for Karatsuba, ToomCook and Burnikel-Ziegler
  // Assumes non-negative parameters and non-negative self.
  procedure BigInteger.AddWithOffset(const Addend: BigInteger; Offset: Integer);
  begin
    Self.EnsureSize(IntMax(Offset + (Addend.FSize and SizeMask) + 1, Self.FSize and SizeMask));
  //  if Offset >= (Self.FSize and SizeMask) then
  //    CopyLimbs(PLimb(Addend.FData), PLimb(Self.FData) + Offset, Addend.FSize and SizeMask)
  //  else
      FInternalAdd(PLimb(Self.FData) + Offset, PLimb(Addend.FData), PLimb(Self.FData) + Offset,
        (Self.FSize and SizeMask) - Offset - 1, Addend.FSize and SizeMask);
    Self.Compact;
  end;
  
  class procedure BigInteger.InternalBitwise(const Left, Right: BigInteger;
    var Result: BigInteger; PlainOp, OppositeOp, InversionOp: TBinaryOperator);
  
negative.code:     class procedure DivTwoDigitsByOne(const Left, Right: BigInteger; N: Integer;
        var Quotient, Remainder: BigInteger); static;
  
      // Karatsuba and Toom-Cook helper function
      // Split BigInteger into smaller BigIntegers of size BlockSize.
      function Split(BlockSize, BlockCount: Integer): TArray<BigInteger>;
  
  