+#if __LP64__ || defined(__arm64__)
+static unsigned long long
+udiv10(unsigned long long a, unsigned long long *rem)
+{
+ *rem = a % 10;
+ return a / 10;
+}
+#else
+unsigned long long
+udiv10(unsigned long long a, unsigned long long *rem_out)
+{
+ if (a <= UINT_MAX) {
+ *rem_out = (unsigned long long)((unsigned int)a % 10);
+ return (unsigned long long)((unsigned int)a / 10);
+ }
+
+ // The biggest multiple of 10 that dividend might contain
+ unsigned long long divisor = 0xa000000000000000;
+ unsigned long long dividend = a;
+ unsigned long long quotient = 0;
+
+ while (divisor >= 0xa) {
+ quotient = quotient << 1;
+ if (dividend >= divisor) {
+ dividend -= divisor;
+ quotient += 1;
+ }
+ divisor = divisor >> 1;
+ }
+
+ *rem_out = dividend;
+ return quotient;
+}
+#endif
+