void field_unescape(char *s) {
  char *src;
  char *dst;
  for (src = dst = s; *src; ++src, ++dst) {
    if (src[0] == '%' && src[1] != '\0' && src[2] != '\0') {
      int high, low;
      if ('a' <= src[1] && src[1] <= 'f')
        high = src[1] - 'a' + 10;
      else if ('A' <= src[1] && src[1] <= 'F')
        high = src[1] - 'A' + 10;
      else if ('0' <= src[1] && src[1] <= '9')
        high = src[1] - '0';
      else
        goto regular_copy;
      if ('a' <= src[2] && src[2] <= 'f')
        low = src[2] - 'a' + 10;
      else if ('A' <= src[2] && src[2] <= 'F')
        low = src[2] - 'A' + 10;
      else if ('0' <= src[2] && src[2] <= '9')
        low = src[2] - '0';
      else
        goto regular_copy;
      *dst = (char)((high << 4) + low);
      src += 2;
    } else {
    regular_copy:
      *dst = *src;
    }
  }
  *dst = '\0';
}


x86 assembly (clang, -O0):
<field_unescape>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     1328 <field_unescape+0x228>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x25,%eax
jne    12f5 <field_unescape+0x1f5>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     12f5 <field_unescape+0x1f5>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
je     12f5 <field_unescape+0x1f5>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     118f <field_unescape+0x8f>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x66,%eax
jg     118f <field_unescape+0x8f>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x1c(%rbp)
jmp    1213 <field_unescape+0x113>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     11cb <field_unescape+0xcb>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x46,%eax
jg     11cb <field_unescape+0xcb>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x1c(%rbp)
jmp    120e <field_unescape+0x10e>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     1204 <field_unescape+0x104>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x39,%eax
jg     1204 <field_unescape+0x104>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x1c(%rbp)
jmp    1209 <field_unescape+0x109>
jmp    12fa <field_unescape+0x1fa>
jmp    120e <field_unescape+0x10e>
jmp    1213 <field_unescape+0x113>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     124f <field_unescape+0x14f>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x66,%eax
jg     124f <field_unescape+0x14f>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x20(%rbp)
jmp    12d3 <field_unescape+0x1d3>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     128b <field_unescape+0x18b>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x46,%eax
jg     128b <field_unescape+0x18b>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x20(%rbp)
jmp    12ce <field_unescape+0x1ce>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     12c4 <field_unescape+0x1c4>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x39,%eax
jg     12c4 <field_unescape+0x1c4>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x20(%rbp)
jmp    12c9 <field_unescape+0x1c9>
jmp    12fa <field_unescape+0x1fa>
jmp    12ce <field_unescape+0x1ce>
jmp    12d3 <field_unescape+0x1d3>
mov    -0x1c(%rbp),%eax
shl    $0x4,%eax
add    -0x20(%rbp),%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    1306 <field_unescape+0x206>
jmp    12fa <field_unescape+0x1fa>
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
jmp    130b <field_unescape+0x20b>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1114 <field_unescape+0x14>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<field_unescape>:
mov    %rdi,%rax
jmp    1122 <field_unescape+0x22>
cs nopw 0x0(%rax,%rax,1)
nop
test   %cl,%cl
je     119d <field_unescape+0x9d>
mov    %cl,(%rax)
add    $0x1,%rdi
add    $0x1,%rax
movzbl (%rdi),%ecx
cmp    $0x25,%cl
jne    1110 <field_unescape+0x10>
movzbl 0x1(%rdi),%edx
mov    $0x25,%cl
test   %dl,%dl
je     1118 <field_unescape+0x18>
movzbl 0x2(%rdi),%r8d
test   %r8b,%r8b
je     1118 <field_unescape+0x18>
lea    -0x61(%rdx),%esi
cmp    $0x5,%sil
ja     114c <field_unescape+0x4c>
add    $0xa9,%dl
jmp    1162 <field_unescape+0x62>
lea    -0x41(%rdx),%esi
cmp    $0x5,%sil
ja     115a <field_unescape+0x5a>
add    $0xc9,%dl
jmp    1162 <field_unescape+0x62>
add    $0xd0,%dl
cmp    $0x9,%dl
ja     1118 <field_unescape+0x18>
lea    -0x61(%r8),%esi
cmp    $0x5,%sil
ja     1172 <field_unescape+0x72>
add    $0xa9,%r8b
jmp    118c <field_unescape+0x8c>
lea    -0x41(%r8),%esi
cmp    $0x5,%sil
ja     1182 <field_unescape+0x82>
add    $0xc9,%r8b
jmp    118c <field_unescape+0x8c>
add    $0xd0,%r8b
cmp    $0x9,%r8b
ja     1118 <field_unescape+0x18>
add    $0x2,%rdi
shl    $0x4,%dl
add    %r8b,%dl
mov    %edx,%ecx
jmp    1118 <field_unescape+0x18>
movb   $0x0,(%rax)
ret

