// File: mouda[P]LTE_random_access-simulate/alglibinternal.cpp
// Function: alglib_impl::xcdot(alglib_impl::ae_vector*, alglib_impl::ae_vector*, long, alglib_impl::ae_vector*, alglib_impl::ae_complex*, double*, alglib_impl::ae_state*)
void xcdot(/* Complex */ ae_vector* a,
     /* Complex */ ae_vector* b,
     ae_int_t n,
     /* Real    */ ae_vector* temp,
     ae_complex* r,
     double* rerr,
     ae_state *_state)
{
    ae_int_t i;
    double mx;
    double v;
    double rerrx;
    double rerry;

    r->x = 0;
    r->y = 0;
    *rerr = 0;

    
    /*
     * special cases:
     * * N=0
     */
    if( n==0 )
    {
        *r = ae_complex_from_d(0);
        *rerr = 0;
        return;
    }
    
    /*
     * calculate real part
     */
    mx = 0;
    for(i=0; i<=n-1; i++)
    {
        v = a->ptr.p_complex[i].x*b->ptr.p_complex[i].x;
        temp->ptr.p_double[2*i+0] = v;
        mx = ae_maxreal(mx, ae_fabs(v, _state), _state);
        v = -a->ptr.p_complex[i].y*b->ptr.p_complex[i].y;
        temp->ptr.p_double[2*i+1] = v;
        mx = ae_maxreal(mx, ae_fabs(v, _state), _state);
    }
    if( ae_fp_eq(mx,0) )
    {
        r->x = 0;
        rerrx = 0;
    }
    else
    {
        xblas_xsum(temp, mx, 2*n, &r->x, &rerrx, _state);
    }
    
    /*
     * calculate imaginary part
     */
    mx = 0;
    for(i=0; i<=n-1; i++)
    {
        v = a->ptr.p_complex[i].x*b->ptr.p_complex[i].y;
        temp->ptr.p_double[2*i+0] = v;
        mx = ae_maxreal(mx, ae_fabs(v, _state), _state);
        v = a->ptr.p_complex[i].y*b->ptr.p_complex[i].x;
        temp->ptr.p_double[2*i+1] = v;
        mx = ae_maxreal(mx, ae_fabs(v, _state), _state);
    }
    if( ae_fp_eq(mx,0) )
    {
        r->y = 0;
        rerry = 0;
    }
    else
    {
        xblas_xsum(temp, mx, 2*n, &r->y, &rerry, _state);
    }
    
    /*
     * total error
     */
    if( ae_fp_eq(rerrx,0)&&ae_fp_eq(rerry,0) )
    {
        *rerr = 0;
    }
    else
    {
        *rerr = ae_maxreal(rerrx, rerry, _state)*ae_sqrt(1+ae_sqr(ae_minreal(rerrx, rerry, _state)/ae_maxreal(rerrx, rerry, _state), _state), _state);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq 0x10(%rbp), %rax
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x28(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, (%rax)
movq -0x28(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, 0x8(%rax)
movq -0x30(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, (%rax)
cmpq $0x0, -0x18(%rbp)
jne 0x31165
xorps %xmm0, %xmm0
callq 0x3f1b0
movsd %xmm0, -0x68(%rbp)
movsd %xmm1, -0x60(%rbp)
movq -0x28(%rbp), %rax
movq -0x68(%rbp), %rcx
movq %rcx, (%rax)
movq -0x60(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, (%rax)
jmp 0x31539
xorps %xmm0, %xmm0
movsd %xmm0, -0x40(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x18(%rbp), %rcx
subq $0x1, %rcx
cmpq %rcx, %rax
jg 0x312a9
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movsd (%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
mulsd (%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x48(%rbp), %xmm0
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq %rcx
movsd %xmm0, (%rax,%rcx,8)
movsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x78(%rbp)
movsd -0x48(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3c820
movaps %xmm0, %xmm1
movsd -0x78(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x40(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movsd 0x8(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
mulsd 0x8(%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x48(%rbp), %xmm0
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq %rcx
movsd %xmm0, 0x8(%rax,%rcx,8)
movsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x70(%rbp)
movsd -0x48(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3c820
movaps %xmm0, %xmm1
movsd -0x70(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x40(%rbp)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x31175
movsd -0x40(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x312bc
jmp 0x312d1
movq -0x28(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, (%rax)
xorps %xmm0, %xmm0
movsd %xmm0, -0x50(%rbp)
jmp 0x312f2
movq -0x20(%rbp), %rdi
movsd -0x40(%rbp), %xmm0
movq -0x18(%rbp), %rsi
shlq %rsi
movq -0x28(%rbp), %rdx
movq 0x10(%rbp), %r8
leaq -0x50(%rbp), %rcx
callq 0x30ce0
xorps %xmm0, %xmm0
movsd %xmm0, -0x40(%rbp)
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x18(%rbp), %rcx
subq $0x1, %rcx
cmpq %rcx, %rax
jg 0x31425
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movsd (%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
mulsd 0x8(%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x48(%rbp), %xmm0
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq %rcx
movsd %xmm0, (%rax,%rcx,8)
movsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x88(%rbp)
movsd -0x48(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3c820
movaps %xmm0, %xmm1
movsd -0x88(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x40(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movsd 0x8(%rax), %xmm0
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
mulsd (%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x48(%rbp), %xmm0
movq -0x20(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
shlq %rcx
movsd %xmm0, 0x8(%rax,%rcx,8)
movsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
movsd -0x48(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3c820
movaps %xmm0, %xmm1
movsd -0x80(%rbp), %xmm0
movq 0x10(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x40(%rbp)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x31302
movsd -0x40(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x31438
jmp 0x3144e
movq -0x28(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, 0x8(%rax)
xorps %xmm0, %xmm0
movsd %xmm0, -0x58(%rbp)
jmp 0x31473
movq -0x20(%rbp), %rdi
movsd -0x40(%rbp), %xmm0
movq -0x18(%rbp), %rsi
shlq %rsi
movq -0x28(%rbp), %rdx
addq $0x8, %rdx
movq 0x10(%rbp), %r8
leaq -0x58(%rbp), %rcx
callq 0x30ce0
movsd -0x50(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x31486
jmp 0x314a9
movsd -0x58(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x31499
jmp 0x314a9
movq -0x30(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, (%rax)
jmp 0x31539
movsd -0x50(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
movq 0x10(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x90(%rbp)
movsd -0x50(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
movq 0x10(%rbp), %rdi
callq 0x3cab0
movsd %xmm0, -0x98(%rbp)
movsd -0x50(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
movq 0x10(%rbp), %rdi
callq 0x3ca70
movaps %xmm0, %xmm1
movsd -0x98(%rbp), %xmm0
divsd %xmm1, %xmm0
movq 0x10(%rbp), %rdi
callq 0x3c870
movaps %xmm0, %xmm1
movsd 0x23af3(%rip), %xmm0    # 0x55008
addsd %xmm1, %xmm0
movq 0x10(%rbp), %rdi
callq 0x3c890
movaps %xmm0, %xmm1
movsd -0x90(%rbp), %xmm0
mulsd %xmm1, %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, (%rax)
addq $0xa0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)