void tdot_subtract_energy_edge(float *tdot, int rad, float kappa,
                               float lambda) {
  int i, j;
  float ez, ec;
  for (j = -rad + 1; j < rad; j++) {
    if (j > 0) {
      ez = j;
      ez = kappa * ez * ez;
    } else {
      ez = 0.0;
    }
    for (i = -rad + 1; i < rad; i++) {
      ec = (i - j);
      ec = lambda * ec * ec;
      *tdot -= ez + ec;
      tdot++;
    }
  }
}


x86 assembly (clang, -O0):
<tdot_subtract_energy_edge>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
movss  %xmm1,-0x14(%rbp)
xor    %eax,%eax
sub    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11e2 <tdot_subtract_energy_edge+0xe2>
cmpl   $0x0,-0x1c(%rbp)
jle    1159 <tdot_subtract_energy_edge+0x59>
cvtsi2ssl -0x1c(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x10(%rbp),%xmm0
mulss  -0x20(%rbp),%xmm0
mulss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    1161 <tdot_subtract_energy_edge+0x61>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
xor    %eax,%eax
sub    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11cf <tdot_subtract_energy_edge+0xcf>
mov    -0x18(%rbp),%eax
sub    -0x1c(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x14(%rbp),%xmm0
mulss  -0x24(%rbp),%xmm0
mulss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x20(%rbp),%xmm1
addss  -0x24(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    116c <tdot_subtract_energy_edge+0x6c>
jmp    11d4 <tdot_subtract_energy_edge+0xd4>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1120 <tdot_subtract_energy_edge+0x20>
pop    %rbp
ret

x86 assembly (clang, -O2):
<tdot_subtract_energy_edge>:
push   %rbp
push   %rbx
mov    $0x1,%r9d
sub    %esi,%r9d
cmp    %esi,%r9d
jge    126d <tdot_subtract_energy_edge+0x16d>
lea    (%rsi,%rsi,1),%r10d
add    $0xfffffffe,%r10d
mov    %r10d,%edx
and    $0xfffffff8,%edx
mov    %edx,%r8d
add    %r9d,%r8d
movd   %r9d,%xmm2
pshufd $0x0,%xmm2,%xmm8
paddd  0xec4(%rip),%xmm8
movaps %xmm1,%xmm11
shufps $0x0,%xmm1,%xmm11
lea    -0x1(%rsi),%ebp
movdqa 0xebf(%rip),%xmm9
movdqa 0xec6(%rip),%xmm10
mov    %r9d,%ecx
nopl   (%rax)
test   %ecx,%ecx
jg     1200 <tdot_subtract_energy_edge+0x100>
xorps  %xmm13,%xmm13
cmp    $0x8,%r10d
jb     121f <tdot_subtract_energy_edge+0x11f>
lea    (%rdi,%rdx,4),%r11
movd   %ecx,%xmm4
pshufd $0x0,%xmm4,%xmm12
movaps %xmm13,%xmm6
shufps $0x0,%xmm13,%xmm6
xor    %ebx,%ebx
movdqa %xmm8,%xmm5
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqa %xmm5,%xmm4
psubd  %xmm12,%xmm4
cvtdq2ps %xmm4,%xmm3
paddd  %xmm9,%xmm4
cvtdq2ps %xmm4,%xmm4
movaps %xmm11,%xmm7
mulps  %xmm3,%xmm7
movaps %xmm11,%xmm2
mulps  %xmm4,%xmm2
mulps  %xmm3,%xmm7
mulps  %xmm4,%xmm2
addps  %xmm6,%xmm7
addps  %xmm6,%xmm2
movups (%rdi,%rbx,4),%xmm3
subps  %xmm7,%xmm3
movups 0x10(%rdi,%rbx,4),%xmm4
subps  %xmm2,%xmm4
movups %xmm3,(%rdi,%rbx,4)
movups %xmm4,0x10(%rdi,%rbx,4)
add    $0x8,%rbx
paddd  %xmm10,%xmm5
cmp    %rbx,%rdx
jne    11a0 <tdot_subtract_energy_edge+0xa0>
mov    %r11,%rdi
mov    %r8d,%ebx
jmp    1222 <tdot_subtract_energy_edge+0x122>
nopl   0x0(%rax)
xorps  %xmm4,%xmm4
cvtsi2ss %ecx,%xmm4
movaps %xmm4,%xmm13
mulss  %xmm0,%xmm13
mulss  %xmm4,%xmm13
cmp    $0x8,%r10d
jae    1176 <tdot_subtract_energy_edge+0x76>
mov    %r9d,%ebx
mov    %esi,%eax
sub    %ebx,%eax
add    %ebp,%ebx
nopl   0x0(%rax,%rax,1)
xorps  %xmm2,%xmm2
cvtsi2ss %ebx,%xmm2
movaps %xmm2,%xmm3
mulss  %xmm1,%xmm3
mulss  %xmm2,%xmm3
addss  %xmm13,%xmm3
movss  (%rdi),%xmm2
subss  %xmm3,%xmm2
movss  %xmm2,(%rdi)
add    $0x4,%rdi
add    $0x1,%ebx
add    $0xffffffff,%eax
jne    1230 <tdot_subtract_energy_edge+0x130>
add    $0x1,%ecx
add    $0xffffffff,%ebp
cmp    %esi,%ecx
jne    1160 <tdot_subtract_energy_edge+0x60>
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @tdot_subtract_energy_edge(float* %0, i32 %1, float %2, float %3) {
%5 = alloca float*
%6 = alloca i32
%7 = alloca float
%8 = alloca float
%9 = alloca i32
%10 = alloca i32
%11 = alloca float
%12 = alloca float
store float* %0, float** %5
store i32 %1, i32* %6
store float %2, float* %7
store float %3, float* %8
%13 = load i32, i32* %6
%14 = sub nsw i32 0, %13
%15 = add nsw i32 %14, 1
store i32 %15, i32* %10
br label %16
16: ; preds = %62, %4
%17 = load i32, i32* %10
%18 = load i32, i32* %6
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %65
20: ; preds = %16
%21 = load i32, i32* %10
%22 = icmp sgt i32 %21, 0
br i1 %22, label %23, label %31
23: ; preds = %20
%24 = load i32, i32* %10
%25 = sitofp i32 %24 to float
store float %25, float* %11
%26 = load float, float* %7
%27 = load float, float* %11
%28 = fmul float %26, %27
%29 = load float, float* %11
%30 = fmul float %28, %29
store float %30, float* %11
br label %32
31: ; preds = %20
store float 0.000000e+00, float* %11
br label %32
32: ; preds = %31, %23
%33 = load i32, i32* %6
%34 = sub nsw i32 0, %33
%35 = add nsw i32 %34, 1
store i32 %35, i32* %9
br label %36
36: ; preds = %58, %32
%37 = load i32, i32* %9
%38 = load i32, i32* %6
%39 = icmp slt i32 %37, %38
br i1 %39, label %40, label %61
40: ; preds = %36
%41 = load i32, i32* %9
%42 = load i32, i32* %10
%43 = sub nsw i32 %41, %42
%44 = sitofp i32 %43 to float
store float %44, float* %12
%45 = load float, float* %8
%46 = load float, float* %12
%47 = fmul float %45, %46
%48 = load float, float* %12
%49 = fmul float %47, %48
store float %49, float* %12
%50 = load float, float* %11
%51 = load float, float* %12
%52 = fadd float %50, %51
%53 = load float*, float** %5
%54 = load float, float* %53
%55 = fsub float %54, %52
store float %55, float* %53
%56 = load float*, float** %5
%57 = getelementptr inbounds float, float* %56, i32 1
store float* %57, float** %5
br label %58
58: ; preds = %40
%59 = load i32, i32* %9
%60 = add nsw i32 %59, 1
store i32 %60, i32* %9
br label %36
61: ; preds = %36
br label %62
62: ; preds = %61
%63 = load i32, i32* %10
%64 = add nsw i32 %63, 1
store i32 %64, i32* %10
br label %16
65: ; preds = %16
ret void
}

LLVM IR (-O2):
define void @tdot_subtract_energy_edge(float* nocapture %0, i32 %1, float %2, float %3) {
%5 = sub i32 1, %1
%6 = icmp slt i32 %5, %1
br i1 %6, label %7, label %85
7: ; preds = %4
%8 = shl i32 %1, 1
%9 = add i32 %8, -2
%10 = icmp ult i32 %9, 8
%11 = and i32 %9, -8
%12 = zext i32 %11 to i64
%13 = add i32 %5, %11
%14 = insertelement <4 x i32> poison, i32 %5, i64 0
%15 = shufflevector <4 x i32> %14, <4 x i32> poison, <4 x i32> zeroinitializer
%16 = add <4 x i32> %15, <i32 0, i32 1, i32 2, i32 3>
%17 = insertelement <4 x float> poison, float %3, i64 0
%18 = shufflevector <4 x float> %17, <4 x float> poison, <4 x i32> zeroinitializer
%19 = insertelement <4 x float> poison, float %3, i64 0
%20 = shufflevector <4 x float> %19, <4 x float> poison, <4 x i32> zeroinitializer
br label %21
21: ; preds = %7, %82
%22 = phi float* [ %79, %82 ], [ %0, %7 ]
%23 = phi i32 [ %83, %82 ], [ %5, %7 ]
%24 = icmp sgt i32 %23, 0
%25 = sitofp i32 %23 to float
%26 = fmul float %25, %2
%27 = fmul float %26, %25
%28 = select i1 %24, float %27, float 0.000000e+00
br i1 %10, label %66, label %29
29: ; preds = %21
%30 = getelementptr float, float* %22, i64 %12
%31 = insertelement <4 x i32> poison, i32 %23, i64 0
%32 = shufflevector <4 x i32> %31, <4 x i32> poison, <4 x i32> zeroinitializer
%33 = insertelement <4 x i32> poison, i32 %23, i64 0
%34 = shufflevector <4 x i32> %33, <4 x i32> poison, <4 x i32> zeroinitializer
%35 = insertelement <4 x float> poison, float %28, i64 0
%36 = shufflevector <4 x float> %35, <4 x float> poison, <4 x i32> zeroinitializer
%37 = insertelement <4 x float> poison, float %28, i64 0
%38 = shufflevector <4 x float> %37, <4 x float> poison, <4 x i32> zeroinitializer
br label %39
39: ; preds = %39, %29
%40 = phi i64 [ 0, %29 ], [ %63, %39 ]
%41 = phi <4 x i32> [ %16, %29 ], [ %64, %39 ]
%42 = getelementptr float, float* %22, i64 %40
%43 = add <4 x i32> %41, <i32 4, i32 4, i32 4, i32 4>
%44 = sub nsw <4 x i32> %41, %32
%45 = sub nsw <4 x i32> %43, %34
%46 = sitofp <4 x i32> %44 to <4 x float>
%47 = sitofp <4 x i32> %45 to <4 x float>
%48 = fmul <4 x float> %18, %46
%49 = fmul <4 x float> %20, %47
%50 = fmul <4 x float> %48, %46
%51 = fmul <4 x float> %49, %47
%52 = fadd <4 x float> %36, %50
%53 = fadd <4 x float> %38, %51
%54 = bitcast float* %42 to <4 x float>*
%55 = load <4 x float>, <4 x float>* %54
%56 = getelementptr float, float* %42, i64 4
%57 = bitcast float* %56 to <4 x float>*
%58 = load <4 x float>, <4 x float>* %57
%59 = fsub <4 x float> %55, %52
%60 = fsub <4 x float> %58, %53
%61 = bitcast float* %42 to <4 x float>*
store <4 x float> %59, <4 x float>* %61
%62 = bitcast float* %56 to <4 x float>*
store <4 x float> %60, <4 x float>* %62
%63 = add nuw i64 %40, 8
%64 = add <4 x i32> %41, <i32 8, i32 8, i32 8, i32 8>
%65 = icmp eq i64 %63, %12
br i1 %65, label %66, label %39
66: ; preds = %39, %21
%67 = phi float* [ %22, %21 ], [ %30, %39 ]
%68 = phi i32 [ %5, %21 ], [ %13, %39 ]
br label %69
69: ; preds = %66, %69
%70 = phi float* [ %79, %69 ], [ %67, %66 ]
%71 = phi i32 [ %80, %69 ], [ %68, %66 ]
%72 = sub nsw i32 %71, %23
%73 = sitofp i32 %72 to float
%74 = fmul float %73, %3
%75 = fmul float %74, %73
%76 = fadd float %28, %75
%77 = load float, float* %70
%78 = fsub float %77, %76
store float %78, float* %70
%79 = getelementptr inbounds float, float* %70, i64 1
%80 = add nsw i32 %71, 1
%81 = icmp eq i32 %80, %1
br i1 %81, label %82, label %69
82: ; preds = %69
%83 = add nsw i32 %23, 1
%84 = icmp eq i32 %83, %1
br i1 %84, label %85, label %21
85: ; preds = %82, %4
ret void
}