char *apont_prev_tok(string)
char *string;
{
  char c;
  --string;
  c = *string;
  while (c == ' ' || c == '\n' || c == '\r' || c == '\f' || c == '\b' ||
         c == '\t') {
    --string;
    c = *string;
  }
  while (c != '\0' && c != ' ' && c != '\n' && c != '\r' && c != '\f' &&
         c != '\b' && c != '\t') {
    --string;
    c = *string;
  }
  ++string;
  return (string);
}


x86 assembly (clang, -O0):
<apont_prev_tok>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x9(%rbp)
movsbl -0x9(%rbp),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0xa(%rbp)
je     1184 <apont_prev_tok+0x84>
movsbl -0x9(%rbp),%ecx
mov    $0x1,%al
cmp    $0xa,%ecx
mov    %al,-0xa(%rbp)
je     1184 <apont_prev_tok+0x84>
movsbl -0x9(%rbp),%ecx
mov    $0x1,%al
cmp    $0xd,%ecx
mov    %al,-0xa(%rbp)
je     1184 <apont_prev_tok+0x84>
movsbl -0x9(%rbp),%ecx
mov    $0x1,%al
cmp    $0xc,%ecx
mov    %al,-0xa(%rbp)
je     1184 <apont_prev_tok+0x84>
movsbl -0x9(%rbp),%ecx
mov    $0x1,%al
cmp    $0x8,%ecx
mov    %al,-0xa(%rbp)
je     1184 <apont_prev_tok+0x84>
movsbl -0x9(%rbp),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0xa(%rbp)
mov    -0xa(%rbp),%al
test   $0x1,%al
jne    1194 <apont_prev_tok+0x94>
jmp    11ae <apont_prev_tok+0xae>
mov    -0x8(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x9(%rbp)
jmp    111d <apont_prev_tok+0x1d>
jmp    11b3 <apont_prev_tok+0xb3>
movsbl -0x9(%rbp),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xb(%rbp)
je     122c <apont_prev_tok+0x12c>
movsbl -0x9(%rbp),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0xb(%rbp)
je     122c <apont_prev_tok+0x12c>
movsbl -0x9(%rbp),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0xb(%rbp)
je     122c <apont_prev_tok+0x12c>
movsbl -0x9(%rbp),%ecx
xor    %eax,%eax
cmp    $0xd,%ecx
mov    %al,-0xb(%rbp)
je     122c <apont_prev_tok+0x12c>
movsbl -0x9(%rbp),%ecx
xor    %eax,%eax
cmp    $0xc,%ecx
mov    %al,-0xb(%rbp)
je     122c <apont_prev_tok+0x12c>
movsbl -0x9(%rbp),%ecx
xor    %eax,%eax
cmp    $0x8,%ecx
mov    %al,-0xb(%rbp)
je     122c <apont_prev_tok+0x12c>
movsbl -0x9(%rbp),%eax
cmp    $0x9,%eax
setne  %al
mov    %al,-0xb(%rbp)
mov    -0xb(%rbp),%al
test   $0x1,%al
jne    123c <apont_prev_tok+0x13c>
jmp    1256 <apont_prev_tok+0x156>
mov    -0x8(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x9(%rbp)
jmp    11b3 <apont_prev_tok+0xb3>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<apont_prev_tok>:
movabs $0x100003700,%rdx
nopw   0x0(%rax,%rax,1)
mov    %rdi,%rax
movzbl -0x1(%rdi),%ecx
cmp    $0x20,%rcx
ja     1127 <apont_prev_tok+0x27>
lea    -0x1(%rax),%rdi
bt     %rcx,%rdx
jb     1110 <apont_prev_tok+0x10>
movabs $0x100003701,%rdx
jmp    1148 <apont_prev_tok+0x48>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl -0x2(%rax),%ecx
add    $0xffffffffffffffff,%rax
cmp    $0x20,%cl
ja     1140 <apont_prev_tok+0x40>
movzbl %cl,%ecx
bt     %rcx,%rdx
jae    1140 <apont_prev_tok+0x40>
ret

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

LLVM IR (-O2):
define i8* @apont_prev_tok(i8* %0) {
br label %2
2: ; preds = %6, %1
%3 = phi i8* [ %0, %1 ], [ %4, %6 ]
%4 = getelementptr inbounds i8, i8* %3, i64 -1
%5 = load i8, i8* %4
switch i8 %5, label %7 [
i8 32, label %6
i8 13, label %6
i8 12, label %6
i8 10, label %6
i8 9, label %6
i8 8, label %6
]
6: ; preds = %2, %2, %2, %2, %2, %2
br label %2
7: ; preds = %2, %10
%8 = phi i8* [ %11, %10 ], [ %4, %2 ]
%9 = phi i8 [ %12, %10 ], [ %5, %2 ]
switch i8 %9, label %10 [
i8 32, label %13
i8 13, label %13
i8 12, label %13
i8 10, label %13
i8 9, label %13
i8 8, label %13
i8 0, label %13
]
10: ; preds = %7
%11 = getelementptr inbounds i8, i8* %8, i64 -1
%12 = load i8, i8* %11
br label %7
13: ; preds = %7, %7, %7, %7, %7, %7, %7
%14 = getelementptr inbounds i8, i8* %8, i64 1
ret i8* %14
}