void dspl_conv_cmplx_krn(double *aR, double *aI, int na, double *bR, double *bI,
                         int nb, double *cR, double *cI) {
  int k;
  int n;
  for (k = 0; k < na; k++) {
    for (n = 0; n < nb; n++) {
      cR[k + n] += aR[k] * bR[n] - aI[k] * bI[n];
      cI[k + n] += aR[k] * bI[n] + aI[k] * bR[n];
    }
  }
}


x86 assembly (clang, -O0):
<dspl_conv_cmplx_krn>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1227 <dspl_conv_cmplx_krn+0x127>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1214 <dspl_conv_cmplx_krn+0x114>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    113d <dspl_conv_cmplx_krn+0x3d>
jmp    1219 <dspl_conv_cmplx_krn+0x119>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    112a <dspl_conv_cmplx_krn+0x2a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dspl_conv_cmplx_krn>:
push   %r14
push   %rbx
test   %edx,%edx
jle    1193 <dspl_conv_cmplx_krn+0x93>
mov    0x20(%rsp),%r10
mov    0x18(%rsp),%rax
mov    %edx,%r11d
mov    %r9d,%r14d
xor    %ebx,%ebx
jmp    1131 <dspl_conv_cmplx_krn+0x31>
nop
add    $0x1,%rbx
add    $0x8,%r10
add    $0x8,%rax
cmp    %r11,%rbx
je     1193 <dspl_conv_cmplx_krn+0x93>
test   %r9d,%r9d
jle    1120 <dspl_conv_cmplx_krn+0x20>
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movsd  (%rdi,%rbx,8),%xmm0
movsd  (%r8,%rdx,8),%xmm1
mulsd  (%rsi,%rbx,8),%xmm1
mulsd  (%rcx,%rdx,8),%xmm0
subsd  %xmm1,%xmm0
addsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,(%rax,%rdx,8)
movsd  (%rdi,%rbx,8),%xmm0
movsd  (%rsi,%rbx,8),%xmm1
mulsd  (%rcx,%rdx,8),%xmm1
mulsd  (%r8,%rdx,8),%xmm0
addsd  %xmm1,%xmm0
addsd  (%r10,%rdx,8),%xmm0
movsd  %xmm0,(%r10,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%r14
jne    1140 <dspl_conv_cmplx_krn+0x40>
jmp    1120 <dspl_conv_cmplx_krn+0x20>
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @dspl_conv_cmplx_krn(double* nocapture %0, double* nocapture %1, i32 %2, double* nocapture %3, double* nocapture %4, i32 %5, double* nocapture %6, double* nocapture %7) {
%9 = icmp sgt i32 %2, 0
br i1 %9, label %10, label %48
10: ; preds = %8
%11 = icmp sgt i32 %5, 0
%12 = zext i32 %2 to i64
%13 = zext i32 %5 to i64
br label %14
14: ; preds = %10, %45
%15 = phi i64 [ 0, %10 ], [ %46, %45 ]
br i1 %11, label %16, label %45
16: ; preds = %14
%17 = getelementptr inbounds double, double* %0, i64 %15
%18 = getelementptr inbounds double, double* %1, i64 %15
br label %19
19: ; preds = %16, %19
%20 = phi i64 [ 0, %16 ], [ %43, %19 ]
%21 = load double, double* %17
%22 = getelementptr inbounds double, double* %3, i64 %20
%23 = load double, double* %22
%24 = load double, double* %18
%25 = getelementptr inbounds double, double* %4, i64 %20
%26 = load double, double* %25
%27 = fneg double %24
%28 = fmul double %26, %27
%29 = tail call double @llvm.fmuladd.f64(double %21, double %23, double %28)
%30 = add nuw nsw i64 %20, %15
%31 = getelementptr inbounds double, double* %6, i64 %30
%32 = load double, double* %31
%33 = fadd double %32, %29
store double %33, double* %31
%34 = load double, double* %17
%35 = load double, double* %25
%36 = load double, double* %18
%37 = load double, double* %22
%38 = fmul double %36, %37
%39 = tail call double @llvm.fmuladd.f64(double %34, double %35, double %38)
%40 = getelementptr inbounds double, double* %7, i64 %30
%41 = load double, double* %40
%42 = fadd double %41, %39
store double %42, double* %40
%43 = add nuw nsw i64 %20, 1
%44 = icmp eq i64 %43, %13
br i1 %44, label %45, label %19
45: ; preds = %19, %14
%46 = add nuw nsw i64 %15, 1
%47 = icmp eq i64 %46, %12
br i1 %47, label %48, label %14
48: ; preds = %45, %8
ret void
}