unsigned short GetProtFeatureValue(char *sw_id) {
  unsigned short features = 0;
  while ((*sw_id) && (sw_id[0] != '['))
    sw_id++;
  if (sw_id == ((void *)0)) {
    (void)0;
    features = -1;
  } else {
    unsigned char i, shifter;
    sw_id += 3;
    for (i = 0, shifter = 12; i < 4; i++, shifter -= 4) {
      if ((sw_id[i] >= '0') && (sw_id[i] <= '9')) {
        features |= (sw_id[i] - '0') << shifter;
      } else if ((sw_id[i] >= 'a') && (sw_id[i] <= 'f')) {
        features |= (sw_id[i] - 'a' + 10) << shifter;
      } else if ((sw_id[i] >= 'A') && (sw_id[i] <= 'F')) {
        features |= (sw_id[i] - 'A' + 10) << shifter;
      } else {
        (void)0;
        return -1;
      }
    }
  }
  return features;
}


x86 assembly (clang, -O0):
<GetProtFeatureValue>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movw   $0x0,-0x12(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x15(%rbp)
je     1133 <GetProtFeatureValue+0x33>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5b,%eax
setne  %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%al
test   $0x1,%al
jne    1143 <GetProtFeatureValue+0x43>
jmp    1154 <GetProtFeatureValue+0x54>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    110e <GetProtFeatureValue+0xe>
cmpq   $0x0,-0x10(%rbp)
jne    116a <GetProtFeatureValue+0x6a>
movw   $0xffff,-0x12(%rbp)
jmp    12b7 <GetProtFeatureValue+0x1b7>
mov    -0x10(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x10(%rbp)
movb   $0x0,-0x13(%rbp)
movb   $0xc,-0x14(%rbp)
movzbl -0x13(%rbp),%eax
cmp    $0x4,%eax
jge    12b2 <GetProtFeatureValue+0x1b2>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11db <GetProtFeatureValue+0xdb>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     11db <GetProtFeatureValue+0xdb>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
movzbl -0x14(%rbp),%ecx
shl    %cl,%eax
mov    %eax,%ecx
movzwl -0x12(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x12(%rbp)
jmp    1296 <GetProtFeatureValue+0x196>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     122e <GetProtFeatureValue+0x12e>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     122e <GetProtFeatureValue+0x12e>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
sub    $0x61,%eax
add    $0xa,%eax
movzbl -0x14(%rbp),%ecx
shl    %cl,%eax
mov    %eax,%ecx
movzwl -0x12(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x12(%rbp)
jmp    1291 <GetProtFeatureValue+0x191>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1281 <GetProtFeatureValue+0x181>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     1281 <GetProtFeatureValue+0x181>
mov    -0x10(%rbp),%rax
movzbl -0x13(%rbp),%ecx
movsbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
add    $0xa,%eax
movzbl -0x14(%rbp),%ecx
shl    %cl,%eax
mov    %eax,%ecx
movzwl -0x12(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x12(%rbp)
jmp    128c <GetProtFeatureValue+0x18c>
movw   $0xffff,-0x2(%rbp)
jmp    12bf <GetProtFeatureValue+0x1bf>
jmp    1291 <GetProtFeatureValue+0x191>
jmp    1296 <GetProtFeatureValue+0x196>
jmp    129b <GetProtFeatureValue+0x19b>
mov    -0x13(%rbp),%al
add    $0x1,%al
mov    %al,-0x13(%rbp)
movzbl -0x14(%rbp),%eax
sub    $0x4,%eax
mov    %al,-0x14(%rbp)
jmp    117e <GetProtFeatureValue+0x7e>
jmp    12b7 <GetProtFeatureValue+0x1b7>
mov    -0x12(%rbp),%ax
mov    %ax,-0x2(%rbp)
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<GetProtFeatureValue>:
push   %rbx
add    $0x6,%rdi
cs nopw 0x0(%rax,%rax,1)
nop
movzbl -0x6(%rdi),%eax
test   %al,%al
je     1122 <GetProtFeatureValue+0x22>
cmp    $0x5b,%al
je     1122 <GetProtFeatureValue+0x22>
add    $0x1,%rdi
jmp    1110 <GetProtFeatureValue+0x10>
movzbl -0x3(%rdi),%r8d
lea    -0x30(%r8),%eax
cmp    $0xa,%al
jae    1133 <GetProtFeatureValue+0x33>
xor    %ecx,%ecx
jmp    115f <GetProtFeatureValue+0x5f>
mov    $0xffff,%ax
lea    -0x41(%r8),%edx
cmp    $0x25,%dl
ja     121c <GetProtFeatureValue+0x11c>
mov    $0x9000,%cx
movzbl %dl,%edx
movabs $0x3f0000003f,%rsi
bt     %rdx,%rsi
jae    121c <GetProtFeatureValue+0x11c>
movzbl -0x2(%rdi),%r9d
lea    -0x30(%r9),%eax
mov    $0xd000,%dx
cmp    $0xa,%al
jb     1192 <GetProtFeatureValue+0x92>
lea    -0x61(%r9),%eax
mov    $0xa900,%dx
cmp    $0x6,%al
jb     1192 <GetProtFeatureValue+0x92>
lea    -0x41(%r9),%esi
mov    $0xffff,%ax
mov    $0xc900,%dx
cmp    $0x5,%sil
ja     121c <GetProtFeatureValue+0x11c>
movsbl -0x1(%rdi),%r11d
lea    -0x30(%r11),%eax
mov    $0xfd00,%r10w
cmp    $0xa,%al
jb     11c4 <GetProtFeatureValue+0xc4>
lea    -0x61(%r11),%eax
mov    $0xfa90,%r10w
cmp    $0x6,%al
jb     11c4 <GetProtFeatureValue+0xc4>
lea    -0x41(%r11),%esi
mov    $0xffff,%ax
mov    $0xfc90,%r10w
cmp    $0x5,%sil
ja     121c <GetProtFeatureValue+0x11c>
movsbl (%rdi),%edi
lea    -0x30(%rdi),%eax
mov    $0xffd0,%si
cmp    $0xa,%al
jb     11ed <GetProtFeatureValue+0xed>
lea    -0x61(%rdi),%eax
mov    $0xffa9,%si
cmp    $0x6,%al
jb     11ed <GetProtFeatureValue+0xed>
lea    -0x41(%rdi),%ebx
mov    $0xffff,%ax
mov    $0xffc9,%si
cmp    $0x5,%bl
ja     121c <GetProtFeatureValue+0x11c>
movzwl %r8w,%eax
shl    $0xc,%eax
add    %eax,%ecx
movzwl %r9w,%eax
shl    $0x8,%eax
add    %eax,%edx
or     %edx,%ecx
movswl %r11w,%eax
shl    $0x4,%eax
movswl %r10w,%edx
add    %eax,%edx
or     %edx,%ecx
movswl %di,%eax
movswl %si,%edx
add    %eax,%edx
or     %edx,%ecx
mov    %ecx,%eax
pop    %rbx
ret

LLVM IR (-O0):
define zeroext i16 @GetProtFeatureValue(i8* %0) {
%2 = alloca i16
%3 = alloca i8*
%4 = alloca i16
%5 = alloca i8
%6 = alloca i8
store i8* %0, i8** %3
store i16 0, i16* %4
br label %7
7: ; preds = %20, %1
%8 = load i8*, i8** %3
%9 = load i8, i8* %8
%10 = sext i8 %9 to i32
%11 = icmp ne i32 %10, 0
br i1 %11, label %12, label %18
12: ; preds = %7
%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 ne i32 %16, 91
br label %18
18: ; preds = %12, %7
%19 = phi i1 [ false, %7 ], [ %17, %12 ]
br i1 %19, label %20, label %23
20: ; preds = %18
%21 = load i8*, i8** %3
%22 = getelementptr inbounds i8, i8* %21, i32 1
store i8* %22, i8** %3
br label %7
23: ; preds = %18
%24 = load i8*, i8** %3
%25 = icmp eq i8* %24, null
br i1 %25, label %26, label %27
26: ; preds = %23
store i16 -1, i16* %4
br label %141
27: ; preds = %23
%28 = load i8*, i8** %3
%29 = getelementptr inbounds i8, i8* %28, i64 3
store i8* %29, i8** %3
store i8 0, i8* %5
store i8 12, i8* %6
br label %30
30: ; preds = %133, %27
%31 = load i8, i8* %5
%32 = zext i8 %31 to i32
%33 = icmp slt i32 %32, 4
br i1 %33, label %34, label %140
34: ; preds = %30
%35 = load i8*, i8** %3
%36 = load i8, i8* %5
%37 = zext i8 %36 to i64
%38 = getelementptr inbounds i8, i8* %35, i64 %37
%39 = load i8, i8* %38
%40 = sext i8 %39 to i32
%41 = icmp sge i32 %40, 48
br i1 %41, label %42, label %65
42: ; preds = %34
%43 = load i8*, i8** %3
%44 = load i8, i8* %5
%45 = zext i8 %44 to i64
%46 = getelementptr inbounds i8, i8* %43, i64 %45
%47 = load i8, i8* %46
%48 = sext i8 %47 to i32
%49 = icmp sle i32 %48, 57
br i1 %49, label %50, label %65
50: ; preds = %42
%51 = load i8*, i8** %3
%52 = load i8, i8* %5
%53 = zext i8 %52 to i64
%54 = getelementptr inbounds i8, i8* %51, i64 %53
%55 = load i8, i8* %54
%56 = sext i8 %55 to i32
%57 = sub nsw i32 %56, 48
%58 = load i8, i8* %6
%59 = zext i8 %58 to i32
%60 = shl i32 %57, %59
%61 = load i16, i16* %4
%62 = zext i16 %61 to i32
%63 = or i32 %62, %60
%64 = trunc i32 %63 to i16
store i16 %64, i16* %4
br label %132
65: ; preds = %42, %34
%66 = load i8*, i8** %3
%67 = load i8, i8* %5
%68 = zext i8 %67 to i64
%69 = getelementptr inbounds i8, i8* %66, i64 %68
%70 = load i8, i8* %69
%71 = sext i8 %70 to i32
%72 = icmp sge i32 %71, 97
br i1 %72, label %73, label %97
73: ; preds = %65
%74 = load i8*, i8** %3
%75 = load i8, i8* %5
%76 = zext i8 %75 to i64
%77 = getelementptr inbounds i8, i8* %74, i64 %76
%78 = load i8, i8* %77
%79 = sext i8 %78 to i32
%80 = icmp sle i32 %79, 102
br i1 %80, label %81, label %97
81: ; preds = %73
%82 = load i8*, i8** %3
%83 = load i8, i8* %5
%84 = zext i8 %83 to i64
%85 = getelementptr inbounds i8, i8* %82, i64 %84
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = sub nsw i32 %87, 97
%89 = add nsw i32 %88, 10
%90 = load i8, i8* %6
%91 = zext i8 %90 to i32
%92 = shl i32 %89, %91
%93 = load i16, i16* %4
%94 = zext i16 %93 to i32
%95 = or i32 %94, %92
%96 = trunc i32 %95 to i16
store i16 %96, i16* %4
br label %131
97: ; preds = %73, %65
%98 = load i8*, i8** %3
%99 = load i8, i8* %5
%100 = zext i8 %99 to i64
%101 = getelementptr inbounds i8, i8* %98, i64 %100
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp sge i32 %103, 65
br i1 %104, label %105, label %129
105: ; preds = %97
%106 = load i8*, i8** %3
%107 = load i8, i8* %5
%108 = zext i8 %107 to i64
%109 = getelementptr inbounds i8, i8* %106, i64 %108
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp sle i32 %111, 70
br i1 %112, label %113, label %129
113: ; preds = %105
%114 = load i8*, i8** %3
%115 = load i8, i8* %5
%116 = zext i8 %115 to i64
%117 = getelementptr inbounds i8, i8* %114, i64 %116
%118 = load i8, i8* %117
%119 = sext i8 %118 to i32
%120 = sub nsw i32 %119, 65
%121 = add nsw i32 %120, 10
%122 = load i8, i8* %6
%123 = zext i8 %122 to i32
%124 = shl i32 %121, %123
%125 = load i16, i16* %4
%126 = zext i16 %125 to i32
%127 = or i32 %126, %124
%128 = trunc i32 %127 to i16
store i16 %128, i16* %4
br label %130
129: ; preds = %105, %97
store i16 -1, i16* %2
br label %143
130: ; preds = %113
br label %131
131: ; preds = %130, %81
br label %132
132: ; preds = %131, %50
br label %133
133: ; preds = %132
%134 = load i8, i8* %5
%135 = add i8 %134, 1
store i8 %135, i8* %5
%136 = load i8, i8* %6
%137 = zext i8 %136 to i32
%138 = sub nsw i32 %137, 4
%139 = trunc i32 %138 to i8
store i8 %139, i8* %6
br label %30
140: ; preds = %30
br label %141
141: ; preds = %140, %26
%142 = load i16, i16* %4
store i16 %142, i16* %2
br label %143
143: ; preds = %141, %129
%144 = load i16, i16* %2
ret i16 %144
}

LLVM IR (-O2):
define zeroext i16 @GetProtFeatureValue(i8* nocapture %0) {
br label %2
2: ; preds = %5, %1
%3 = phi i8* [ %0, %1 ], [ %6, %5 ]
%4 = load i8, i8* %3
switch i8 %4, label %5 [
i8 0, label %7
i8 91, label %7
]
5: ; preds = %2
%6 = getelementptr inbounds i8, i8* %3, i64 1
br label %2
7: ; preds = %2, %2
%8 = getelementptr inbounds i8, i8* %3, i64 3
%9 = load i8, i8* %8
%10 = zext i8 %9 to i16
%11 = add i8 %9, -48
%12 = icmp ult i8 %11, 10
br i1 %12, label %14, label %13
13: ; preds = %7
switch i8 %9, label %65 [
i8 102, label %14
i8 101, label %14
i8 100, label %14
i8 99, label %14
i8 98, label %14
i8 97, label %14
i8 70, label %14
i8 69, label %14
i8 68, label %14
i8 67, label %14
i8 66, label %14
i8 65, label %14
]
14: ; preds = %13, %13, %13, %13, %13, %13, %13, %13, %13, %13, %13, %13, %7
%15 = phi i16 [ 0, %7 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ], [ -28672, %13 ]
%16 = shl i16 %10, 12
%17 = add i16 %16, %15
%18 = getelementptr inbounds i8, i8* %3, i64 4
%19 = load i8, i8* %18
%20 = zext i8 %19 to i16
%21 = add i8 %19, -48
%22 = icmp ult i8 %21, 10
br i1 %22, label %29, label %23
23: ; preds = %14
%24 = add i8 %19, -97
%25 = icmp ult i8 %24, 6
br i1 %25, label %29, label %26
26: ; preds = %23
%27 = add i8 %19, -65
%28 = icmp ult i8 %27, 6
br i1 %28, label %29, label %65
29: ; preds = %14, %23, %26
%30 = phi i16 [ -14080, %26 ], [ -22272, %23 ], [ -12288, %14 ]
%31 = shl nuw i16 %20, 8
%32 = add i16 %31, %30
%33 = or i16 %17, %32
%34 = getelementptr inbounds i8, i8* %3, i64 5
%35 = load i8, i8* %34
%36 = sext i8 %35 to i16
%37 = add i8 %35, -48
%38 = icmp ult i8 %37, 10
br i1 %38, label %45, label %39
39: ; preds = %29
%40 = add i8 %35, -97
%41 = icmp ult i8 %40, 6
br i1 %41, label %45, label %42
42: ; preds = %39
%43 = add i8 %35, -65
%44 = icmp ult i8 %43, 6
br i1 %44, label %45, label %65
45: ; preds = %29, %39, %42
%46 = phi i16 [ -880, %42 ], [ -1392, %39 ], [ -768, %29 ]
%47 = shl nsw i16 %36, 4
%48 = add nsw i16 %47, %46
%49 = or i16 %33, %48
%50 = getelementptr inbounds i8, i8* %3, i64 6
%51 = load i8, i8* %50
%52 = sext i8 %51 to i16
%53 = add i8 %51, -48
%54 = icmp ult i8 %53, 10
br i1 %54, label %61, label %55
55: ; preds = %45
%56 = add i8 %51, -97
%57 = icmp ult i8 %56, 6
br i1 %57, label %61, label %58
58: ; preds = %55
%59 = add i8 %51, -65
%60 = icmp ult i8 %59, 6
br i1 %60, label %61, label %65
61: ; preds = %45, %55, %58
%62 = phi i16 [ -55, %58 ], [ -87, %55 ], [ -48, %45 ]
%63 = add nsw i16 %62, %52
%64 = or i16 %49, %63
br label %65
65: ; preds = %13, %61, %58, %42, %26
%66 = phi i16 [ -1, %26 ], [ -1, %42 ], [ -1, %58 ], [ %64, %61 ], [ -1, %13 ]
ret i16 %66
}