#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_16(unsigned short *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_16>:
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_16+0xfd>
cmpq   $0x0,-0x18(%rbp)
je     118d <_getSums_16+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_16+0x88>
movl   $0x0,-0x4(%rbp)
jmp    1204 <_getSums_16+0x104>
jmp    118d <_getSums_16+0x8d>
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0x24(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movzwl (%rax,%rcx,2),%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
movzwl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
mov    -0x2c(%rbp),%edx
imul   -0x24(%rbp),%edx
add    -0x30(%rbp),%edx
movslq %edx,%rdx
movzwl (%rcx,%rdx,2),%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_16+0x42>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_getSums_16>:
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    117f <_getSums_16+0x7f>
add    %r8d,%ebx
imul   %ecx,%r9d
movslq %r8d,%rcx
movslq %r9d,%r9
movslq %ebx,%r8
lea    (%rdi,%r9,2),%rdi
add    %r9,%rdx
jmp    1172 <_getSums_16+0x72>
nop
movzwl (%rdi,%rcx,2),%ebx
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
addsd  (%r11),%xmm0
movsd  %xmm0,(%r11)
imul   %ebx,%ebx
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
addsd  (%r10),%xmm0
movsd  %xmm0,(%r10)
add    $0x1,%rcx
cmp    %r8,%rcx
jge    117f <_getSums_16+0x7f>
test   %rsi,%rsi
je     1140 <_getSums_16+0x40>
cmpb   $0x0,(%rdx,%rcx,1)
jne    1140 <_getSums_16+0x40>
xor    %eax,%eax
pop    %rbx
ret

LLVM IR (-O0):
define i32 @_getSums_16(i16* %0, i8* %1, i8* %2, i32 %3, i32 %4, i32 %5, i32 %6, double* %7, double* %8) {
%10 = alloca i32
%11 = alloca i16*
%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 i16* %0, i16** %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 i16*, i16** %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 i16, i16* %48, i64 %54
%56 = load i16, i16* %55
%57 = zext i16 %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 i16*, i16** %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 i16, i16* %62, i64 %68
%70 = load i16, i16* %69
%71 = zext i16 %70 to i32
%72 = load i16*, i16** %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 i16, i16* %72, i64 %78
%80 = load i16, i16* %79
%81 = zext i16 %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_16(i16* 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 %38
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 ], [ %36, %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 %38, label %25
25: ; preds = %18, %21
%26 = getelementptr inbounds i16, i16* %0, i64 %20
%27 = load i16, i16* %26
%28 = uitofp i16 %27 to double
%29 = load double, double* %7
%30 = fadd double %29, %28
store double %30, double* %7
%31 = zext i16 %27 to i32
%32 = mul nuw nsw i32 %31, %31
%33 = sitofp i32 %32 to double
%34 = load double, double* %8
%35 = fadd double %34, %33
store double %35, double* %8
%36 = add nsw i64 %19, 1
%37 = icmp slt i64 %36, %17
br i1 %37, label %18, label %38
38: ; preds = %21, %25, %9
%39 = phi i32 [ 1, %9 ], [ 1, %25 ], [ 0, %21 ]
ret i32 %39
}