void vranlc(int n, double *x, double a, double y[]) {
  const double r23 = 1.1920928955078125e-07;
  const double r46 = r23 * r23;
  const double t23 = 8.388608e+06;
  const double t46 = t23 * t23;
  double t1, t2, t3, t4, a1, a2, x1, x2, z;
  int i;
  t1 = r23 * a;
  a1 = (int)t1;
  a2 = a - t23 * a1;
  for (i = 0; i < n; i++) {
    t1 = r23 * (*x);
    x1 = (int)t1;
    x2 = *x - t23 * x1;
    t1 = a1 * x2 + a2 * x1;
    t2 = (int)(r23 * t1);
    z = t1 - t23 * t2;
    t3 = t23 * z + a2 * x2;
    t4 = (int)(r46 * t3);
    *x = t3 - t46 * t4;
    y[i] = r46 * (*x);
  }
  return;
}


x86 assembly (clang, -O0):
<vranlc>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movsd  0xee8(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xef3(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xede(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xec9(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xeb4(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
cvttsd2si -0x48(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm0
movsd  0xe82(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x0,-0x8c(%rbp)
mov    -0x8c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12dd <vranlc+0x1dd>
mov    -0x10(%rbp),%rax
movsd  0xe58(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
cvttsd2si -0x48(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x78(%rbp),%xmm0
movsd  0xe24(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xdf6(%rip),%xmm0
mulsd  -0x48(%rbp),%xmm0
cvttsd2si %xmm0,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  0xdca(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0x70(%rbp),%xmm1
mulsd  -0x80(%rbp),%xmm1
movsd  0xdb8(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xdab(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
cvttsd2si %xmm0,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm0
movsd  0xd8f(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0xd6b(%rip),%xmm0
mulsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x8c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8c(%rbp)
jmp    1195 <vranlc+0x95>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<vranlc>:
test   %edi,%edi
jle    11e8 <vranlc+0xe8>
movsd  0xef0(%rip),%xmm1
mulsd  %xmm0,%xmm1
cvttpd2dq %xmm1,%xmm1
cvtdq2pd %xmm1,%xmm6
movapd %xmm6,%xmm1
mulsd  0xee0(%rip),%xmm1
addsd  %xmm0,%xmm1
mov    %edi,%eax
xor    %ecx,%ecx
movsd  0xec8(%rip),%xmm0
movsd  0xec8(%rip),%xmm3
movsd  0xec7(%rip),%xmm8
movsd  0xec7(%rip),%xmm5
movsd  0xec6(%rip),%xmm9
nopw   0x0(%rax,%rax,1)
movsd  (%rsi),%xmm4
movapd %xmm4,%xmm7
mulsd  %xmm0,%xmm7
cvttpd2dq %xmm7,%xmm7
cvtdq2pd %xmm7,%xmm7
movapd %xmm1,%xmm2
mulsd  %xmm7,%xmm2
mulsd  %xmm3,%xmm7
addsd  %xmm4,%xmm7
movapd %xmm6,%xmm4
mulsd  %xmm7,%xmm4
addsd  %xmm2,%xmm4
movapd %xmm4,%xmm2
mulsd  %xmm0,%xmm2
cvttpd2dq %xmm2,%xmm2
cvtdq2pd %xmm2,%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm4,%xmm2
mulsd  %xmm1,%xmm7
mulsd  %xmm8,%xmm2
addsd  %xmm7,%xmm2
movapd %xmm2,%xmm4
mulsd  %xmm5,%xmm4
cvttpd2dq %xmm4,%xmm4
cvtdq2pd %xmm4,%xmm4
mulsd  %xmm9,%xmm4
addsd  %xmm2,%xmm4
movsd  %xmm4,(%rsi)
mulsd  %xmm5,%xmm4
movsd  %xmm4,(%rdx,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1160 <vranlc+0x60>
ret

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

LLVM IR (-O2):
define void @vranlc(i32 %0, double* nocapture %1, double %2, double* nocapture writeonly %3) {
%5 = fmul double %2, 0x3E80000000000000
%6 = fptosi double %5 to i32
%7 = sitofp i32 %6 to double
%8 = tail call double @llvm.fmuladd.f64(double %7, double 0xC160000000000000, double %2)
%9 = icmp sgt i32 %0, 0
br i1 %9, label %10, label %35
10: ; preds = %4
%11 = zext i32 %0 to i64
br label %12
12: ; preds = %10, %12
%13 = phi i64 [ 0, %10 ], [ %33, %12 ]
%14 = load double, double* %1
%15 = fmul double %14, 0x3E80000000000000
%16 = fptosi double %15 to i32
%17 = sitofp i32 %16 to double
%18 = tail call double @llvm.fmuladd.f64(double %17, double 0xC160000000000000, double %14)
%19 = fmul double %8, %17
%20 = tail call double @llvm.fmuladd.f64(double %7, double %18, double %19)
%21 = fmul double %20, 0x3E80000000000000
%22 = fptosi double %21 to i32
%23 = sitofp i32 %22 to double
%24 = tail call double @llvm.fmuladd.f64(double %23, double 0xC160000000000000, double %20)
%25 = fmul double %8, %18
%26 = tail call double @llvm.fmuladd.f64(double %24, double 0x4160000000000000, double %25)
%27 = fmul double %26, 0x3D10000000000000
%28 = fptosi double %27 to i32
%29 = sitofp i32 %28 to double
%30 = tail call double @llvm.fmuladd.f64(double %29, double 0xC2D0000000000000, double %26)
store double %30, double* %1
%31 = fmul double %30, 0x3D10000000000000
%32 = getelementptr inbounds double, double* %3, i64 %13
store double %31, double* %32
%33 = add nuw nsw i64 %13, 1
%34 = icmp eq i64 %33, %11
br i1 %34, label %35, label %12
35: ; preds = %12, %4
ret void
}