#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 scalar_t__ *p_dim;
typedef size_t j;

/* Variables and functions */
int _getSums_8(unsigned char *p_in_im, unsigned char *mask_im,
               unsigned char *p_mask_im, int p_dim, int i, int j, int winsize,
               double *sum, double *sqrsum) {
  int k;
  *sum = 0.0;
  *sqrsum = 0.0;
  for (k = i; k < (i + winsize); k++) {
    if (mask_im != NULL) {
      if (p_mask_im[((j) * (p_dim) + (k))] == 0)
        return 0;
    }
    *sum += p_in_im[((j) * (p_dim) + (k))];
    *sqrsum += p_in_im[((j) * (p_dim) + (k))] * p_in_im[((j) * (p_dim) + (k))];
  }
  return 1;
}


x86 assembly (clang, -O0):
<_getSums_8>:
push   %rbp
mov    %rsp,%rbp
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%eax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
mov    0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x28(%rbp),%ecx
add    0x10(%rbp),%ecx
cmp    %ecx,%eax
jge    11fd <_getSums_8+0xfd>
cmpq   $0x0,-0x18(%rbp)
je     118d <_getSums_8+0x8d>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0x24(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    1188 <_getSums_8+0x88>
movl   $0x0,-0x4(%rbp)
jmp    1204 <_getSums_8+0x104>
jmp    118d <_getSums_8+0x8d>
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0x24(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
mov    0x18(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0x24(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x2c(%rbp),%edx
imul   -0x24(%rbp),%edx
add    -0x30(%rbp),%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
mov    0x20(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1142 <_getSums_8+0x42>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_getSums_8>:
push   %rbx
mov    0x20(%rsp),%r10
mov    0x18(%rsp),%r11
mov    0x10(%rsp),%ebx
movq   $0x0,(%r11)
movq   $0x0,(%r10)
mov    $0x1,%eax
test   %ebx,%ebx
jle    1183 <_getSums_8+0x83>
add    %r8d,%ebx
imul   %ecx,%r9d
movslq %r8d,%rcx
movslq %r9d,%r9
movslq %ebx,%r8
add    %r9,%rdi
add    %r9,%rdx
jmp    1176 <_getSums_8+0x76>
xchg   %ax,%ax
movzbl (%rdi,%rcx,1),%ebx
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
addsd  (%r11),%xmm0
movsd  %xmm0,(%r11)
movzbl (%rdi,%rcx,1),%ebx
imul   %ebx,%ebx
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
addsd  (%r10),%xmm0
movsd  %xmm0,(%r10)
add    $0x1,%rcx
cmp    %r8,%rcx
jge    1183 <_getSums_8+0x83>
test   %rsi,%rsi
je     1140 <_getSums_8+0x40>
cmpb   $0x0,(%rdx,%rcx,1)
jne    1140 <_getSums_8+0x40>
xor    %eax,%eax
pop    %rbx
ret

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

LLVM IR (-O2):
define i32 @_getSums_8(i8* nocapture %0, i8* readnone %1, i8* nocapture %2, i32 %3, i32 %4, i32 %5, i32 %6, double* nocapture %7, double* nocapture %8) {
store double 0.000000e+00, double* %7
store double 0.000000e+00, double* %8
%10 = icmp sgt i32 %6, 0
br i1 %10, label %11, label %39
11: ; preds = %9
%12 = add nsw i32 %6, %4
%13 = mul nsw i32 %5, %3
%14 = icmp eq i8* %1, null
%15 = sext i32 %4 to i64
%16 = sext i32 %13 to i64
%17 = sext i32 %12 to i64
br label %18
18: ; preds = %11, %25
%19 = phi i64 [ %15, %11 ], [ %37, %25 ]
%20 = add nsw i64 %19, %16
br i1 %14, label %25, label %21
21: ; preds = %18
%22 = getelementptr inbounds i8, i8* %2, i64 %20
%23 = load i8, i8* %22
%24 = icmp eq i8 %23, 0
br i1 %24, label %39, label %25
25: ; preds = %18, %21
%26 = getelementptr inbounds i8, i8* %0, i64 %20
%27 = load i8, i8* %26
%28 = uitofp i8 %27 to double
%29 = load double, double* %7
%30 = fadd double %29, %28
store double %30, double* %7
%31 = load i8, i8* %26
%32 = zext i8 %31 to i32
%33 = mul nuw nsw i32 %32, %32
%34 = sitofp i32 %33 to double
%35 = load double, double* %8
%36 = fadd double %35, %34
store double %36, double* %8
%37 = add nsw i64 %19, 1
%38 = icmp slt i64 %37, %17
br i1 %38, label %18, label %39
39: ; preds = %21, %25, %9
%40 = phi i32 [ 1, %9 ], [ 1, %25 ], [ 0, %21 ]
ret i32 %40
}