LLVM IR (-O0):
define void @field_unescape(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
store i8* %0, i8** %2
%7 = load i8*, i8** %2
store i8* %7, i8** %4
store i8* %7, i8** %3
br label %8
8: ; preds = %163, %1
%9 = load i8*, i8** %3
%10 = load i8, i8* %9
%11 = icmp ne i8 %10, 0
br i1 %11, label %12, label %168
12: ; preds = %8
%13 = load i8*, i8** %3
%14 = getelementptr inbounds i8, i8* %13, i64 0
%15 = load i8, i8* %14
%16 = sext i8 %15 to i32
%17 = icmp eq i32 %16, 37
br i1 %17, label %18, label %157
18: ; preds = %12
%19 = load i8*, i8** %3
%20 = getelementptr inbounds i8, i8* %19, i64 1
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = icmp ne i32 %22, 0
br i1 %23, label %24, label %157
24: ; preds = %18
%25 = load i8*, i8** %3
%26 = getelementptr inbounds i8, i8* %25, i64 2
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %157
30: ; preds = %24
%31 = load i8*, i8** %3
%32 = getelementptr inbounds i8, i8* %31, i64 1
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp sle i32 97, %34
br i1 %35, label %36, label %49
36: ; preds = %30
%37 = load i8*, i8** %3
%38 = getelementptr inbounds i8, i8* %37, i64 1
%39 = load i8, i8* %38
%40 = sext i8 %39 to i32
%41 = icmp sle i32 %40, 102
br i1 %41, label %42, label %49
42: ; preds = %36
%43 = load i8*, i8** %3
%44 = getelementptr inbounds i8, i8* %43, i64 1
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = sub nsw i32 %46, 97
%48 = add nsw i32 %47, 10
store i32 %48, i32* %5
br label %89
49: ; preds = %36, %30
%50 = load i8*, i8** %3
%51 = getelementptr inbounds i8, i8* %50, i64 1
%52 = load i8, i8* %51
%53 = sext i8 %52 to i32
%54 = icmp sle i32 65, %53
br i1 %54, label %55, label %68
55: ; preds = %49
%56 = load i8*, i8** %3
%57 = getelementptr inbounds i8, i8* %56, i64 1
%58 = load i8, i8* %57
%59 = sext i8 %58 to i32
%60 = icmp sle i32 %59, 70
br i1 %60, label %61, label %68
61: ; preds = %55
%62 = load i8*, i8** %3
%63 = getelementptr inbounds i8, i8* %62, i64 1
%64 = load i8, i8* %63
%65 = sext i8 %64 to i32
%66 = sub nsw i32 %65, 65
%67 = add nsw i32 %66, 10
store i32 %67, i32* %5
br label %88
68: ; preds = %55, %49
%69 = load i8*, i8** %3
%70 = getelementptr inbounds i8, i8* %69, i64 1
%71 = load i8, i8* %70
%72 = sext i8 %71 to i32
%73 = icmp sle i32 48, %72
br i1 %73, label %74, label %86
74: ; preds = %68
%75 = load i8*, i8** %3
%76 = getelementptr inbounds i8, i8* %75, i64 1
%77 = load i8, i8* %76
%78 = sext i8 %77 to i32
%79 = icmp sle i32 %78, 57
br i1 %79, label %80, label %86
80: ; preds = %74
%81 = load i8*, i8** %3
%82 = getelementptr inbounds i8, i8* %81, i64 1
%83 = load i8, i8* %82
%84 = sext i8 %83 to i32
%85 = sub nsw i32 %84, 48
store i32 %85, i32* %5
br label %87
86: ; preds = %74, %68
br label %158
87: ; preds = %80
br label %88
88: ; preds = %87, %61
br label %89
89: ; preds = %88, %42
%90 = load i8*, i8** %3
%91 = getelementptr inbounds i8, i8* %90, i64 2
%92 = load i8, i8* %91
%93 = sext i8 %92 to i32
%94 = icmp sle i32 97, %93
br i1 %94, label %95, label %108
95: ; preds = %89
%96 = load i8*, i8** %3
%97 = getelementptr inbounds i8, i8* %96, i64 2
%98 = load i8, i8* %97
%99 = sext i8 %98 to i32
%100 = icmp sle i32 %99, 102
br i1 %100, label %101, label %108
101: ; preds = %95
%102 = load i8*, i8** %3
%103 = getelementptr inbounds i8, i8* %102, i64 2
%104 = load i8, i8* %103
%105 = sext i8 %104 to i32
%106 = sub nsw i32 %105, 97
%107 = add nsw i32 %106, 10
store i32 %107, i32* %6
br label %148
108: ; preds = %95, %89
%109 = load i8*, i8** %3
%110 = getelementptr inbounds i8, i8* %109, i64 2
%111 = load i8, i8* %110
%112 = sext i8 %111 to i32
%113 = icmp sle i32 65, %112
br i1 %113, label %114, label %127
114: ; preds = %108
%115 = load i8*, i8** %3
%116 = getelementptr inbounds i8, i8* %115, i64 2
%117 = load i8, i8* %116
%118 = sext i8 %117 to i32
%119 = icmp sle i32 %118, 70
br i1 %119, label %120, label %127
120: ; preds = %114
%121 = load i8*, i8** %3
%122 = getelementptr inbounds i8, i8* %121, i64 2
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
%125 = sub nsw i32 %124, 65
%126 = add nsw i32 %125, 10
store i32 %126, i32* %6
br label %147
127: ; preds = %114, %108
%128 = load i8*, i8** %3
%129 = getelementptr inbounds i8, i8* %128, i64 2
%130 = load i8, i8* %129
%131 = sext i8 %130 to i32
%132 = icmp sle i32 48, %131
br i1 %132, label %133, label %145
133: ; preds = %127
%134 = load i8*, i8** %3
%135 = getelementptr inbounds i8, i8* %134, i64 2
%136 = load i8, i8* %135
%137 = sext i8 %136 to i32
%138 = icmp sle i32 %137, 57
br i1 %138, label %139, label %145
139: ; preds = %133
%140 = load i8*, i8** %3
%141 = getelementptr inbounds i8, i8* %140, i64 2
%142 = load i8, i8* %141
%143 = sext i8 %142 to i32
%144 = sub nsw i32 %143, 48
store i32 %144, i32* %6
br label %146
145: ; preds = %133, %127
br label %158
146: ; preds = %139
br label %147
147: ; preds = %146, %120
br label %148
148: ; preds = %147, %101
%149 = load i32, i32* %5
%150 = shl i32 %149, 4
%151 = load i32, i32* %6
%152 = add nsw i32 %150, %151
%153 = trunc i32 %152 to i8
%154 = load i8*, i8** %4
store i8 %153, i8* %154
%155 = load i8*, i8** %3
%156 = getelementptr inbounds i8, i8* %155, i64 2
store i8* %156, i8** %3
br label %162
157: ; preds = %24, %18, %12
br label %158
158: ; preds = %157, %145, %86
%159 = load i8*, i8** %3
%160 = load i8, i8* %159
%161 = load i8*, i8** %4
store i8 %160, i8* %161
br label %162
162: ; preds = %158, %148
br label %163
163: ; preds = %162
%164 = load i8*, i8** %3
%165 = getelementptr inbounds i8, i8* %164, i32 1
store i8* %165, i8** %3
%166 = load i8*, i8** %4
%167 = getelementptr inbounds i8, i8* %166, i32 1
store i8* %167, i8** %4
br label %8
168: ; preds = %8
%169 = load i8*, i8** %4
store i8 0, i8* %169
ret void
}

