long int mac(const short *a, const short *b, long int sqr, long int *sum) {
  long int i;
  long int dotp = *sum;
  for (i = 0; i < 150; i++) {
    dotp += b[i] * a[i];
    sqr += b[i] * b[i];
  }
  *sum = dotp;
  return sqr;
}


x86 assembly (clang, -O0):
<mac>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x30(%rbp)
movq   $0x0,-0x28(%rbp)
cmpq   $0x96,-0x28(%rbp)
jge    1190 <mac+0x90>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    -0x8(%rbp),%rcx
mov    -0x28(%rbp),%rdx
movswl (%rcx,%rdx,2),%ecx
imul   %ecx,%eax
cltq
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
mov    -0x28(%rbp),%rdx
movswl (%rcx,%rdx,2),%ecx
imul   %ecx,%eax
cltq
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1127 <mac+0x27>
mov    -0x30(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mac>:
movq   (%rcx),%xmm2
movq   %rdx,%xmm9
pxor   %xmm8,%xmm8
mov    $0x2,%eax
pxor   %xmm3,%xmm3
pxor   %xmm1,%xmm1
nopl   0x0(%rax,%rax,1)
movd   -0x4(%rsi,%rax,2),%xmm6
movd   (%rsi,%rax,2),%xmm5
movd   -0x4(%rdi,%rax,2),%xmm7
movd   (%rdi,%rax,2),%xmm4
movdqa %xmm6,%xmm0
punpcklwd %xmm8,%xmm0
pshuflw $0xd4,%xmm7,%xmm7
pmaddwd %xmm0,%xmm7
movdqa %xmm5,%xmm0
punpcklwd %xmm8,%xmm0
pshuflw $0xd4,%xmm4,%xmm4
pmaddwd %xmm0,%xmm4
pxor   %xmm0,%xmm0
pcmpgtd %xmm7,%xmm0
punpckldq %xmm0,%xmm7
paddq  %xmm7,%xmm2
pxor   %xmm0,%xmm0
pcmpgtd %xmm4,%xmm0
punpckldq %xmm0,%xmm4
paddq  %xmm4,%xmm3
movdqa %xmm6,%xmm0
pmulhw %xmm6,%xmm0
pmullw %xmm6,%xmm6
punpcklwd %xmm0,%xmm6
movdqa %xmm5,%xmm0
pmulhw %xmm5,%xmm0
pmullw %xmm5,%xmm5
punpcklwd %xmm0,%xmm5
punpckldq %xmm8,%xmm6
paddq  %xmm6,%xmm9
punpckldq %xmm8,%xmm5
paddq  %xmm5,%xmm1
add    $0x4,%rax
cmp    $0x96,%rax
jne    1120 <mac+0x20>
paddq  %xmm2,%xmm3
pshufd $0xee,%xmm3,%xmm0
paddq  %xmm3,%xmm0
movq   %xmm0,%r8
paddq  %xmm9,%xmm1
pshufd $0xee,%xmm1,%xmm0
paddq  %xmm1,%xmm0
movq   %xmm0,%rax
movswq 0x128(%rsi),%r9
movswq 0x128(%rdi),%rdx
imul   %r9,%rdx
add    %r8,%rdx
imul   %r9d,%r9d
add    %rax,%r9
movswq 0x12a(%rsi),%rax
movswq 0x12a(%rdi),%rsi
imul   %rax,%rsi
add    %rdx,%rsi
imul   %eax,%eax
add    %r9,%rax
mov    %rsi,(%rcx)
ret

LLVM IR (-O0):
define i64 @mac(i16* %0, i16* %1, i64 %2, i64* %3) {
%5 = alloca i16*
%6 = alloca i16*
%7 = alloca i64
%8 = alloca i64*
%9 = alloca i64
%10 = alloca i64
store i16* %0, i16** %5
store i16* %1, i16** %6
store i64 %2, i64* %7
store i64* %3, i64** %8
%11 = load i64*, i64** %8
%12 = load i64, i64* %11
store i64 %12, i64* %10
store i64 0, i64* %9
br label %13
13: ; preds = %45, %4
%14 = load i64, i64* %9
%15 = icmp slt i64 %14, 150
br i1 %15, label %16, label %48
16: ; preds = %13
%17 = load i16*, i16** %6
%18 = load i64, i64* %9
%19 = getelementptr inbounds i16, i16* %17, i64 %18
%20 = load i16, i16* %19
%21 = sext i16 %20 to i32
%22 = load i16*, i16** %5
%23 = load i64, i64* %9
%24 = getelementptr inbounds i16, i16* %22, i64 %23
%25 = load i16, i16* %24
%26 = sext i16 %25 to i32
%27 = mul nsw i32 %21, %26
%28 = sext i32 %27 to i64
%29 = load i64, i64* %10
%30 = add nsw i64 %29, %28
store i64 %30, i64* %10
%31 = load i16*, i16** %6
%32 = load i64, i64* %9
%33 = getelementptr inbounds i16, i16* %31, i64 %32
%34 = load i16, i16* %33
%35 = sext i16 %34 to i32
%36 = load i16*, i16** %6
%37 = load i64, i64* %9
%38 = getelementptr inbounds i16, i16* %36, i64 %37
%39 = load i16, i16* %38
%40 = sext i16 %39 to i32
%41 = mul nsw i32 %35, %40
%42 = sext i32 %41 to i64
%43 = load i64, i64* %7
%44 = add nsw i64 %43, %42
store i64 %44, i64* %7
br label %45
45: ; preds = %16
%46 = load i64, i64* %9
%47 = add nsw i64 %46, 1
store i64 %47, i64* %9
br label %13
48: ; preds = %13
%49 = load i64, i64* %10
%50 = load i64*, i64** %8
store i64 %49, i64* %50
%51 = load i64, i64* %7
ret i64 %51
}

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