@@ -123,6 +123,8 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
123123 [MP_F_NEW_CELL ] = 1 ,
124124 [MP_F_MAKE_CLOSURE_FROM_RAW_CODE ] = 3 ,
125125 [MP_F_SETUP_CODE_STATE ] = 5 ,
126+ [MP_F_SMALL_INT_FLOOR_DIVIDE ] = 2 ,
127+ [MP_F_SMALL_INT_MODULO ] = 2 ,
126128};
127129
128130#include "py/asmx86.h"
@@ -1843,6 +1845,20 @@ STATIC void emit_native_binary_op(emit_t *emit, mp_binary_op_t op) {
18431845 return ;
18441846 }
18451847 #endif
1848+
1849+ // special cases for floor-divide and module because we dispatch to helper functions
1850+ if (op == MP_BINARY_OP_FLOOR_DIVIDE || op == MP_BINARY_OP_INPLACE_FLOOR_DIVIDE
1851+ || op == MP_BINARY_OP_MODULO || op == MP_BINARY_OP_INPLACE_MODULO ) {
1852+ emit_pre_pop_reg_reg (emit , & vtype_rhs , REG_ARG_2 , & vtype_lhs , REG_ARG_1 );
1853+ if (op == MP_BINARY_OP_FLOOR_DIVIDE || op == MP_BINARY_OP_INPLACE_FLOOR_DIVIDE ) {
1854+ emit_call (emit , MP_F_SMALL_INT_FLOOR_DIVIDE );
1855+ } else {
1856+ emit_call (emit , MP_F_SMALL_INT_MODULO );
1857+ }
1858+ emit_post_push_reg (emit , VTYPE_INT , REG_RET );
1859+ return ;
1860+ }
1861+
18461862 int reg_rhs = REG_ARG_3 ;
18471863 emit_pre_pop_reg_flexible (emit , & vtype_rhs , & reg_rhs , REG_RET , REG_ARG_2 );
18481864 emit_pre_pop_reg (emit , & vtype_lhs , REG_ARG_2 );
0 commit comments