@@ -186,26 +186,49 @@ static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg);
186
186
* include parameter parsing.
187
187
*/
188
188
typedef void (* gmp_unary_op_t )(mpz_ptr , mpz_srcptr );
189
- typedef int (* gmp_unary_opl_t )(mpz_srcptr );
189
+ typedef mp_bitcnt_t (* gmp_unary_opl_t )(mpz_srcptr );
190
190
191
191
typedef void (* gmp_unary_ui_op_t )(mpz_ptr , gmp_ulong );
192
192
193
193
typedef void (* gmp_binary_op_t )(mpz_ptr , mpz_srcptr , mpz_srcptr );
194
- typedef int (* gmp_binary_opl_t )(mpz_srcptr , mpz_srcptr );
195
194
196
195
typedef void (* gmp_binary_ui_op_t )(mpz_ptr , mpz_srcptr , gmp_ulong );
197
196
typedef void (* gmp_binary_op2_t )(mpz_ptr , mpz_ptr , mpz_srcptr , mpz_srcptr );
198
- typedef void (* gmp_binary_ui_op2_t )(mpz_ptr , mpz_ptr , mpz_srcptr , gmp_ulong );
197
+ typedef gmp_ulong (* gmp_binary_ui_op2_t )(mpz_ptr , mpz_ptr , mpz_srcptr , gmp_ulong );
199
198
200
199
static inline void gmp_zval_binary_ui_op (zval * return_value , zval * a_arg , zval * b_arg , gmp_binary_op_t gmp_op , gmp_binary_ui_op_t gmp_ui_op , int check_b_zero );
201
200
static inline void gmp_zval_binary_ui_op2 (zval * return_value , zval * a_arg , zval * b_arg , gmp_binary_op2_t gmp_op , gmp_binary_ui_op2_t gmp_ui_op , int check_b_zero );
202
201
static inline void gmp_zval_unary_op (zval * return_value , zval * a_arg , gmp_unary_op_t gmp_op );
203
202
static inline void gmp_zval_unary_ui_op (zval * return_value , zval * a_arg , gmp_unary_ui_op_t gmp_op );
204
203
204
+ static void gmp_mpz_tdiv_q_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
205
+ mpz_tdiv_q_ui (a , b , c );
206
+ }
207
+ static void gmp_mpz_tdiv_r_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
208
+ mpz_tdiv_r_ui (a , b , c );
209
+ }
210
+ static void gmp_mpz_fdiv_q_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
211
+ mpz_fdiv_q_ui (a , b , c );
212
+ }
213
+ static void gmp_mpz_fdiv_r_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
214
+ mpz_fdiv_r_ui (a , b , c );
215
+ }
216
+ static void gmp_mpz_cdiv_r_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
217
+ mpz_cdiv_r_ui (a , b , c );
218
+ }
219
+ static void gmp_mpz_cdiv_q_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
220
+ mpz_cdiv_q_ui (a , b , c );
221
+ }
222
+ static void gmp_mpz_mod_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
223
+ mpz_mod_ui (a , b , c );
224
+ }
225
+ static void gmp_mpz_gcd_ui (mpz_ptr a , mpz_srcptr b , gmp_ulong c ) {
226
+ mpz_gcd_ui (a , b , c );
227
+ }
228
+
205
229
/* Binary operations */
206
230
#define gmp_binary_ui_op (op , uop ) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop, 0)
207
231
#define gmp_binary_op (op ) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, NULL, 0)
208
- #define gmp_binary_opl (op ) _gmp_binary_opl(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
209
232
#define gmp_binary_ui_op_no_zero (op , uop ) \
210
233
_gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop, 1)
211
234
@@ -328,8 +351,7 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva
328
351
329
352
#define DO_BINARY_UI_OP_EX (op , uop , check_b_zero ) \
330
353
gmp_zval_binary_ui_op( \
331
- result, op1, op2, op, (gmp_binary_ui_op_t) uop, \
332
- check_b_zero \
354
+ result, op1, op2, op, uop, check_b_zero \
333
355
); \
334
356
return SUCCESS;
335
357
@@ -353,9 +375,9 @@ static int gmp_do_operation_ex(zend_uchar opcode, zval *result, zval *op1, zval
353
375
shift_operator_helper (mpz_pow_ui , result , op1 , op2 );
354
376
return SUCCESS ;
355
377
case ZEND_DIV :
356
- DO_BINARY_UI_OP_EX (mpz_tdiv_q , mpz_tdiv_q_ui , 1 );
378
+ DO_BINARY_UI_OP_EX (mpz_tdiv_q , gmp_mpz_tdiv_q_ui , 1 );
357
379
case ZEND_MOD :
358
- DO_BINARY_UI_OP_EX (mpz_mod , mpz_mod_ui , 1 );
380
+ DO_BINARY_UI_OP_EX (mpz_mod , gmp_mpz_mod_ui , 1 );
359
381
case ZEND_SL :
360
382
shift_operator_helper (mpz_mul_2exp , result , op1 , op2 );
361
383
return SUCCESS ;
@@ -836,28 +858,6 @@ static inline void _gmp_unary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_opl_t
836
858
}
837
859
/* }}} */
838
860
839
- /* {{{ _gmp_binary_opl
840
- */
841
- static inline void _gmp_binary_opl (INTERNAL_FUNCTION_PARAMETERS , gmp_binary_opl_t gmp_op )
842
- {
843
- zval * a_arg , * b_arg ;
844
- mpz_ptr gmpnum_a , gmpnum_b ;
845
- gmp_temp_t temp_a , temp_b ;
846
-
847
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "zz" , & a_arg , & b_arg ) == FAILURE ){
848
- RETURN_THROWS ();
849
- }
850
-
851
- FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a );
852
- FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a );
853
-
854
- RETVAL_LONG (gmp_op (gmpnum_a , gmpnum_b ));
855
-
856
- FREE_GMP_TEMP (temp_a );
857
- FREE_GMP_TEMP (temp_b );
858
- }
859
- /* }}} */
860
-
861
861
/* {{{ proto GMP gmp_init(mixed number [, int base])
862
862
Initializes GMP number */
863
863
ZEND_FUNCTION (gmp_init )
@@ -1077,13 +1077,13 @@ ZEND_FUNCTION(gmp_div_qr)
1077
1077
1078
1078
switch (round ) {
1079
1079
case GMP_ROUND_ZERO :
1080
- gmp_zval_binary_ui_op2 (return_value , a_arg , b_arg , mpz_tdiv_qr , ( gmp_binary_ui_op2_t ) mpz_tdiv_qr_ui , 1 );
1080
+ gmp_zval_binary_ui_op2 (return_value , a_arg , b_arg , mpz_tdiv_qr , mpz_tdiv_qr_ui , 1 );
1081
1081
break ;
1082
1082
case GMP_ROUND_PLUSINF :
1083
- gmp_zval_binary_ui_op2 (return_value , a_arg , b_arg , mpz_cdiv_qr , ( gmp_binary_ui_op2_t ) mpz_cdiv_qr_ui , 1 );
1083
+ gmp_zval_binary_ui_op2 (return_value , a_arg , b_arg , mpz_cdiv_qr , mpz_cdiv_qr_ui , 1 );
1084
1084
break ;
1085
1085
case GMP_ROUND_MINUSINF :
1086
- gmp_zval_binary_ui_op2 (return_value , a_arg , b_arg , mpz_fdiv_qr , ( gmp_binary_ui_op2_t ) mpz_fdiv_qr_ui , 1 );
1086
+ gmp_zval_binary_ui_op2 (return_value , a_arg , b_arg , mpz_fdiv_qr , mpz_fdiv_qr_ui , 1 );
1087
1087
break ;
1088
1088
default :
1089
1089
php_error_docref (NULL , E_WARNING , "Invalid rounding mode" );
@@ -1105,13 +1105,13 @@ ZEND_FUNCTION(gmp_div_r)
1105
1105
1106
1106
switch (round ) {
1107
1107
case GMP_ROUND_ZERO :
1108
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_tdiv_r , ( gmp_binary_ui_op_t ) mpz_tdiv_r_ui , 1 );
1108
+ gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_tdiv_r , gmp_mpz_tdiv_r_ui , 1 );
1109
1109
break ;
1110
1110
case GMP_ROUND_PLUSINF :
1111
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_cdiv_r , ( gmp_binary_ui_op_t ) mpz_cdiv_r_ui , 1 );
1111
+ gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_cdiv_r , gmp_mpz_cdiv_r_ui , 1 );
1112
1112
break ;
1113
1113
case GMP_ROUND_MINUSINF :
1114
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_fdiv_r , ( gmp_binary_ui_op_t ) mpz_fdiv_r_ui , 1 );
1114
+ gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_fdiv_r , gmp_mpz_fdiv_r_ui , 1 );
1115
1115
break ;
1116
1116
default :
1117
1117
php_error_docref (NULL , E_WARNING , "Invalid rounding mode" );
@@ -1133,13 +1133,13 @@ ZEND_FUNCTION(gmp_div_q)
1133
1133
1134
1134
switch (round ) {
1135
1135
case GMP_ROUND_ZERO :
1136
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_tdiv_q , ( gmp_binary_ui_op_t ) mpz_tdiv_q_ui , 1 );
1136
+ gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_tdiv_q , gmp_mpz_tdiv_q_ui , 1 );
1137
1137
break ;
1138
1138
case GMP_ROUND_PLUSINF :
1139
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_cdiv_q , ( gmp_binary_ui_op_t ) mpz_cdiv_q_ui , 1 );
1139
+ gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_cdiv_q , gmp_mpz_cdiv_q_ui , 1 );
1140
1140
break ;
1141
1141
case GMP_ROUND_MINUSINF :
1142
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_fdiv_q , ( gmp_binary_ui_op_t ) mpz_fdiv_q_ui , 1 );
1142
+ gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_fdiv_q , gmp_mpz_fdiv_q_ui , 1 );
1143
1143
break ;
1144
1144
default :
1145
1145
php_error_docref (NULL , E_WARNING , "Invalid rounding mode" );
@@ -1153,7 +1153,7 @@ ZEND_FUNCTION(gmp_div_q)
1153
1153
Computes a modulo b */
1154
1154
ZEND_FUNCTION (gmp_mod )
1155
1155
{
1156
- gmp_binary_ui_op_no_zero (mpz_mod , ( gmp_binary_ui_op_t ) mpz_mod_ui );
1156
+ gmp_binary_ui_op_no_zero (mpz_mod , gmp_mpz_mod_ui );
1157
1157
}
1158
1158
/* }}} */
1159
1159
@@ -1529,15 +1529,15 @@ ZEND_FUNCTION(gmp_prob_prime)
1529
1529
Computes greatest common denominator (gcd) of a and b */
1530
1530
ZEND_FUNCTION (gmp_gcd )
1531
1531
{
1532
- gmp_binary_ui_op (mpz_gcd , ( gmp_binary_ui_op_t ) mpz_gcd_ui );
1532
+ gmp_binary_ui_op (mpz_gcd , gmp_mpz_gcd_ui );
1533
1533
}
1534
1534
/* }}} */
1535
1535
1536
1536
/* {{{ proto GMP gmp_lcm(mixed a, mixed b)
1537
1537
Computes least common multiple (lcm) of a and b */
1538
1538
ZEND_FUNCTION (gmp_lcm )
1539
1539
{
1540
- gmp_binary_ui_op (mpz_lcm , ( gmp_binary_ui_op_t ) mpz_lcm_ui );
1540
+ gmp_binary_ui_op (mpz_lcm , mpz_lcm_ui );
1541
1541
}
1542
1542
/* }}} */
1543
1543
@@ -1603,15 +1603,43 @@ ZEND_FUNCTION(gmp_invert)
1603
1603
Computes Jacobi symbol */
1604
1604
ZEND_FUNCTION (gmp_jacobi )
1605
1605
{
1606
- gmp_binary_opl (mpz_jacobi );
1606
+ zval * a_arg , * b_arg ;
1607
+ mpz_ptr gmpnum_a , gmpnum_b ;
1608
+ gmp_temp_t temp_a , temp_b ;
1609
+
1610
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "zz" , & a_arg , & b_arg ) == FAILURE ){
1611
+ RETURN_THROWS ();
1612
+ }
1613
+
1614
+ FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a );
1615
+ FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a );
1616
+
1617
+ RETVAL_LONG (mpz_jacobi (gmpnum_a , gmpnum_b ));
1618
+
1619
+ FREE_GMP_TEMP (temp_a );
1620
+ FREE_GMP_TEMP (temp_b );
1607
1621
}
1608
1622
/* }}} */
1609
1623
1610
1624
/* {{{ proto int gmp_legendre(mixed a, mixed b)
1611
1625
Computes Legendre symbol */
1612
1626
ZEND_FUNCTION (gmp_legendre )
1613
1627
{
1614
- gmp_binary_opl (mpz_legendre );
1628
+ zval * a_arg , * b_arg ;
1629
+ mpz_ptr gmpnum_a , gmpnum_b ;
1630
+ gmp_temp_t temp_a , temp_b ;
1631
+
1632
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "zz" , & a_arg , & b_arg ) == FAILURE ){
1633
+ RETURN_THROWS ();
1634
+ }
1635
+
1636
+ FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a );
1637
+ FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a );
1638
+
1639
+ RETVAL_LONG (mpz_legendre (gmpnum_a , gmpnum_b ));
1640
+
1641
+ FREE_GMP_TEMP (temp_a );
1642
+ FREE_GMP_TEMP (temp_b );
1615
1643
}
1616
1644
/* }}} */
1617
1645
@@ -1946,15 +1974,29 @@ ZEND_FUNCTION(gmp_testbit)
1946
1974
Calculates the population count of a */
1947
1975
ZEND_FUNCTION (gmp_popcount )
1948
1976
{
1949
- gmp_unary_opl (( gmp_unary_opl_t ) mpz_popcount );
1977
+ gmp_unary_opl (mpz_popcount );
1950
1978
}
1951
1979
/* }}} */
1952
1980
1953
1981
/* {{{ proto int gmp_hamdist(mixed a, mixed b)
1954
1982
Calculates hamming distance between a and b */
1955
1983
ZEND_FUNCTION (gmp_hamdist )
1956
1984
{
1957
- gmp_binary_opl ((gmp_binary_opl_t ) mpz_hamdist );
1985
+ zval * a_arg , * b_arg ;
1986
+ mpz_ptr gmpnum_a , gmpnum_b ;
1987
+ gmp_temp_t temp_a , temp_b ;
1988
+
1989
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "zz" , & a_arg , & b_arg ) == FAILURE ){
1990
+ RETURN_THROWS ();
1991
+ }
1992
+
1993
+ FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a );
1994
+ FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a );
1995
+
1996
+ RETVAL_LONG (mpz_hamdist (gmpnum_a , gmpnum_b ));
1997
+
1998
+ FREE_GMP_TEMP (temp_a );
1999
+ FREE_GMP_TEMP (temp_b );
1958
2000
}
1959
2001
/* }}} */
1960
2002
0 commit comments