#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*/ is_delim(char);
int read_byte(char *, unsigned char *);
int read_mac(char *arg, unsigned char *macaddr) {
  char *p = arg;
  int i, n;
  i = 0;
  n = read_byte(p, &macaddr[0]);
  if (n == 0)
    return -1;
  p += n;
  if (!is_delim(*p))
    return -1;
  p++;
  n = read_byte(p, &macaddr[1]);
  if (n == 0)
    return -1;
  p += n;
  if (!is_delim(*p))
    return -1;
  p++;
  n = read_byte(p, &macaddr[2]);
  if (n == 0)
    return -1;
  p += n;
  if (!is_delim(*p))
    return -1;
  p++;
  n = read_byte(p, &macaddr[3]);
  if (n == 0)
    return -1;
  p += n;
  if (!is_delim(*p))
    return -1;
  p++;
  n = read_byte(p, &macaddr[4]);
  if (n == 0)
    return -1;
  p += n;
  if (!is_delim(*p))
    return -1;
  p++;
  n = read_byte(p, &macaddr[5]);
  if (n == 0)
    return -1;
  p += n;
  if (*p != '\0')
    return -1;
  return 0;
}


x86 assembly (clang, -O0):
<read_mac>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1030 <read_byte@plt>
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    1165 <read_mac+0x45>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%edi
call   1040 <is_delim@plt>
cmp    $0x0,%eax
jne    1197 <read_mac+0x77>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x1,%rsi
call   1030 <read_byte@plt>
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    11cd <read_mac+0xad>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%edi
call   1040 <is_delim@plt>
cmp    $0x0,%eax
jne    11ff <read_mac+0xdf>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x2,%rsi
call   1030 <read_byte@plt>
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    1235 <read_mac+0x115>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%edi
call   1040 <is_delim@plt>
cmp    $0x0,%eax
jne    1267 <read_mac+0x147>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x3,%rsi
call   1030 <read_byte@plt>
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    129d <read_mac+0x17d>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%edi
call   1040 <is_delim@plt>
cmp    $0x0,%eax
jne    12cf <read_mac+0x1af>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x4,%rsi
call   1030 <read_byte@plt>
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    1305 <read_mac+0x1e5>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%edi
call   1040 <is_delim@plt>
cmp    $0x0,%eax
jne    1337 <read_mac+0x217>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x5,%rsi
call   1030 <read_byte@plt>
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    136d <read_mac+0x24d>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     139a <read_mac+0x27a>
movl   $0xffffffff,-0x4(%rbp)
jmp    13a1 <read_mac+0x281>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<read_mac>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r15
mov    %rdi,%rbx
call   1030 <read_byte@plt>
mov    $0xffffffff,%r14d
test   %eax,%eax
je     1220 <read_mac+0x100>
movslq %eax,%rbp
movsbl (%rbx,%rbp,1),%edi
call   1040 <is_delim@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
add    %rbp,%rbx
add    $0x1,%rbx
lea    0x1(%r15),%rsi
mov    %rbx,%rdi
call   1030 <read_byte@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
movslq %eax,%rbp
movsbl (%rbx,%rbp,1),%edi
call   1040 <is_delim@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
add    %rbp,%rbx
add    $0x1,%rbx
lea    0x2(%r15),%rsi
mov    %rbx,%rdi
call   1030 <read_byte@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
movslq %eax,%rbp
movsbl (%rbx,%rbp,1),%edi
call   1040 <is_delim@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
add    %rbp,%rbx
add    $0x1,%rbx
lea    0x3(%r15),%rsi
mov    %rbx,%rdi
call   1030 <read_byte@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
movslq %eax,%rbp
movsbl (%rbx,%rbp,1),%edi
call   1040 <is_delim@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
add    %rbp,%rbx
add    $0x1,%rbx
lea    0x4(%r15),%rsi
mov    %rbx,%rdi
call   1030 <read_byte@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
movslq %eax,%rbp
movsbl (%rbx,%rbp,1),%edi
call   1040 <is_delim@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
add    %rbp,%rbx
add    $0x1,%rbx
add    $0x5,%r15
mov    %rbx,%rdi
mov    %r15,%rsi
call   1030 <read_byte@plt>
test   %eax,%eax
je     1220 <read_mac+0x100>
cltq
xor    %ecx,%ecx
cmp    (%rbx,%rax,1),%cl
sbb    %r14d,%r14d
mov    %r14d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @read_mac(i8* %0, i8* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %4
store i8* %1, i8** %5
%9 = load i8*, i8** %4
store i8* %9, i8** %6
store i32 0, i32* %7
%10 = load i8*, i8** %6
%11 = load i8*, i8** %5
%12 = getelementptr inbounds i8, i8* %11, i64 0
%13 = call i32 @read_byte(i8* %10, i8* %12)
store i32 %13, i32* %8
%14 = load i32, i32* %8
%15 = icmp eq i32 %14, 0
br i1 %15, label %16, label %17
16: ; preds = %2
store i32 -1, i32* %3
br label %128
17: ; preds = %2
%18 = load i32, i32* %8
%19 = load i8*, i8** %6
%20 = sext i32 %18 to i64
%21 = getelementptr inbounds i8, i8* %19, i64 %20
store i8* %21, i8** %6
%22 = load i8*, i8** %6
%23 = load i8, i8* %22
%24 = call i32 @is_delim(i8 signext %23)
%25 = icmp ne i32 %24, 0
br i1 %25, label %27, label %26
26: ; preds = %17
store i32 -1, i32* %3
br label %128
27: ; preds = %17
%28 = load i8*, i8** %6
%29 = getelementptr inbounds i8, i8* %28, i32 1
store i8* %29, i8** %6
%30 = load i8*, i8** %6
%31 = load i8*, i8** %5
%32 = getelementptr inbounds i8, i8* %31, i64 1
%33 = call i32 @read_byte(i8* %30, i8* %32)
store i32 %33, i32* %8
%34 = load i32, i32* %8
%35 = icmp eq i32 %34, 0
br i1 %35, label %36, label %37
36: ; preds = %27
store i32 -1, i32* %3
br label %128
37: ; preds = %27
%38 = load i32, i32* %8
%39 = load i8*, i8** %6
%40 = sext i32 %38 to i64
%41 = getelementptr inbounds i8, i8* %39, i64 %40
store i8* %41, i8** %6
%42 = load i8*, i8** %6
%43 = load i8, i8* %42
%44 = call i32 @is_delim(i8 signext %43)
%45 = icmp ne i32 %44, 0
br i1 %45, label %47, label %46
46: ; preds = %37
store i32 -1, i32* %3
br label %128
47: ; preds = %37
%48 = load i8*, i8** %6
%49 = getelementptr inbounds i8, i8* %48, i32 1
store i8* %49, i8** %6
%50 = load i8*, i8** %6
%51 = load i8*, i8** %5
%52 = getelementptr inbounds i8, i8* %51, i64 2
%53 = call i32 @read_byte(i8* %50, i8* %52)
store i32 %53, i32* %8
%54 = load i32, i32* %8
%55 = icmp eq i32 %54, 0
br i1 %55, label %56, label %57
56: ; preds = %47
store i32 -1, i32* %3
br label %128
57: ; preds = %47
%58 = load i32, i32* %8
%59 = load i8*, i8** %6
%60 = sext i32 %58 to i64
%61 = getelementptr inbounds i8, i8* %59, i64 %60
store i8* %61, i8** %6
%62 = load i8*, i8** %6
%63 = load i8, i8* %62
%64 = call i32 @is_delim(i8 signext %63)
%65 = icmp ne i32 %64, 0
br i1 %65, label %67, label %66
66: ; preds = %57
store i32 -1, i32* %3
br label %128
67: ; preds = %57
%68 = load i8*, i8** %6
%69 = getelementptr inbounds i8, i8* %68, i32 1
store i8* %69, i8** %6
%70 = load i8*, i8** %6
%71 = load i8*, i8** %5
%72 = getelementptr inbounds i8, i8* %71, i64 3
%73 = call i32 @read_byte(i8* %70, i8* %72)
store i32 %73, i32* %8
%74 = load i32, i32* %8
%75 = icmp eq i32 %74, 0
br i1 %75, label %76, label %77
76: ; preds = %67
store i32 -1, i32* %3
br label %128
77: ; preds = %67
%78 = load i32, i32* %8
%79 = load i8*, i8** %6
%80 = sext i32 %78 to i64
%81 = getelementptr inbounds i8, i8* %79, i64 %80
store i8* %81, i8** %6
%82 = load i8*, i8** %6
%83 = load i8, i8* %82
%84 = call i32 @is_delim(i8 signext %83)
%85 = icmp ne i32 %84, 0
br i1 %85, label %87, label %86
86: ; preds = %77
store i32 -1, i32* %3
br label %128
87: ; preds = %77
%88 = load i8*, i8** %6
%89 = getelementptr inbounds i8, i8* %88, i32 1
store i8* %89, i8** %6
%90 = load i8*, i8** %6
%91 = load i8*, i8** %5
%92 = getelementptr inbounds i8, i8* %91, i64 4
%93 = call i32 @read_byte(i8* %90, i8* %92)
store i32 %93, i32* %8
%94 = load i32, i32* %8
%95 = icmp eq i32 %94, 0
br i1 %95, label %96, label %97
96: ; preds = %87
store i32 -1, i32* %3
br label %128
97: ; preds = %87
%98 = load i32, i32* %8
%99 = load i8*, i8** %6
%100 = sext i32 %98 to i64
%101 = getelementptr inbounds i8, i8* %99, i64 %100
store i8* %101, i8** %6
%102 = load i8*, i8** %6
%103 = load i8, i8* %102
%104 = call i32 @is_delim(i8 signext %103)
%105 = icmp ne i32 %104, 0
br i1 %105, label %107, label %106
106: ; preds = %97
store i32 -1, i32* %3
br label %128
107: ; preds = %97
%108 = load i8*, i8** %6
%109 = getelementptr inbounds i8, i8* %108, i32 1
store i8* %109, i8** %6
%110 = load i8*, i8** %6
%111 = load i8*, i8** %5
%112 = getelementptr inbounds i8, i8* %111, i64 5
%113 = call i32 @read_byte(i8* %110, i8* %112)
store i32 %113, i32* %8
%114 = load i32, i32* %8
%115 = icmp eq i32 %114, 0
br i1 %115, label %116, label %117
116: ; preds = %107
store i32 -1, i32* %3
br label %128
117: ; preds = %107
%118 = load i32, i32* %8
%119 = load i8*, i8** %6
%120 = sext i32 %118 to i64
%121 = getelementptr inbounds i8, i8* %119, i64 %120
store i8* %121, i8** %6
%122 = load i8*, i8** %6
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
%125 = icmp ne i32 %124, 0
br i1 %125, label %126, label %127
126: ; preds = %117
store i32 -1, i32* %3
br label %128
127: ; preds = %117
store i32 0, i32* %3
br label %128
128: ; preds = %127, %126, %116, %106, %96, %86, %76, %66, %56, %46, %36, %26, %16
%129 = load i32, i32* %3
ret i32 %129
}

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