gem5  v20.0.0.3
amo.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2017 Advanced Micro Devices, Inc.
3  * All rights reserved.
4  *
5  * Copyright (c) 2003-2005 The Regents of The University of Michigan
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are
10  * met: redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer;
12  * redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution;
15  * neither the name of the copyright holders nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef __BASE_AMO_HH__
33 #define __BASE_AMO_HH__
34 
35 #include <array>
36 #include <cstdint>
37 #include <functional>
38 #include <memory>
39 
41 {
42  virtual void operator()(uint8_t *p) = 0;
43  virtual AtomicOpFunctor* clone() = 0;
44  virtual ~AtomicOpFunctor() {}
45 };
46 
47 template <class T>
49 {
50  void operator()(uint8_t *p) { execute((T *)p); }
51  virtual AtomicOpFunctor* clone() = 0;
52  virtual void execute(T * p) = 0;
53 };
54 
55 template<typename T>
57 {
58  public:
59  AtomicGeneric2Op(T _a, std::function<void(T*,T)> _op)
60  : a(_a), op(_op)
61  {}
62  AtomicOpFunctor* clone() override
63  {
64  return new AtomicGeneric2Op<T>(*this);
65  }
66  void execute(T *b) override
67  {
68  op(b, a);
69  }
70  private:
71  T a;
72  std::function<void(T*,T)> op;
73  };
74 
75 template<typename T>
77 {
78  public:
79  AtomicGeneric3Op(T _a, T _c, std::function<void(T*, T, T)> _op)
80  : a(_a), c(_c), op(_op)
81  {}
82  AtomicOpFunctor* clone() override
83  {
84  return new AtomicGeneric3Op<T>(*this);
85  }
86  void execute(T *b) override
87  {
88  op(b, a, c);
89  }
90  private:
91  T a;
92  T c;
93  std::function<void(T*, T, T)> op;
94 };
95 
96 template<typename T>
98 {
99  public:
100  AtomicGenericPair3Op(std::array<T, 2>& _a, std::array<T, 2> _c,
101  std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> _op)
102  : a(_a), c(_c), op(_op)
103  {}
104  AtomicOpFunctor* clone() override
105  {
106  return new AtomicGenericPair3Op<T>(*this);
107  }
108  void execute(T* b) override
109  {
110  op(b, a, c);
111  }
112  private:
113  std::array<T, 2> a;
114  std::array<T, 2> c;
115  std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> op;
116 };
117 
118 template<typename T>
120 {
121  public:
122  T a;
123  AtomicOpAnd(T _a) : a(_a) { }
124  void execute(T *b) { *b &= a; }
125  AtomicOpFunctor* clone () { return new AtomicOpAnd(a); }
126 };
127 
128 template<typename T>
130 {
131  public:
132  T a;
133  AtomicOpOr(T _a) : a(_a) { }
134  void execute(T *b) { *b |= a; }
135  AtomicOpFunctor* clone () { return new AtomicOpOr(a); }
136 };
137 
138 template<typename T>
140 {
141  public:
142  T a;
143  AtomicOpXor(T _a) : a(_a) {}
144  void execute(T *b) { *b ^= a; }
145  AtomicOpFunctor* clone () { return new AtomicOpXor(a); }
146 };
147 
148 template<typename T>
150 {
151  public:
152  T a;
153  AtomicOpExch(T _a) : a(_a) { }
154  void execute(T *b) { *b = a; }
155  AtomicOpFunctor* clone () { return new AtomicOpExch(a); }
156 };
157 
158 template<typename T>
160 {
161  public:
162  T a;
163  AtomicOpAdd(T _a) : a(_a) { }
164  void execute(T *b) { *b += a; }
165  AtomicOpFunctor* clone () { return new AtomicOpAdd(a); }
166 };
167 
168 template<typename T>
170 {
171  public:
172  T a;
173  AtomicOpSub(T _a) : a(_a) { }
174  void execute(T *b) { *b -= a; }
175  AtomicOpFunctor* clone () { return new AtomicOpSub(a); }
176 };
177 
178 template<typename T>
180 {
181  public:
183  void execute(T *b) { *b += 1; }
184  AtomicOpFunctor* clone () { return new AtomicOpInc(); }
185 };
186 
187 template<typename T>
189 {
190  public:
192  void execute(T *b) { *b -= 1; }
193  AtomicOpFunctor* clone () { return new AtomicOpDec(); }
194 };
195 
196 template<typename T>
198 {
199  public:
200  T a;
201  AtomicOpMax(T _a) : a(_a) { }
202 
203  void
204  execute(T *b)
205  {
206  if (a > *b)
207  *b = a;
208  }
209  AtomicOpFunctor* clone () { return new AtomicOpMax(a); }
210 };
211 
212 template<typename T>
214 {
215  public:
216  T a;
217  AtomicOpMin(T _a) : a(_a) {}
218 
219  void
220  execute(T *b)
221  {
222  if (a < *b)
223  *b = a;
224  }
225  AtomicOpFunctor* clone () { return new AtomicOpMin(a); }
226 };
227 
228 typedef std::unique_ptr<AtomicOpFunctor> AtomicOpFunctorPtr;
229 
230 #endif // __BASE_AMO_HH__
void operator()(uint8_t *p)
Definition: amo.hh:50
AtomicOpAdd(T _a)
Definition: amo.hh:163
void execute(T *b)
Definition: amo.hh:204
AtomicOpOr(T _a)
Definition: amo.hh:133
AtomicOpFunctor * clone()
Definition: amo.hh:155
AtomicOpFunctor * clone()
Definition: amo.hh:193
Bitfield< 8 > a
void execute(T *b)
Definition: amo.hh:220
std::unique_ptr< AtomicOpFunctor > AtomicOpFunctorPtr
Definition: amo.hh:228
AtomicOpSub(T _a)
Definition: amo.hh:173
AtomicGenericPair3Op(std::array< T, 2 > &_a, std::array< T, 2 > _c, std::function< void(T *, std::array< T, 2 > &, std::array< T, 2 >)> _op)
Definition: amo.hh:100
void execute(T *b) override
Definition: amo.hh:108
void execute(T *b) override
Definition: amo.hh:66
AtomicOpFunctor * clone()
Definition: amo.hh:209
AtomicOpExch(T _a)
Definition: amo.hh:153
void execute(T *b)
Definition: amo.hh:164
AtomicOpFunctor * clone()
Definition: amo.hh:165
Bitfield< 7 > b
std::function< void(T *, T, T)> op
Definition: amo.hh:93
virtual ~AtomicOpFunctor()
Definition: amo.hh:44
std::array< T, 2 > c
Definition: amo.hh:114
void execute(T *b)
Definition: amo.hh:192
virtual void operator()(uint8_t *p)=0
AtomicOpFunctor * clone() override
Definition: amo.hh:62
AtomicOpFunctor * clone()
Definition: amo.hh:125
void execute(T *b)
Definition: amo.hh:124
void execute(T *b)
Definition: amo.hh:183
AtomicOpFunctor * clone()
Definition: amo.hh:175
AtomicOpAnd(T _a)
Definition: amo.hh:123
virtual AtomicOpFunctor * clone()=0
void execute(T *b)
Definition: amo.hh:144
AtomicOpFunctor * clone()
Definition: amo.hh:184
AtomicOpFunctor * clone()
Definition: amo.hh:225
AtomicOpMax(T _a)
Definition: amo.hh:201
void execute(T *b)
Definition: amo.hh:174
AtomicOpMin(T _a)
Definition: amo.hh:217
std::function< void(T *, T)> op
Definition: amo.hh:72
void execute(T *b)
Definition: amo.hh:134
AtomicOpFunctor * clone() override
Definition: amo.hh:104
Bitfield< 29 > c
AtomicOpFunctor * clone()
Definition: amo.hh:145
void execute(T *b) override
Definition: amo.hh:86
AtomicOpInc()
Definition: amo.hh:182
std::array< T, 2 > a
Definition: amo.hh:113
AtomicOpDec()
Definition: amo.hh:191
AtomicOpFunctor * clone() override
Definition: amo.hh:82
AtomicGeneric3Op(T _a, T _c, std::function< void(T *, T, T)> _op)
Definition: amo.hh:79
AtomicOpFunctor * clone()
Definition: amo.hh:135
AtomicGeneric2Op(T _a, std::function< void(T *, T)> _op)
Definition: amo.hh:59
AtomicOpXor(T _a)
Definition: amo.hh:143
Bitfield< 4 > op
Definition: types.hh:78
void execute(T *b)
Definition: amo.hh:154
Bitfield< 0 > p

Generated on Fri Jul 3 2020 15:52:58 for gem5 by doxygen 1.8.13