LLVM IR (-O2):
define void @field_unescape(i8* nocapture %0) {
br label %2
2: ; preds = %45, %1
%3 = phi i8* [ %0, %1 ], [ %48, %45 ]
%4 = phi i8* [ %0, %1 ], [ %49, %45 ]
%5 = load i8, i8* %3
switch i8 %5, label %45 [
i8 0, label %50
i8 37, label %6
]
6: ; preds = %2
%7 = getelementptr inbounds i8, i8* %3, i64 1
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 0
br i1 %9, label %45, label %10
10: ; preds = %6
%11 = getelementptr inbounds i8, i8* %3, i64 2
%12 = load i8, i8* %11
%13 = icmp eq i8 %12, 0
br i1 %13, label %45, label %14
14: ; preds = %10
%15 = add i8 %8, -97
%16 = icmp ult i8 %15, 6
br i1 %16, label %17, label %19
17: ; preds = %14
%18 = add nsw i8 %8, -87
br label %27
19: ; preds = %14
%20 = add i8 %8, -65
%21 = icmp ult i8 %20, 6
br i1 %21, label %22, label %24
22: ; preds = %19
%23 = add nsw i8 %8, -55
br label %27
24: ; preds = %19
%25 = add i8 %8, -48
%26 = icmp ult i8 %25, 10
br i1 %26, label %27, label %45
27: ; preds = %24, %22, %17
%28 = phi i8 [ %18, %17 ], [ %23, %22 ], [ %25, %24 ]
%29 = add i8 %12, -97
%30 = icmp ult i8 %29, 6
br i1 %30, label %31, label %33
31: ; preds = %27
%32 = add nsw i8 %12, -87
br label %41
33: ; preds = %27
%34 = add i8 %12, -65
%35 = icmp ult i8 %34, 6
br i1 %35, label %36, label %38
36: ; preds = %33
%37 = add nsw i8 %12, -55
br label %41
38: ; preds = %33
%39 = add i8 %12, -48
%40 = icmp ult i8 %39, 10
br i1 %40, label %41, label %45
41: ; preds = %38, %31, %36
%42 = phi i8 [ %32, %31 ], [ %37, %36 ], [ %39, %38 ]
%43 = shl nuw i8 %28, 4
%44 = add nuw i8 %42, %43
br label %45
45: ; preds = %10, %6, %2, %24, %38, %41
%46 = phi i8 [ %44, %41 ], [ 37, %38 ], [ 37, %24 ], [ %5, %2 ], [ 37, %6 ], [ 37, %10 ]
%47 = phi i8* [ %11, %41 ], [ %3, %38 ], [ %3, %24 ], [ %3, %2 ], [ %3, %6 ], [ %3, %10 ]
store i8 %46, i8* %4
%48 = getelementptr inbounds i8, i8* %47, i64 1
%49 = getelementptr inbounds i8, i8* %4, i64 1
br label %2
50: ; preds = %2
store i8 0, i8* %4
ret void
}