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

/* Variables and functions */
uint32_t update_crc(uint32_t Crc, uint8_t *Buffer, uint32_t Size) {
  Size = Size >> 2;
  while (Size--) {
    static const uint32_t CrcTable[16] = {
        0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B,
        0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
        0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD};
    Crc = Crc ^ *((uint32_t *)Buffer);
    Buffer += 4;
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
    Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  }
  return (Crc);
}


x86 assembly (clang, -O0):
<update_crc>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     1228 <update_crc+0x128>
mov    -0x4(%rbp),%eax
mov    -0x10(%rbp),%rcx
xor    (%rcx),%eax
mov    %eax,-0x4(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xea7(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xe8b(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xe6f(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xe53(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xe37(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xe1b(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xdff(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1c,%ecx
movslq %ecx,%rdx
lea    0xde3(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
jmp    1117 <update_crc+0x17>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<update_crc>:
mov    %edi,%eax
cmp    $0x4,%edx
jb     1197 <update_crc+0x97>
sar    $0x2,%edx
lea    0xeeb(%rip),%rcx
cs nopw 0x0(%rax,%rax,1)
nop
xor    (%rsi),%eax
mov    %eax,%edi
shl    $0x4,%edi
sar    $0x1c,%eax
cltq
xor    (%rcx,%rax,4),%edi
mov    %edi,%eax
shl    $0x4,%eax
sar    $0x1c,%edi
movslq %edi,%rdi
xor    (%rcx,%rdi,4),%eax
mov    %eax,%edi
shl    $0x4,%edi
sar    $0x1c,%eax
cltq
xor    (%rcx,%rax,4),%edi
mov    %edi,%eax
shl    $0x4,%eax
sar    $0x1c,%edi
movslq %edi,%rdi
xor    (%rcx,%rdi,4),%eax
mov    %eax,%edi
shl    $0x4,%edi
sar    $0x1c,%eax
cltq
xor    (%rcx,%rax,4),%edi
mov    %edi,%eax
shl    $0x4,%eax
sar    $0x1c,%edi
movslq %edi,%rdi
xor    (%rcx,%rdi,4),%eax
add    $0x10,%rsi
mov    %eax,%edi
shl    $0x4,%edi
sar    $0x1c,%eax
cltq
xor    (%rcx,%rax,4),%edi
mov    %edi,%eax
shl    $0x4,%eax
sar    $0x1c,%edi
movslq %edi,%rdi
xor    (%rcx,%rdi,4),%eax
add    $0xffffffff,%edx
jne    1120 <update_crc+0x20>
ret

LLVM IR (-O0):
@update_crc.CrcTable = internal constant [16 x i32] [i32 0, i32 79764919, i32 159529838, i32 222504665, i32 319059676, i32 398814059, i32 445009330, i32 507990021, i32 638119352, i32 583659535, i32 797628118, i32 726387553, i32 890018660, i32 835552979, i32 1015980042, i32 944750013]
define i32 @update_crc(i32 %0, i32* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32*
%6 = alloca i32
store i32 %0, i32* %4
store i32* %1, i32** %5
store i32 %2, i32* %6
%7 = load i32, i32* %6
%8 = ashr i32 %7, 2
store i32 %8, i32* %6
br label %9
9: ; preds = %13, %3
%10 = load i32, i32* %6
%11 = add nsw i32 %10, -1
store i32 %11, i32* %6
%12 = icmp ne i32 %10, 0
br i1 %12, label %13, label %84
13: ; preds = %9
%14 = load i32, i32* %4
%15 = load i32*, i32** %5
%16 = load i32, i32* %15
%17 = xor i32 %14, %16
store i32 %17, i32* %4
%18 = load i32*, i32** %5
%19 = getelementptr inbounds i32, i32* %18, i64 4
store i32* %19, i32** %5
%20 = load i32, i32* %4
%21 = shl i32 %20, 4
%22 = load i32, i32* %4
%23 = ashr i32 %22, 28
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %24
%26 = load i32, i32* %25
%27 = xor i32 %21, %26
store i32 %27, i32* %4
%28 = load i32, i32* %4
%29 = shl i32 %28, 4
%30 = load i32, i32* %4
%31 = ashr i32 %30, 28
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %32
%34 = load i32, i32* %33
%35 = xor i32 %29, %34
store i32 %35, i32* %4
%36 = load i32, i32* %4
%37 = shl i32 %36, 4
%38 = load i32, i32* %4
%39 = ashr i32 %38, 28
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %40
%42 = load i32, i32* %41
%43 = xor i32 %37, %42
store i32 %43, i32* %4
%44 = load i32, i32* %4
%45 = shl i32 %44, 4
%46 = load i32, i32* %4
%47 = ashr i32 %46, 28
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %48
%50 = load i32, i32* %49
%51 = xor i32 %45, %50
store i32 %51, i32* %4
%52 = load i32, i32* %4
%53 = shl i32 %52, 4
%54 = load i32, i32* %4
%55 = ashr i32 %54, 28
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %56
%58 = load i32, i32* %57
%59 = xor i32 %53, %58
store i32 %59, i32* %4
%60 = load i32, i32* %4
%61 = shl i32 %60, 4
%62 = load i32, i32* %4
%63 = ashr i32 %62, 28
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %64
%66 = load i32, i32* %65
%67 = xor i32 %61, %66
store i32 %67, i32* %4
%68 = load i32, i32* %4
%69 = shl i32 %68, 4
%70 = load i32, i32* %4
%71 = ashr i32 %70, 28
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %72
%74 = load i32, i32* %73
%75 = xor i32 %69, %74
store i32 %75, i32* %4
%76 = load i32, i32* %4
%77 = shl i32 %76, 4
%78 = load i32, i32* %4
%79 = ashr i32 %78, 28
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %80
%82 = load i32, i32* %81
%83 = xor i32 %77, %82
store i32 %83, i32* %4
br label %9
84: ; preds = %9
%85 = load i32, i32* %4
ret i32 %85
}

LLVM IR (-O2):
@update_crc.CrcTable = internal unnamed_addr constant [16 x i32] [i32 0, i32 79764919, i32 159529838, i32 222504665, i32 319059676, i32 398814059, i32 445009330, i32 507990021, i32 638119352, i32 583659535, i32 797628118, i32 726387553, i32 890018660, i32 835552979, i32 1015980042, i32 944750013]
define i32 @update_crc(i32 %0, i32* nocapture %1, i32 %2) {
%4 = icmp ult i32 %2, 4
br i1 %4, label %64, label %5
5: ; preds = %3
%6 = ashr i32 %2, 2
br label %7
7: ; preds = %5, %7
%8 = phi i32 [ %11, %7 ], [ %6, %5 ]
%9 = phi i32* [ %14, %7 ], [ %1, %5 ]
%10 = phi i32 [ %62, %7 ], [ %0, %5 ]
%11 = add nsw i32 %8, -1
%12 = load i32, i32* %9
%13 = xor i32 %12, %10
%14 = getelementptr inbounds i32, i32* %9, i64 4
%15 = shl i32 %13, 4
%16 = ashr i32 %13, 28
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %17
%19 = load i32, i32* %18
%20 = xor i32 %15, %19
%21 = shl i32 %20, 4
%22 = ashr i32 %20, 28
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %23
%25 = load i32, i32* %24
%26 = xor i32 %21, %25
%27 = shl i32 %26, 4
%28 = ashr i32 %26, 28
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %29
%31 = load i32, i32* %30
%32 = xor i32 %27, %31
%33 = shl i32 %32, 4
%34 = ashr i32 %32, 28
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %35
%37 = load i32, i32* %36
%38 = xor i32 %33, %37
%39 = shl i32 %38, 4
%40 = ashr i32 %38, 28
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %41
%43 = load i32, i32* %42
%44 = xor i32 %39, %43
%45 = shl i32 %44, 4
%46 = ashr i32 %44, 28
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %47
%49 = load i32, i32* %48
%50 = xor i32 %45, %49
%51 = shl i32 %50, 4
%52 = ashr i32 %50, 28
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %53
%55 = load i32, i32* %54
%56 = xor i32 %51, %55
%57 = shl i32 %56, 4
%58 = ashr i32 %56, 28
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds [16 x i32], [16 x i32]* @update_crc.CrcTable, i64 0, i64 %59
%61 = load i32, i32* %60
%62 = xor i32 %57, %61
%63 = icmp eq i32 %11, 0
br i1 %63, label %64, label %7
64: ; preds = %7, %3
%65 = phi i32 [ %0, %3 ], [ %62, %7 ]
ret i32 %65
}