// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2015 Benoit Steiner // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN_CXX11_FIXED_POINT_MAT_VEC_PRODUCT_H #define EIGEN_CXX11_FIXED_POINT_MAT_VEC_PRODUCT_H namespace Eigen { namespace internal { // Mat-Vec product // Both lhs and rhs are encoded as 8bit signed integers template struct general_matrix_vector_product { EIGEN_DONT_INLINE static void run( Index rows, Index cols, const LhsMapper& lhs, const RhsMapper& rhs, QInt32* res, Index resIncr, QInt8 alpha); }; template EIGEN_DONT_INLINE void general_matrix_vector_product::run( Index rows, Index cols, const LhsMapper& lhs, const RhsMapper& rhs, QInt32* res, Index resIncr, QInt8 alpha) { eigen_assert(alpha.value == 1); eigen_assert(resIncr == 1); eigen_assert(rows > 0); eigen_assert(cols > 0); for (Index i = 0; i < rows; ++i) { for (Index j = 0; j < cols; ++j) { res[i] += lhs(i, j) * rhs(j, 0); } } } // Mat-Vec product // The lhs is encoded using 8bit signed integers, the rhs using 8bit unsigned integers template struct general_matrix_vector_product { EIGEN_DONT_INLINE static void run( Index rows, Index cols, const LhsMapper& lhs, const RhsMapper& rhs, QInt32* res, Index resIncr, QUInt8 alpha); }; template EIGEN_DONT_INLINE void general_matrix_vector_product::run( Index rows, Index cols, const LhsMapper& lhs, const RhsMapper& rhs, QInt32* res, Index resIncr, QUInt8 alpha) { eigen_assert(alpha.value == 1); eigen_assert(resIncr == 1); eigen_assert(rows > 0); eigen_assert(cols > 0); for (Index i = 0; i < rows; ++i) { for (Index j = 0; j < cols; ++j) { res[i] += lhs(i, j) * rhs(j, 0); } } } // Mat-Vec product // The lhs is encoded using bit unsigned integers, the rhs using 8bit signed integers template struct general_matrix_vector_product { EIGEN_DONT_INLINE static void run( Index rows, Index cols, const LhsMapper& lhs, const RhsMapper& rhs, QInt32* res, Index resIncr, QInt8 alpha); }; template EIGEN_DONT_INLINE void general_matrix_vector_product::run( Index rows, Index cols, const LhsMapper& lhs, const RhsMapper& rhs, QInt32* res, Index resIncr, QInt8 alpha) { eigen_assert(alpha.value == 1); eigen_assert(resIncr == 1); eigen_assert(rows > 0); eigen_assert(cols > 0); for (Index i = 0; i < rows; ++i) { for (Index j = 0; j < cols; ++j) { res[i] += lhs(i, j) * rhs(j, 0); } } } } // namespace internal } // namespace Eigen #endif // EIGEN_CXX11_FIXED_POINT_MAT_VEC_PRODUCT_H