summaryrefslogtreecommitdiff
path: root/py/modbuiltins.c
diff options
context:
space:
mode:
authorNicko van Someren <nicko@nicko.org>2017-02-01 16:41:22 -0700
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-02-02 22:23:10 +0300
commitdf0117c8ae213a0652c3b19a969edc7fd994eeab (patch)
tree015d209752d8277e9bcd970b10a08556f438b386 /py/modbuiltins.c
parent2486c4ff469fdb69555476e342eadda91a4ceadf (diff)
py: Added optimised support for 3-argument calls to builtin.pow()
Updated modbuiltin.c to add conditional support for 3-arg calls to pow() using MICROPY_PY_BUILTINS_POW3 config parameter. Added support in objint_mpz.c for for optimised implementation.
Diffstat (limited to 'py/modbuiltins.c')
-rw-r--r--py/modbuiltins.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index f62afd807..a0c68930d 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -378,7 +378,14 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_ord_obj, mp_builtin_ord);
STATIC mp_obj_t mp_builtin_pow(size_t n_args, const mp_obj_t *args) {
switch (n_args) {
case 2: return mp_binary_op(MP_BINARY_OP_POWER, args[0], args[1]);
- default: return mp_binary_op(MP_BINARY_OP_MODULO, mp_binary_op(MP_BINARY_OP_POWER, args[0], args[1]), args[2]); // TODO optimise...
+ default:
+#if !MICROPY_PY_BUILTINS_POW3
+ mp_raise_msg(&mp_type_NotImplementedError, "3-arg pow() not supported");
+#elif MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_MPZ
+ return mp_binary_op(MP_BINARY_OP_MODULO, mp_binary_op(MP_BINARY_OP_POWER, args[0], args[1]), args[2]);
+#else
+ return mp_obj_int_pow3(args[0], args[1], args[2]);
+#endif
}
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_pow_obj, 2, 3, mp_builtin_pow);