#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *, unsigned char *);
unsigned char msg_send(int, unsigned char *, int);
int /*<<< orphan*/ stderr;
int strlen(char *);
unsigned char ANT_SendAcknowledgedDataA(unsigned char chan,
                                        unsigned char *data) {
  unsigned char buf[9];
  int i;
  if (strlen((char *)data) != 16) {
    fprintf(stderr, "Bad data length %s\n", data);
    return 0;
  }
  buf[0] = chan;
  for (i = 0; i < 8; i++)
    buf[1 + i] = ((data[i * 2] >= '0' && data[i * 2] <= '9')
                      ? (data[i * 2] - '0')
                      : ((data[i * 2] & 0xdf) - 'A' + 10)) *
                     16 +
                 ((data[i * 2 + 1] >= '0' && data[i * 2 + 1] <= '9')
                      ? (data[i * 2 + 1] - '0')
                      : ((data[i * 2 + 1] & 0xdf) - 'A' + 10));
  return msg_send(0x4f, buf, 9);
}


x86 assembly (clang, -O0):
<ANT_SendAcknowledgedDataA>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %dil,%al
mov    %al,-0x2(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x10,%eax
je     1176 <ANT_SendAcknowledgedDataA+0x46>
mov    0x2e85(%rip),%rax
mov    (%rax),%edi
mov    -0x10(%rbp),%rdx
lea    0xe98(%rip),%rsi
call   1040 <fprintf@plt>
movb   $0x0,-0x1(%rbp)
jmp    12ba <ANT_SendAcknowledgedDataA+0x18a>
mov    -0x2(%rbp),%al
mov    %al,-0x19(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x8,-0x20(%rbp)
jge    12a4 <ANT_SendAcknowledgedDataA+0x174>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11dd <ANT_SendAcknowledgedDataA+0xad>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     11dd <ANT_SendAcknowledgedDataA+0xad>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %eax,-0x24(%rbp)
jmp    11fc <ANT_SendAcknowledgedDataA+0xcc>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xdf,%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     125e <ANT_SendAcknowledgedDataA+0x12e>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     125e <ANT_SendAcknowledgedDataA+0x12e>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
jmp    1280 <ANT_SendAcknowledgedDataA+0x150>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xdf,%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x2c(%rbp),%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x20(%rbp),%eax
add    $0x1,%eax
cltq
mov    %cl,-0x19(%rbp,%rax,1)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1183 <ANT_SendAcknowledgedDataA+0x53>
lea    -0x19(%rbp),%rsi
mov    $0x4f,%edi
mov    $0x9,%edx
call   1050 <msg_send@plt>
mov    %al,-0x1(%rbp)
movzbl -0x1(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ANT_SendAcknowledgedDataA>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%rbx
mov    %edi,%ebp
mov    %rsi,%rdi
call   1030 <strlen@plt>
cmp    $0x10,%eax
jne    1306 <ANT_SendAcknowledgedDataA+0x1d6>
mov    %bpl,0xf(%rsp)
mov    (%rbx),%al
mov    0x1(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x10(%rsp)
mov    0x2(%rbx),%al
mov    0x3(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x11(%rsp)
mov    0x4(%rbx),%al
mov    0x5(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x12(%rsp)
mov    0x6(%rbx),%al
mov    0x7(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x13(%rsp)
mov    0x8(%rbx),%al
mov    0x9(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x14(%rsp)
mov    0xa(%rbx),%al
mov    0xb(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x15(%rsp)
mov    0xc(%rbx),%al
mov    0xd(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x16(%rsp)
mov    0xe(%rbx),%al
mov    0xf(%rbx),%cl
lea    -0x30(%rax),%edx
xor    %esi,%esi
cmp    $0xa,%dl
setae  %sil
lea    (%rsi,%rsi,8),%edx
add    %al,%dl
shl    $0x4,%dl
lea    -0x30(%rcx),%eax
and    $0xdf,%cl
add    $0xc9,%cl
cmp    $0xa,%al
movzbl %al,%eax
movzbl %cl,%ecx
cmovb  %eax,%ecx
add    %dl,%cl
mov    %cl,0x17(%rsp)
lea    0xf(%rsp),%rsi
mov    $0x4f,%edi
mov    $0x9,%edx
call   1050 <msg_send@plt>
jmp    1320 <ANT_SendAcknowledgedDataA+0x1f0>
mov    0x2cd3(%rip),%rax
mov    (%rax),%edi
lea    0xcea(%rip),%rsi
mov    %rbx,%rdx
call   1040 <fprintf@plt>
xor    %eax,%eax
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
@stderr = global i32 0
@.str = [20 x i8] c"Bad data length %s\0A\00"
define zeroext i8 @ANT_SendAcknowledgedDataA(i8 zeroext %0, i8* %1) {
%3 = alloca i8
%4 = alloca i8
%5 = alloca i8*
%6 = alloca [9 x i8]
%7 = alloca i32
store i8 %0, i8* %4
store i8* %1, i8** %5
%8 = load i8*, i8** %5
%9 = call i32 @strlen(i8* %8)
%10 = icmp ne i32 %9, 16
br i1 %10, label %11, label %15
11: ; preds = %2
%12 = load i32, i32* @stderr
%13 = load i8*, i8** %5
%14 = call i32 @fprintf(i32 %12, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), i8* %13)
store i8 0, i8* %3
br label %117
15: ; preds = %2
%16 = load i8, i8* %4
%17 = getelementptr inbounds [9 x i8], [9 x i8]* %6, i64 0, i64 0
store i8 %16, i8* %17
store i32 0, i32* %7
br label %18
18: ; preds = %111, %15
%19 = load i32, i32* %7
%20 = icmp slt i32 %19, 8
br i1 %20, label %21, label %114
21: ; preds = %18
%22 = load i8*, i8** %5
%23 = load i32, i32* %7
%24 = mul nsw i32 %23, 2
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %22, i64 %25
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = icmp sge i32 %28, 48
br i1 %29, label %30, label %48
30: ; preds = %21
%31 = load i8*, i8** %5
%32 = load i32, i32* %7
%33 = mul nsw i32 %32, 2
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i8, i8* %31, i64 %34
%36 = load i8, i8* %35
%37 = zext i8 %36 to i32
%38 = icmp sle i32 %37, 57
br i1 %38, label %39, label %48
39: ; preds = %30
%40 = load i8*, i8** %5
%41 = load i32, i32* %7
%42 = mul nsw i32 %41, 2
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8, i8* %40, i64 %43
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = sub nsw i32 %46, 48
br label %59
48: ; preds = %30, %21
%49 = load i8*, i8** %5
%50 = load i32, i32* %7
%51 = mul nsw i32 %50, 2
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8, i8* %49, i64 %52
%54 = load i8, i8* %53
%55 = zext i8 %54 to i32
%56 = and i32 %55, 223
%57 = sub nsw i32 %56, 65
%58 = add nsw i32 %57, 10
br label %59
59: ; preds = %48, %39
%60 = phi i32 [ %47, %39 ], [ %58, %48 ]
%61 = mul nsw i32 %60, 16
%62 = load i8*, i8** %5
%63 = load i32, i32* %7
%64 = mul nsw i32 %63, 2
%65 = add nsw i32 %64, 1
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds i8, i8* %62, i64 %66
%68 = load i8, i8* %67
%69 = zext i8 %68 to i32
%70 = icmp sge i32 %69, 48
br i1 %70, label %71, label %91
71: ; preds = %59
%72 = load i8*, i8** %5
%73 = load i32, i32* %7
%74 = mul nsw i32 %73, 2
%75 = add nsw i32 %74, 1
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i8, i8* %72, i64 %76
%78 = load i8, i8* %77
%79 = zext i8 %78 to i32
%80 = icmp sle i32 %79, 57
br i1 %80, label %81, label %91
81: ; preds = %71
%82 = load i8*, i8** %5
%83 = load i32, i32* %7
%84 = mul nsw i32 %83, 2
%85 = add nsw i32 %84, 1
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i8, i8* %82, i64 %86
%88 = load i8, i8* %87
%89 = zext i8 %88 to i32
%90 = sub nsw i32 %89, 48
br label %103
91: ; preds = %71, %59
%92 = load i8*, i8** %5
%93 = load i32, i32* %7
%94 = mul nsw i32 %93, 2
%95 = add nsw i32 %94, 1
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i8, i8* %92, i64 %96
%98 = load i8, i8* %97
%99 = zext i8 %98 to i32
%100 = and i32 %99, 223
%101 = sub nsw i32 %100, 65
%102 = add nsw i32 %101, 10
br label %103
103: ; preds = %91, %81
%104 = phi i32 [ %90, %81 ], [ %102, %91 ]
%105 = add nsw i32 %61, %104
%106 = trunc i32 %105 to i8
%107 = load i32, i32* %7
%108 = add nsw i32 1, %107
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds [9 x i8], [9 x i8]* %6, i64 0, i64 %109
store i8 %106, i8* %110
br label %111
111: ; preds = %103
%112 = load i32, i32* %7
%113 = add nsw i32 %112, 1
store i32 %113, i32* %7
br label %18
114: ; preds = %18
%115 = getelementptr inbounds [9 x i8], [9 x i8]* %6, i64 0, i64 0
%116 = call zeroext i8 @msg_send(i32 79, i8* %115, i32 9)
store i8 %116, i8* %3
br label %117
117: ; preds = %114, %11
%118 = load i8, i8* %3
ret i8 %118
}

LLVM IR (-O2):
@stderr = global i32 0
@.str = [20 x i8] c"Bad data length %s\0A\00"
define zeroext i8 @ANT_SendAcknowledgedDataA(i8 zeroext %0, i8* %1) {
%3 = alloca [9 x i8]
%4 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 0
%5 = tail call i32 @strlen(i8* %1)
%6 = icmp eq i32 %5, 16
br i1 %6, label %10, label %7
7: ; preds = %2
%8 = load i32, i32* @stderr
%9 = tail call i32 @fprintf(i32 %8, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %139
10: ; preds = %2
store i8 %0, i8* %4
%11 = load i8, i8* %1
%12 = add i8 %11, -48
%13 = icmp ult i8 %12, 10
%14 = select i1 %13, i8 0, i8 9
%15 = add i8 %14, %11
%16 = shl i8 %15, 4
%17 = getelementptr inbounds i8, i8* %1, i64 1
%18 = load i8, i8* %17
%19 = add i8 %18, -48
%20 = icmp ult i8 %19, 10
%21 = and i8 %18, -33
%22 = add i8 %21, -55
%23 = select i1 %20, i8 %19, i8 %22
%24 = add i8 %16, %23
%25 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 1
store i8 %24, i8* %25
%26 = getelementptr inbounds i8, i8* %1, i64 2
%27 = load i8, i8* %26
%28 = add i8 %27, -48
%29 = icmp ult i8 %28, 10
%30 = select i1 %29, i8 0, i8 9
%31 = add i8 %30, %27
%32 = shl i8 %31, 4
%33 = getelementptr inbounds i8, i8* %1, i64 3
%34 = load i8, i8* %33
%35 = add i8 %34, -48
%36 = icmp ult i8 %35, 10
%37 = and i8 %34, -33
%38 = add i8 %37, -55
%39 = select i1 %36, i8 %35, i8 %38
%40 = add i8 %32, %39
%41 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 2
store i8 %40, i8* %41
%42 = getelementptr inbounds i8, i8* %1, i64 4
%43 = load i8, i8* %42
%44 = add i8 %43, -48
%45 = icmp ult i8 %44, 10
%46 = select i1 %45, i8 0, i8 9
%47 = add i8 %46, %43
%48 = shl i8 %47, 4
%49 = getelementptr inbounds i8, i8* %1, i64 5
%50 = load i8, i8* %49
%51 = add i8 %50, -48
%52 = icmp ult i8 %51, 10
%53 = and i8 %50, -33
%54 = add i8 %53, -55
%55 = select i1 %52, i8 %51, i8 %54
%56 = add i8 %48, %55
%57 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 3
store i8 %56, i8* %57
%58 = getelementptr inbounds i8, i8* %1, i64 6
%59 = load i8, i8* %58
%60 = add i8 %59, -48
%61 = icmp ult i8 %60, 10
%62 = select i1 %61, i8 0, i8 9
%63 = add i8 %62, %59
%64 = shl i8 %63, 4
%65 = getelementptr inbounds i8, i8* %1, i64 7
%66 = load i8, i8* %65
%67 = add i8 %66, -48
%68 = icmp ult i8 %67, 10
%69 = and i8 %66, -33
%70 = add i8 %69, -55
%71 = select i1 %68, i8 %67, i8 %70
%72 = add i8 %64, %71
%73 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 4
store i8 %72, i8* %73
%74 = getelementptr inbounds i8, i8* %1, i64 8
%75 = load i8, i8* %74
%76 = add i8 %75, -48
%77 = icmp ult i8 %76, 10
%78 = select i1 %77, i8 0, i8 9
%79 = add i8 %78, %75
%80 = shl i8 %79, 4
%81 = getelementptr inbounds i8, i8* %1, i64 9
%82 = load i8, i8* %81
%83 = add i8 %82, -48
%84 = icmp ult i8 %83, 10
%85 = and i8 %82, -33
%86 = add i8 %85, -55
%87 = select i1 %84, i8 %83, i8 %86
%88 = add i8 %80, %87
%89 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 5
store i8 %88, i8* %89
%90 = getelementptr inbounds i8, i8* %1, i64 10
%91 = load i8, i8* %90
%92 = add i8 %91, -48
%93 = icmp ult i8 %92, 10
%94 = select i1 %93, i8 0, i8 9
%95 = add i8 %94, %91
%96 = shl i8 %95, 4
%97 = getelementptr inbounds i8, i8* %1, i64 11
%98 = load i8, i8* %97
%99 = add i8 %98, -48
%100 = icmp ult i8 %99, 10
%101 = and i8 %98, -33
%102 = add i8 %101, -55
%103 = select i1 %100, i8 %99, i8 %102
%104 = add i8 %96, %103
%105 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 6
store i8 %104, i8* %105
%106 = getelementptr inbounds i8, i8* %1, i64 12
%107 = load i8, i8* %106
%108 = add i8 %107, -48
%109 = icmp ult i8 %108, 10
%110 = select i1 %109, i8 0, i8 9
%111 = add i8 %110, %107
%112 = shl i8 %111, 4
%113 = getelementptr inbounds i8, i8* %1, i64 13
%114 = load i8, i8* %113
%115 = add i8 %114, -48
%116 = icmp ult i8 %115, 10
%117 = and i8 %114, -33
%118 = add i8 %117, -55
%119 = select i1 %116, i8 %115, i8 %118
%120 = add i8 %112, %119
%121 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 7
store i8 %120, i8* %121
%122 = getelementptr inbounds i8, i8* %1, i64 14
%123 = load i8, i8* %122
%124 = add i8 %123, -48
%125 = icmp ult i8 %124, 10
%126 = select i1 %125, i8 0, i8 9
%127 = add i8 %126, %123
%128 = shl i8 %127, 4
%129 = getelementptr inbounds i8, i8* %1, i64 15
%130 = load i8, i8* %129
%131 = add i8 %130, -48
%132 = icmp ult i8 %131, 10
%133 = and i8 %130, -33
%134 = add i8 %133, -55
%135 = select i1 %132, i8 %131, i8 %134
%136 = add i8 %128, %135
%137 = getelementptr inbounds [9 x i8], [9 x i8]* %3, i64 0, i64 8
store i8 %136, i8* %137
%138 = call zeroext i8 @msg_send(i32 79, i8* %4, i32 9)
br label %139
139: ; preds = %10, %7
%140 = phi i8 [ 0, %7 ], [ %138, %10 ]
ret i8 %140
}