void to_oct(value, digs, where) register long value;
register int digs;
register char *where;
{
  --digs;
  where[--digs] = ' ';
  do {
    where[--digs] = '0' + (char)(value & 7);
    value >>= 3;
  } while (digs > 0 && value != 0);
  while (digs > 0)
    where[--digs] = ' ';
}


x86 assembly (clang, -O0):
<to_oct>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x20,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
and    $0x7,%rax
movsbl %al,%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xc(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
sar    $0x3,%rax
mov    %rax,-0x8(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0xc(%rbp)
mov    %al,-0x19(%rbp)
jle    1175 <to_oct+0x75>
cmpq   $0x0,-0x8(%rbp)
setne  %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
test   $0x1,%al
jne    112c <to_oct+0x2c>
jmp    1185 <to_oct+0x85>
cmpl   $0x0,-0xc(%rbp)
jle    11a8 <to_oct+0xa8>
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x20,(%rax,%rcx,1)
jmp    1185 <to_oct+0x85>
pop    %rbp
ret

x86 assembly (clang, -O2):
<to_oct>:
push   %rax
movslq %esi,%r8
movb   $0x20,-0x2(%r8,%rdx,1)
lea    -0x2(%r8),%r11d
lea    (%r8,%rdx,1),%r9
add    $0xfffffffffffffffd,%r9
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
lea    (%r8,%rax,1),%r10
add    $0xfffffffffffffffe,%r10
mov    %edi,%ecx
and    $0x7,%cl
or     $0x30,%cl
mov    %cl,(%r9,%rax,1)
add    $0xffffffffffffffff,%rax
add    $0xffffffff,%r11d
cmp    $0x2,%r10
jl     1162 <to_oct+0x52>
mov    %rdi,%rcx
sar    $0x3,%rcx
cmp    $0x7,%rdi
mov    %rcx,%rdi
ja     1130 <to_oct+0x20>
lea    (%rsi,%rax,1),%ecx
add    $0xffffffff,%ecx
cmp    $0x2,%ecx
jl     11a0 <to_oct+0x90>
lea    (%rsi,%rax,1),%ecx
add    $0xfffffffd,%ecx
test   %r11d,%r11d
mov    $0x1,%edi
cmovle %r11d,%edi
sub    %edi,%esi
add    %esi,%eax
add    $0xfffffffe,%eax
sub    %rax,%rcx
add    %rcx,%rdx
add    $0x1,%rax
mov    %rdx,%rdi
mov    $0x20,%esi
mov    %rax,%rdx
call   1030 <memset@plt>
pop    %rax
ret

LLVM IR (-O0):
define void @to_oct(i64 %0, i32 %1, i8* %2) {
%4 = alloca i64
%5 = alloca i32
%6 = alloca i8*
store i64 %0, i64* %4
store i32 %1, i32* %5
store i8* %2, i8** %6
%7 = load i32, i32* %5
%8 = add nsw i32 %7, -1
store i32 %8, i32* %5
%9 = load i8*, i8** %6
%10 = load i32, i32* %5
%11 = add nsw i32 %10, -1
store i32 %11, i32* %5
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds i8, i8* %9, i64 %12
store i8 32, i8* %13
br label %14
14: ; preds = %34, %3
%15 = load i64, i64* %4
%16 = and i64 %15, 7
%17 = trunc i64 %16 to i8
%18 = sext i8 %17 to i32
%19 = add nsw i32 48, %18
%20 = trunc i32 %19 to i8
%21 = load i8*, i8** %6
%22 = load i32, i32* %5
%23 = add nsw i32 %22, -1
store i32 %23, i32* %5
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %21, i64 %24
store i8 %20, i8* %25
%26 = load i64, i64* %4
%27 = ashr i64 %26, 3
store i64 %27, i64* %4
br label %28
28: ; preds = %14
%29 = load i32, i32* %5
%30 = icmp sgt i32 %29, 0
br i1 %30, label %31, label %34
31: ; preds = %28
%32 = load i64, i64* %4
%33 = icmp ne i64 %32, 0
br label %34
34: ; preds = %31, %28
%35 = phi i1 [ false, %28 ], [ %33, %31 ]
br i1 %35, label %14, label %36
36: ; preds = %34
br label %37
37: ; preds = %40, %36
%38 = load i32, i32* %5
%39 = icmp sgt i32 %38, 0
br i1 %39, label %40, label %46
40: ; preds = %37
%41 = load i8*, i8** %6
%42 = load i32, i32* %5
%43 = add nsw i32 %42, -1
store i32 %43, i32* %5
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %41, i64 %44
store i8 32, i8* %45
br label %37
46: ; preds = %37
ret void
}

LLVM IR (-O2):
define void @to_oct(i64 %0, i32 %1, i8* nocapture writeonly %2) {
%4 = add nsw i32 %1, -2
%5 = sext i32 %4 to i64
%6 = getelementptr inbounds i8, i8* %2, i64 %5
store i8 32, i8* %6
%7 = sext i32 %1 to i64
%8 = add nsw i64 %7, -2
br label %9
9: ; preds = %9, %3
%10 = phi i64 [ %15, %9 ], [ %8, %3 ]
%11 = phi i64 [ %17, %9 ], [ %0, %3 ]
%12 = trunc i64 %11 to i8
%13 = and i8 %12, 7
%14 = or i8 %13, 48
%15 = add nsw i64 %10, -1
%16 = getelementptr inbounds i8, i8* %2, i64 %15
store i8 %14, i8* %16
%17 = ashr i64 %11, 3
%18 = icmp sgt i64 %10, 1
%19 = icmp ugt i64 %11, 7
%20 = select i1 %18, i1 %19, i1 false
br i1 %20, label %9, label %21
21: ; preds = %9
%22 = trunc i64 %10 to i32
%23 = trunc i64 %15 to i32
%24 = icmp sgt i32 %22, 1
br i1 %24, label %25, label %34
25: ; preds = %21
%26 = add i64 %10, 4294967294
%27 = and i64 %26, 4294967295
%28 = call i32 @llvm.smin.i32(i32 %23, i32 1)
%29 = sub i32 %23, %28
%30 = zext i32 %29 to i64
%31 = sub nsw i64 %27, %30
%32 = getelementptr i8, i8* %2, i64 %31
%33 = add nuw nsw i64 %30, 1
br label %34
34: ; preds = %25, %21
ret void
}