#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 */

/* Variables and functions */
int t_sqrt(unsigned int);
int irms(short *data, int factor) {
  short *p1, *p2;
  unsigned int sum;
  p2 = (p1 = data) + 40;
  for (sum = 0; p2 > p1; p1++)
    sum += (*p1) * (*p1);
  if (sum == 0)
    return 0;
  return (0x20000000 / (t_sqrt(sum) >> 8)) * factor;
}


x86 assembly (clang, -O0):
<irms>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
add    $0x50,%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jbe    116c <irms+0x5c>
mov    -0x20(%rbp),%rax
movswl (%rax),%eax
mov    -0x20(%rbp),%rcx
movswl (%rcx),%ecx
imul   %ecx,%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
jmp    1136 <irms+0x26>
cmpl   $0x0,-0x2c(%rbp)
jne    1182 <irms+0x72>
movl   $0x0,-0x4(%rbp)
jmp    119e <irms+0x8e>
mov    -0x2c(%rbp),%edi
call   1030 <t_sqrt@plt>
mov    %eax,%ecx
sar    $0x8,%ecx
mov    $0x20000000,%eax
cltd
idiv   %ecx
imul   -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<irms>:
push   %rbx
movq   (%rdi),%xmm0
movq   0x8(%rdi),%xmm1
punpcklwd %xmm0,%xmm1
pmaddwd %xmm1,%xmm1
movq   0x10(%rdi),%xmm2
pxor   %xmm0,%xmm0
punpcklwd %xmm0,%xmm2
pmaddwd %xmm2,%xmm2
paddd  %xmm1,%xmm2
movq   0x18(%rdi),%xmm1
punpcklwd %xmm0,%xmm1
pmaddwd %xmm1,%xmm1
movq   0x20(%rdi),%xmm3
punpcklwd %xmm0,%xmm3
pmaddwd %xmm3,%xmm3
paddd  %xmm1,%xmm3
paddd  %xmm2,%xmm3
movq   0x28(%rdi),%xmm1
punpcklwd %xmm0,%xmm1
pmaddwd %xmm1,%xmm1
movq   0x30(%rdi),%xmm2
punpcklwd %xmm0,%xmm2
pmaddwd %xmm2,%xmm2
paddd  %xmm1,%xmm2
movq   0x38(%rdi),%xmm1
punpcklwd %xmm0,%xmm1
pmaddwd %xmm1,%xmm1
paddd  %xmm2,%xmm1
paddd  %xmm3,%xmm1
movq   0x40(%rdi),%xmm2
punpcklwd %xmm0,%xmm2
pmaddwd %xmm2,%xmm2
movq   0x48(%rdi),%xmm3
punpcklwd %xmm0,%xmm3
pmaddwd %xmm3,%xmm3
paddd  %xmm2,%xmm3
paddd  %xmm1,%xmm3
pshufd $0xee,%xmm3,%xmm0
paddd  %xmm3,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%edi
test   %edi,%edi
je     11e2 <irms+0xd2>
mov    %esi,%ebx
call   1030 <t_sqrt@plt>
mov    %eax,%ecx
sar    $0x8,%ecx
mov    $0x20000000,%eax
xor    %edx,%edx
idiv   %ecx
imul   %ebx,%eax
pop    %rbx
ret
xor    %eax,%eax
pop    %rbx
ret

LLVM IR (-O0):
define i32 @irms(i16* %0, i32 %1) {
%3 = alloca i32
%4 = alloca i16*
%5 = alloca i32
%6 = alloca i16*
%7 = alloca i16*
%8 = alloca i32
store i16* %0, i16** %4
store i32 %1, i32* %5
%9 = load i16*, i16** %4
store i16* %9, i16** %6
%10 = getelementptr inbounds i16, i16* %9, i64 40
store i16* %10, i16** %7
store i32 0, i32* %8
br label %11
11: ; preds = %25, %2
%12 = load i16*, i16** %7
%13 = load i16*, i16** %6
%14 = icmp ugt i16* %12, %13
br i1 %14, label %15, label %28
15: ; preds = %11
%16 = load i16*, i16** %6
%17 = load i16, i16* %16
%18 = sext i16 %17 to i32
%19 = load i16*, i16** %6
%20 = load i16, i16* %19
%21 = sext i16 %20 to i32
%22 = mul nsw i32 %18, %21
%23 = load i32, i32* %8
%24 = add i32 %23, %22
store i32 %24, i32* %8
br label %25
25: ; preds = %15
%26 = load i16*, i16** %6
%27 = getelementptr inbounds i16, i16* %26, i32 1
store i16* %27, i16** %6
br label %11
28: ; preds = %11
%29 = load i32, i32* %8
%30 = icmp eq i32 %29, 0
br i1 %30, label %31, label %32
31: ; preds = %28
store i32 0, i32* %3
br label %39
32: ; preds = %28
%33 = load i32, i32* %8
%34 = call i32 @t_sqrt(i32 %33)
%35 = ashr i32 %34, 8
%36 = sdiv i32 536870912, %35
%37 = load i32, i32* %5
%38 = mul nsw i32 %36, %37
store i32 %38, i32* %3
br label %39
39: ; preds = %32, %31
%40 = load i32, i32* %3
ret i32 %40
}

