Skip to content

ext/bcmath: Performance improvement bcsqrt() #18771

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions ext/bcmath/config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ if test "$PHP_BCMATH" != "no"; then
libbcmath/src/floor_or_ceil.c
libbcmath/src/long2num.c
libbcmath/src/init.c
libbcmath/src/int2num.c
libbcmath/src/nearzero.c
libbcmath/src/neg.c
libbcmath/src/num2long.c
libbcmath/src/num2str.c
Expand Down
4 changes: 2 additions & 2 deletions ext/bcmath/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ ARG_ENABLE("bcmath", "bc style precision math functions", "yes");
if (PHP_BCMATH == "yes") {
EXTENSION("bcmath", "bcmath.c", null, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
ADD_SOURCES("ext/bcmath/libbcmath/src", "add.c div.c init.c neg.c \
raisemod.c sub.c compare.c divmod.c int2num.c long2num.c \
raisemod.c sub.c compare.c divmod.c long2num.c \
num2long.c recmul.c sqrt.c zero.c doaddsub.c \
floor_or_ceil.c nearzero.c num2str.c raise.c rmzero.c str2num.c \
floor_or_ceil.c num2str.c raise.c rmzero.c str2num.c \
round.c convert.c", "bcmath");

AC_DEFINE('HAVE_BCMATH', 1, "Define to 1 if the PHP extension 'bcmath' is available.");
Expand Down
10 changes: 0 additions & 10 deletions ext/bcmath/libbcmath/src/bcmath.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,20 +117,12 @@ bool bc_is_zero(bc_num num);

bool bc_is_zero_for_scale(bc_num num, size_t scale);

bool bc_is_near_zero(bc_num num, size_t scale);

bool bc_is_neg(bc_num num);

void bc_rm_trailing_zeros(bc_num num);

bc_num bc_add(bc_num n1, bc_num n2, size_t scale_min);

#define bc_add_ex(n1, n2, result, scale_min) do { \
bc_num add_ex = bc_add(n1, n2, scale_min); \
bc_free_num (result); \
*(result) = add_ex; \
} while (0)

bc_num bc_sub(bc_num n1, bc_num n2, size_t scale_min);

#define bc_sub_ex(n1, n2, result, scale_min) do { \
Expand Down Expand Up @@ -178,8 +170,6 @@ raise_mod_status bc_raisemod(bc_num base, bc_num exponent, bc_num mod, bc_num *r

bc_raise_status bc_raise(bc_num base, long exponent, bc_num *result, size_t scale);

void bc_raise_bc_exponent(bc_num base, bc_num exponent, bc_num *resul, size_t scale);

bool bc_sqrt(bc_num *num, size_t scale);

/* Prototypes needed for external utility routines. */
Expand Down
16 changes: 16 additions & 0 deletions ext/bcmath/libbcmath/src/div.c
Original file line number Diff line number Diff line change
Expand Up @@ -429,3 +429,19 @@ bool bc_divide(bc_num numerator, bc_num divisor, bc_num *quot, size_t scale)
*quot = bc_copy_num(BCG(_zero_));
return true;
}

void bc_divide_vector(
BC_VECTOR *numerator_vectors, size_t numerator_arr_size,
const BC_VECTOR *divisor_vectors, size_t divisor_arr_size, size_t divisor_size,
BC_VECTOR *quot_vectors, size_t quot_arr_size
) {
ZEND_ASSERT(divisor_vectors[divisor_arr_size - 1] != 0);
ZEND_ASSERT(quot_arr_size == numerator_arr_size - divisor_arr_size + 1);

/* Do the division */
if (divisor_arr_size == 1) {
bc_fast_div(numerator_vectors, numerator_arr_size, divisor_vectors[0], quot_vectors, quot_arr_size);
} else {
bc_standard_div(numerator_vectors, numerator_arr_size, divisor_vectors, divisor_arr_size, divisor_size, quot_vectors, quot_arr_size);
}
}
74 changes: 0 additions & 74 deletions ext/bcmath/libbcmath/src/int2num.c

This file was deleted.

57 changes: 0 additions & 57 deletions ext/bcmath/libbcmath/src/nearzero.c

This file was deleted.

4 changes: 4 additions & 0 deletions ext/bcmath/libbcmath/src/private.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ bc_num _bc_do_sub (bc_num n1, bc_num n2);
void bc_multiply_vector(
const BC_VECTOR *n1_vector, size_t n1_arr_size, const BC_VECTOR *n2_vector, size_t n2_arr_size,
BC_VECTOR *prod_vector, size_t prod_arr_size);
void bc_divide_vector(
BC_VECTOR *numerator_vectors, size_t numerator_arr_size,
const BC_VECTOR *divisor_vectors, size_t divisor_arr_size, size_t divisor_size,
BC_VECTOR *quot_vectors, size_t quot_arr_size);
void _bc_rm_leading_zeros (bc_num num);

#endif
16 changes: 0 additions & 16 deletions ext/bcmath/libbcmath/src/raise.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,19 +252,3 @@ bc_raise_status bc_raise(bc_num base, long exponent, bc_num *result, size_t scal
}
return BC_RAISE_STATUS_OK;
}

/* This is used internally by BCMath */
void bc_raise_bc_exponent(bc_num base, bc_num expo, bc_num *result, size_t scale) {
/* Exponent must not have fractional part */
assert(expo->n_scale == 0);

long exponent = bc_num2long(expo);
/* Exponent must be properly convertable to long */
if (exponent == 0 && (expo->n_len > 1 || expo->n_value[0] != 0)) {
assert(false && "Exponent is not well formed in internal call");
//assert(exponent != 0 || (expo->n_len == 0 && expo->n_value[0] == 0));
}
//assert(exponent != 0 || (expo->n_len == 0 && expo->n_value[0] == 0));
bc_raise(base, exponent, result, scale);
}

Loading