// File: /workspace/github_cpp_makefile_star2_O3/mouda[P]LTE_random_access-simulate/ap.cpp
// Function: alglib_impl::_ialglib_mv_32(double const*, double const*, double*, long, double, double)
void _ialglib_mv_32(const double *a, const double *x, double *y, ae_int_t stride, double alpha, double beta)
{
    ae_int_t i, k;
    const double *pa0, *pa1, *pb;

    pa0 = a;
    pa1 = a+alglib_r_block;
    pb = x;
    for(i=0; i<16; i++)
    {
        double v0 = 0, v1 = 0;
        for(k=0; k<4; k++)
        {
            v0 += pa0[0]*pb[0];
            v1 += pa1[0]*pb[0];
            v0 += pa0[1]*pb[1];
            v1 += pa1[1]*pb[1];
            v0 += pa0[2]*pb[2];
            v1 += pa1[2]*pb[2];
            v0 += pa0[3]*pb[3];
            v1 += pa1[3]*pb[3];
            v0 += pa0[4]*pb[4];
            v1 += pa1[4]*pb[4];
            v0 += pa0[5]*pb[5];
            v1 += pa1[5]*pb[5];
            v0 += pa0[6]*pb[6];
            v1 += pa1[6]*pb[6];
            v0 += pa0[7]*pb[7];
            v1 += pa1[7]*pb[7];
            pa0 += 8;
            pa1 += 8;
            pb  += 8;
        }
        y[0] = beta*y[0]+alpha*v0;
        y[stride] = beta*y[stride]+alpha*v1;

        /*
         * now we've processed rows I and I+1,
         * pa0 and pa1 are pointing to rows I+1 and I+2.
         * move to I+2 and I+3.
         */
        pa0 += alglib_r_block;
        pa1 += alglib_r_block;
        pb = x;
        y+=2*stride;
    }
}

// Assembly:
movq %rcx, %rax
shlq $0x4, %rax
xorl %r8d, %r8d
xorpd %xmm2, %xmm2
xorl %r9d, %r9d
movsd 0x100(%rdi,%r9), %xmm6
movsd 0x108(%rdi,%r9), %xmm7
movsd 0x110(%rdi,%r9), %xmm8
movsd 0x118(%rdi,%r9), %xmm5
movhpd (%rdi,%r9), %xmm6       # xmm6 = xmm6[0],mem[0]
movsd (%rsi,%r9), %xmm9
movsd 0x8(%rsi,%r9), %xmm10
movsd 0x10(%rsi,%r9), %xmm4
movsd 0x18(%rsi,%r9), %xmm3
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
mulpd %xmm6, %xmm9
movhpd 0x8(%rdi,%r9), %xmm7    # xmm7 = xmm7[0],mem[0]
addpd %xmm2, %xmm9
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
mulpd %xmm7, %xmm10
addpd %xmm9, %xmm10
movhpd 0x10(%rdi,%r9), %xmm8   # xmm8 = xmm8[0],mem[0]
unpcklpd %xmm4, %xmm4            # xmm4 = xmm4[0,0]
mulpd %xmm8, %xmm4
addpd %xmm10, %xmm4
movhpd 0x18(%rdi,%r9), %xmm5   # xmm5 = xmm5[0],mem[0]
unpcklpd %xmm3, %xmm3            # xmm3 = xmm3[0,0]
mulpd %xmm5, %xmm3
movsd 0x120(%rdi,%r9), %xmm2
movhpd 0x20(%rdi,%r9), %xmm2   # xmm2 = xmm2[0],mem[0]
addpd %xmm4, %xmm3
movsd 0x20(%rsi,%r9), %xmm4
unpcklpd %xmm4, %xmm4            # xmm4 = xmm4[0,0]
mulpd %xmm2, %xmm4
addpd %xmm3, %xmm4
movsd 0x128(%rdi,%r9), %xmm2
movhpd 0x28(%rdi,%r9), %xmm2   # xmm2 = xmm2[0],mem[0]
movsd 0x28(%rsi,%r9), %xmm3
unpcklpd %xmm3, %xmm3            # xmm3 = xmm3[0,0]
mulpd %xmm2, %xmm3
addpd %xmm4, %xmm3
movsd 0x130(%rdi,%r9), %xmm2
movhpd 0x30(%rdi,%r9), %xmm2   # xmm2 = xmm2[0],mem[0]
movsd 0x30(%rsi,%r9), %xmm4
unpcklpd %xmm4, %xmm4            # xmm4 = xmm4[0,0]
mulpd %xmm2, %xmm4
addpd %xmm3, %xmm4
movsd 0x138(%rdi,%r9), %xmm3
movhpd 0x38(%rdi,%r9), %xmm3   # xmm3 = xmm3[0],mem[0]
movsd 0x38(%rsi,%r9), %xmm2
unpcklpd %xmm2, %xmm2            # xmm2 = xmm2[0,0]
mulpd %xmm3, %xmm2
addpd %xmm4, %xmm2
addq $0x40, %r9
cmpq $0x100, %r9             # imm = 0x100
jne 0x2e8d6
addq $0x200, %rdi            # imm = 0x200
movapd %xmm2, %xmm3
unpckhpd %xmm2, %xmm3            # xmm3 = xmm3[1],xmm2[1]
mulsd %xmm0, %xmm3
movsd (%rdx), %xmm4
mulsd %xmm1, %xmm4
addsd %xmm3, %xmm4
movsd %xmm4, (%rdx)
mulsd %xmm0, %xmm2
movsd (%rdx,%rcx,8), %xmm3
mulsd %xmm1, %xmm3
addsd %xmm2, %xmm3
movsd %xmm3, (%rdx,%rcx,8)
addq %rax, %rdx
incq %r8
cmpq $0x10, %r8
jne 0x2e8cf
retq