// File: Pyboon[P]sage/./Eigen/src/Core/GeneralProduct.h
// Function: void Eigen::internal::gemv_dense_selector<2, 1, true>::run<Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, -1, 0, -1, -1> const>, Eigen::Transpose<Eigen::CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<std::complex<double>>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1> const> const> const>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1, 1, 1, -1>>>(Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, -1, 0, -1, -1> const> const&, Eigen::Transpose<Eigen::CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<std::complex<double>>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1> const> const> const> const&, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1, 1, 1, -1>>&, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1, 1, 1, -1>>::Scalar const&)
static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
  {
    typedef typename Lhs::Scalar   LhsScalar;
    typedef typename Rhs::Scalar   RhsScalar;
    typedef typename Dest::Scalar  ResScalar;
    
    typedef internal::blas_traits<Lhs> LhsBlasTraits;
    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
    typedef internal::blas_traits<Rhs> RhsBlasTraits;
    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
    typedef typename internal::remove_all<ActualRhsType>::type ActualRhsTypeCleaned;

    typename add_const<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(lhs);
    typename add_const<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(rhs);

    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs)
                                  * RhsBlasTraits::extractScalarFactor(rhs);

    enum {
      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
      // on, the other hand it is good for the cache to pack the vector anyways...
      DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1
    };

    gemv_static_vector_if<RhsScalar,ActualRhsTypeCleaned::SizeAtCompileTime,ActualRhsTypeCleaned::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;

    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),
        DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());

    if(!DirectlyUseRhs)
    {
      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
      Index size = actualRhs.size();
      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
      #endif
      Map<typename ActualRhsTypeCleaned::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
    }

    typedef const_blas_data_mapper<LhsScalar,Index,RowMajor> LhsMapper;
    typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
    general_matrix_vector_product
        <Index,LhsScalar,LhsMapper,RowMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
        actualLhs.rows(), actualLhs.cols(),
        LhsMapper(actualLhs.data(), actualLhs.outerStride()),
        RhsMapper(actualRhsPtr, 1),
        dest.data(), dest.col(0).innerStride(), //NOTE  if dest is not a vector at compile-time, then dest.innerStride() might be wrong. (bug 1166)
        actualAlpha);
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1f0, %rsp            # imm = 0x1F0
movq %rdi, -0x70(%rbp)
movq %rsi, -0x78(%rbp)
movq %rdx, -0x80(%rbp)
movq %rcx, -0x88(%rbp)
movq -0x70(%rbp), %rdi
callq 0x322a0
movq %rax, -0x90(%rbp)
movq -0x78(%rbp), %rdi
callq 0x322e0
movq %rax, -0x98(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x188(%rbp)
movq -0x70(%rbp), %rdi
callq 0x32320
movq -0x188(%rbp), %rdi
movsd %xmm0, -0xc8(%rbp)
movsd %xmm1, -0xc0(%rbp)
leaq -0xc8(%rbp), %rsi
callq 0x20310
movsd %xmm0, -0xb8(%rbp)
movsd %xmm1, -0xb0(%rbp)
movq -0x78(%rbp), %rdi
callq 0x32360
movsd %xmm0, -0xd8(%rbp)
movsd %xmm1, -0xd0(%rbp)
leaq -0xb8(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x20310
movsd %xmm0, -0xa8(%rbp)
movsd %xmm1, -0xa0(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x323a0
movq %rax, -0x68(%rbp)
movabsq $0xfffffffffffffff, %rax # imm = 0xFFFFFFFFFFFFFFF
cmpq %rax, -0x68(%rbp)
jbe 0x31ee9
callq 0x14c90
leaq -0x98(%rbp), %rdi
callq 0x323e0
cmpq $0x0, %rax
je 0x31f10
leaq -0x98(%rbp), %rdi
callq 0x323e0
movq %rax, -0x190(%rbp)
jmp 0x31f8e
leaq -0x98(%rbp), %rdi
callq 0x323a0
shlq $0x4, %rax
cmpq $0x20000, %rax          # imm = 0x20000
ja 0x31f61
leaq -0x98(%rbp), %rdi
callq 0x323a0
movq %rax, %rcx
shlq $0x4, %rcx
addq $0x1e, %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
addq $0x10, %rax
subq $0x1, %rax
andq $-0x10, %rax
movq %rax, -0x198(%rbp)
jmp 0x31f80
leaq -0x98(%rbp), %rdi
callq 0x323a0
movq %rax, %rdi
shlq $0x4, %rdi
callq 0x14db0
movq %rax, -0x198(%rbp)
movq -0x198(%rbp), %rax
movq %rax, -0x190(%rbp)
movq -0x190(%rbp), %rax
movq %rax, -0xe8(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x323e0
cmpq $0x0, %rax
jne 0x31fbe
movq -0xe8(%rbp), %rax
movq %rax, -0x1a0(%rbp)
jmp 0x31fc9
xorl %eax, %eax
movq %rax, -0x1a0(%rbp)
jmp 0x31fc9
movq -0x1a0(%rbp), %rax
movq %rax, -0x1b8(%rbp)
leaq -0x98(%rbp), %rdi
movq %rdi, -0x1c0(%rbp)
callq 0x323a0
movq -0x1c0(%rbp), %rdi
movq %rax, -0x1b0(%rbp)
callq 0x323a0
movq -0x1b8(%rbp), %rsi
movq -0x1b0(%rbp), %rdx
shlq $0x4, %rax
subq $0x20001, %rax          # imm = 0x20001
setae %al
movzbl %al, %ecx
leaq -0x100(%rbp), %rdi
callq 0x32410
leaq -0x90(%rbp), %rdi
callq 0x356d0
movq %rax, -0x1a8(%rbp)
jmp 0x3203c
leaq -0x90(%rbp), %rdi
callq 0x356f0
movq %rax, -0x1c8(%rbp)
jmp 0x32051
leaq -0x90(%rbp), %rdi
callq 0x35710
movq %rax, -0x1d0(%rbp)
jmp 0x32066
leaq -0x90(%rbp), %rdi
callq 0x35740
movq %rax, -0x1d8(%rbp)
jmp 0x3207b
movq -0x1d8(%rbp), %rax
movq -0x1d0(%rbp), %rcx
leaq -0x120(%rbp), %rdx
movq %rdx, -0x50(%rbp)
movq %rcx, -0x58(%rbp)
movq %rax, -0x60(%rbp)
movq -0x50(%rbp), %rdx
movq -0x58(%rbp), %rcx
movq -0x60(%rbp), %rax
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq -0x28(%rbp), %rcx
movq %rcx, (%rax)
movq -0x30(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0xe8(%rbp), %rax
leaq -0x130(%rbp), %rcx
movq %rcx, -0x38(%rbp)
movq %rax, -0x40(%rbp)
movq $0x1, -0x48(%rbp)
movq -0x38(%rbp), %rdx
movq -0x40(%rbp), %rcx
movq -0x48(%rbp), %rax
movq %rdx, -0x8(%rbp)
movq %rcx, -0x10(%rbp)
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq -0x10(%rbp), %rcx
movq %rcx, (%rax)
movq -0x18(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x80(%rbp), %rdi
callq 0x35770
movq %rax, -0x1e0(%rbp)
jmp 0x32122
movq -0x80(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0x168(%rbp), %rdi
callq 0x357a0
jmp 0x32138
leaq -0x168(%rbp), %rdi
callq 0x357f0
movq %rax, -0x1e8(%rbp)
jmp 0x3214d
movq -0x1e8(%rbp), %r9
movq -0x1e0(%rbp), %r8
movq -0x1c8(%rbp), %rsi
movq -0x1a8(%rbp), %rdi
movups -0xa8(%rbp), %xmm0
movaps %xmm0, -0x180(%rbp)
movsd -0x180(%rbp), %xmm0
movsd -0x178(%rbp), %xmm1
leaq -0x120(%rbp), %rdx
leaq -0x130(%rbp), %rcx
callq 0x32460
jmp 0x3219c
leaq -0x100(%rbp), %rdi
callq 0x35810
movq %rbp, %rsp
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x108(%rbp)
movl %eax, -0x10c(%rbp)
leaq -0x100(%rbp), %rdi
callq 0x35810
movq -0x108(%rbp), %rdi
callq 0x9dc0
nopw (%rax,%rax)