gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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  * Authors: Nathan Binkert
32  * Anthony Gutierrez
33  */
34 
35 #ifndef __BASE_AMO_HH__
36 #define __BASE_AMO_HH__
37 
38 #include <array>
39 #include <cstdint>
40 #include <functional>
41 
43 {
44  virtual void operator()(uint8_t *p) = 0;
45  virtual AtomicOpFunctor* clone() = 0;
46  virtual ~AtomicOpFunctor() {}
47 };
48 
49 template <class T>
51 {
52  void operator()(uint8_t *p) { execute((T *)p); }
53  virtual AtomicOpFunctor* clone() = 0;
54  virtual void execute(T * p) = 0;
55 };
56 
57 template<typename T>
59 {
60  public:
61  AtomicGeneric2Op(T _a, std::function<void(T*,T)> _op)
62  : a(_a), op(_op)
63  {}
64  AtomicOpFunctor* clone() override
65  {
66  return new AtomicGeneric2Op<T>(*this);
67  }
68  void execute(T *b) override
69  {
70  op(b, a);
71  }
72  private:
73  T a;
74  std::function<void(T*,T)> op;
75  };
76 
77 template<typename T>
79 {
80  public:
81  AtomicGeneric3Op(T _a, T _c, std::function<void(T*, T, T)> _op)
82  : a(_a), c(_c), op(_op)
83  {}
84  AtomicOpFunctor* clone() override
85  {
86  return new AtomicGeneric3Op<T>(*this);
87  }
88  void execute(T *b) override
89  {
90  op(b, a, c);
91  }
92  private:
93  T a;
94  T c;
95  std::function<void(T*, T, T)> op;
96 };
97 
98 template<typename T>
100 {
101  public:
102  AtomicGenericPair3Op(std::array<T, 2>& _a, std::array<T, 2> _c,
103  std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> _op)
104  : a(_a), c(_c), op(_op)
105  {}
106  AtomicOpFunctor* clone() override
107  {
108  return new AtomicGenericPair3Op<T>(*this);
109  }
110  void execute(T* b) override
111  {
112  op(b, a, c);
113  }
114  private:
115  std::array<T, 2> a;
116  std::array<T, 2> c;
117  std::function<void(T*, std::array<T, 2>&, std::array<T, 2>)> op;
118 };
119 
120 template<typename T>
122 {
123  public:
124  T a;
125  AtomicOpAnd(T _a) : a(_a) { }
126  void execute(T *b) { *b &= a; }
127  AtomicOpFunctor* clone () { return new AtomicOpAnd(a); }
128 };
129 
130 template<typename T>
132 {
133  public:
134  T a;
135  AtomicOpOr(T _a) : a(_a) { }
136  void execute(T *b) { *b |= a; }
137  AtomicOpFunctor* clone () { return new AtomicOpOr(a); }
138 };
139 
140 template<typename T>
142 {
143  public:
144  T a;
145  AtomicOpXor(T _a) : a(_a) {}
146  void execute(T *b) { *b ^= a; }
147  AtomicOpFunctor* clone () { return new AtomicOpXor(a); }
148 };
149 
150 template<typename T>
152 {
153  public:
154  T a;
155  AtomicOpExch(T _a) : a(_a) { }
156  void execute(T *b) { *b = a; }
157  AtomicOpFunctor* clone () { return new AtomicOpExch(a); }
158 };
159 
160 template<typename T>
162 {
163  public:
164  T a;
165  AtomicOpAdd(T _a) : a(_a) { }
166  void execute(T *b) { *b += a; }
167  AtomicOpFunctor* clone () { return new AtomicOpAdd(a); }
168 };
169 
170 template<typename T>
172 {
173  public:
174  T a;
175  AtomicOpSub(T _a) : a(_a) { }
176  void execute(T *b) { *b -= a; }
177  AtomicOpFunctor* clone () { return new AtomicOpSub(a); }
178 };
179 
180 template<typename T>
182 {
183  public:
185  void execute(T *b) { *b += 1; }
186  AtomicOpFunctor* clone () { return new AtomicOpInc(); }
187 };
188 
189 template<typename T>
191 {
192  public:
194  void execute(T *b) { *b -= 1; }
195  AtomicOpFunctor* clone () { return new AtomicOpDec(); }
196 };
197 
198 template<typename T>
200 {
201  public:
202  T a;
203  AtomicOpMax(T _a) : a(_a) { }
204 
205  void
206  execute(T *b)
207  {
208  if (a > *b)
209  *b = a;
210  }
211  AtomicOpFunctor* clone () { return new AtomicOpMax(a); }
212 };
213 
214 template<typename T>
216 {
217  public:
218  T a;
219  AtomicOpMin(T _a) : a(_a) {}
220 
221  void
222  execute(T *b)
223  {
224  if (a < *b)
225  *b = a;
226  }
227  AtomicOpFunctor* clone () { return new AtomicOpMin(a); }
228 };
229 
230 typedef std::unique_ptr<AtomicOpFunctor> AtomicOpFunctorPtr;
231 
232 #endif // __BASE_AMO_HH__
void operator()(uint8_t *p)
Definition: amo.hh:52
AtomicOpAdd(T _a)
Definition: amo.hh:165
void execute(T *b)
Definition: amo.hh:206
AtomicOpOr(T _a)
Definition: amo.hh:135
AtomicOpFunctor * clone()
Definition: amo.hh:157
AtomicOpFunctor * clone()
Definition: amo.hh:195
Bitfield< 8 > a
void execute(T *b)
Definition: amo.hh:222
std::unique_ptr< AtomicOpFunctor > AtomicOpFunctorPtr
Definition: amo.hh:230
AtomicOpSub(T _a)
Definition: amo.hh:175
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:102
void execute(T *b) override
Definition: amo.hh:110
void execute(T *b) override
Definition: amo.hh:68
AtomicOpFunctor * clone()
Definition: amo.hh:211
AtomicOpExch(T _a)
Definition: amo.hh:155
void execute(T *b)
Definition: amo.hh:166
AtomicOpFunctor * clone()
Definition: amo.hh:167
Bitfield< 7 > b
std::function< void(T *, T, T)> op
Definition: amo.hh:95
virtual ~AtomicOpFunctor()
Definition: amo.hh:46
std::array< T, 2 > c
Definition: amo.hh:116
void execute(T *b)
Definition: amo.hh:194
virtual void operator()(uint8_t *p)=0
AtomicOpFunctor * clone() override
Definition: amo.hh:64
AtomicOpFunctor * clone()
Definition: amo.hh:127
void execute(T *b)
Definition: amo.hh:126
void execute(T *b)
Definition: amo.hh:185
AtomicOpFunctor * clone()
Definition: amo.hh:177
AtomicOpAnd(T _a)
Definition: amo.hh:125
virtual AtomicOpFunctor * clone()=0
void execute(T *b)
Definition: amo.hh:146
AtomicOpFunctor * clone()
Definition: amo.hh:186
AtomicOpFunctor * clone()
Definition: amo.hh:227
AtomicOpMax(T _a)
Definition: amo.hh:203
void execute(T *b)
Definition: amo.hh:176
AtomicOpMin(T _a)
Definition: amo.hh:219
std::function< void(T *, T)> op
Definition: amo.hh:74
void execute(T *b)
Definition: amo.hh:136
AtomicOpFunctor * clone() override
Definition: amo.hh:106
Bitfield< 29 > c
AtomicOpFunctor * clone()
Definition: amo.hh:147
void execute(T *b) override
Definition: amo.hh:88
AtomicOpInc()
Definition: amo.hh:184
std::array< T, 2 > a
Definition: amo.hh:115
AtomicOpDec()
Definition: amo.hh:193
AtomicOpFunctor * clone() override
Definition: amo.hh:84
AtomicGeneric3Op(T _a, T _c, std::function< void(T *, T, T)> _op)
Definition: amo.hh:81
AtomicOpFunctor * clone()
Definition: amo.hh:137
AtomicGeneric2Op(T _a, std::function< void(T *, T)> _op)
Definition: amo.hh:61
AtomicOpXor(T _a)
Definition: amo.hh:145
Bitfield< 4 > op
Definition: types.hh:80
void execute(T *b)
Definition: amo.hh:156
Bitfield< 0 > p

Generated on Fri Feb 28 2020 16:26:58 for gem5 by doxygen 1.8.13