void put_char(char **p, unsigned char c) {
  if ((c >= ' ' && c < 0x7f) || c >= 0xa0)
    *(*p)++ = c;
  else {
    *(*p)++ = '\\';
    *(*p)++ = '0' + (c >> 6);
    *(*p)++ = '0' + ((c >> 3) & 7);
    *(*p)++ = '0' + (c & 7);
  }
}


x86 assembly (clang, -O0):
<put_char>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %rdi,-0x8(%rbp)
mov    %al,-0x9(%rbp)
movzbl -0x9(%rbp),%eax
cmp    $0x20,%eax
jl     1128 <put_char+0x28>
movzbl -0x9(%rbp),%eax
cmp    $0x7f,%eax
jl     1137 <put_char+0x37>
movzbl -0x9(%rbp),%eax
cmp    $0xa0,%eax
jl     1152 <put_char+0x52>
mov    -0x9(%rbp),%cl
mov    -0x8(%rbp),%rdx
mov    (%rdx),%rax
mov    %rax,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
mov    %cl,(%rax)
jmp    11c6 <put_char+0xc6>
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,(%rcx)
movb   $0x5c,(%rax)
movzbl -0x9(%rbp),%eax
sar    $0x6,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rdx
mov    (%rdx),%rax
mov    %rax,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
mov    %cl,(%rax)
movzbl -0x9(%rbp),%eax
sar    $0x3,%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rdx
mov    (%rdx),%rax
mov    %rax,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
mov    %cl,(%rax)
movzbl -0x9(%rbp),%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rdx
mov    (%rdx),%rax
mov    %rax,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
mov    %cl,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<put_char>:
mov    (%rdi),%rax
lea    0x1(%rax),%rcx
mov    %rcx,(%rdi)
cmp    $0x9f,%sil
ja     1155 <put_char+0x55>
lea    -0x20(%rsi),%ecx
cmp    $0x5e,%cl
jbe    1155 <put_char+0x55>
movb   $0x5c,(%rax)
mov    %esi,%eax
shr    $0x6,%al
or     $0x30,%al
mov    (%rdi),%rcx
lea    0x1(%rcx),%rdx
mov    %rdx,(%rdi)
mov    %al,(%rcx)
mov    %esi,%eax
shr    $0x3,%al
and    $0x7,%al
or     $0x30,%al
mov    (%rdi),%rcx
lea    0x1(%rcx),%rdx
mov    %rdx,(%rdi)
mov    %al,(%rcx)
and    $0x7,%sil
or     $0x30,%sil
mov    (%rdi),%rax
lea    0x1(%rax),%rcx
mov    %rcx,(%rdi)
mov    %sil,(%rax)
ret

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

LLVM IR (-O2):
define void @put_char(i8** nocapture %0, i8 zeroext %1) {
%3 = add i8 %1, -32
%4 = icmp ult i8 %3, 95
%5 = icmp ugt i8 %1, -97
%6 = or i1 %5, %4
%7 = load i8*, i8** %0
%8 = getelementptr inbounds i8, i8* %7, i64 1
store i8* %8, i8** %0
br i1 %6, label %9, label %10
9: ; preds = %2
store i8 %1, i8* %7
br label %24
10: ; preds = %2
store i8 92, i8* %7
%11 = lshr i8 %1, 6
%12 = or i8 %11, 48
%13 = load i8*, i8** %0
%14 = getelementptr inbounds i8, i8* %13, i64 1
store i8* %14, i8** %0
store i8 %12, i8* %13
%15 = lshr i8 %1, 3
%16 = and i8 %15, 7
%17 = or i8 %16, 48
%18 = load i8*, i8** %0
%19 = getelementptr inbounds i8, i8* %18, i64 1
store i8* %19, i8** %0
store i8 %17, i8* %18
%20 = and i8 %1, 7
%21 = or i8 %20, 48
%22 = load i8*, i8** %0
%23 = getelementptr inbounds i8, i8* %22, i64 1
store i8* %23, i8** %0
store i8 %21, i8* %22
br label %24
24: ; preds = %10, %9
ret void
}