@@ -368,7 +368,40 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva
368
368
369
369
static int gmp_do_operation_ex (zend_uchar opcode , zval * result , zval * op1 , zval * op2 ) /* {{{ */
370
370
{
371
+ switch (opcode ) {
372
+ case ZEND_ADD :
373
+ gmp_zval_binary_ui_op (result , op1 , op2 , mpz_add , mpz_add_ui , false, true);
374
+ if (UNEXPECTED (EG (exception ))) { return FAILURE ; }
375
+ return SUCCESS ;
376
+ case ZEND_SUB :
377
+ DO_BINARY_UI_OP (mpz_sub );
378
+ case ZEND_MUL :
379
+ DO_BINARY_UI_OP (mpz_mul );
380
+ case ZEND_POW :
381
+ shift_operator_helper (mpz_pow_ui , result , op1 , op2 , opcode );
382
+ return SUCCESS ;
383
+ case ZEND_DIV :
384
+ DO_BINARY_UI_OP_EX (mpz_tdiv_q , gmp_mpz_tdiv_q_ui , 1 );
385
+ case ZEND_MOD :
386
+ DO_BINARY_UI_OP_EX (mpz_mod , gmp_mpz_mod_ui , 1 );
387
+ case ZEND_SL :
388
+ shift_operator_helper (mpz_mul_2exp , result , op1 , op2 , opcode );
389
+ return SUCCESS ;
390
+ case ZEND_SR :
391
+ shift_operator_helper (mpz_fdiv_q_2exp , result , op1 , op2 , opcode );
392
+ return SUCCESS ;
393
+ case ZEND_BW_OR :
394
+ DO_BINARY_OP (mpz_ior );
395
+ case ZEND_BW_AND :
396
+ DO_BINARY_OP (mpz_and );
397
+ case ZEND_BW_XOR :
398
+ DO_BINARY_OP (mpz_xor );
399
+ case ZEND_BW_NOT :
400
+ DO_UNARY_OP (mpz_com );
401
+
402
+ default :
371
403
return FAILURE ;
404
+ }
372
405
}
373
406
/* }}} */
374
407
@@ -1012,18 +1045,21 @@ ZEND_FUNCTION(gmp_strval)
1012
1045
/* {{{ Add a and b */
1013
1046
ZEND_FUNCTION (gmp_add )
1014
1047
{
1048
+ gmp_binary_ui_op (mpz_add , mpz_add_ui );
1015
1049
}
1016
1050
/* }}} */
1017
1051
1018
1052
/* {{{ Subtract b from a */
1019
1053
ZEND_FUNCTION (gmp_sub )
1020
1054
{
1055
+ gmp_binary_ui_op (mpz_sub , mpz_sub_ui );
1021
1056
}
1022
1057
/* }}} */
1023
1058
1024
1059
/* {{{ Multiply a and b */
1025
1060
ZEND_FUNCTION (gmp_mul )
1026
1061
{
1062
+ gmp_binary_ui_op (mpz_mul , mpz_mul_ui );
1027
1063
}
1028
1064
/* }}} */
1029
1065
@@ -1477,12 +1513,14 @@ ZEND_FUNCTION(gmp_prob_prime)
1477
1513
/* {{{ Computes greatest common denominator (gcd) of a and b */
1478
1514
ZEND_FUNCTION (gmp_gcd )
1479
1515
{
1516
+ gmp_binary_ui_op (mpz_gcd , gmp_mpz_gcd_ui );
1480
1517
}
1481
1518
/* }}} */
1482
1519
1483
1520
/* {{{ Computes least common multiple (lcm) of a and b */
1484
1521
ZEND_FUNCTION (gmp_lcm )
1485
1522
{
1523
+ gmp_binary_ui_op (mpz_lcm , mpz_lcm_ui );
1486
1524
}
1487
1525
/* }}} */
1488
1526
0 commit comments