float ddiff(float f[], float h, int m) {
  float fp;
  int i;
  float A, B;
  A = (float)(m * (m + 1) * (2 * m + 1) / 3);
  B = (float)(m * (m + 1) * (2 * m + 1)) * (float)(3 * m * m + 3 * m - 1) / 15.;
  fp = 0.;
  for (i = 0; i < 2 * m + 1; i++)
    fp += f[i] * (A - (float)((2 * m + 1) * (i - m) * (i - m)));
  fp /= ((A * A - B * ((float)(2 * m + 1))) * h * h / 2.);
  return (float)fp;
}


x86 assembly (clang, -O0):
<ddiff>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    -0x10(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    -0x10(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
imul   %ecx,%eax
cvtsi2ss %eax,%xmm0
imul   $0x3,-0x10(%rbp),%eax
imul   -0x10(%rbp),%eax
imul   $0x3,-0x10(%rbp),%ecx
add    %ecx,%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe86(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    -0x10(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    11ff <ddiff+0xff>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  -0x1c(%rbp),%xmm2
mov    -0x10(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
mov    -0x18(%rbp),%ecx
sub    -0x10(%rbp),%ecx
imul   %ecx,%eax
mov    -0x18(%rbp),%ecx
sub    -0x10(%rbp),%ecx
imul   %ecx,%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm2
movss  -0x14(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1196 <ddiff+0x96>
movss  -0x1c(%rbp),%xmm0
movss  -0x1c(%rbp),%xmm2
movss  -0x20(%rbp),%xmm1
mov    -0x10(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
cvtsi2ss %eax,%xmm3
mulss  %xmm3,%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mulss  -0xc(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdbe(%rip),%xmm0
divsd  %xmm0,%xmm1
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<ddiff>:
push   %rbp
push   %r15
push   %r14
push   %rbx
lea    0x1(%rsi),%r10d
imul   %esi,%r10d
lea    (%rsi,%rsi,1),%r9d
add    $0x1,%r9d
imul   %r9d,%r10d
movslq %r10d,%rax
imul   $0x55555556,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
shr    $0x20,%rax
add    %ecx,%eax
cvtsi2ss %eax,%xmm1
lea    (%rsi,%rsi,2),%r8d
test   %r9d,%r9d
jle    11cc <ddiff+0xcc>
test   %esi,%esi
je     11d1 <ddiff+0xd1>
mov    %r9d,%r11d
mov    $0x1,%r14d
sub    %esi,%r14d
mov    %r14d,%edx
imul   %r9d,%edx
lea    0x2(,%rsi,4),%ebx
mov    %esi,%r15d
neg    %r15d
mov    %esi,%ebp
imul   %r9d,%ebp
neg    %ebp
add    $0xffffffffffffffff,%r11
xorps  %xmm2,%xmm2
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
lea    (%r15,%rax,1),%ecx
imul   %ebp,%ecx
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
movaps %xmm1,%xmm4
subss  %xmm3,%xmm4
mulss  (%rdi,%rax,4),%xmm4
addss  %xmm2,%xmm4
lea    (%r14,%rax,1),%ecx
imul   %edx,%ecx
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
movaps %xmm1,%xmm2
subss  %xmm3,%xmm2
mulss  0x4(%rdi,%rax,4),%xmm2
addss  %xmm4,%xmm2
add    $0x2,%rax
add    %ebx,%edx
add    %ebx,%ebp
cmp    %rax,%r11
jne    1180 <ddiff+0x80>
jmp    11d6 <ddiff+0xd6>
xorps  %xmm2,%xmm2
jmp    1201 <ddiff+0x101>
xorps  %xmm2,%xmm2
xor    %eax,%eax
mov    %eax,%ecx
sub    %esi,%ecx
mov    %ecx,%edx
imul   %r9d,%edx
imul   %ecx,%edx
xorps  %xmm3,%xmm3
cvtsi2ss %edx,%xmm3
movaps %xmm1,%xmm4
subss  %xmm3,%xmm4
mulss  (%rdi,%rax,4),%xmm4
addss  %xmm2,%xmm4
xorps  %xmm2,%xmm2
cvtss2sd %xmm4,%xmm2
xorps  %xmm3,%xmm3
cvtsi2ss %r10d,%xmm3
imul   %r8d,%esi
lea    (%r8,%rsi,1),%eax
add    $0xffffffff,%eax
xorps  %xmm4,%xmm4
cvtsi2ss %eax,%xmm4
cvtsi2ss %r9d,%xmm5
mulss  %xmm3,%xmm4
divss  0xdd4(%rip),%xmm4
mulss  %xmm5,%xmm4
mulss  %xmm1,%xmm1
addss  %xmm4,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
mulsd  0xdb9(%rip),%xmm0
divsd  %xmm0,%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define float @ddiff(float* nocapture %0, float %1, i32 %2) {
%4 = add nsw i32 %2, 1
%5 = mul nsw i32 %4, %2
%6 = shl nsw i32 %2, 1
%7 = or i32 %6, 1
%8 = mul nsw i32 %5, %7
%9 = sdiv i32 %8, 3
%10 = sitofp i32 %9 to float
%11 = mul nsw i32 %2, 3
%12 = icmp sgt i32 %7, 0
br i1 %12, label %13, label %58
13: ; preds = %3
%14 = icmp eq i32 %2, 0
br i1 %14, label %44, label %15
15: ; preds = %13
%16 = zext i32 %7 to i64
%17 = add nsw i64 %16, -1
br label %18
18: ; preds = %18, %15
%19 = phi i64 [ 0, %15 ], [ %41, %18 ]
%20 = phi float [ 0.000000e+00, %15 ], [ %40, %18 ]
%21 = phi i64 [ 0, %15 ], [ %42, %18 ]
%22 = getelementptr inbounds float, float* %0, i64 %19
%23 = load float, float* %22
%24 = trunc i64 %19 to i32
%25 = sub nsw i32 %24, %2
%26 = mul nsw i32 %25, %7
%27 = mul nsw i32 %26, %25
%28 = sitofp i32 %27 to float
%29 = fsub float %10, %28
%30 = tail call float @llvm.fmuladd.f32(float %23, float %29, float %20)
%31 = or i64 %19, 1
%32 = getelementptr inbounds float, float* %0, i64 %31
%33 = load float, float* %32
%34 = trunc i64 %31 to i32
%35 = sub nsw i32 %34, %2
%36 = mul nsw i32 %35, %7
%37 = mul nsw i32 %36, %35
%38 = sitofp i32 %37 to float
%39 = fsub float %10, %38
%40 = tail call float @llvm.fmuladd.f32(float %33, float %39, float %30)
%41 = add nuw nsw i64 %19, 2
%42 = add i64 %21, 2
%43 = icmp eq i64 %42, %17
br i1 %43, label %44, label %18
44: ; preds = %18, %13
%45 = phi float [ undef, %13 ], [ %40, %18 ]
%46 = phi i64 [ 0, %13 ], [ %41, %18 ]
%47 = phi float [ 0.000000e+00, %13 ], [ %40, %18 ]
%48 = getelementptr inbounds float, float* %0, i64 %46
%49 = load float, float* %48
%50 = trunc i64 %46 to i32
%51 = sub nsw i32 %50, %2
%52 = mul nsw i32 %51, %7
%53 = mul nsw i32 %52, %51
%54 = sitofp i32 %53 to float
%55 = fsub float %10, %54
%56 = tail call float @llvm.fmuladd.f32(float %49, float %55, float %47)
%57 = fpext float %56 to double
br label %58
58: ; preds = %44, %3
%59 = phi double [ 0.000000e+00, %3 ], [ %57, %44 ]
%60 = sitofp i32 %8 to float
%61 = mul nsw i32 %11, %2
%62 = add i32 %11, -1
%63 = add i32 %62, %61
%64 = sitofp i32 %63 to float
%65 = fmul float %60, %64
%66 = sitofp i32 %7 to float
%67 = fdiv float %65, -1.500000e+01
%68 = fmul float %67, %66
%69 = tail call float @llvm.fmuladd.f32(float %10, float %10, float %68)
%70 = fmul float %69, %1
%71 = fmul float %70, %1
%72 = fpext float %71 to double
%73 = fmul double %72, 5.000000e-01
%74 = fdiv double %59, %73
%75 = fptrunc double %74 to float
ret float %75
}