LLVM IR (-O2):
define i32 @irms(i16* nocapture %0, i32 %1) {
%3 = bitcast i16* %0 to <4 x i16>*
%4 = load <4 x i16>, <4 x i16>* %3
%5 = sext <4 x i16> %4 to <4 x i32>
%6 = mul nsw <4 x i32> %5, %5
%7 = getelementptr inbounds i16, i16* %0, i64 4
%8 = bitcast i16* %7 to <4 x i16>*
%9 = load <4 x i16>, <4 x i16>* %8
%10 = sext <4 x i16> %9 to <4 x i32>
%11 = mul nsw <4 x i32> %10, %10
%12 = add nuw <4 x i32> %11, %6
%13 = getelementptr inbounds i16, i16* %0, i64 8
%14 = bitcast i16* %13 to <4 x i16>*
%15 = load <4 x i16>, <4 x i16>* %14
%16 = sext <4 x i16> %15 to <4 x i32>
%17 = mul nsw <4 x i32> %16, %16
%18 = add <4 x i32> %17, %12
%19 = getelementptr inbounds i16, i16* %0, i64 12
%20 = bitcast i16* %19 to <4 x i16>*
%21 = load <4 x i16>, <4 x i16>* %20
%22 = sext <4 x i16> %21 to <4 x i32>
%23 = mul nsw <4 x i32> %22, %22
%24 = add <4 x i32> %23, %18
%25 = getelementptr inbounds i16, i16* %0, i64 16
%26 = bitcast i16* %25 to <4 x i16>*
%27 = load <4 x i16>, <4 x i16>* %26
%28 = sext <4 x i16> %27 to <4 x i32>
%29 = mul nsw <4 x i32> %28, %28
%30 = add <4 x i32> %29, %24
%31 = getelementptr inbounds i16, i16* %0, i64 20
%32 = bitcast i16* %31 to <4 x i16>*
%33 = load <4 x i16>, <4 x i16>* %32
%34 = sext <4 x i16> %33 to <4 x i32>
%35 = mul nsw <4 x i32> %34, %34
%36 = add <4 x i32> %35, %30
%37 = getelementptr inbounds i16, i16* %0, i64 24
%38 = bitcast i16* %37 to <4 x i16>*
%39 = load <4 x i16>, <4 x i16>* %38
%40 = sext <4 x i16> %39 to <4 x i32>
%41 = mul nsw <4 x i32> %40, %40
%42 = add <4 x i32> %41, %36
%43 = getelementptr inbounds i16, i16* %0, i64 28
%44 = bitcast i16* %43 to <4 x i16>*
%45 = load <4 x i16>, <4 x i16>* %44
%46 = sext <4 x i16> %45 to <4 x i32>
%47 = mul nsw <4 x i32> %46, %46
%48 = add <4 x i32> %47, %42
%49 = getelementptr inbounds i16, i16* %0, i64 32
%50 = bitcast i16* %49 to <4 x i16>*
%51 = load <4 x i16>, <4 x i16>* %50
%52 = sext <4 x i16> %51 to <4 x i32>
%53 = mul nsw <4 x i32> %52, %52
%54 = add <4 x i32> %53, %48
%55 = getelementptr inbounds i16, i16* %0, i64 36
%56 = bitcast i16* %55 to <4 x i16>*
%57 = load <4 x i16>, <4 x i16>* %56
%58 = sext <4 x i16> %57 to <4 x i32>
%59 = mul nsw <4 x i32> %58, %58
%60 = add <4 x i32> %59, %54
%61 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %60)
%62 = icmp eq i32 %61, 0
br i1 %62, label %68, label %63
63: ; preds = %2
%64 = tail call i32 @t_sqrt(i32 %61)
%65 = ashr i32 %64, 8
%66 = sdiv i32 536870912, %65
%67 = mul nsw i32 %66, %1
br label %68
68: ; preds = %2, %63
%69 = phi i32 [ %67, %63 ], [ 0, %2 ]
ret i32 %69
}