#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 u_int;
typedef int u_char;
typedef int int32_t;

/* Variables and functions */
int osi_cksum(register const u_char *p, register u_int len, const u_char *toff,
              u_char *cksum, u_char *off) {
  int x, y, f = (len - ((toff - p) + 1));
  int32_t c0 = 0, c1 = 0;
  if ((cksum[0] = off[0]) == 0 && (cksum[1] = off[1]) == 0)
    return 0;
  off[0] = off[1] = 0;
  while ((int)--len >= 0) {
    c0 += *p++;
    c1 += c0;
    c0 %= 255;
    c1 %= 255;
  }
  x = (c0 * f - c1);
  if (x < 0)
    x = 255 - (-x % 255);
  else
    x %= 255;
  y = -1 * (x + c0);
  if (y < 0)
    y = 255 - (-y % 255);
  else
    y %= 255;
  off[0] = x;
  off[1] = y;
  return (off[0] != cksum[0] || off[1] != cksum[1]);
}


x86 assembly (clang, -O0):
<osi_cksum>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
movslq -0x14(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    -0x10(%rbp),%rdx
sub    %rdx,%rcx
sar    $0x2,%rcx
add    $0x1,%rcx
sub    %rcx,%rax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
mov    -0x28(%rbp),%rcx
mov    %eax,(%rcx)
cmp    $0x0,%eax
jne    117a <osi_cksum+0x7a>
mov    -0x30(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x28(%rbp),%rcx
mov    %eax,0x4(%rcx)
cmp    $0x0,%eax
jne    117a <osi_cksum+0x7a>
movl   $0x0,-0x4(%rbp)
jmp    12af <osi_cksum+0x1af>
mov    -0x30(%rbp),%rax
movl   $0x0,0x4(%rax)
mov    -0x30(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jl     11e2 <osi_cksum+0xe2>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
add    -0x40(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x40(%rbp),%eax
mov    $0xff,%ecx
cltd
idiv   %ecx
mov    %edx,-0x40(%rbp)
mov    -0x44(%rbp),%eax
mov    $0xff,%ecx
cltd
idiv   %ecx
mov    %edx,-0x44(%rbp)
jmp    118f <osi_cksum+0x8f>
mov    -0x40(%rbp),%eax
imul   -0x3c(%rbp),%eax
sub    -0x44(%rbp),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jge    1215 <osi_cksum+0x115>
xor    %eax,%eax
sub    -0x34(%rbp),%eax
mov    $0xff,%ecx
cltd
idiv   %ecx
mov    $0xff,%eax
sub    %edx,%eax
mov    %eax,-0x34(%rbp)
jmp    1223 <osi_cksum+0x123>
mov    -0x34(%rbp),%eax
mov    $0xff,%ecx
cltd
idiv   %ecx
mov    %edx,-0x34(%rbp)
mov    -0x34(%rbp),%eax
add    -0x40(%rbp),%eax
imul   $0xffffffff,%eax,%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x38(%rbp)
jge    1258 <osi_cksum+0x158>
xor    %eax,%eax
sub    -0x38(%rbp),%eax
mov    $0xff,%ecx
cltd
idiv   %ecx
mov    $0xff,%eax
sub    %edx,%eax
mov    %eax,-0x38(%rbp)
jmp    1266 <osi_cksum+0x166>
mov    -0x38(%rbp),%eax
mov    $0xff,%ecx
cltd
idiv   %ecx
mov    %edx,-0x38(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x38(%rbp),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%ecx
mov    -0x28(%rbp),%rdx
mov    $0x1,%al
cmp    (%rdx),%ecx
mov    %al,-0x45(%rbp)
jne    12a4 <osi_cksum+0x1a4>
mov    -0x30(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    0x4(%rcx),%eax
setne  %al
mov    %al,-0x45(%rbp)
mov    -0x45(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<osi_cksum>:
push   %rbx
mov    (%r8),%eax
mov    %eax,(%rcx)
test   %eax,%eax
jne    1119 <osi_cksum+0x19>
mov    0x4(%r8),%eax
mov    %eax,0x4(%rcx)
test   %eax,%eax
je     1314 <osi_cksum+0x214>
sub    %rdi,%rdx
shr    $0x2,%rdx
not    %edx
add    %esi,%edx
movq   $0x0,(%r8)
test   %esi,%esi
jle    113e <osi_cksum+0x3e>
cmp    $0x1,%esi
jne    1148 <osi_cksum+0x48>
xor    %eax,%eax
xor    %r9d,%r9d
jmp    1219 <osi_cksum+0x119>
xor    %r9d,%r9d
xor    %eax,%eax
jmp    1272 <osi_cksum+0x172>
mov    %esi,%r10d
and    $0xfffffffe,%r10d
xor    %eax,%eax
xor    %r9d,%r9d
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    (%rdi),%r9d
add    %r9d,%eax
movslq %r9d,%r11
imul   $0xffffffff80808081,%r11,%r9
shr    $0x20,%r9
add    %r11d,%r9d
mov    %r9d,%ebx
shr    $0x1f,%ebx
sar    $0x7,%r9d
add    %ebx,%r9d
mov    %r9d,%ebx
shl    $0x8,%ebx
sub    %ebx,%r9d
add    %r11d,%r9d
movslq %eax,%r11
imul   $0xffffffff80808081,%r11,%rax
shr    $0x20,%rax
add    %r11d,%eax
mov    %eax,%ebx
shr    $0x1f,%ebx
sar    $0x7,%eax
add    %ebx,%eax
mov    %eax,%ebx
shl    $0x8,%ebx
sub    %ebx,%eax
add    0x4(%rdi),%r9d
add    %r11d,%eax
add    $0x8,%rdi
add    %r9d,%eax
movslq %r9d,%r11
imul   $0xffffffff80808081,%r11,%r9
shr    $0x20,%r9
add    %r11d,%r9d
mov    %r9d,%ebx
shr    $0x1f,%ebx
sar    $0x7,%r9d
add    %ebx,%r9d
mov    %r9d,%ebx
shl    $0x8,%ebx
sub    %ebx,%r9d
add    %r11d,%r9d
movslq %eax,%r11
imul   $0xffffffff80808081,%r11,%rax
shr    $0x20,%rax
add    %r11d,%eax
mov    %eax,%ebx
shr    $0x1f,%ebx
sar    $0x7,%eax
add    %ebx,%eax
mov    %eax,%ebx
shl    $0x8,%ebx
sub    %ebx,%eax
add    %r11d,%eax
add    $0xfffffffe,%r10d
jne    1160 <osi_cksum+0x60>
test   $0x1,%sil
je     1272 <osi_cksum+0x172>
add    (%rdi),%r9d
add    %r9d,%eax
movslq %r9d,%rsi
imul   $0xffffffff80808081,%rsi,%r9
shr    $0x20,%r9
add    %esi,%r9d
mov    %r9d,%edi
shr    $0x1f,%edi
sar    $0x7,%r9d
add    %edi,%r9d
mov    %r9d,%edi
shl    $0x8,%edi
sub    %edi,%r9d
add    %esi,%r9d
movslq %eax,%rsi
imul   $0xffffffff80808081,%rsi,%rax
shr    $0x20,%rax
add    %esi,%eax
mov    %eax,%edi
shr    $0x1f,%edi
sar    $0x7,%eax
add    %edi,%eax
mov    %eax,%edi
shl    $0x8,%edi
sub    %edi,%eax
add    %esi,%eax
imul   %r9d,%edx
sub    %eax,%edx
js     12b9 <osi_cksum+0x1b9>
mov    %edx,%eax
mov    $0x80808081,%esi
imul   %rax,%rsi
shr    $0x27,%rsi
mov    %esi,%eax
shl    $0x8,%eax
sub    %eax,%esi
add    %edx,%esi
add    %esi,%r9d
jle    12de <osi_cksum+0x1de>
mov    %r9d,%eax
mov    $0x80808081,%edx
imul   %rax,%rdx
shr    $0x27,%rdx
mov    %edx,%eax
shl    $0x8,%eax
sub    %eax,%edx
add    %r9d,%edx
xor    $0xff,%edx
jmp    12fa <osi_cksum+0x1fa>
mov    %edx,%eax
neg    %eax
mov    $0x80808081,%esi
imul   %rax,%rsi
shr    $0x27,%rsi
mov    %esi,%eax
shl    $0x8,%eax
sub    %eax,%esi
sub    %edx,%esi
xor    $0xff,%esi
add    %esi,%r9d
jg     1297 <osi_cksum+0x197>
mov    %r9d,%eax
neg    %eax
mov    $0x80808081,%edx
imul   %rax,%rdx
shr    $0x27,%rdx
mov    %edx,%eax
shl    $0x8,%eax
sub    %eax,%edx
sub    %r9d,%edx
mov    %esi,(%r8)
mov    %edx,0x4(%r8)
mov    $0x1,%eax
cmp    (%rcx),%esi
jne    1312 <osi_cksum+0x212>
xor    %eax,%eax
cmp    0x4(%rcx),%edx
setne  %al
pop    %rbx
ret
xor    %eax,%eax
pop    %rbx
ret

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

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