void wf_gsb1leg(x, order, k1, k2, basis) double x;
int order;
double k1, k2;
double *basis;
{
  int i;
  double ri, xnorm;
  basis[0] = 1.0;
  if (order == 1)
    return;
  xnorm = (x + k1) * k2;
  basis[1] = xnorm;
  if (order == 2)
    return;
  for (i = 2; i < order; i++) {
    ri = i;
    basis[i] =
        ((2.0 * ri - 1.0) * xnorm * basis[i - 1] - (ri - 1.0) * basis[i - 2]) /
        ri;
  }
  return;
}


x86 assembly (clang, -O0):
<wf_gsb1leg>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
mov    %rsi,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsd  0xeda(%rip),%xmm0
movsd  %xmm0,(%rax)
cmpl   $0x1,-0xc(%rbp)
jne    1139 <wf_gsb1leg+0x39>
jmp    121a <wf_gsb1leg+0x11a>
movsd  -0x8(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
cmpl   $0x2,-0xc(%rbp)
jne    116a <wf_gsb1leg+0x6a>
jmp    121a <wf_gsb1leg+0x11a>
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1215 <wf_gsb1leg+0x115>
cvtsi2sdl -0x2c(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  %xmm0,%xmm0
movsd  0xe70(%rip),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x40(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x38(%rbp),%xmm1
movsd  0xe40(%rip),%xmm3
subsd  %xmm3,%xmm1
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
divsd  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1171 <wf_gsb1leg+0x71>
jmp    121a <wf_gsb1leg+0x11a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<wf_gsb1leg>:
movabs $0x3ff0000000000000,%rax
mov    %rax,(%rsi)
cmp    $0x1,%edi
je     118d <wf_gsb1leg+0x8d>
addsd  %xmm1,%xmm0
mulsd  %xmm2,%xmm0
movsd  %xmm0,0x8(%rsi)
cmp    $0x3,%edi
jl     118d <wf_gsb1leg+0x8d>
mov    %edi,%eax
add    $0xfffffffffffffffd,%rax
movsd  0xece(%rip),%xmm2
xor    %ecx,%ecx
movsd  0xecc(%rip),%xmm1
movapd %xmm0,%xmm3
lea    0x2(%rcx),%edx
xorps  %xmm4,%xmm4
cvtsi2sd %edx,%xmm4
movapd %xmm4,%xmm5
addsd  %xmm4,%xmm5
addsd  %xmm1,%xmm5
mulsd  %xmm0,%xmm5
mulsd  %xmm3,%xmm5
movapd %xmm4,%xmm3
addsd  %xmm1,%xmm3
mulsd  %xmm2,%xmm3
subsd  %xmm3,%xmm5
movapd %xmm5,%xmm3
divsd  %xmm4,%xmm3
movsd  %xmm3,0x10(%rsi,%rcx,8)
cmp    %rcx,%rax
je     118d <wf_gsb1leg+0x8d>
movsd  0x8(%rsi,%rcx,8),%xmm2
add    $0x1,%rcx
jmp    1140 <wf_gsb1leg+0x40>
ret

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

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