void incrementRadon(double *pr, double pixel, double r) {
  int r1;
  double delta;
  r1 = (int)r;
  delta = r - r1;
  pr[r1] += pixel * (1.0 - delta);
  pr[r1 + 1] += pixel * delta;
}


x86 assembly (clang, -O0):
<incrementRadon>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
cvttsd2si -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xec6(%rip),%xmm2
subsd  -0x28(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<incrementRadon>:
cvttsd2si %xmm1,%eax
cvttpd2dq %xmm1,%xmm2
cvtdq2pd %xmm2,%xmm2
subsd  %xmm2,%xmm1
movsd  0xee8(%rip),%xmm2
subsd  %xmm1,%xmm2
cltq
movupd (%rdi,%rax,8),%xmm3
unpcklpd %xmm0,%xmm0
unpcklpd %xmm1,%xmm2
mulpd  %xmm0,%xmm2
addpd  %xmm3,%xmm2
movupd %xmm2,(%rdi,%rax,8)
ret

LLVM IR (-O0):
define void @incrementRadon(double* %0, double %1, double %2) {
%4 = alloca double*
%5 = alloca double
%6 = alloca double
%7 = alloca i32
%8 = alloca double
store double* %0, double** %4
store double %1, double* %5
store double %2, double* %6
%9 = load double, double* %6
%10 = fptosi double %9 to i32
store i32 %10, i32* %7
%11 = load double, double* %6
%12 = load i32, i32* %7
%13 = sitofp i32 %12 to double
%14 = fsub double %11, %13
store double %14, double* %8
%15 = load double, double* %5
%16 = load double, double* %8
%17 = fsub double 1.000000e+00, %16
%18 = load double*, double** %4
%19 = load i32, i32* %7
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds double, double* %18, i64 %20
%22 = load double, double* %21
%23 = call double @llvm.fmuladd.f64(double %15, double %17, double %22)
store double %23, double* %21
%24 = load double, double* %5
%25 = load double, double* %8
%26 = load double*, double** %4
%27 = load i32, i32* %7
%28 = add nsw i32 %27, 1
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds double, double* %26, i64 %29
%31 = load double, double* %30
%32 = call double @llvm.fmuladd.f64(double %24, double %25, double %31)
store double %32, double* %30
ret void
}

LLVM IR (-O2):
define void @incrementRadon(double* nocapture %0, double %1, double %2) {
%4 = fptosi double %2 to i32
%5 = sitofp i32 %4 to double
%6 = fsub double %2, %5
%7 = fsub double 1.000000e+00, %6
%8 = sext i32 %4 to i64
%9 = getelementptr inbounds double, double* %0, i64 %8
%10 = bitcast double* %9 to <2 x double>*
%11 = load <2 x double>, <2 x double>* %10
%12 = insertelement <2 x double> poison, double %1, i64 0
%13 = shufflevector <2 x double> %12, <2 x double> poison, <2 x i32> zeroinitializer
%14 = insertelement <2 x double> poison, double %7, i64 0
%15 = insertelement <2 x double> %14, double %6, i64 1
%16 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %13, <2 x double> %15, <2 x double> %11)
%17 = bitcast double* %9 to <2 x double>*
store <2 x double> %16, <2 x double>* %17
ret void
}