// File: mouda[P]LTE_random_access-simulate/alglibinternal.cpp
// Function: alglib_impl::complexgeneratereflection(alglib_impl::ae_vector*, long, alglib_impl::ae_complex*, alglib_impl::ae_state*)
void complexgeneratereflection(/* Complex */ ae_vector* x,
     ae_int_t n,
     ae_complex* tau,
     ae_state *_state)
{
    ae_int_t j;
    ae_complex alpha;
    double alphi;
    double alphr;
    double beta;
    double xnorm;
    double mx;
    ae_complex t;
    double s;
    ae_complex v;

    tau->x = 0;
    tau->y = 0;

    if( n<=0 )
    {
        *tau = ae_complex_from_d(0);
        return;
    }
    
    /*
     * Scale if needed (to avoid overflow/underflow during intermediate
     * calculations).
     */
    mx = 0;
    for(j=1; j<=n; j++)
    {
        mx = ae_maxreal(ae_c_abs(x->ptr.p_complex[j], _state), mx, _state);
    }
    s = 1;
    if( ae_fp_neq(mx,0) )
    {
        if( ae_fp_less(mx,1) )
        {
            s = ae_sqrt(ae_minrealnumber, _state);
            v = ae_complex_from_d(1/s);
            ae_v_cmulc(&x->ptr.p_complex[1], 1, ae_v_len(1,n), v);
        }
        else
        {
            s = ae_sqrt(ae_maxrealnumber, _state);
            v = ae_complex_from_d(1/s);
            ae_v_cmulc(&x->ptr.p_complex[1], 1, ae_v_len(1,n), v);
        }
    }
    
    /*
     * calculate
     */
    alpha = x->ptr.p_complex[1];
    mx = 0;
    for(j=2; j<=n; j++)
    {
        mx = ae_maxreal(ae_c_abs(x->ptr.p_complex[j], _state), mx, _state);
    }
    xnorm = 0;
    if( ae_fp_neq(mx,0) )
    {
        for(j=2; j<=n; j++)
        {
            t = ae_c_div_d(x->ptr.p_complex[j],mx);
            xnorm = xnorm+ae_c_mul(t,ae_c_conj(t, _state)).x;
        }
        xnorm = ae_sqrt(xnorm, _state)*mx;
    }
    alphr = alpha.x;
    alphi = alpha.y;
    if( ae_fp_eq(xnorm,0)&&ae_fp_eq(alphi,0) )
    {
        *tau = ae_complex_from_d(0);
        x->ptr.p_complex[1] = ae_c_mul_d(x->ptr.p_complex[1],s);
        return;
    }
    mx = ae_maxreal(ae_fabs(alphr, _state), ae_fabs(alphi, _state), _state);
    mx = ae_maxreal(mx, ae_fabs(xnorm, _state), _state);
    beta = -mx*ae_sqrt(ae_sqr(alphr/mx, _state)+ae_sqr(alphi/mx, _state)+ae_sqr(xnorm/mx, _state), _state);
    if( ae_fp_less(alphr,0) )
    {
        beta = -beta;
    }
    tau->x = (beta-alphr)/beta;
    tau->y = -alphi/beta;
    alpha = ae_c_d_div(1,ae_c_sub_d(alpha,beta));
    if( n>1 )
    {
        ae_v_cmulc(&x->ptr.p_complex[2], 1, ae_v_len(2,n), alpha);
    }
    alpha = ae_complex_from_d(beta);
    x->ptr.p_complex[1] = alpha;
    
    /*
     * Scale back
     */
    x->ptr.p_complex[1] = ae_c_mul_d(x->ptr.p_complex[1],s);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x240, %rsp            # imm = 0x240
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x18(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, (%rax)
movq -0x18(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, 0x8(%rax)
cmpq $0x0, -0x10(%rbp)
jg 0x25f3f
xorps %xmm0, %xmm0
callq 0x3f1b0
movsd %xmm0, -0x98(%rbp)
movsd %xmm1, -0x90(%rbp)
movq -0x18(%rbp), %rax
movq -0x98(%rbp), %rcx
movq %rcx, (%rax)
movq -0x90(%rbp), %rcx
movq %rcx, 0x8(%rax)
jmp 0x26763
xorps %xmm0, %xmm0
movsd %xmm0, -0x60(%rbp)
movq $0x1, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x10(%rbp), %rax
jg 0x25fbb
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x28(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rcx
movq %rcx, -0xa8(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xa0(%rbp)
movq -0x20(%rbp), %rdi
movsd -0xa8(%rbp), %xmm0
movsd -0xa0(%rbp), %xmm1
callq 0x3f2b0
movsd -0x60(%rbp), %xmm1
movq -0x20(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x60(%rbp)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x25f4f
movsd 0x2f045(%rip), %xmm0    # 0x55008
movsd %xmm0, -0x78(%rbp)
movsd -0x60(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c410
testb $0x1, %al
jne 0x25fde
jmp 0x2615e
movsd -0x60(%rbp), %xmm0
movsd 0x2f01d(%rip), %xmm1    # 0x55008
callq 0x3c440
testb $0x1, %al
jne 0x25ff9
jmp 0x260ad
movq -0x20(%rbp), %rdi
movsd 0x30423(%rip), %xmm0    # 0x56428
callq 0x3c890
movsd %xmm0, -0x78(%rbp)
movsd 0x2eff1(%rip), %xmm0    # 0x55008
divsd -0x78(%rbp), %xmm0
callq 0x3f1b0
movsd %xmm0, -0xb8(%rbp)
movsd %xmm1, -0xb0(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
addq $0x10, %rax
movq %rax, -0x200(%rbp)
movq -0x10(%rbp), %rsi
movl $0x1, %edi
callq 0x42370
movq -0x200(%rbp), %rdi
movq %rax, %rdx
movq -0x88(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0xc0(%rbp)
movsd -0xc8(%rbp), %xmm0
movsd -0xc0(%rbp), %xmm1
movl $0x1, %esi
callq 0x41780
jmp 0x2615c
movq -0x20(%rbp), %rdi
movsd 0x2f6ef(%rip), %xmm0    # 0x557a8
callq 0x3c890
movsd %xmm0, -0x78(%rbp)
movsd 0x2ef3d(%rip), %xmm0    # 0x55008
divsd -0x78(%rbp), %xmm0
callq 0x3f1b0
movsd %xmm0, -0xd8(%rbp)
movsd %xmm1, -0xd0(%rbp)
movq -0xd8(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
addq $0x10, %rax
movq %rax, -0x208(%rbp)
movq -0x10(%rbp), %rsi
movl $0x1, %edi
callq 0x42370
movq -0x208(%rbp), %rdi
movq %rax, %rdx
movq -0x88(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0xe0(%rbp)
movsd -0xe8(%rbp), %xmm0
movsd -0xe0(%rbp), %xmm1
movl $0x1, %esi
callq 0x41780
jmp 0x2615e
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x30(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x60(%rbp)
movq $0x2, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x10(%rbp), %rax
jg 0x261f2
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x28(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rcx
movq %rcx, -0xf8(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0xf0(%rbp)
movq -0x20(%rbp), %rdi
movsd -0xf8(%rbp), %xmm0
movsd -0xf0(%rbp), %xmm1
callq 0x3f2b0
movsd -0x60(%rbp), %xmm1
movq -0x20(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x60(%rbp)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x26186
xorps %xmm0, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x60(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c410
testb $0x1, %al
jne 0x26210
jmp 0x26366
movq $0x2, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x10(%rbp), %rax
jg 0x2634e
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x28(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rcx
movq %rcx, -0x118(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0x110(%rbp)
movsd -0x60(%rbp), %xmm2
movsd -0x118(%rbp), %xmm0
movsd -0x110(%rbp), %xmm1
callq 0x3f930
movsd %xmm0, -0x108(%rbp)
movsd %xmm1, -0x100(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x100(%rbp), %rax
movq %rax, -0x68(%rbp)
movsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x210(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x138(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x130(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x20(%rbp), %rdi
movsd -0x158(%rbp), %xmm0
movsd -0x150(%rbp), %xmm1
callq 0x3f220
movsd %xmm0, -0x148(%rbp)
movsd %xmm1, -0x140(%rbp)
movsd -0x138(%rbp), %xmm0
movsd -0x130(%rbp), %xmm1
movsd -0x148(%rbp), %xmm2
movsd -0x140(%rbp), %xmm3
callq 0x3f510
movaps %xmm0, %xmm2
movsd -0x210(%rbp), %xmm0
movsd %xmm2, -0x128(%rbp)
movsd %xmm1, -0x120(%rbp)
addsd -0x128(%rbp), %xmm0
movsd %xmm0, -0x58(%rbp)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x26218
movsd -0x58(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c890
mulsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x30(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x58(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x26390
jmp 0x26442
movsd -0x40(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c3d0
testb $0x1, %al
jne 0x263a6
jmp 0x26442
xorps %xmm0, %xmm0
callq 0x3f1b0
movsd %xmm0, -0x168(%rbp)
movsd %xmm1, -0x160(%rbp)
movq -0x18(%rbp), %rax
movq -0x168(%rbp), %rcx
movq %rcx, (%rax)
movq -0x160(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x188(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x180(%rbp)
movsd -0x78(%rbp), %xmm2
movsd -0x188(%rbp), %xmm0
movsd -0x180(%rbp), %xmm1
callq 0x3f850
movsd %xmm0, -0x178(%rbp)
movsd %xmm1, -0x170(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x178(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0x170(%rbp), %rcx
movq %rcx, 0x18(%rax)
jmp 0x26763
movsd -0x48(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c820
movsd %xmm0, -0x238(%rbp)
movsd -0x40(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c820
movaps %xmm0, %xmm1
movsd -0x238(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x60(%rbp)
movsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x230(%rbp)
movsd -0x58(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c820
movaps %xmm0, %xmm1
movsd -0x230(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3ca70
movsd %xmm0, -0x60(%rbp)
movsd -0x60(%rbp), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movsd %xmm0, -0x218(%rbp)
movsd -0x48(%rbp), %xmm0
divsd -0x60(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c870
movsd %xmm0, -0x228(%rbp)
movsd -0x40(%rbp), %xmm0
divsd -0x60(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c870
movaps %xmm0, %xmm1
movsd -0x228(%rbp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x220(%rbp)
movsd -0x58(%rbp), %xmm0
divsd -0x60(%rbp), %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c870
movaps %xmm0, %xmm1
movsd -0x220(%rbp), %xmm0
addsd %xmm1, %xmm0
movq -0x20(%rbp), %rdi
callq 0x3c890
movaps %xmm0, %xmm1
movsd -0x218(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x48(%rbp), %xmm0
xorps %xmm1, %xmm1
callq 0x3c440
testb $0x1, %al
jne 0x2656e
jmp 0x2658f
movsd -0x50(%rbp), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x50(%rbp), %xmm0
subsd -0x48(%rbp), %xmm0
divsd -0x50(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x40(%rbp), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
divsd -0x50(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x1b8(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x1b0(%rbp)
movsd -0x50(%rbp), %xmm2
movsd -0x1b8(%rbp), %xmm0
movsd -0x1b0(%rbp), %xmm1
callq 0x3f8a0
movsd %xmm0, -0x1a8(%rbp)
movsd %xmm1, -0x1a0(%rbp)
movsd -0x1a8(%rbp), %xmm1
movsd -0x1a0(%rbp), %xmm2
movsd 0x2e9e0(%rip), %xmm0    # 0x55008
callq 0x3f980
movsd %xmm0, -0x198(%rbp)
movsd %xmm1, -0x190(%rbp)
movq -0x198(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x190(%rbp), %rax
movq %rax, -0x30(%rbp)
cmpq $0x1, -0x10(%rbp)
jle 0x266b5
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
addq $0x20, %rax
movq %rax, -0x240(%rbp)
movq -0x10(%rbp), %rsi
movl $0x2, %edi
callq 0x42370
movq -0x240(%rbp), %rdi
movq %rax, %rdx
movq -0x38(%rbp), %rax
movq %rax, -0x1c8(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x1c0(%rbp)
movsd -0x1c8(%rbp), %xmm0
movsd -0x1c0(%rbp), %xmm1
movl $0x1, %esi
callq 0x41780
movsd -0x50(%rbp), %xmm0
callq 0x3f1b0
movsd %xmm0, -0x1d8(%rbp)
movsd %xmm1, -0x1d0(%rbp)
movq -0x1d8(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x1d0(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x38(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0x30(%rbp), %rcx
movq %rcx, 0x18(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x1f8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x1f0(%rbp)
movsd -0x78(%rbp), %xmm2
movsd -0x1f8(%rbp), %xmm0
movsd -0x1f0(%rbp), %xmm1
callq 0x3f850
movsd %xmm0, -0x1e8(%rbp)
movsd %xmm1, -0x1e0(%rbp)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x1e8(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0x1e0(%rbp), %rcx
movq %rcx, 0x18(%rax)
addq $0x240, %rsp            # imm = 0x240
popq %rbp
retq
nopl (%rax)