void bspline_knot_insert(double x, unsigned int n, unsigned int p,
                         double t2[n + 2], double v2[n - p + 1],
                         const double tau[n + 1], const double v[n - p]) {
  unsigned int k = find_span(n, tau, x);
  for (unsigned int i = 0; i <= k; i++)
    t2[i] = tau[i];
  t2[k + 1] = x;
  for (unsigned int i = k + 1; i < n; i++)
    t2[i + 1] = tau[i];
  unsigned int r = k - p + 1;
  unsigned int s = k;
  for (unsigned int i = 0; i < r; i++)
    v2[i] = v[i];
  for (unsigned int i = r; i <= s; i++) {
    double a = (x - tau[i]) / (tau[i + p] - tau[i]);
    v2[i] = (1. - a) * v[i - 1] + a * v[i];
  }
  for (unsigned int i = s; i < n - p; i++)
    v2[i + 1] = v[i];
}


x86 assembly (clang, -O0):
<bspline_knot_insert>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0xc(%rbp),%edi
mov    -0x28(%rbp),%rsi
movsd  -0x8(%rbp),%xmm0
mov    $0x1,%al
call   1030 <find_span@plt>
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x34(%rbp),%eax
ja     1182 <bspline_knot_insert+0x72>
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1150 <bspline_knot_insert+0x40>
movsd  -0x8(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jae    11d8 <bspline_knot_insert+0xc8>
mov    -0x28(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11a1 <bspline_knot_insert+0x91>
mov    -0x34(%rbp),%eax
sub    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x40(%rbp),%eax
jae    1223 <bspline_knot_insert+0x113>
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    11f1 <bspline_knot_insert+0xe1>
mov    -0x40(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x44(%rbp),%eax
ja     12bd <bspline_knot_insert+0x1ad>
movsd  -0x8(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x4c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    -0x10(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x4c(%rbp),%ecx
subsd  (%rax,%rcx,8),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xd8c(%rip),%xmm0
subsd  -0x58(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x4c(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x58(%rbp),%xmm1
mov    -0x30(%rbp),%rax
mov    -0x4c(%rbp),%ecx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x4c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1229 <bspline_knot_insert+0x119>
mov    -0x44(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    -0x10(%rbp),%ecx
cmp    %ecx,%eax
jae    12ff <bspline_knot_insert+0x1ef>
mov    -0x30(%rbp),%rax
mov    -0x5c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x5c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    12c3 <bspline_knot_insert+0x1b3>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bspline_knot_insert>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %r9,%r13
mov    %r8,%rbp
mov    %rcx,%r14
mov    %rdx,%rbx
mov    %esi,%r12d
mov    %edi,0x8(%rsp)
mov    %r8,%rsi
movapd %xmm0,0x10(%rsp)
mov    $0x1,%al
call   1030 <find_span@plt>
mov    %eax,%r15d
lea    0x1(%r15),%r9d
cmp    $0x4,%r9d
jb     116f <bspline_knot_insert+0x5f>
lea    0x0(,%r9,8),%rax
add    %rbp,%rax
cmp    %rbx,%rax
jbe    11ed <bspline_knot_insert+0xdd>
lea    (%rbx,%r9,8),%rax
cmp    %rbp,%rax
jbe    11ed <bspline_knot_insert+0xdd>
xor    %edx,%edx
mov    0x8(%rsp),%r11d
movapd 0x10(%rsp),%xmm5
mov    %rdx,%rcx
not    %rcx
add    %r9,%rcx
mov    %r9,%rsi
and    $0x3,%rsi
je     11a5 <bspline_knot_insert+0x95>
xchg   %ax,%ax
movsd  0x0(%rbp,%rdx,8),%xmm0
movsd  %xmm0,(%rbx,%rdx,8)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rsi
jne    1190 <bspline_knot_insert+0x80>
cmp    $0x3,%rcx
jb     12d8 <bspline_knot_insert+0x1c8>
nop
movsd  0x0(%rbp,%rdx,8),%xmm0
movsd  %xmm0,(%rbx,%rdx,8)
movsd  0x8(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rdx,8)
movsd  0x10(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rdx,8)
movsd  0x18(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rdx,8)
add    $0x4,%rdx
cmp    %rdx,%r9
jne    11b0 <bspline_knot_insert+0xa0>
jmp    12d8 <bspline_knot_insert+0x1c8>
mov    %r9d,%edx
and    $0xfffffffc,%edx
lea    -0x4(%rdx),%rax
mov    %rax,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %ecx,%r8d
and    $0x3,%r8d
cmp    $0xc,%rax
jae    1213 <bspline_knot_insert+0x103>
xor    %edi,%edi
jmp    127d <bspline_knot_insert+0x16d>
and    $0xfffffffffffffffc,%rcx
xor    %edi,%edi
nopl   0x0(%rax)
movups 0x0(%rbp,%rdi,8),%xmm0
movups 0x10(%rbp,%rdi,8),%xmm1
movups %xmm0,(%rbx,%rdi,8)
movups %xmm1,0x10(%rbx,%rdi,8)
movups 0x20(%rbp,%rdi,8),%xmm0
movups 0x30(%rbp,%rdi,8),%xmm1
movups %xmm0,0x20(%rbx,%rdi,8)
movups %xmm1,0x30(%rbx,%rdi,8)
movups 0x40(%rbp,%rdi,8),%xmm0
movups 0x50(%rbp,%rdi,8),%xmm1
movups %xmm0,0x40(%rbx,%rdi,8)
movups %xmm1,0x50(%rbx,%rdi,8)
movupd 0x60(%rbp,%rdi,8),%xmm0
movupd 0x70(%rbp,%rdi,8),%xmm1
movupd %xmm0,0x60(%rbx,%rdi,8)
movupd %xmm1,0x70(%rbx,%rdi,8)
add    $0x10,%rdi
add    $0xfffffffffffffffc,%rcx
jne    1220 <bspline_knot_insert+0x110>
test   %r8,%r8
mov    0x8(%rsp),%r11d
movapd 0x10(%rsp),%xmm5
je     12cf <bspline_knot_insert+0x1bf>
lea    (%rbx,%rdi,8),%rcx
add    $0x10,%rcx
lea    0x10(,%rdi,8),%rdi
add    %rbp,%rdi
shl    $0x5,%r8
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
movupd -0x10(%rdi,%rsi,1),%xmm0
movupd (%rdi,%rsi,1),%xmm1
movupd %xmm0,-0x10(%rcx,%rsi,1)
movupd %xmm1,(%rcx,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%r8
jne    12b0 <bspline_knot_insert+0x1a0>
cmp    %r9,%rdx
jne    117c <bspline_knot_insert+0x6c>
movsd  %xmm5,(%rbx,%r9,8)
cmp    %r11d,%r9d
jae    1458 <bspline_knot_insert+0x348>
mov    %r11d,%r10d
sub    %r15d,%r10d
add    $0xfffffffe,%r10d
mov    %r9,%rdx
cmp    $0x3,%r10d
jb     13ea <bspline_knot_insert+0x2da>
lea    (%rbx,%r9,8),%rcx
add    $0x8,%rcx
lea    (%r10,%r9,1),%rax
lea    0x8(,%rax,8),%rdx
add    %rbp,%rdx
cmp    %rdx,%rcx
jae    1339 <bspline_knot_insert+0x229>
lea    (%rbx,%rax,8),%rax
add    $0x10,%rax
lea    0x0(,%r9,8),%rcx
add    %rbp,%rcx
mov    %r9,%rdx
cmp    %rax,%rcx
jb     13ea <bspline_knot_insert+0x2da>
add    $0x1,%r10
mov    %r10,%rdx
and    $0xfffffffffffffffc,%rdx
lea    -0x4(%rdx),%rax
mov    %rax,%r8
shr    $0x2,%r8
add    $0x1,%r8
test   %rax,%rax
je     13ba <bspline_knot_insert+0x2aa>
movabs $0x7ffffffffffffffc,%rcx
ff ff 7f
or     $0x2,%rcx
and    %r8,%rcx
lea    (%rbx,%r9,8),%r11
add    $0x38,%r11
lea    0x30(,%r9,8),%rsi
add    %rbp,%rsi
xor    %edi,%edi
xchg   %ax,%ax
movups -0x30(%rsi,%rdi,8),%xmm0
movups -0x20(%rsi,%rdi,8),%xmm1
movups %xmm0,-0x30(%r11,%rdi,8)
movups %xmm1,-0x20(%r11,%rdi,8)
movupd -0x10(%rsi,%rdi,8),%xmm0
movupd (%rsi,%rdi,8),%xmm1
movupd %xmm0,-0x10(%r11,%rdi,8)
movupd %xmm1,(%r11,%rdi,8)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rcx
jne    1380 <bspline_knot_insert+0x270>
jmp    13bc <bspline_knot_insert+0x2ac>
xor    %edi,%edi
test   $0x1,%r8b
mov    0x8(%rsp),%r11d
je     13e2 <bspline_knot_insert+0x2d2>
add    %r9,%rdi
movupd 0x0(%rbp,%rdi,8),%xmm0
movupd 0x10(%rbp,%rdi,8),%xmm1
movupd %xmm0,0x8(%rbx,%rdi,8)
movupd %xmm1,0x18(%rbx,%rdi,8)
cmp    %rdx,%r10
je     1458 <bspline_knot_insert+0x348>
add    %r9,%rdx
mov    %r11d,%esi
sub    %edx,%esi
mov    %edx,%ecx
not    %ecx
add    %r11d,%ecx
and    $0x3,%esi
je     1415 <bspline_knot_insert+0x305>
nopl   0x0(%rax,%rax,1)
movsd  0x0(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rdx,8)
add    $0x1,%rdx
add    $0xffffffff,%esi
jne    1400 <bspline_knot_insert+0x2f0>
cmp    $0x3,%ecx
jb     1458 <bspline_knot_insert+0x348>
mov    %r11d,%ecx
nopl   (%rax)
movsd  0x0(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rdx,8)
movsd  0x8(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rdx,8)
movsd  0x10(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rdx,8)
movsd  0x18(%rbp,%rdx,8),%xmm0
movsd  %xmm0,0x20(%rbx,%rdx,8)
add    $0x4,%rdx
cmp    %edx,%ecx
jne    1420 <bspline_knot_insert+0x310>
mov    %r15d,%eax
sub    %r12d,%eax
mov    %eax,%edx
inc    %edx
je     1618 <bspline_knot_insert+0x508>
mov    %edx,%r10d
cmp    $0x4,%edx
jb     1491 <bspline_knot_insert+0x381>
lea    0x0(,%r10,8),%rcx
add    %r13,%rcx
cmp    %r14,%rcx
jbe    1525 <bspline_knot_insert+0x415>
lea    (%r14,%r10,8),%rcx
cmp    %r13,%rcx
jbe    1525 <bspline_knot_insert+0x415>
xor    %edi,%edi
mov    %rdi,%rcx
not    %rcx
add    %r10,%rcx
mov    %r10,%rbx
and    $0x3,%rbx
je     14c7 <bspline_knot_insert+0x3b7>
cs nopw 0x0(%rax,%rax,1)
nop
movsd  0x0(%r13,%rdi,8),%xmm0
movsd  %xmm0,(%r14,%rdi,8)
add    $0x1,%rdi
add    $0xffffffffffffffff,%rbx
jne    14b0 <bspline_knot_insert+0x3a0>
cmp    $0x3,%rcx
jb     1618 <bspline_knot_insert+0x508>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  0x0(%r13,%rdi,8),%xmm0
movsd  %xmm0,(%r14,%rdi,8)
movsd  0x8(%r13,%rdi,8),%xmm0
movsd  %xmm0,0x8(%r14,%rdi,8)
movsd  0x10(%r13,%rdi,8),%xmm0
movsd  %xmm0,0x10(%r14,%rdi,8)
movsd  0x18(%r13,%rdi,8),%xmm0
movsd  %xmm0,0x18(%r14,%rdi,8)
add    $0x4,%rdi
cmp    %rdi,%r10
jne    14e0 <bspline_knot_insert+0x3d0>
jmp    1618 <bspline_knot_insert+0x508>
mov    %r10d,%edi
and    $0xfffffffc,%edi
lea    -0x4(%rdi),%rsi
mov    %rsi,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %ecx,%r8d
and    $0x3,%r8d
cmp    $0xc,%rsi
jae    154e <bspline_knot_insert+0x43e>
xor    %ebx,%ebx
jmp    15cd <bspline_knot_insert+0x4bd>
and    $0xfffffffffffffffc,%rcx
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups 0x0(%r13,%rbx,8),%xmm0
movups 0x10(%r13,%rbx,8),%xmm1
movups %xmm0,(%r14,%rbx,8)
movups %xmm1,0x10(%r14,%rbx,8)
movups 0x20(%r13,%rbx,8),%xmm0
movups 0x30(%r13,%rbx,8),%xmm1
movups %xmm0,0x20(%r14,%rbx,8)
movups %xmm1,0x30(%r14,%rbx,8)
movups 0x40(%r13,%rbx,8),%xmm0
movups 0x50(%r13,%rbx,8),%xmm1
movups %xmm0,0x40(%r14,%rbx,8)
movups %xmm1,0x50(%r14,%rbx,8)
movupd 0x60(%r13,%rbx,8),%xmm0
movupd 0x70(%r13,%rbx,8),%xmm1
movupd %xmm0,0x60(%r14,%rbx,8)
movupd %xmm1,0x70(%r14,%rbx,8)
add    $0x10,%rbx
add    $0xfffffffffffffffc,%rcx
jne    1560 <bspline_knot_insert+0x450>
test   %r8,%r8
je     160f <bspline_knot_insert+0x4ff>
lea    (%r14,%rbx,8),%rcx
add    $0x10,%rcx
lea    0x10(,%rbx,8),%rbx
add    %r13,%rbx
shl    $0x5,%r8
xor    %esi,%esi
nopl   0x0(%rax,%rax,1)
movupd -0x10(%rbx,%rsi,1),%xmm0
movupd (%rbx,%rsi,1),%xmm1
movupd %xmm0,-0x10(%rcx,%rsi,1)
movupd %xmm1,(%rcx,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%r8
jne    15f0 <bspline_knot_insert+0x4e0>
cmp    %r10,%rdi
jne    1493 <bspline_knot_insert+0x383>
sub    %r12d,%r11d
cmp    %r15d,%edx
ja     185d <bspline_knot_insert+0x74d>
mov    %r11d,0x8(%rsp)
mov    %r15d,%r8d
sub    %r12d,%r8d
lea    0x2(%r8),%ebx
cmp    %r9d,%ebx
mov    %r9d,%r11d
cmova  %ebx,%r11d
add    %r12d,%r11d
mov    %r15d,%ecx
not    %ecx
add    %ecx,%r11d
cmp    $0x2,%r11d
jb     1802 <bspline_knot_insert+0x6f2>
cmp    %r9d,%ebx
mov    %r9d,%r10d
cmova  %ebx,%r10d
lea    (%r10,%r12,1),%edi
sub    %r15d,%edi
add    $0xfffffffe,%edi
mov    $0xfffffffe,%esi
sub    %eax,%esi
cmp    %edi,%esi
jb     1802 <bspline_knot_insert+0x6f2>
lea    (%r10,%r12,1),%esi
add    $0xffffffff,%esi
cmp    %r9d,%esi
jb     1802 <bspline_knot_insert+0x6f2>
add    %r12d,%ecx
cmp    %edi,%ecx
jb     1802 <bspline_knot_insert+0x6f2>
mov    %edx,%esi
lea    (%r14,%rsi,8),%rcx
mov    %rsi,0x10(%rsp)
cmp    %r9d,%ebx
cmovbe %r9d,%ebx
add    %r12d,%ebx
sub    %r15d,%ebx
add    $0xfffffffe,%ebx
add    %rbx,%rsi
lea    0x8(%r14,%rsi,8),%rdi
mov    %rdi,0x30(%rsp)
mov    %rsi,0x20(%rsp)
lea    0x0(%rbp,%r9,8),%rdi
mov    %rdi,0x28(%rsp)
lea    (%rbx,%r9,1),%r10
lea    0x8(,%r10,8),%r10
add    %rbp,%r10
add    %r8,%rbx
cmp    %r10,%rcx
lea    0x8(%rbp,%rsi,8),%r10
setb   0xf(%rsp)
mov    0x30(%rsp),%rdi
cmp    %rdi,0x28(%rsp)
setb   0x28(%rsp)
cmp    %r10,%rcx
mov    0x10(%rsp),%r10
lea    0x0(%rbp,%r10,8),%rsi
setb   0xe(%rsp)
cmp    %rdi,%rsi
mov    0x20(%rsp),%rsi
lea    0x8(%r13,%rsi,8),%rsi
setb   0x20(%rsp)
cmp    %rsi,%rcx
lea    0x0(%r13,%r10,8),%rsi
setb   %r10b
cmp    %rdi,%rsi
lea    0x8(%r13,%rbx,8),%rsi
setb   0x10(%rsp)
cmp    %rsi,%rcx
lea    0x0(%r13,%r8,8),%rsi
setb   %bl
cmp    %rdi,%rsi
setb   %r8b
mov    0x28(%rsp),%cl
test   %cl,0xf(%rsp)
jne    1802 <bspline_knot_insert+0x6f2>
mov    0x20(%rsp),%cl
and    %cl,0xe(%rsp)
jne    1802 <bspline_knot_insert+0x6f2>
and    0x10(%rsp),%r10b
jne    1802 <bspline_knot_insert+0x6f2>
and    %r8b,%bl
jne    1802 <bspline_knot_insert+0x6f2>
mov    %r11d,%r8d
and    $0xfffffffe,%r8d
add    %r8d,%edx
movapd %xmm5,%xmm0
unpcklpd %xmm5,%xmm0
movapd 0x872(%rip),%xmm1
mov    %r9d,%ebx
mov    %r8d,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    0x1(%rax),%esi
movapd %xmm0,%xmm2
movupd 0x0(%rbp,%rsi,8),%xmm3
subpd  %xmm3,%xmm2
mov    %ebx,%edi
movupd 0x0(%rbp,%rdi,8),%xmm4
subpd  %xmm3,%xmm4
divpd  %xmm4,%xmm2
movapd %xmm1,%xmm3
mov    %eax,%edi
movupd 0x0(%r13,%rdi,8),%xmm4
subpd  %xmm2,%xmm3
mulpd  %xmm3,%xmm4
movupd 0x0(%r13,%rsi,8),%xmm3
mulpd  %xmm2,%xmm3
addpd  %xmm4,%xmm3
movupd %xmm3,(%r14,%rsi,8)
add    $0x2,%eax
add    $0x2,%ebx
add    $0xfffffffe,%ecx
jne    17a0 <bspline_knot_insert+0x690>
cmp    %r8d,%r11d
mov    0x8(%rsp),%r11d
jne    1807 <bspline_knot_insert+0x6f7>
jmp    185d <bspline_knot_insert+0x74d>
mov    0x8(%rsp),%r11d
movsd  0x801(%rip),%xmm0
nop
mov    %edx,%eax
movsd  0x0(%rbp,%rax,8),%xmm1
movapd %xmm5,%xmm2
lea    (%r12,%rdx,1),%ecx
movsd  0x0(%rbp,%rcx,8),%xmm3
subsd  %xmm1,%xmm2
subsd  %xmm1,%xmm3
divsd  %xmm3,%xmm2
movapd %xmm0,%xmm1
lea    -0x1(%rdx),%ecx
subsd  %xmm2,%xmm1
mulsd  0x0(%r13,%rax,8),%xmm2
mulsd  0x0(%r13,%rcx,8),%xmm1
addsd  %xmm2,%xmm1
movsd  %xmm1,(%r14,%rax,8)
add    $0x1,%edx
cmp    %r15d,%edx
jbe    1810 <bspline_knot_insert+0x700>
cmp    %r11d,%r15d
jae    1997 <bspline_knot_insert+0x887>
lea    -0x1(%r9),%rax
mov    %r11d,%edx
xor    %esi,%esi
mov    %rdx,%rcx
sub    %r9,%rcx
cmovae %rcx,%rsi
add    $0x1,%rsi
cmp    $0x4,%rsi
jb     1980 <bspline_knot_insert+0x870>
cmp    %r9,%rdx
mov    %r9,%rcx
cmova  %rdx,%rcx
lea    (%r14,%r9,8),%rdi
lea    0x0(,%rcx,8),%rbp
add    %r13,%rbp
cmp    %rbp,%rdi
jae    18c1 <bspline_knot_insert+0x7b1>
lea    (%r14,%rcx,8),%rcx
add    $0x8,%rcx
lea    0x0(,%rax,8),%rdi
add    %r13,%rdi
cmp    %rcx,%rdi
jb     1980 <bspline_knot_insert+0x870>
mov    %rsi,%r8
and    $0xfffffffffffffffc,%r8
lea    -0x4(%r8),%rcx
mov    %rcx,%r10
shr    $0x2,%r10
add    $0x1,%r10
test   %rcx,%rcx
je     19a6 <bspline_knot_insert+0x896>
movabs $0x7ffffffffffffffc,%rbx
ff ff 7f
or     $0x2,%rbx
and    %r10,%rbx
lea    0x28(,%r9,8),%rcx
add    %r13,%rcx
lea    (%r14,%r9,8),%rdi
add    $0x30,%rdi
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
movups -0x30(%rcx,%rbp,8),%xmm0
movups -0x20(%rcx,%rbp,8),%xmm1
movups %xmm0,-0x30(%rdi,%rbp,8)
movups %xmm1,-0x20(%rdi,%rbp,8)
movupd -0x10(%rcx,%rbp,8),%xmm0
movupd (%rcx,%rbp,8),%xmm1
movupd %xmm0,-0x10(%rdi,%rbp,8)
movupd %xmm1,(%rdi,%rbp,8)
add    $0x8,%rbp
add    $0xfffffffffffffffe,%rbx
jne    1910 <bspline_knot_insert+0x800>
test   $0x1,%r10b
je     196d <bspline_knot_insert+0x85d>
lea    (%rax,%rbp,1),%rcx
movupd 0x0(%r13,%rcx,8),%xmm0
movupd 0x10(%r13,%rcx,8),%xmm1
lea    (%r9,%rbp,1),%rcx
movupd %xmm0,(%r14,%rcx,8)
movupd %xmm1,0x10(%r14,%rcx,8)
cmp    %r8,%rsi
je     1997 <bspline_knot_insert+0x887>
add    %r8,%rax
cs nopw 0x0(%rax,%rax,1)
nop
movsd  0x0(%r13,%rax,8),%xmm0
movsd  %xmm0,0x8(%r14,%rax,8)
add    $0x1,%rax
cmp    %rdx,%rax
jb     1980 <bspline_knot_insert+0x870>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebp,%ebp
test   $0x1,%r10b
jne    194a <bspline_knot_insert+0x83a>
jmp    196d <bspline_knot_insert+0x85d>

LLVM IR (-O0):
define void @bspline_knot_insert(double %0, i32 %1, i32 %2, double* %3, double* %4, double* %5, double* %6) {
%8 = alloca double
%9 = alloca i32
%10 = alloca i32
%11 = alloca double*
%12 = alloca double*
%13 = alloca double*
%14 = alloca double*
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca double
%23 = alloca i32
store double %0, double* %8
store i32 %1, i32* %9
store i32 %2, i32* %10
store double* %3, double** %11
store double* %4, double** %12
store double* %5, double** %13
store double* %6, double** %14
%24 = load i32, i32* %9
%25 = add i32 %24, 2
%26 = zext i32 %25 to i64
%27 = load i32, i32* %9
%28 = load i32, i32* %10
%29 = sub i32 %27, %28
%30 = add i32 %29, 1
%31 = zext i32 %30 to i64
%32 = load i32, i32* %9
%33 = add i32 %32, 1
%34 = zext i32 %33 to i64
%35 = load i32, i32* %9
%36 = load i32, i32* %10
%37 = sub i32 %35, %36
%38 = zext i32 %37 to i64
%39 = load i32, i32* %9
%40 = load double*, double** %13
%41 = load double, double* %8
%42 = call i32 (i32, double*, double, ...) bitcast (i32 (...)* @find_span to i32 (i32, double*, double, ...)*)(i32 %39, double* %40, double %41)
store i32 %42, i32* %15
store i32 0, i32* %16
br label %43
43: ; preds = %57, %7
%44 = load i32, i32* %16
%45 = load i32, i32* %15
%46 = icmp ule i32 %44, %45
br i1 %46, label %47, label %60
47: ; preds = %43
%48 = load double*, double** %13
%49 = load i32, i32* %16
%50 = zext i32 %49 to i64
%51 = getelementptr inbounds double, double* %48, i64 %50
%52 = load double, double* %51
%53 = load double*, double** %11
%54 = load i32, i32* %16
%55 = zext i32 %54 to i64
%56 = getelementptr inbounds double, double* %53, i64 %55
store double %52, double* %56
br label %57
57: ; preds = %47
%58 = load i32, i32* %16
%59 = add i32 %58, 1
store i32 %59, i32* %16
br label %43
60: ; preds = %43
%61 = load double, double* %8
%62 = load double*, double** %11
%63 = load i32, i32* %15
%64 = add i32 %63, 1
%65 = zext i32 %64 to i64
%66 = getelementptr inbounds double, double* %62, i64 %65
store double %61, double* %66
%67 = load i32, i32* %15
%68 = add i32 %67, 1
store i32 %68, i32* %17
br label %69
69: ; preds = %84, %60
%70 = load i32, i32* %17
%71 = load i32, i32* %9
%72 = icmp ult i32 %70, %71
br i1 %72, label %73, label %87
73: ; preds = %69
%74 = load double*, double** %13
%75 = load i32, i32* %17
%76 = zext i32 %75 to i64
%77 = getelementptr inbounds double, double* %74, i64 %76
%78 = load double, double* %77
%79 = load double*, double** %11
%80 = load i32, i32* %17
%81 = add i32 %80, 1
%82 = zext i32 %81 to i64
%83 = getelementptr inbounds double, double* %79, i64 %82
store double %78, double* %83
br label %84
84: ; preds = %73
%85 = load i32, i32* %17
%86 = add i32 %85, 1
store i32 %86, i32* %17
br label %69
87: ; preds = %69
%88 = load i32, i32* %15
%89 = load i32, i32* %10
%90 = sub i32 %88, %89
%91 = add i32 %90, 1
store i32 %91, i32* %18
%92 = load i32, i32* %15
store i32 %92, i32* %19
store i32 0, i32* %20
br label %93
93: ; preds = %107, %87
%94 = load i32, i32* %20
%95 = load i32, i32* %18
%96 = icmp ult i32 %94, %95
br i1 %96, label %97, label %110
97: ; preds = %93
%98 = load double*, double** %14
%99 = load i32, i32* %20
%100 = zext i32 %99 to i64
%101 = getelementptr inbounds double, double* %98, i64 %100
%102 = load double, double* %101
%103 = load double*, double** %12
%104 = load i32, i32* %20
%105 = zext i32 %104 to i64
%106 = getelementptr inbounds double, double* %103, i64 %105
store double %102, double* %106
br label %107
107: ; preds = %97
%108 = load i32, i32* %20
%109 = add i32 %108, 1
store i32 %109, i32* %20
br label %93
110: ; preds = %93
%111 = load i32, i32* %18
store i32 %111, i32* %21
br label %112
112: ; preds = %158, %110
%113 = load i32, i32* %21
%114 = load i32, i32* %19
%115 = icmp ule i32 %113, %114
br i1 %115, label %116, label %161
116: ; preds = %112
%117 = load double, double* %8
%118 = load double*, double** %13
%119 = load i32, i32* %21
%120 = zext i32 %119 to i64
%121 = getelementptr inbounds double, double* %118, i64 %120
%122 = load double, double* %121
%123 = fsub double %117, %122
%124 = load double*, double** %13
%125 = load i32, i32* %21
%126 = load i32, i32* %10
%127 = add i32 %125, %126
%128 = zext i32 %127 to i64
%129 = getelementptr inbounds double, double* %124, i64 %128
%130 = load double, double* %129
%131 = load double*, double** %13
%132 = load i32, i32* %21
%133 = zext i32 %132 to i64
%134 = getelementptr inbounds double, double* %131, i64 %133
%135 = load double, double* %134
%136 = fsub double %130, %135
%137 = fdiv double %123, %136
store double %137, double* %22
%138 = load double, double* %22
%139 = fsub double 1.000000e+00, %138
%140 = load double*, double** %14
%141 = load i32, i32* %21
%142 = sub i32 %141, 1
%143 = zext i32 %142 to i64
%144 = getelementptr inbounds double, double* %140, i64 %143
%145 = load double, double* %144
%146 = load double, double* %22
%147 = load double*, double** %14
%148 = load i32, i32* %21
%149 = zext i32 %148 to i64
%150 = getelementptr inbounds double, double* %147, i64 %149
%151 = load double, double* %150
%152 = fmul double %146, %151
%153 = call double @llvm.fmuladd.f64(double %139, double %145, double %152)
%154 = load double*, double** %12
%155 = load i32, i32* %21
%156 = zext i32 %155 to i64
%157 = getelementptr inbounds double, double* %154, i64 %156
store double %153, double* %157
br label %158
158: ; preds = %116
%159 = load i32, i32* %21
%160 = add i32 %159, 1
store i32 %160, i32* %21
br label %112
161: ; preds = %112
%162 = load i32, i32* %19
store i32 %162, i32* %23
br label %163
163: ; preds = %180, %161
%164 = load i32, i32* %23
%165 = load i32, i32* %9
%166 = load i32, i32* %10
%167 = sub i32 %165, %166
%168 = icmp ult i32 %164, %167
br i1 %168, label %169, label %183
169: ; preds = %163
%170 = load double*, double** %14
%171 = load i32, i32* %23
%172 = zext i32 %171 to i64
%173 = getelementptr inbounds double, double* %170, i64 %172
%174 = load double, double* %173
%175 = load double*, double** %12
%176 = load i32, i32* %23
%177 = add i32 %176, 1
%178 = zext i32 %177 to i64
%179 = getelementptr inbounds double, double* %175, i64 %178
store double %174, double* %179
br label %180
180: ; preds = %169
%181 = load i32, i32* %23
%182 = add i32 %181, 1
store i32 %182, i32* %23
br label %163
183: ; preds = %163
ret void
}

LLVM IR (-O2):
define void @bspline_knot_insert(double %0, i32 %1, i32 %2, double* nocapture writeonly %3, double* nocapture writeonly %4, double* %5, double* nocapture %6) {
%8 = tail call i32 (i32, double*, double, ...) bitcast (i32 (...)* @find_span to i32 (i32, double*, double, ...)*)(i32 %1, double* %5, double %0)
%9 = add i32 %8, 1
%10 = zext i32 %9 to i64
%11 = icmp ult i32 %9, 4
br i1 %11, label %97, label %12
12: ; preds = %7
%13 = getelementptr double, double* %3, i64 %10
%14 = getelementptr double, double* %5, i64 %10
%15 = icmp ugt double* %14, %3
%16 = icmp ugt double* %13, %5
%17 = and i1 %15, %16
br i1 %17, label %97, label %18
18: ; preds = %12
%19 = and i64 %10, 4294967292
%20 = add nsw i64 %19, -4
%21 = lshr exact i64 %20, 2
%22 = add nuw nsw i64 %21, 1
%23 = and i64 %22, 3
%24 = icmp ult i64 %20, 12
br i1 %24, label %76, label %25
25: ; preds = %18
%26 = and i64 %22, 9223372036854775804
br label %27
27: ; preds = %27, %25
%28 = phi i64 [ 0, %25 ], [ %73, %27 ]
%29 = phi i64 [ 0, %25 ], [ %74, %27 ]
%30 = getelementptr inbounds double, double* %5, i64 %28
%31 = bitcast double* %30 to <2 x double>*
%32 = load <2 x double>, <2 x double>* %31
%33 = getelementptr inbounds double, double* %30, i64 2
%34 = bitcast double* %33 to <2 x double>*
%35 = load <2 x double>, <2 x double>* %34
%36 = getelementptr inbounds double, double* %3, i64 %28
%37 = bitcast double* %36 to <2 x double>*
store <2 x double> %32, <2 x double>* %37
%38 = getelementptr inbounds double, double* %36, i64 2
%39 = bitcast double* %38 to <2 x double>*
store <2 x double> %35, <2 x double>* %39
%40 = or i64 %28, 4
%41 = getelementptr inbounds double, double* %5, i64 %40
%42 = bitcast double* %41 to <2 x double>*
%43 = load <2 x double>, <2 x double>* %42
%44 = getelementptr inbounds double, double* %41, i64 2
%45 = bitcast double* %44 to <2 x double>*
%46 = load <2 x double>, <2 x double>* %45
%47 = getelementptr inbounds double, double* %3, i64 %40
%48 = bitcast double* %47 to <2 x double>*
store <2 x double> %43, <2 x double>* %48
%49 = getelementptr inbounds double, double* %47, i64 2
%50 = bitcast double* %49 to <2 x double>*
store <2 x double> %46, <2 x double>* %50
%51 = or i64 %28, 8
%52 = getelementptr inbounds double, double* %5, i64 %51
%53 = bitcast double* %52 to <2 x double>*
%54 = load <2 x double>, <2 x double>* %53
%55 = getelementptr inbounds double, double* %52, i64 2
%56 = bitcast double* %55 to <2 x double>*
%57 = load <2 x double>, <2 x double>* %56
%58 = getelementptr inbounds double, double* %3, i64 %51
%59 = bitcast double* %58 to <2 x double>*
store <2 x double> %54, <2 x double>* %59
%60 = getelementptr inbounds double, double* %58, i64 2
%61 = bitcast double* %60 to <2 x double>*
store <2 x double> %57, <2 x double>* %61
%62 = or i64 %28, 12
%63 = getelementptr inbounds double, double* %5, i64 %62
%64 = bitcast double* %63 to <2 x double>*
%65 = load <2 x double>, <2 x double>* %64
%66 = getelementptr inbounds double, double* %63, i64 2
%67 = bitcast double* %66 to <2 x double>*
%68 = load <2 x double>, <2 x double>* %67
%69 = getelementptr inbounds double, double* %3, i64 %62
%70 = bitcast double* %69 to <2 x double>*
store <2 x double> %65, <2 x double>* %70
%71 = getelementptr inbounds double, double* %69, i64 2
%72 = bitcast double* %71 to <2 x double>*
store <2 x double> %68, <2 x double>* %72
%73 = add nuw i64 %28, 16
%74 = add nuw i64 %29, 4
%75 = icmp eq i64 %74, %26
br i1 %75, label %76, label %27
76: ; preds = %27, %18
%77 = phi i64 [ 0, %18 ], [ %73, %27 ]
%78 = icmp eq i64 %23, 0
br i1 %78, label %95, label %79
79: ; preds = %76, %79
%80 = phi i64 [ %92, %79 ], [ %77, %76 ]
%81 = phi i64 [ %93, %79 ], [ 0, %76 ]
%82 = getelementptr inbounds double, double* %5, i64 %80
%83 = bitcast double* %82 to <2 x double>*
%84 = load <2 x double>, <2 x double>* %83
%85 = getelementptr inbounds double, double* %82, i64 2
%86 = bitcast double* %85 to <2 x double>*
%87 = load <2 x double>, <2 x double>* %86
%88 = getelementptr inbounds double, double* %3, i64 %80
%89 = bitcast double* %88 to <2 x double>*
store <2 x double> %84, <2 x double>* %89
%90 = getelementptr inbounds double, double* %88, i64 2
%91 = bitcast double* %90 to <2 x double>*
store <2 x double> %87, <2 x double>* %91
%92 = add nuw i64 %80, 4
%93 = add i64 %81, 1
%94 = icmp eq i64 %93, %23
br i1 %94, label %95, label %79
95: ; preds = %79, %76
%96 = icmp eq i64 %19, %10
br i1 %96, label %115, label %97
97: ; preds = %12, %7, %95
%98 = phi i64 [ 0, %12 ], [ 0, %7 ], [ %19, %95 ]
%99 = xor i64 %98, -1
%100 = add nsw i64 %99, %10
%101 = and i64 %10, 3
%102 = icmp eq i64 %101, 0
br i1 %102, label %112, label %103
103: ; preds = %97, %103
%104 = phi i64 [ %109, %103 ], [ %98, %97 ]
%105 = phi i64 [ %110, %103 ], [ 0, %97 ]
%106 = getelementptr inbounds double, double* %5, i64 %104
%107 = load double, double* %106
%108 = getelementptr inbounds double, double* %3, i64 %104
store double %107, double* %108
%109 = add nuw nsw i64 %104, 1
%110 = add i64 %105, 1
%111 = icmp eq i64 %110, %101
br i1 %111, label %112, label %103
112: ; preds = %103, %97
%113 = phi i64 [ %98, %97 ], [ %109, %103 ]
%114 = icmp ult i64 %100, 3
br i1 %114, label %115, label %219
115: ; preds = %112, %219, %95
%116 = sub i32 %1, %2
%117 = getelementptr inbounds double, double* %3, i64 %10
store double %0, double* %117
%118 = icmp ult i32 %9, %1
br i1 %118, label %119, label %238
119: ; preds = %115
%120 = add i32 %1, -2
%121 = sub i32 %120, %8
%122 = zext i32 %121 to i64
%123 = add nuw nsw i64 %122, 1
%124 = icmp ult i32 %121, 3
br i1 %124, label %199, label %125
125: ; preds = %119
%126 = add nuw nsw i64 %10, 1
%127 = getelementptr double, double* %3, i64 %126
%128 = add i32 %1, -2
%129 = sub i32 %128, %8
%130 = zext i32 %129 to i64
%131 = add nuw nsw i64 %130, %10
%132 = add nuw nsw i64 %131, 2
%133 = getelementptr double, double* %3, i64 %132
%134 = getelementptr double, double* %5, i64 %10
%135 = add nuw nsw i64 %131, 1
%136 = getelementptr double, double* %5, i64 %135
%137 = icmp ult double* %127, %136
%138 = icmp ult double* %134, %133
%139 = and i1 %137, %138
br i1 %139, label %199, label %140
140: ; preds = %125
%141 = and i64 %123, 8589934588
%142 = add nuw nsw i64 %141, %10
%143 = add nsw i64 %141, -4
%144 = lshr exact i64 %143, 2
%145 = add nuw nsw i64 %144, 1
%146 = and i64 %145, 1
%147 = icmp eq i64 %143, 0
br i1 %147, label %181, label %148
148: ; preds = %140
%149 = and i64 %145, 9223372036854775806
br label %150
150: ; preds = %150, %148
%151 = phi i64 [ 0, %148 ], [ %178, %150 ]
%152 = phi i64 [ 0, %148 ], [ %179, %150 ]
%153 = add i64 %151, %10
%154 = getelementptr inbounds double, double* %5, i64 %153
%155 = bitcast double* %154 to <2 x double>*
%156 = load <2 x double>, <2 x double>* %155
%157 = getelementptr inbounds double, double* %154, i64 2
%158 = bitcast double* %157 to <2 x double>*
%159 = load <2 x double>, <2 x double>* %158
%160 = add nuw nsw i64 %153, 1
%161 = getelementptr inbounds double, double* %3, i64 %160
%162 = bitcast double* %161 to <2 x double>*
store <2 x double> %156, <2 x double>* %162
%163 = getelementptr inbounds double, double* %161, i64 2
%164 = bitcast double* %163 to <2 x double>*
store <2 x double> %159, <2 x double>* %164
%165 = or i64 %151, 4
%166 = add i64 %165, %10
%167 = getelementptr inbounds double, double* %5, i64 %166
%168 = bitcast double* %167 to <2 x double>*
%169 = load <2 x double>, <2 x double>* %168
%170 = getelementptr inbounds double, double* %167, i64 2
%171 = bitcast double* %170 to <2 x double>*
%172 = load <2 x double>, <2 x double>* %171
%173 = add nuw nsw i64 %166, 1
%174 = getelementptr inbounds double, double* %3, i64 %173
%175 = bitcast double* %174 to <2 x double>*
store <2 x double> %169, <2 x double>* %175
%176 = getelementptr inbounds double, double* %174, i64 2
%177 = bitcast double* %176 to <2 x double>*
store <2 x double> %172, <2 x double>* %177
%178 = add nuw i64 %151, 8
%179 = add i64 %152, 2
%180 = icmp eq i64 %179, %149
br i1 %180, label %181, label %150
181: ; preds = %150, %140
%182 = phi i64 [ 0, %140 ], [ %178, %150 ]
%183 = icmp eq i64 %146, 0
br i1 %183, label %197, label %184
184: ; preds = %181
%185 = add i64 %182, %10
%186 = getelementptr inbounds double, double* %5, i64 %185
%187 = bitcast double* %186 to <2 x double>*
%188 = load <2 x double>, <2 x double>* %187
%189 = getelementptr inbounds double, double* %186, i64 2
%190 = bitcast double* %189 to <2 x double>*
%191 = load <2 x double>, <2 x double>* %190
%192 = add nuw nsw i64 %185, 1
%193 = getelementptr inbounds double, double* %3, i64 %192
%194 = bitcast double* %193 to <2 x double>*
store <2 x double> %188, <2 x double>* %194
%195 = getelementptr inbounds double, double* %193, i64 2
%196 = bitcast double* %195 to <2 x double>*
store <2 x double> %191, <2 x double>* %196
br label %197
197: ; preds = %181, %184
%198 = icmp eq i64 %123, %141
br i1 %198, label %238, label %199
199: ; preds = %125, %119, %197
%200 = phi i64 [ %10, %125 ], [ %10, %119 ], [ %142, %197 ]
%201 = trunc i64 %200 to i32
%202 = sub i32 %1, %201
%203 = xor i32 %201, -1
%204 = add i32 %203, %1
%205 = and i32 %202, 3
%206 = icmp eq i32 %205, 0
br i1 %206, label %216, label %207
207: ; preds = %199, %207
%208 = phi i64 [ %212, %207 ], [ %200, %199 ]
%209 = phi i32 [ %214, %207 ], [ 0, %199 ]
%210 = getelementptr inbounds double, double* %5, i64 %208
%211 = load double, double* %210
%212 = add nuw nsw i64 %208, 1
%213 = getelementptr inbounds double, double* %3, i64 %212
store double %211, double* %213
%214 = add i32 %209, 1
%215 = icmp eq i32 %214, %205
br i1 %215, label %216, label %207
216: ; preds = %207, %199
%217 = phi i64 [ %200, %199 ], [ %212, %207 ]
%218 = icmp ult i32 %204, 3
br i1 %218, label %238, label %348
219: ; preds = %112, %219
%220 = phi i64 [ %236, %219 ], [ %113, %112 ]
%221 = getelementptr inbounds double, double* %5, i64 %220
%222 = load double, double* %221
%223 = getelementptr inbounds double, double* %3, i64 %220
store double %222, double* %223
%224 = add nuw nsw i64 %220, 1
%225 = getelementptr inbounds double, double* %5, i64 %224
%226 = load double, double* %225
%227 = getelementptr inbounds double, double* %3, i64 %224
store double %226, double* %227
%228 = add nuw nsw i64 %220, 2
%229 = getelementptr inbounds double, double* %5, i64 %228
%230 = load double, double* %229
%231 = getelementptr inbounds double, double* %3, i64 %228
store double %230, double* %231
%232 = add nuw nsw i64 %220, 3
%233 = getelementptr inbounds double, double* %5, i64 %232
%234 = load double, double* %233
%235 = getelementptr inbounds double, double* %3, i64 %232
store double %234, double* %235
%236 = add nuw nsw i64 %220, 4
%237 = icmp eq i64 %236, %10
br i1 %237, label %115, label %219
238: ; preds = %216, %348, %197, %115
%239 = sub i32 %8, %2
%240 = add i32 %239, 1
%241 = icmp eq i32 %240, 0
br i1 %241, label %368, label %242
242: ; preds = %238
%243 = zext i32 %240 to i64
%244 = icmp ult i32 %240, 4
br i1 %244, label %330, label %245
245: ; preds = %242
%246 = getelementptr double, double* %4, i64 %243
%247 = getelementptr double, double* %6, i64 %243
%248 = icmp ugt double* %247, %4
%249 = icmp ugt double* %246, %6
%250 = and i1 %248, %249
br i1 %250, label %330, label %251
251: ; preds = %245
%252 = and i64 %243, 4294967292
%253 = add nsw i64 %252, -4
%254 = lshr exact i64 %253, 2
%255 = add nuw nsw i64 %254, 1
%256 = and i64 %255, 3
%257 = icmp ult i64 %253, 12
br i1 %257, label %309, label %258
258: ; preds = %251
%259 = and i64 %255, 9223372036854775804
br label %260
260: ; preds = %260, %258
%261 = phi i64 [ 0, %258 ], [ %306, %260 ]
%262 = phi i64 [ 0, %258 ], [ %307, %260 ]
%263 = getelementptr inbounds double, double* %6, i64 %261
%264 = bitcast double* %263 to <2 x double>*
%265 = load <2 x double>, <2 x double>* %264
%266 = getelementptr inbounds double, double* %263, i64 2
%267 = bitcast double* %266 to <2 x double>*
%268 = load <2 x double>, <2 x double>* %267
%269 = getelementptr inbounds double, double* %4, i64 %261
%270 = bitcast double* %269 to <2 x double>*
store <2 x double> %265, <2 x double>* %270
%271 = getelementptr inbounds double, double* %269, i64 2
%272 = bitcast double* %271 to <2 x double>*
store <2 x double> %268, <2 x double>* %272
%273 = or i64 %261, 4
%274 = getelementptr inbounds double, double* %6, i64 %273
%275 = bitcast double* %274 to <2 x double>*
%276 = load <2 x double>, <2 x double>* %275
%277 = getelementptr inbounds double, double* %274, i64 2
%278 = bitcast double* %277 to <2 x double>*
%279 = load <2 x double>, <2 x double>* %278
%280 = getelementptr inbounds double, double* %4, i64 %273
%281 = bitcast double* %280 to <2 x double>*
store <2 x double> %276, <2 x double>* %281
%282 = getelementptr inbounds double, double* %280, i64 2
%283 = bitcast double* %282 to <2 x double>*
store <2 x double> %279, <2 x double>* %283
%284 = or i64 %261, 8
%285 = getelementptr inbounds double, double* %6, i64 %284
%286 = bitcast double* %285 to <2 x double>*
%287 = load <2 x double>, <2 x double>* %286
%288 = getelementptr inbounds double, double* %285, i64 2
%289 = bitcast double* %288 to <2 x double>*
%290 = load <2 x double>, <2 x double>* %289
%291 = getelementptr inbounds double, double* %4, i64 %284
%292 = bitcast double* %291 to <2 x double>*
store <2 x double> %287, <2 x double>* %292
%293 = getelementptr inbounds double, double* %291, i64 2
%294 = bitcast double* %293 to <2 x double>*
store <2 x double> %290, <2 x double>* %294
%295 = or i64 %261, 12
%296 = getelementptr inbounds double, double* %6, i64 %295
%297 = bitcast double* %296 to <2 x double>*
%298 = load <2 x double>, <2 x double>* %297
%299 = getelementptr inbounds double, double* %296, i64 2
%300 = bitcast double* %299 to <2 x double>*
%301 = load <2 x double>, <2 x double>* %300
%302 = getelementptr inbounds double, double* %4, i64 %295
%303 = bitcast double* %302 to <2 x double>*
store <2 x double> %298, <2 x double>* %303
%304 = getelementptr inbounds double, double* %302, i64 2
%305 = bitcast double* %304 to <2 x double>*
store <2 x double> %301, <2 x double>* %305
%306 = add nuw i64 %261, 16
%307 = add nuw i64 %262, 4
%308 = icmp eq i64 %307, %259
br i1 %308, label %309, label %260
309: ; preds = %260, %251
%310 = phi i64 [ 0, %251 ], [ %306, %260 ]
%311 = icmp eq i64 %256, 0
br i1 %311, label %328, label %312
312: ; preds = %309, %312
%313 = phi i64 [ %325, %312 ], [ %310, %309 ]
%314 = phi i64 [ %326, %312 ], [ 0, %309 ]
%315 = getelementptr inbounds double, double* %6, i64 %313
%316 = bitcast double* %315 to <2 x double>*
%317 = load <2 x double>, <2 x double>* %316
%318 = getelementptr inbounds double, double* %315, i64 2
%319 = bitcast double* %318 to <2 x double>*
%320 = load <2 x double>, <2 x double>* %319
%321 = getelementptr inbounds double, double* %4, i64 %313
%322 = bitcast double* %321 to <2 x double>*
store <2 x double> %317, <2 x double>* %322
%323 = getelementptr inbounds double, double* %321, i64 2
%324 = bitcast double* %323 to <2 x double>*
store <2 x double> %320, <2 x double>* %324
%325 = add nuw i64 %313, 4
%326 = add i64 %314, 1
%327 = icmp eq i64 %326, %256
br i1 %327, label %328, label %312
328: ; preds = %312, %309
%329 = icmp eq i64 %252, %243
br i1 %329, label %368, label %330
330: ; preds = %245, %242, %328
%331 = phi i64 [ 0, %245 ], [ 0, %242 ], [ %252, %328 ]
%332 = xor i64 %331, -1
%333 = add nsw i64 %332, %243
%334 = and i64 %243, 3
%335 = icmp eq i64 %334, 0
br i1 %335, label %345, label %336
336: ; preds = %330, %336
%337 = phi i64 [ %342, %336 ], [ %331, %330 ]
%338 = phi i64 [ %343, %336 ], [ 0, %330 ]
%339 = getelementptr inbounds double, double* %6, i64 %337
%340 = load double, double* %339
%341 = getelementptr inbounds double, double* %4, i64 %337
store double %340, double* %341
%342 = add nuw nsw i64 %337, 1
%343 = add i64 %338, 1
%344 = icmp eq i64 %343, %334
br i1 %344, label %345, label %336
345: ; preds = %336, %330
%346 = phi i64 [ %331, %330 ], [ %342, %336 ]
%347 = icmp ult i64 %333, 3
br i1 %347, label %368, label %475
348: ; preds = %216, %348
%349 = phi i64 [ %364, %348 ], [ %217, %216 ]
%350 = getelementptr inbounds double, double* %5, i64 %349
%351 = load double, double* %350
%352 = add nuw nsw i64 %349, 1
%353 = getelementptr inbounds double, double* %3, i64 %352
store double %351, double* %353
%354 = getelementptr inbounds double, double* %5, i64 %352
%355 = load double, double* %354
%356 = add nuw nsw i64 %349, 2
%357 = getelementptr inbounds double, double* %3, i64 %356
store double %355, double* %357
%358 = getelementptr inbounds double, double* %5, i64 %356
%359 = load double, double* %358
%360 = add nuw nsw i64 %349, 3
%361 = getelementptr inbounds double, double* %3, i64 %360
store double %359, double* %361
%362 = getelementptr inbounds double, double* %5, i64 %360
%363 = load double, double* %362
%364 = add nuw nsw i64 %349, 4
%365 = getelementptr inbounds double, double* %3, i64 %364
store double %363, double* %365
%366 = trunc i64 %364 to i32
%367 = icmp eq i32 %366, %1
br i1 %367, label %238, label %348
368: ; preds = %345, %475, %328, %238
%369 = icmp ugt i32 %240, %8
br i1 %369, label %494, label %370
370: ; preds = %368
%371 = add i32 %8, 2
%372 = sub i32 %371, %2
%373 = call i32 @llvm.umax.i32(i32 %372, i32 %9)
%374 = add i32 %373, %2
%375 = xor i32 %8, -1
%376 = add i32 %374, %375
%377 = icmp ult i32 %376, 2
br i1 %377, label %473, label %378
378: ; preds = %370
%379 = add i32 %8, 2
%380 = sub i32 %379, %2
%381 = call i32 @llvm.umax.i32(i32 %380, i32 %9)
%382 = add i32 %381, %2
%383 = add i32 %382, -2
%384 = sub i32 %383, %8
%385 = sub i32 -2, %239
%386 = icmp ult i32 %385, %384
%387 = add i32 %382, -1
%388 = icmp ult i32 %387, %9
%389 = xor i32 %8, -1
%390 = add i32 %389, %2
%391 = icmp ult i32 %390, %384
%392 = or i1 %386, %388
%393 = or i1 %392, %391
br i1 %393, label %473, label %394
394: ; preds = %378
%395 = zext i32 %240 to i64
%396 = getelementptr double, double* %4, i64 %395
%397 = add i32 %8, 2
%398 = sub i32 %397, %2
%399 = call i32 @llvm.umax.i32(i32 %398, i32 %9)
%400 = add i32 %399, %2
%401 = add i32 %400, -2
%402 = sub i32 %401, %8
%403 = zext i32 %402 to i64
%404 = add nuw nsw i64 %403, %395
%405 = add nuw nsw i64 %404, 1
%406 = getelementptr double, double* %4, i64 %405
%407 = getelementptr double, double* %5, i64 %10
%408 = add nuw nsw i64 %403, %10
%409 = add nuw nsw i64 %408, 1
%410 = getelementptr double, double* %5, i64 %409
%411 = getelementptr double, double* %5, i64 %395
%412 = getelementptr double, double* %5, i64 %405
%413 = getelementptr double, double* %6, i64 %395
%414 = getelementptr double, double* %6, i64 %405
%415 = sub i32 %8, %2
%416 = zext i32 %415 to i64
%417 = getelementptr double, double* %6, i64 %416
%418 = add nuw nsw i64 %403, %416
%419 = add nuw nsw i64 %418, 1
%420 = getelementptr double, double* %6, i64 %419
%421 = icmp ult double* %396, %410
%422 = icmp ult double* %407, %406
%423 = and i1 %421, %422
%424 = icmp ult double* %396, %412
%425 = icmp ult double* %411, %406
%426 = and i1 %424, %425
%427 = or i1 %423, %426
%428 = icmp ult double* %396, %414
%429 = icmp ult double* %413, %406
%430 = and i1 %428, %429
%431 = or i1 %427, %430
%432 = icmp ult double* %396, %420
%433 = icmp ult double* %417, %406
%434 = and i1 %432, %433
%435 = or i1 %431, %434
br i1 %435, label %473, label %436
436: ; preds = %394
%437 = and i32 %376, -2
%438 = add i32 %240, %437
%439 = insertelement <2 x double> poison, double %0, i64 0
%440 = shufflevector <2 x double> %439, <2 x double> poison, <2 x i32> zeroinitializer
br label %441
441: ; preds = %441, %436
%442 = phi i32 [ 0, %436 ], [ %469, %441 ]
%443 = add i32 %240, %442
%444 = zext i32 %443 to i64
%445 = getelementptr inbounds double, double* %5, i64 %444
%446 = bitcast double* %445 to <2 x double>*
%447 = load <2 x double>, <2 x double>* %446
%448 = fsub <2 x double> %440, %447
%449 = add i32 %443, %2
%450 = zext i32 %449 to i64
%451 = getelementptr inbounds double, double* %5, i64 %450
%452 = bitcast double* %451 to <2 x double>*
%453 = load <2 x double>, <2 x double>* %452
%454 = fsub <2 x double> %453, %447
%455 = fdiv <2 x double> %448, %454
%456 = fsub <2 x double> <double 1.000000e+00, double 1.000000e+00>, %455
%457 = add i32 %239, %442
%458 = zext i32 %457 to i64
%459 = getelementptr inbounds double, double* %6, i64 %458
%460 = bitcast double* %459 to <2 x double>*
%461 = load <2 x double>, <2 x double>* %460
%462 = getelementptr inbounds double, double* %6, i64 %444
%463 = bitcast double* %462 to <2 x double>*
%464 = load <2 x double>, <2 x double>* %463
%465 = fmul <2 x double> %455, %464
%466 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %456, <2 x double> %461, <2 x double> %465)
%467 = getelementptr inbounds double, double* %4, i64 %444
%468 = bitcast double* %467 to <2 x double>*
store <2 x double> %466, <2 x double>* %468
%469 = add nuw i32 %442, 2
%470 = icmp eq i32 %469, %437
br i1 %470, label %471, label %441
471: ; preds = %441
%472 = icmp eq i32 %376, %437
br i1 %472, label %494, label %473
473: ; preds = %394, %378, %370, %471
%474 = phi i32 [ %240, %394 ], [ %240, %378 ], [ %240, %370 ], [ %438, %471 ]
br label %574
475: ; preds = %345, %475
%476 = phi i64 [ %492, %475 ], [ %346, %345 ]
%477 = getelementptr inbounds double, double* %6, i64 %476
%478 = load double, double* %477
%479 = getelementptr inbounds double, double* %4, i64 %476
store double %478, double* %479
%480 = add nuw nsw i64 %476, 1
%481 = getelementptr inbounds double, double* %6, i64 %480
%482 = load double, double* %481
%483 = getelementptr inbounds double, double* %4, i64 %480
store double %482, double* %483
%484 = add nuw nsw i64 %476, 2
%485 = getelementptr inbounds double, double* %6, i64 %484
%486 = load double, double* %485
%487 = getelementptr inbounds double, double* %4, i64 %484
store double %486, double* %487
%488 = add nuw nsw i64 %476, 3
%489 = getelementptr inbounds double, double* %6, i64 %488
%490 = load double, double* %489
%491 = getelementptr inbounds double, double* %4, i64 %488
store double %490, double* %491
%492 = add nuw nsw i64 %476, 4
%493 = icmp eq i64 %492, %243
br i1 %493, label %368, label %475
494: ; preds = %574, %471, %368
%495 = icmp ult i32 %8, %116
br i1 %495, label %496, label %598
496: ; preds = %494
%497 = add nsw i64 %10, -1
%498 = zext i32 %116 to i64
%499 = call i64 @llvm.umax.i64(i64 %498, i64 %10)
%500 = add nuw nsw i64 %499, 1
%501 = sub nsw i64 %500, %10
%502 = icmp ult i64 %501, 4
br i1 %502, label %572, label %503
503: ; preds = %496
%504 = getelementptr double, double* %4, i64 %10
%505 = call i64 @llvm.umax.i64(i64 %498, i64 %10)
%506 = add nuw nsw i64 %505, 1
%507 = getelementptr double, double* %4, i64 %506
%508 = getelementptr double, double* %6, i64 %497
%509 = getelementptr double, double* %6, i64 %505
%510 = icmp ult double* %504, %509
%511 = icmp ult double* %508, %507
%512 = and i1 %510, %511
br i1 %512, label %572, label %513
513: ; preds = %503
%514 = and i64 %501, -4
%515 = add nsw i64 %497, %514
%516 = add nsw i64 %514, -4
%517 = lshr exact i64 %516, 2
%518 = add nuw nsw i64 %517, 1
%519 = and i64 %518, 1
%520 = icmp eq i64 %516, 0
br i1 %520, label %554, label %521
521: ; preds = %513
%522 = and i64 %518, 9223372036854775806
br label %523
523: ; preds = %523, %521
%524 = phi i64 [ 0, %521 ], [ %551, %523 ]
%525 = phi i64 [ 0, %521 ], [ %552, %523 ]
%526 = add i64 %497, %524
%527 = getelementptr inbounds double, double* %6, i64 %526
%528 = bitcast double* %527 to <2 x double>*
%529 = load <2 x double>, <2 x double>* %528
%530 = getelementptr inbounds double, double* %527, i64 2
%531 = bitcast double* %530 to <2 x double>*
%532 = load <2 x double>, <2 x double>* %531
%533 = add i64 %524, %10
%534 = getelementptr inbounds double, double* %4, i64 %533
%535 = bitcast double* %534 to <2 x double>*
store <2 x double> %529, <2 x double>* %535
%536 = getelementptr inbounds double, double* %534, i64 2
%537 = bitcast double* %536 to <2 x double>*
store <2 x double> %532, <2 x double>* %537
%538 = or i64 %524, 4
%539 = add i64 %497, %538
%540 = getelementptr inbounds double, double* %6, i64 %539
%541 = bitcast double* %540 to <2 x double>*
%542 = load <2 x double>, <2 x double>* %541
%543 = getelementptr inbounds double, double* %540, i64 2
%544 = bitcast double* %543 to <2 x double>*
%545 = load <2 x double>, <2 x double>* %544
%546 = add i64 %538, %10
%547 = getelementptr inbounds double, double* %4, i64 %546
%548 = bitcast double* %547 to <2 x double>*
store <2 x double> %542, <2 x double>* %548
%549 = getelementptr inbounds double, double* %547, i64 2
%550 = bitcast double* %549 to <2 x double>*
store <2 x double> %545, <2 x double>* %550
%551 = add nuw i64 %524, 8
%552 = add i64 %525, 2
%553 = icmp eq i64 %552, %522
br i1 %553, label %554, label %523
554: ; preds = %523, %513
%555 = phi i64 [ 0, %513 ], [ %551, %523 ]
%556 = icmp eq i64 %519, 0
br i1 %556, label %570, label %557
557: ; preds = %554
%558 = add i64 %497, %555
%559 = getelementptr inbounds double, double* %6, i64 %558
%560 = bitcast double* %559 to <2 x double>*
%561 = load <2 x double>, <2 x double>* %560
%562 = getelementptr inbounds double, double* %559, i64 2
%563 = bitcast double* %562 to <2 x double>*
%564 = load <2 x double>, <2 x double>* %563
%565 = add i64 %555, %10
%566 = getelementptr inbounds double, double* %4, i64 %565
%567 = bitcast double* %566 to <2 x double>*
store <2 x double> %561, <2 x double>* %567
%568 = getelementptr inbounds double, double* %566, i64 2
%569 = bitcast double* %568 to <2 x double>*
store <2 x double> %564, <2 x double>* %569
br label %570
570: ; preds = %554, %557
%571 = icmp eq i64 %501, %514
br i1 %571, label %598, label %572
572: ; preds = %503, %496, %570
%573 = phi i64 [ %497, %503 ], [ %497, %496 ], [ %515, %570 ]
br label %599
574: ; preds = %473, %574
%575 = phi i32 [ %596, %574 ], [ %474, %473 ]
%576 = zext i32 %575 to i64
%577 = getelementptr inbounds double, double* %5, i64 %576
%578 = load double, double* %577
%579 = fsub double %0, %578
%580 = add i32 %575, %2
%581 = zext i32 %580 to i64
%582 = getelementptr inbounds double, double* %5, i64 %581
%583 = load double, double* %582
%584 = fsub double %583, %578
%585 = fdiv double %579, %584
%586 = fsub double 1.000000e+00, %585
%587 = add i32 %575, -1
%588 = zext i32 %587 to i64
%589 = getelementptr inbounds double, double* %6, i64 %588
%590 = load double, double* %589
%591 = getelementptr inbounds double, double* %6, i64 %576
%592 = load double, double* %591
%593 = fmul double %585, %592
%594 = tail call double @llvm.fmuladd.f64(double %586, double %590, double %593)
%595 = getelementptr inbounds double, double* %4, i64 %576
store double %594, double* %595
%596 = add i32 %575, 1
%597 = icmp ugt i32 %596, %8
br i1 %597, label %494, label %574
598: ; preds = %599, %570, %494
ret void
599: ; preds = %572, %599
%600 = phi i64 [ %603, %599 ], [ %573, %572 ]
%601 = getelementptr inbounds double, double* %6, i64 %600
%602 = load double, double* %601
%603 = add nuw nsw i64 %600, 1
%604 = getelementptr inbounds double, double* %4, i64 %603
store double %602, double* %604
%605 = icmp ult i64 %603, %498
br i1 %605, label %599, label %598
}