diff --git a/py/intdivmod.c b/py/intdivmod.c
new file mode 100644
index 0000000000000000000000000000000000000000..4cb363b5111a50a8c4be46cebba3d581ee0e9420
--- /dev/null
+++ b/py/intdivmod.c
@@ -0,0 +1,24 @@
+#include "mpconfig.h"
+
+machine_int_t python_modulo(machine_int_t dividend, machine_int_t divisor) {
+    machine_int_t lsign = (dividend >= 0) ? 1 :-1;
+    machine_int_t rsign = (divisor >= 0) ? 1 :-1;
+    dividend %= divisor;
+    if (lsign != rsign) {
+        dividend += divisor;
+    }
+  return dividend;
+}
+
+
+machine_int_t python_floor_divide(machine_int_t num, machine_int_t denom) {
+    machine_int_t lsign = num > 0 ? 1 : -1;
+    machine_int_t rsign = denom > 0 ? 1 : -1;
+    if (lsign == -1) {num *= -1;}
+    if (rsign == -1) {denom *= -1;}
+    if (lsign != rsign){
+        return - ( num + denom - 1) / denom;
+    } else {
+        return num / denom;
+    }
+}
diff --git a/py/intdivmod.h b/py/intdivmod.h
new file mode 100644
index 0000000000000000000000000000000000000000..7716bd21e9403fcddca76ee270b35e29ae042091
--- /dev/null
+++ b/py/intdivmod.h
@@ -0,0 +1,4 @@
+// Functions for integer modulo and floor division
+
+machine_int_t python_modulo(machine_int_t dividend, machine_int_t divisor);
+machine_int_t python_floor_divide(machine_int_t num, machine_int_t denom);