char nextch(patp)
char **patp;
{
  register char ch;
  register char chsum;
  register int count;
  ch = *(*patp)++;
  if (ch == '\\') {
    ch = *(*patp)++;
    if ((ch >= '0' && ch <= '7')) {
      chsum = 0;
      for (count = 0; count < 3 && (ch >= '0' && ch <= '7'); count++) {
        chsum *= 8;
        chsum += ch - '0';
        ch = *(*patp)++;
      }
      (*patp)--;
      ch = chsum;
    }
  }
  return (ch);
}


x86 assembly (clang, -O0):
<nextch>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,(%rcx)
mov    (%rax),%al
mov    %al,-0x9(%rbp)
movsbl -0x9(%rbp),%eax
cmp    $0x5c,%eax
jne    1201 <nextch+0x101>
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,(%rcx)
mov    (%rax),%al
mov    %al,-0x9(%rbp)
movsbl -0x9(%rbp),%eax
cmp    $0x30,%eax
jl     11fc <nextch+0xfc>
movsbl -0x9(%rbp),%eax
cmp    $0x37,%eax
jg     11fc <nextch+0xfc>
movb   $0x0,-0xa(%rbp)
movl   $0x0,-0x10(%rbp)
xor    %eax,%eax
cmpl   $0x3,-0x10(%rbp)
mov    %al,-0x11(%rbp)
jge    119a <nextch+0x9a>
movsbl -0x9(%rbp),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x12(%rbp)
jl     1194 <nextch+0x94>
movsbl -0x9(%rbp),%eax
cmp    $0x37,%eax
setle  %al
mov    %al,-0x12(%rbp)
mov    -0x12(%rbp),%al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
test   $0x1,%al
jne    11aa <nextch+0xaa>
jmp    11e8 <nextch+0xe8>
movsbl -0xa(%rbp),%eax
shl    $0x3,%eax
mov    %al,-0xa(%rbp)
movsbl -0x9(%rbp),%ecx
sub    $0x30,%ecx
movsbl -0xa(%rbp),%eax
add    %ecx,%eax
mov    %al,-0xa(%rbp)
mov    -0x8(%rbp),%rcx
mov    (%rcx),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,(%rcx)
mov    (%rax),%al
mov    %al,-0x9(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1166 <nextch+0x66>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,(%rax)
mov    -0xa(%rbp),%al
mov    %al,-0x9(%rbp)
jmp    1201 <nextch+0x101>
movsbl -0x9(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<nextch>:
mov    (%rdi),%rcx
lea    0x1(%rcx),%rax
mov    %rax,(%rdi)
mov    (%rcx),%al
cmp    $0x5c,%al
jne    1176 <nextch+0x76>
lea    0x2(%rcx),%rsi
mov    %rsi,(%rdi)
mov    0x1(%rcx),%al
mov    %eax,%edx
and    $0xf8,%dl
cmp    $0x30,%dl
jne    1176 <nextch+0x76>
add    $0xd0,%al
lea    0x3(%rcx),%r9
mov    %r9,(%rdi)
mov    0x2(%rcx),%r8b
mov    %r8d,%edx
and    $0xf8,%dl
cmp    $0x30,%dl
jne    1173 <nextch+0x73>
shl    $0x3,%al
add    %r8b,%al
add    $0xd0,%al
lea    0x4(%rcx),%rsi
mov    %rsi,(%rdi)
mov    0x3(%rcx),%r8b
mov    %r8d,%edx
and    $0xf8,%dl
cmp    $0x30,%dl
jne    1170 <nextch+0x70>
shl    $0x3,%al
add    %al,%r8b
add    $0xd0,%r8b
add    $0x5,%rcx
mov    %rcx,(%rdi)
mov    %r8d,%eax
jmp    1173 <nextch+0x73>
mov    %r9,%rsi
mov    %rsi,(%rdi)
ret

LLVM IR (-O0):
define signext i8 @nextch(i8** %0) {
%2 = alloca i8**
%3 = alloca i8
%4 = alloca i8
%5 = alloca i32
store i8** %0, i8*** %2
%6 = load i8**, i8*** %2
%7 = load i8*, i8** %6
%8 = getelementptr inbounds i8, i8* %7, i32 1
store i8* %8, i8** %6
%9 = load i8, i8* %7
store i8 %9, i8* %3
%10 = load i8, i8* %3
%11 = sext i8 %10 to i32
%12 = icmp eq i32 %11, 92
br i1 %12, label %13, label %66
13: ; preds = %1
%14 = load i8**, i8*** %2
%15 = load i8*, i8** %14
%16 = getelementptr inbounds i8, i8* %15, i32 1
store i8* %16, i8** %14
%17 = load i8, i8* %15
store i8 %17, i8* %3
%18 = load i8, i8* %3
%19 = sext i8 %18 to i32
%20 = icmp sge i32 %19, 48
br i1 %20, label %21, label %65
21: ; preds = %13
%22 = load i8, i8* %3
%23 = sext i8 %22 to i32
%24 = icmp sle i32 %23, 55
br i1 %24, label %25, label %65
25: ; preds = %21
store i8 0, i8* %4
store i32 0, i32* %5
br label %26
26: ; preds = %57, %25
%27 = load i32, i32* %5
%28 = icmp slt i32 %27, 3
br i1 %28, label %29, label %39
29: ; preds = %26
%30 = load i8, i8* %3
%31 = sext i8 %30 to i32
%32 = icmp sge i32 %31, 48
br i1 %32, label %33, label %37
33: ; preds = %29
%34 = load i8, i8* %3
%35 = sext i8 %34 to i32
%36 = icmp sle i32 %35, 55
br label %37
37: ; preds = %33, %29
%38 = phi i1 [ false, %29 ], [ %36, %33 ]
br label %39
39: ; preds = %37, %26
%40 = phi i1 [ false, %26 ], [ %38, %37 ]
br i1 %40, label %41, label %60
41: ; preds = %39
%42 = load i8, i8* %4
%43 = sext i8 %42 to i32
%44 = mul nsw i32 %43, 8
%45 = trunc i32 %44 to i8
store i8 %45, i8* %4
%46 = load i8, i8* %3
%47 = sext i8 %46 to i32
%48 = sub nsw i32 %47, 48
%49 = load i8, i8* %4
%50 = sext i8 %49 to i32
%51 = add nsw i32 %50, %48
%52 = trunc i32 %51 to i8
store i8 %52, i8* %4
%53 = load i8**, i8*** %2
%54 = load i8*, i8** %53
%55 = getelementptr inbounds i8, i8* %54, i32 1
store i8* %55, i8** %53
%56 = load i8, i8* %54
store i8 %56, i8* %3
br label %57
57: ; preds = %41
%58 = load i32, i32* %5
%59 = add nsw i32 %58, 1
store i32 %59, i32* %5
br label %26
60: ; preds = %39
%61 = load i8**, i8*** %2
%62 = load i8*, i8** %61
%63 = getelementptr inbounds i8, i8* %62, i32 -1
store i8* %63, i8** %61
%64 = load i8, i8* %4
store i8 %64, i8* %3
br label %65
65: ; preds = %60, %21, %13
br label %66
66: ; preds = %65, %1
%67 = load i8, i8* %3
ret i8 %67
}

LLVM IR (-O2):
define signext i8 @nextch(i8** nocapture %0) {
%2 = load i8*, i8** %0
%3 = getelementptr inbounds i8, i8* %2, i64 1
store i8* %3, i8** %0
%4 = load i8, i8* %2
%5 = icmp eq i8 %4, 92
br i1 %5, label %6, label %33
6: ; preds = %1
%7 = getelementptr inbounds i8, i8* %2, i64 2
store i8* %7, i8** %0
%8 = load i8, i8* %3
%9 = and i8 %8, -8
%10 = icmp eq i8 %9, 48
br i1 %10, label %11, label %33
11: ; preds = %6
%12 = add nsw i8 %8, -48
%13 = getelementptr inbounds i8, i8* %2, i64 3
store i8* %13, i8** %0
%14 = load i8, i8* %7
%15 = and i8 %14, -8
%16 = icmp eq i8 %15, 48
br i1 %16, label %17, label %30
17: ; preds = %11
%18 = shl i8 %12, 3
%19 = add nsw i8 %14, -48
%20 = add nuw i8 %19, %18
%21 = getelementptr inbounds i8, i8* %2, i64 4
store i8* %21, i8** %0
%22 = load i8, i8* %13
%23 = and i8 %22, -8
%24 = icmp eq i8 %23, 48
br i1 %24, label %25, label %30
25: ; preds = %17
%26 = shl i8 %20, 3
%27 = add nsw i8 %22, -48
%28 = add nuw i8 %27, %26
%29 = getelementptr inbounds i8, i8* %2, i64 5
store i8* %29, i8** %0
br label %30
30: ; preds = %25, %17, %11
%31 = phi i8* [ %7, %11 ], [ %13, %17 ], [ %21, %25 ]
%32 = phi i8 [ %12, %11 ], [ %20, %17 ], [ %28, %25 ]
store i8* %31, i8** %0
br label %33
33: ; preds = %6, %30, %1
%34 = phi i8 [ %32, %30 ], [ %8, %6 ], [ %4, %1 ]
ret i8 %34
}