Eigen  3.4.90 (git rev 5a9f66fb35d03a4da9ef8976e67a61b30aa16dcf)
 
Loading...
Searching...
No Matches
AssignmentFunctors.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2010 Gael Guennebaud <[email protected]>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
11#define EIGEN_ASSIGNMENT_FUNCTORS_H
12
13// IWYU pragma: private
14#include "../InternalHeaderCheck.h"
15
16namespace Eigen {
17
18namespace internal {
19
24template <typename DstScalar, typename SrcScalar>
25struct assign_op {
26 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a = b; }
27
28 template <int Alignment, typename Packet>
29 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
30 internal::pstoret<DstScalar, Packet, Alignment>(a, b);
31 }
32};
33
34// Empty overload for void type (used by PermutationMatrix)
35template <typename DstScalar>
36struct assign_op<DstScalar, void> {};
37
38template <typename DstScalar, typename SrcScalar>
39struct functor_traits<assign_op<DstScalar, SrcScalar> > {
40 enum {
41 Cost = NumTraits<DstScalar>::ReadCost,
42 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::Vectorizable &&
43 packet_traits<SrcScalar>::Vectorizable
44 };
45};
46
51template <typename DstScalar, typename SrcScalar>
52struct add_assign_op {
53 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a += b; }
54
55 template <int Alignment, typename Packet>
56 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
57 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::padd(internal::ploadt<Packet, Alignment>(a), b));
58 }
59};
60template <typename DstScalar, typename SrcScalar>
61struct functor_traits<add_assign_op<DstScalar, SrcScalar> > {
62 enum {
63 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
64 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasAdd
65 };
66};
67
72template <typename DstScalar, typename SrcScalar>
73struct sub_assign_op {
74 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a -= b; }
75
76 template <int Alignment, typename Packet>
77 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
78 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::psub(internal::ploadt<Packet, Alignment>(a), b));
79 }
80};
81template <typename DstScalar, typename SrcScalar>
82struct functor_traits<sub_assign_op<DstScalar, SrcScalar> > {
83 enum {
84 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
85 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasSub
86 };
87};
88
93template <typename DstScalar, typename SrcScalar = DstScalar>
94struct mul_assign_op {
95 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; }
96
97 template <int Alignment, typename Packet>
98 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
99 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pmul(internal::ploadt<Packet, Alignment>(a), b));
100 }
101};
102template <typename DstScalar, typename SrcScalar>
103struct functor_traits<mul_assign_op<DstScalar, SrcScalar> > {
104 enum {
105 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
106 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasMul
107 };
108};
109
114template <typename DstScalar, typename SrcScalar = DstScalar>
115struct div_assign_op {
116 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a /= b; }
117
118 template <int Alignment, typename Packet>
119 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
120 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pdiv(internal::ploadt<Packet, Alignment>(a), b));
121 }
122};
123template <typename DstScalar, typename SrcScalar>
124struct functor_traits<div_assign_op<DstScalar, SrcScalar> > {
125 enum {
126 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
127 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasDiv
128 };
129};
130
146template <typename Scalar>
147struct swap_assign_op {
148 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const {
149#ifdef EIGEN_GPUCC
150 // FIXME is there some kind of cuda::swap?
151 Scalar t = b;
152 const_cast<Scalar&>(b) = a;
153 a = t;
154#else
155 using std::swap;
156 swap(a, const_cast<Scalar&>(b));
157#endif
158 }
159};
160template <typename Scalar>
161struct functor_traits<swap_assign_op<Scalar> > {
162 enum {
163 Cost = 3 * NumTraits<Scalar>::ReadCost,
164 PacketAccess =
165#if defined(EIGEN_VECTORIZE_AVX) && (EIGEN_CLANG_STRICT_LESS_THAN(8, 0, 0) || EIGEN_COMP_CLANGAPPLE)
166 // This is a partial workaround for a bug in clang generating bad code
167 // when mixing 256/512 bits loads and 128 bits moves.
168 // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1684
169 // https://bugs.llvm.org/show_bug.cgi?id=40815
170 0
171#else
172 packet_traits<Scalar>::Vectorizable
173#endif
174 };
175};
176
177} // namespace internal
178
179} // namespace Eigen
180
181#endif // EIGEN_ASSIGNMENT_FUNCTORS_H
Namespace containing all symbols from the Eigen library.
Definition Core:137