Skip to content

Instantly share code, notes, and snippets.

@rightson
Created March 29, 2016 15:33
Show Gist options
  • Save rightson/3b0d6976da8ea1b81f89 to your computer and use it in GitHub Desktop.
Save rightson/3b0d6976da8ea1b81f89 to your computer and use it in GitHub Desktop.
#include <stdio.h>
typedef unsigned int u32;
typedef unsigned long u64;
static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
{
union {
u64 v64;
u32 v32[2];
} d = { dividend };
u32 upper;
upper = d.v32[1];
d.v32[1] = 0;
if (upper >= divisor) {
d.v32[1] = upper / divisor;
upper %= divisor;
}
asm ("divl %2" : "=a" (d.v32[0]), "=d" (*remainder) :
"rm" (divisor), "0" (d.v32[0]), "1" (upper));
return d.v64;
}
int main() {
u64 dividend = 101;
u32 divisor = 17;
u32 remainder;
u64 quoitent = div_u64_rem(dividend, divisor, &remainder);
printf("%lu = %u * %lu + %u\n", dividend, divisor, quoitent, remainder);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment