int check_ax25_addr(unsigned char *buf) {
  int k;
  unsigned char c;
  for (k = 0; k < 6; k++) {
    c = buf[k] >> 1;
    if (c == ' ')
      break;
    if ((c < 'A' || c > 'Z') && (c < '0' || c > '9'))
      return 1;
  }
  if (k == 0)
    return 1;
  for (k++; k < 6; k++)
    if (buf[k] >> 1 != ' ')
      return 1;
  return 0;
}


x86 assembly (clang, -O0):
<check_ax25_addr>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x6,-0x14(%rbp)
jge    1190 <check_ax25_addr+0x90>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sar    $0x1,%eax
mov    %al,-0x15(%rbp)
movzbl -0x15(%rbp),%eax
cmp    $0x20,%eax
jne    113d <check_ax25_addr+0x3d>
jmp    1190 <check_ax25_addr+0x90>
movzbl -0x15(%rbp),%eax
cmp    $0x41,%eax
jl     1157 <check_ax25_addr+0x57>
movzbl -0x15(%rbp),%eax
cmp    $0x5a,%eax
jle    117d <check_ax25_addr+0x7d>
movzbl -0x15(%rbp),%eax
cmp    $0x30,%eax
jl     1171 <check_ax25_addr+0x71>
movzbl -0x15(%rbp),%eax
cmp    $0x39,%eax
jle    117d <check_ax25_addr+0x7d>
movl   $0x1,-0x4(%rbp)
jmp    11f7 <check_ax25_addr+0xf7>
jmp    1182 <check_ax25_addr+0x82>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <check_ax25_addr+0xf>
cmpl   $0x0,-0x14(%rbp)
jne    11a6 <check_ax25_addr+0xa6>
movl   $0x1,-0x4(%rbp)
jmp    11f7 <check_ax25_addr+0xf7>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x6,-0x14(%rbp)
jge    11f0 <check_ax25_addr+0xf0>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sar    $0x1,%eax
cmp    $0x20,%eax
je     11dd <check_ax25_addr+0xdd>
movl   $0x1,-0x4(%rbp)
jmp    11f7 <check_ax25_addr+0xf7>
jmp    11e2 <check_ax25_addr+0xe2>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11af <check_ax25_addr+0xaf>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_ax25_addr>:
mov    (%rdi),%cl
mov    %ecx,%edx
and    $0xfe,%dl
mov    $0x1,%eax
cmp    $0x40,%dl
je     1121 <check_ax25_addr+0x21>
lea    0x4a(%rcx),%edx
cmp    $0xcb,%dl
ja     1122 <check_ax25_addr+0x22>
add    $0x8c,%cl
cmp    $0xec,%cl
jae    1122 <check_ax25_addr+0x22>
ret
mov    0x1(%rdi),%dl
mov    %edx,%eax
and    $0xfe,%al
mov    $0x1,%ecx
cmp    $0x40,%al
jne    1160 <check_ax25_addr+0x60>
mov    %ecx,%eax
cmp    $0x6,%ecx
mov    $0x5,%edx
cmovae %ecx,%edx
nop
cmp    %rax,%rdx
je     122b <check_ax25_addr+0x12b>
movzbl 0x1(%rdi,%rax,1),%ecx
and    $0xfe,%cl
add    $0x1,%rax
cmp    $0x40,%cl
je     1140 <check_ax25_addr+0x40>
mov    $0x1,%eax
ret
lea    0x4a(%rdx),%ecx
mov    $0x1,%eax
cmp    $0xcb,%cl
ja     1175 <check_ax25_addr+0x75>
add    $0x8c,%dl
cmp    $0xec,%dl
jb     1121 <check_ax25_addr+0x21>
mov    0x2(%rdi),%sil
mov    %esi,%edx
and    $0xfe,%dl
mov    $0x2,%ecx
cmp    $0x40,%dl
je     1132 <check_ax25_addr+0x32>
lea    0x4a(%rsi),%ecx
cmp    $0xcb,%cl
ja     119a <check_ax25_addr+0x9a>
add    $0x8c,%sil
cmp    $0xec,%sil
jb     1121 <check_ax25_addr+0x21>
mov    0x3(%rdi),%sil
mov    %esi,%edx
and    $0xfe,%dl
mov    $0x3,%ecx
cmp    $0x40,%dl
je     1132 <check_ax25_addr+0x32>
lea    0x4a(%rsi),%ecx
cmp    $0xcb,%cl
ja     11c3 <check_ax25_addr+0xc3>
add    $0x8c,%sil
cmp    $0xec,%sil
jb     1121 <check_ax25_addr+0x21>
mov    0x4(%rdi),%sil
mov    %esi,%edx
and    $0xfe,%dl
mov    $0x4,%ecx
cmp    $0x40,%dl
je     1132 <check_ax25_addr+0x32>
lea    0x4a(%rsi),%ecx
cmp    $0xcb,%cl
ja     11f0 <check_ax25_addr+0xf0>
add    $0x8c,%sil
cmp    $0xec,%sil
jb     1121 <check_ax25_addr+0x21>
mov    0x5(%rdi),%sil
mov    %esi,%edx
and    $0xfe,%dl
mov    $0x5,%ecx
cmp    $0x40,%dl
je     1132 <check_ax25_addr+0x32>
lea    0x4a(%rsi),%edx
mov    $0x6,%ecx
cmp    $0xcb,%dl
ja     1132 <check_ax25_addr+0x32>
add    $0x8c,%sil
cmp    $0xec,%sil
jb     1121 <check_ax25_addr+0x21>
jmp    1132 <check_ax25_addr+0x32>
xor    %eax,%eax
ret

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

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