#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 */
typedef int uint8_t;

/* Variables and functions */
int /*<<< orphan*/ data_pkg(int *, int *, int *);
int /*<<< orphan*/ hexdump(int *, int);
int main() {
  uint8_t data[64] = {
      0x97, 0xa8, 0x16, 0x13, 0x33, 0x9d, 0x5b, 0xdc, 0x74, 0xc7, 0x72,
      0xdd, 0xd0, 0xb2, 0x46, 0x46, 0x33, 0xe0, 0x6b, 0xf2, 0x7a, 0x19,
      0x72, 0x19, 0xb5, 0x11, 0xf4, 0x7d, 0xaa, 0x2b, 0x0e, 0x70, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0xa1, 0x05,
      0x1a, 0x77, 0x5c, 0xe9, 0x50, 0x45, 0xc9, 0x88, 0x01};
  uint8_t out[88], pre_calc[24];
  data_pkg(data, out, pre_calc);
  hexdump(pre_calc, 24);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x2d0,%rsp
movl   $0x0,-0x4(%rbp)
lea    -0x110(%rbp),%rdi
lea    0xeb0(%rip),%rsi
mov    $0x100,%edx
call   1040 <memcpy@plt>
lea    -0x110(%rbp),%rdi
lea    -0x270(%rbp),%rsi
lea    -0x2d0(%rbp),%rdx
call   1030 <data_pkg@plt>
lea    -0x2d0(%rbp),%rdi
mov    $0x18,%esi
call   1050 <hexdump@plt>
xor    %eax,%eax
add    $0x2d0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r14
push   %rbx
sub    $0x2c8,%rsp
lea    0xebf(%rip),%rsi
lea    0x60(%rsp),%r14
mov    $0x100,%edx
mov    %r14,%rdi
call   1040 <memcpy@plt>
lea    0x160(%rsp),%rsi
mov    %rsp,%rbx
mov    %r14,%rdi
mov    %rbx,%rdx
call   1030 <data_pkg@plt>
mov    %rbx,%rdi
mov    $0x18,%esi
call   1050 <hexdump@plt>
xor    %eax,%eax
add    $0x2c8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@__const.main.data = [64 x i32] [i32 151, i32 168, i32 22, i32 19, i32 51, i32 157, i32 91, i32 220, i32 116, i32 199, i32 114, i32 221, i32 208, i32 178, i32 70, i32 70, i32 51, i32 224, i32 107, i32 242, i32 122, i32 25, i32 114, i32 25, i32 181, i32 17, i32 244, i32 125, i32 170, i32 43, i32 14, i32 112, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 107, i32 161, i32 5, i32 26, i32 119, i32 92, i32 233, i32 80, i32 69, i32 201, i32 136, i32 1]
define i32 @main() {
%1 = alloca i32
%2 = alloca [64 x i32]
%3 = alloca [88 x i32]
%4 = alloca [24 x i32]
store i32 0, i32* %1
%5 = bitcast [64 x i32]* %2 to i8*
%6 = getelementptr inbounds [64 x i32], [64 x i32]* %2, i64 0, i64 0
%7 = getelementptr inbounds [88 x i32], [88 x i32]* %3, i64 0, i64 0
%8 = getelementptr inbounds [24 x i32], [24 x i32]* %4, i64 0, i64 0
%9 = call i32 @data_pkg(i32* %6, i32* %7, i32* %8)
%10 = getelementptr inbounds [24 x i32], [24 x i32]* %4, i64 0, i64 0
%11 = call i32 @hexdump(i32* %10, i32 24)
ret i32 0
}

LLVM IR (-O2):
@__const.main.data = [64 x i32] [i32 151, i32 168, i32 22, i32 19, i32 51, i32 157, i32 91, i32 220, i32 116, i32 199, i32 114, i32 221, i32 208, i32 178, i32 70, i32 70, i32 51, i32 224, i32 107, i32 242, i32 122, i32 25, i32 114, i32 25, i32 181, i32 17, i32 244, i32 125, i32 170, i32 43, i32 14, i32 112, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 107, i32 161, i32 5, i32 26, i32 119, i32 92, i32 233, i32 80, i32 69, i32 201, i32 136, i32 1]
define i32 @main() {
%1 = alloca [64 x i32]
%2 = alloca [88 x i32]
%3 = alloca [24 x i32]
%4 = bitcast [64 x i32]* %1 to i8*
%5 = bitcast [88 x i32]* %2 to i8*
%6 = bitcast [24 x i32]* %3 to i8*
%7 = getelementptr inbounds [64 x i32], [64 x i32]* %1, i64 0, i64 0
%8 = getelementptr inbounds [88 x i32], [88 x i32]* %2, i64 0, i64 0
%9 = getelementptr inbounds [24 x i32], [24 x i32]* %3, i64 0, i64 0
%10 = call i32 @data_pkg(i32* %7, i32* %8, i32* %9)
%11 = call i32 @hexdump(i32* %9, i32 24)
ret i32 0
}