#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 */
void construct_mic_header2(unsigned char *mic_header2, unsigned char *mpdu,
                           int a4_exists, int qc_exists) {
  int i;
  for (i = 0; i < 16; i++)
    mic_header2[i] = 0x00;
  mic_header2[0] = mpdu[16];
  mic_header2[1] = mpdu[17];
  mic_header2[2] = mpdu[18];
  mic_header2[3] = mpdu[19];
  mic_header2[4] = mpdu[20];
  mic_header2[5] = mpdu[21];
  mic_header2[6] = mpdu[22] & 0x0f;
  mic_header2[7] = 0x00;
  if ((!qc_exists) & a4_exists) {
    for (i = 0; i < 6; i++)
      mic_header2[8 + i] = mpdu[24 + i];
  }
  if (qc_exists && (!a4_exists)) {
    mic_header2[8] = mpdu[24] & 0x0f;
    mic_header2[9] = mpdu[25] & 0x00;
  }
  if (qc_exists && a4_exists) {
    for (i = 0; i < 6; i++)
      mic_header2[8 + i] = mpdu[24 + i];
    mic_header2[14] = mpdu[30] & 0x0f;
    mic_header2[15] = mpdu[31] & 0x00;
  }
}


x86 assembly (clang, -O0):
<construct_mic_header2>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x10,-0x1c(%rbp)
jge    113d <construct_mic_header2+0x3d>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1119 <construct_mic_header2+0x19>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    0x11(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x10(%rbp),%rax
mov    0x12(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x10(%rbp),%rax
mov    0x13(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x10(%rbp),%rax
mov    0x14(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x4(%rax)
mov    -0x10(%rbp),%rax
mov    0x15(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x16(%rax),%eax
and    $0xf,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x6(%rax)
mov    -0x8(%rbp),%rax
movb   $0x0,0x7(%rax)
cmpl   $0x0,-0x18(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
and    -0x14(%rbp),%eax
cmp    $0x0,%eax
je     120a <construct_mic_header2+0x10a>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x6,-0x1c(%rbp)
jge    1205 <construct_mic_header2+0x105>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x18,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x8,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11cd <construct_mic_header2+0xcd>
jmp    120a <construct_mic_header2+0x10a>
cmpl   $0x0,-0x18(%rbp)
je     1246 <construct_mic_header2+0x146>
cmpl   $0x0,-0x14(%rbp)
jne    1246 <construct_mic_header2+0x146>
mov    -0x10(%rbp),%rax
movzbl 0x18(%rax),%eax
and    $0xf,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x8(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x19(%rax),%eax
and    $0x0,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x9(%rax)
cmpl   $0x0,-0x18(%rbp)
je     12c1 <construct_mic_header2+0x1c1>
cmpl   $0x0,-0x14(%rbp)
je     12c1 <construct_mic_header2+0x1c1>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x6,-0x1c(%rbp)
jge    1299 <construct_mic_header2+0x199>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x18,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x8,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1261 <construct_mic_header2+0x161>
mov    -0x10(%rbp),%rax
movzbl 0x1e(%rax),%eax
and    $0xf,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xe(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x1f(%rax),%eax
and    $0x0,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xf(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<construct_mic_header2>:
xorps  %xmm0,%xmm0
movups %xmm0,(%rdi)
mov    0x10(%rsi),%al
mov    %al,(%rdi)
mov    0x11(%rsi),%al
mov    %al,0x1(%rdi)
mov    0x12(%rsi),%al
mov    %al,0x2(%rdi)
mov    0x13(%rsi),%al
mov    %al,0x3(%rdi)
mov    0x14(%rsi),%al
mov    %al,0x4(%rdi)
mov    0x15(%rsi),%al
mov    %al,0x5(%rdi)
mov    0x16(%rsi),%al
and    $0xf,%al
mov    %al,0x6(%rdi)
movb   $0x0,0x7(%rdi)
xor    %eax,%eax
test   %ecx,%ecx
sete   %al
test   %edx,%eax
je     1164 <construct_mic_header2+0x64>
mov    0x18(%rsi),%al
mov    %al,0x8(%rdi)
mov    0x19(%rsi),%al
mov    %al,0x9(%rdi)
mov    0x1a(%rsi),%al
mov    %al,0xa(%rdi)
mov    0x1b(%rsi),%al
mov    %al,0xb(%rdi)
mov    0x1c(%rsi),%al
mov    %al,0xc(%rdi)
mov    0x1d(%rsi),%al
mov    %al,0xd(%rdi)
test   %edx,%edx
jne    1178 <construct_mic_header2+0x78>
test   %ecx,%ecx
je     1178 <construct_mic_header2+0x78>
mov    0x18(%rsi),%al
and    $0xf,%al
mov    %al,0x8(%rdi)
movb   $0x0,0x9(%rdi)
test   %edx,%edx
je     11b0 <construct_mic_header2+0xb0>
test   %ecx,%ecx
je     11b0 <construct_mic_header2+0xb0>
mov    0x18(%rsi),%al
mov    %al,0x8(%rdi)
mov    0x19(%rsi),%al
mov    %al,0x9(%rdi)
mov    0x1a(%rsi),%al
mov    %al,0xa(%rdi)
mov    0x1b(%rsi),%al
mov    %al,0xb(%rdi)
mov    0x1c(%rsi),%al
mov    %al,0xc(%rdi)
mov    0x1d(%rsi),%al
mov    %al,0xd(%rdi)
mov    0x1e(%rsi),%al
and    $0xf,%al
mov    %al,0xe(%rdi)
movb   $0x0,0xf(%rdi)
ret

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

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