// File: melop[P]admixem/./spline.h
// Function: (anonymous namespace)::tk::spline::operator()(double) const
double spline::operator() (double x) const
{
    size_t n=m_x.size();
    // find the closest point m_x[idx] < x, idx=0 even if x<m_x[0]
    std::vector<double>::const_iterator it;
    it=std::lower_bound(m_x.begin(),m_x.end(),x);
    int idx=std::max( int(it-m_x.begin())-1, 0);

    double h=x-m_x[idx];
    double interpol;
    if(x<m_x[0]) {
        // extrapolation to the left
        interpol=(m_b0*h + m_c0)*h + m_y[0];
    } else if(x>m_x[n-1]) {
        // extrapolation to the right
        interpol=(m_b[n-1]*h + m_c[n-1])*h + m_y[n-1];
    } else {
        // interpolation
        interpol=((m_a[idx]*h + m_b[idx])*h + m_c[idx])*h + m_y[idx];
    }
    return interpol;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
movq %rdi, -0x8(%rbp)
movsd %xmm0, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x70(%rbp)
callq 0x2a780
movq %rax, -0x18(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x31220
movq -0x70(%rbp), %rdi
callq 0x2edd0
movq -0x70(%rbp), %rdi
movq %rax, -0x30(%rbp)
callq 0x2ee00
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rdi
movq -0x38(%rbp), %rsi
leaq -0x10(%rbp), %rdx
callq 0x31240
movq -0x70(%rbp), %rdi
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x20(%rbp)
callq 0x2edd0
movq %rax, -0x48(%rbp)
leaq -0x20(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0x31290
subl $0x1, %eax
movl %eax, -0x40(%rbp)
movl $0x0, -0x4c(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x4c(%rbp), %rsi
callq 0x30a80
movq -0x70(%rbp), %rdi
movl (%rax), %eax
movl %eax, -0x3c(%rbp)
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x78(%rbp)
movslq -0x3c(%rbp), %rsi
callq 0x2ec00
movsd -0x78(%rbp), %xmm0
movq -0x70(%rbp), %rdi
subsd (%rax), %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
xorl %eax, %eax
movl %eax, %esi
callq 0x2ec00
movsd -0x68(%rbp), %xmm1
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x20a19
movq -0x70(%rbp), %rdi
movsd 0x78(%rdi), %xmm0
movsd -0x58(%rbp), %xmm2
movsd 0x80(%rdi), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x88(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
addq $0x18, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x2ec00
movsd -0x88(%rbp), %xmm0
movsd -0x80(%rbp), %xmm2
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
jmp 0x20bda
movq -0x70(%rbp), %rdi
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x90(%rbp)
movq -0x18(%rbp), %rsi
subq $0x1, %rsi
callq 0x2ec00
movsd -0x90(%rbp), %xmm0
ucomisd (%rax), %xmm0
jbe 0x20af8
movq -0x70(%rbp), %rdi
addq $0x48, %rdi
movq -0x18(%rbp), %rsi
subq $0x1, %rsi
callq 0x2ec00
movq -0x70(%rbp), %rdi
movsd (%rax), %xmm0
movsd %xmm0, -0xb0(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0xa8(%rbp)
addq $0x60, %rdi
movq -0x18(%rbp), %rsi
subq $0x1, %rsi
callq 0x2ec00
movsd -0xb0(%rbp), %xmm0
movsd -0xa8(%rbp), %xmm2
movq -0x70(%rbp), %rdi
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x98(%rbp)
addq $0x18, %rdi
movq -0x18(%rbp), %rsi
subq $0x1, %rsi
callq 0x2ec00
movsd -0xa0(%rbp), %xmm0
movsd -0x98(%rbp), %xmm2
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
jmp 0x20bd8
movq -0x70(%rbp), %rdi
addq $0x30, %rdi
movslq -0x3c(%rbp), %rsi
callq 0x2ec00
movq -0x70(%rbp), %rdi
movsd (%rax), %xmm0
movsd %xmm0, -0xe0(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0xd8(%rbp)
addq $0x48, %rdi
movslq -0x3c(%rbp), %rsi
callq 0x2ec00
movsd -0xe0(%rbp), %xmm0
movsd -0xd8(%rbp), %xmm2
movq -0x70(%rbp), %rdi
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0xc8(%rbp)
addq $0x60, %rdi
movslq -0x3c(%rbp), %rsi
callq 0x2ec00
movsd -0xd0(%rbp), %xmm0
movsd -0xc8(%rbp), %xmm2
movq -0x70(%rbp), %rdi
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0xc0(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
addq $0x18, %rdi
movslq -0x3c(%rbp), %rsi
callq 0x2ec00
movsd -0xc0(%rbp), %xmm0
movsd -0xb8(%rbp), %xmm2
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
jmp 0x20bda
movsd -0x60(%rbp), %xmm0
addq $0xe0, %rsp
popq %rbp
retq
nopl (%rax,%rax)