unsigned long div10quickm(unsigned long *tp) {
  unsigned long q, r, t;
  t = *tp;
  q = (t >> 1) + (t >> 2);
  q = q + (q >> 4);
  q = q + (q >> 8);
  q = q + (q >> 16);
  q >>= 3;
  r = t - (((q << 2) + q) << 1);
  t = q + (r >> 9);
  *tp = t;
  t <<= 1;
  t = (t << 2) + t;
  return *tp - t;
}


x86 assembly (clang, -O0):
<div10quickm>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
shr    $0x1,%rax
mov    -0x20(%rbp),%rcx
shr    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x10(%rbp),%rcx
shr    $0x4,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x10(%rbp),%rcx
shr    $0x8,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x10(%rbp),%rcx
shr    $0x10,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x3,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
shl    $0x2,%rcx
add    -0x10(%rbp),%rcx
shl    $0x1,%rcx
sub    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
shr    $0x9,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
shl    $0x2,%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
sub    -0x20(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<div10quickm>:
mov    (%rdi),%rax
mov    %rax,%rcx
shr    %rcx
mov    %rax,%rdx
shr    $0x2,%rdx
add    %rcx,%rdx
mov    %rdx,%rcx
shr    $0x4,%rcx
add    %rdx,%rcx
mov    %rcx,%rdx
shr    $0x8,%rdx
add    %rcx,%rdx
mov    %rdx,%rcx
shr    $0x10,%rcx
add    %rdx,%rcx
shr    $0x3,%rcx
lea    (%rcx,%rcx,1),%rdx
lea    (%rdx,%rdx,4),%rdx
sub    %rdx,%rax
shr    $0x9,%rax
add    %rcx,%rax
mov    %rax,(%rdi)
lea    (%rax,%rax,8),%rax
neg    %rax
ret

LLVM IR (-O0):
define i64 @div10quickm(i64* %0) {
%2 = alloca i64*
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
store i64* %0, i64** %2
%6 = load i64*, i64** %2
%7 = load i64, i64* %6
store i64 %7, i64* %5
%8 = load i64, i64* %5
%9 = lshr i64 %8, 1
%10 = load i64, i64* %5
%11 = lshr i64 %10, 2
%12 = add i64 %9, %11
store i64 %12, i64* %3
%13 = load i64, i64* %3
%14 = load i64, i64* %3
%15 = lshr i64 %14, 4
%16 = add i64 %13, %15
store i64 %16, i64* %3
%17 = load i64, i64* %3
%18 = load i64, i64* %3
%19 = lshr i64 %18, 8
%20 = add i64 %17, %19
store i64 %20, i64* %3
%21 = load i64, i64* %3
%22 = load i64, i64* %3
%23 = lshr i64 %22, 16
%24 = add i64 %21, %23
store i64 %24, i64* %3
%25 = load i64, i64* %3
%26 = lshr i64 %25, 3
store i64 %26, i64* %3
%27 = load i64, i64* %5
%28 = load i64, i64* %3
%29 = shl i64 %28, 2
%30 = load i64, i64* %3
%31 = add i64 %29, %30
%32 = shl i64 %31, 1
%33 = sub i64 %27, %32
store i64 %33, i64* %4
%34 = load i64, i64* %3
%35 = load i64, i64* %4
%36 = lshr i64 %35, 9
%37 = add i64 %34, %36
store i64 %37, i64* %5
%38 = load i64, i64* %5
%39 = load i64*, i64** %2
store i64 %38, i64* %39
%40 = load i64, i64* %5
%41 = shl i64 %40, 1
store i64 %41, i64* %5
%42 = load i64, i64* %5
%43 = shl i64 %42, 2
%44 = load i64, i64* %5
%45 = add i64 %43, %44
store i64 %45, i64* %5
%46 = load i64*, i64** %2
%47 = load i64, i64* %46
%48 = load i64, i64* %5
%49 = sub i64 %47, %48
ret i64 %49
}

LLVM IR (-O2):
define i64 @div10quickm(i64* nocapture %0) {
%2 = load i64, i64* %0
%3 = lshr i64 %2, 1
%4 = lshr i64 %2, 2
%5 = add nuw i64 %3, %4
%6 = lshr i64 %5, 4
%7 = add nuw i64 %6, %5
%8 = lshr i64 %7, 8
%9 = add nuw i64 %8, %7
%10 = lshr i64 %9, 16
%11 = add nuw i64 %10, %9
%12 = lshr i64 %11, 3
%13 = mul i64 %12, -10
%14 = add i64 %13, %2
%15 = lshr i64 %14, 9
%16 = add nuw nsw i64 %15, %12
store i64 %16, i64* %0
%17 = mul i64 %16, -9
ret i64 %17
}