str.isa (10037:5cac77888310) str.isa (12219:5c42cf79d862)
1// -*- mode:c++ -*-
2
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010-2011 ARM Limited
3// Copyright (c) 2010-2011,2017 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating
9// to a hardware implementation of the functionality of the software
10// licensed hereunder. You may use the software subject to the license
11// terms below provided that you ensure that this notice is replicated
12// unmodified and in its entirety in all distributions of the software,
13// modified or unmodified, in source code or in binary form.
14//
15// Redistribution and use in source and binary forms, with or without
16// modification, are permitted provided that the following conditions are
17// met: redistributions of source code must retain the above copyright
18// notice, this list of conditions and the following disclaimer;
19// redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution;
22// neither the name of the copyright holders nor the names of its
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Authors: Gabe Black
39
40let {{
41 import math
42
43 header_output = ""
44 decoder_output = ""
45 exec_output = ""
46
47 class StoreInst(LoadStoreInst):
48 execBase = 'Store'
49
50 def __init__(self, mnem, post, add, writeback, size=4,
51 sign=False, user=False, flavor="normal",
52 instFlags = []):
53 super(StoreInst, self).__init__()
54
55 self.name = mnem
56 self.post = post
57 self.add = add
58 self.writeback = writeback
59 self.size = size
60 self.sign = sign
61 self.user = user
62 self.flavor = flavor
63 self.instFlags = instFlags
64 if self.add:
65 self.op = " +"
66 else:
67 self.op = " -"
68
69 self.memFlags = ["ArmISA::TLB::MustBeOne"]
70 self.codeBlobs = { "postacc_code" : "" }
71
72 def emitHelper(self, base = 'Memory', wbDecl = None):
73
74 global header_output, decoder_output, exec_output
75
76 codeBlobs = self.codeBlobs
77 codeBlobs["predicate_test"] = pickPredicate(codeBlobs)
78 (newHeader,
79 newDecoder,
80 newExec) = self.fillTemplates(self.name, self.Name, codeBlobs,
81 self.memFlags, self.instFlags,
82 base, wbDecl, None, False,
83 self.size, self.sign)
84
85 header_output += newHeader
86 decoder_output += newDecoder
87 exec_output += newExec
88
89 class SrsInst(LoadStoreInst):
90 execBase = 'Store'
91 decConstBase = 'Srs'
92
93 def __init__(self, mnem, post, add, writeback):
94 super(SrsInst, self).__init__()
95 self.name = mnem
96 self.post = post
97 self.add = add
98 self.writeback = writeback
99
100 self.Name = "SRS_" + storeImmClassName(post, add, writeback, 8)
101
102 def emit(self):
103 offset = 0
104 if self.post != self.add:
105 offset += 4
106 if not self.add:
107 offset -= 8
108
109 eaCode = "EA = SpMode + %d;" % offset
110
111 wbDiff = -8
112 if self.add:
113 wbDiff = 8
114 accCode = '''
115 CPSR cpsr = Cpsr;
116 Mem_ud = (uint64_t)cSwap(LR_uw, cpsr.e) |
117 ((uint64_t)cSwap(Spsr_uw, cpsr.e) << 32);
118 '''
119
120 global header_output, decoder_output, exec_output
121
122 codeBlobs = { "ea_code": eaCode,
123 "memacc_code": accCode,
124 "postacc_code": "" }
125 codeBlobs["predicate_test"] = pickPredicate(codeBlobs)
126
127 wbDecl = None
128 if self.writeback:
129 wbDecl = '''MicroAddiUop(machInst,
130 intRegInMode((OperatingMode)regMode, INTREG_SP),
131 intRegInMode((OperatingMode)regMode, INTREG_SP),
132 %d);''' % wbDiff
133
134 (newHeader,
135 newDecoder,
136 newExec) = self.fillTemplates(self.name, self.Name, codeBlobs,
137 ["ArmISA::TLB::AlignWord", "ArmISA::TLB::MustBeOne"], [],
138 'SrsOp', wbDecl)
139
140 header_output += newHeader
141 decoder_output += newDecoder
142 exec_output += newExec
143
144 class StoreImmInst(StoreInst):
145 def __init__(self, *args, **kargs):
146 super(StoreImmInst, self).__init__(*args, **kargs)
147 self.offset = self.op + " imm"
148
149 if self.add:
150 self.wbDecl = "MicroAddiUop(machInst, base, base, imm);"
151 else:
152 self.wbDecl = "MicroSubiUop(machInst, base, base, imm);"
153
154 class StoreRegInst(StoreInst):
155 def __init__(self, *args, **kargs):
156 super(StoreRegInst, self).__init__(*args, **kargs)
157 self.offset = self.op + " shift_rm_imm(Index, shiftAmt," + \
158 " shiftType, OptShiftRmCondCodesC)"
159 if self.add:
160 self.wbDecl = '''
161 MicroAddUop(machInst, base, base, index, shiftAmt, shiftType);
162 '''
163 else:
164 self.wbDecl = '''
165 MicroSubUop(machInst, base, base, index, shiftAmt, shiftType);
166 '''
167
168 class StoreSingle(StoreInst):
169 def __init__(self, *args, **kargs):
170 super(StoreSingle, self).__init__(*args, **kargs)
171
172 # Build the default class name
173 self.Name = self.nameFunc(self.post, self.add, self.writeback,
174 self.size, self.sign, self.user)
175
176 # Add memory request flags where necessary
177 self.memFlags.append("%d" % int(math.log(self.size, 2)))
178 if self.user:
179 self.memFlags.append("ArmISA::TLB::UserMode")
180
181 if self.flavor == "exclusive":
182 self.memFlags.append("Request::LLSC")
183 elif self.flavor != "fp":
184 self.memFlags.append("ArmISA::TLB::AllowUnaligned")
185
186 # Disambiguate the class name for different flavors of stores
187 if self.flavor != "normal":
188 self.Name = "%s_%s" % (self.name.upper(), self.Name)
189
190 def emit(self):
191 # Address computation
192 eaCode = "EA = Base"
193 if not self.post:
194 eaCode += self.offset
195 eaCode += ";"
196
197 if self.flavor == "fp":
198 eaCode += vfpEnabledCheckCode
199
200 self.codeBlobs["ea_code"] = eaCode
201
202 # Code that actually handles the access
203 if self.flavor == "fp":
204 accCode = 'Mem%(suffix)s = cSwap(FpDest_uw, ((CPSR)Cpsr).e);'
205 else:
206 accCode = \
207 'Mem%(suffix)s = cSwap(Dest%(suffix)s, ((CPSR)Cpsr).e);'
208 accCode = accCode % \
209 { "suffix" : buildMemSuffix(self.sign, self.size) }
210
211 self.codeBlobs["memacc_code"] = accCode
212
213 # Push it out to the output files
214 base = buildMemBase(self.basePrefix, self.post, self.writeback)
215 wbDecl = None
216 if self.writeback:
217 wbDecl = self.wbDecl
218 self.emitHelper(base, wbDecl)
219
220 def storeImmClassName(post, add, writeback, size=4, sign=False, user=False):
221 return memClassName("STORE_IMM", post, add, writeback, size, sign, user)
222
223 class StoreImmEx(StoreImmInst, StoreSingle):
224 execBase = 'StoreEx'
225 decConstBase = 'StoreExImm'
226 basePrefix = 'MemoryExImm'
227 nameFunc = staticmethod(storeImmClassName)
228
229 def __init__(self, *args, **kargs):
230 super(StoreImmEx, self).__init__(*args, **kargs)
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating
9// to a hardware implementation of the functionality of the software
10// licensed hereunder. You may use the software subject to the license
11// terms below provided that you ensure that this notice is replicated
12// unmodified and in its entirety in all distributions of the software,
13// modified or unmodified, in source code or in binary form.
14//
15// Redistribution and use in source and binary forms, with or without
16// modification, are permitted provided that the following conditions are
17// met: redistributions of source code must retain the above copyright
18// notice, this list of conditions and the following disclaimer;
19// redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution;
22// neither the name of the copyright holders nor the names of its
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Authors: Gabe Black
39
40let {{
41 import math
42
43 header_output = ""
44 decoder_output = ""
45 exec_output = ""
46
47 class StoreInst(LoadStoreInst):
48 execBase = 'Store'
49
50 def __init__(self, mnem, post, add, writeback, size=4,
51 sign=False, user=False, flavor="normal",
52 instFlags = []):
53 super(StoreInst, self).__init__()
54
55 self.name = mnem
56 self.post = post
57 self.add = add
58 self.writeback = writeback
59 self.size = size
60 self.sign = sign
61 self.user = user
62 self.flavor = flavor
63 self.instFlags = instFlags
64 if self.add:
65 self.op = " +"
66 else:
67 self.op = " -"
68
69 self.memFlags = ["ArmISA::TLB::MustBeOne"]
70 self.codeBlobs = { "postacc_code" : "" }
71
72 def emitHelper(self, base = 'Memory', wbDecl = None):
73
74 global header_output, decoder_output, exec_output
75
76 codeBlobs = self.codeBlobs
77 codeBlobs["predicate_test"] = pickPredicate(codeBlobs)
78 (newHeader,
79 newDecoder,
80 newExec) = self.fillTemplates(self.name, self.Name, codeBlobs,
81 self.memFlags, self.instFlags,
82 base, wbDecl, None, False,
83 self.size, self.sign)
84
85 header_output += newHeader
86 decoder_output += newDecoder
87 exec_output += newExec
88
89 class SrsInst(LoadStoreInst):
90 execBase = 'Store'
91 decConstBase = 'Srs'
92
93 def __init__(self, mnem, post, add, writeback):
94 super(SrsInst, self).__init__()
95 self.name = mnem
96 self.post = post
97 self.add = add
98 self.writeback = writeback
99
100 self.Name = "SRS_" + storeImmClassName(post, add, writeback, 8)
101
102 def emit(self):
103 offset = 0
104 if self.post != self.add:
105 offset += 4
106 if not self.add:
107 offset -= 8
108
109 eaCode = "EA = SpMode + %d;" % offset
110
111 wbDiff = -8
112 if self.add:
113 wbDiff = 8
114 accCode = '''
115 CPSR cpsr = Cpsr;
116 Mem_ud = (uint64_t)cSwap(LR_uw, cpsr.e) |
117 ((uint64_t)cSwap(Spsr_uw, cpsr.e) << 32);
118 '''
119
120 global header_output, decoder_output, exec_output
121
122 codeBlobs = { "ea_code": eaCode,
123 "memacc_code": accCode,
124 "postacc_code": "" }
125 codeBlobs["predicate_test"] = pickPredicate(codeBlobs)
126
127 wbDecl = None
128 if self.writeback:
129 wbDecl = '''MicroAddiUop(machInst,
130 intRegInMode((OperatingMode)regMode, INTREG_SP),
131 intRegInMode((OperatingMode)regMode, INTREG_SP),
132 %d);''' % wbDiff
133
134 (newHeader,
135 newDecoder,
136 newExec) = self.fillTemplates(self.name, self.Name, codeBlobs,
137 ["ArmISA::TLB::AlignWord", "ArmISA::TLB::MustBeOne"], [],
138 'SrsOp', wbDecl)
139
140 header_output += newHeader
141 decoder_output += newDecoder
142 exec_output += newExec
143
144 class StoreImmInst(StoreInst):
145 def __init__(self, *args, **kargs):
146 super(StoreImmInst, self).__init__(*args, **kargs)
147 self.offset = self.op + " imm"
148
149 if self.add:
150 self.wbDecl = "MicroAddiUop(machInst, base, base, imm);"
151 else:
152 self.wbDecl = "MicroSubiUop(machInst, base, base, imm);"
153
154 class StoreRegInst(StoreInst):
155 def __init__(self, *args, **kargs):
156 super(StoreRegInst, self).__init__(*args, **kargs)
157 self.offset = self.op + " shift_rm_imm(Index, shiftAmt," + \
158 " shiftType, OptShiftRmCondCodesC)"
159 if self.add:
160 self.wbDecl = '''
161 MicroAddUop(machInst, base, base, index, shiftAmt, shiftType);
162 '''
163 else:
164 self.wbDecl = '''
165 MicroSubUop(machInst, base, base, index, shiftAmt, shiftType);
166 '''
167
168 class StoreSingle(StoreInst):
169 def __init__(self, *args, **kargs):
170 super(StoreSingle, self).__init__(*args, **kargs)
171
172 # Build the default class name
173 self.Name = self.nameFunc(self.post, self.add, self.writeback,
174 self.size, self.sign, self.user)
175
176 # Add memory request flags where necessary
177 self.memFlags.append("%d" % int(math.log(self.size, 2)))
178 if self.user:
179 self.memFlags.append("ArmISA::TLB::UserMode")
180
181 if self.flavor == "exclusive":
182 self.memFlags.append("Request::LLSC")
183 elif self.flavor != "fp":
184 self.memFlags.append("ArmISA::TLB::AllowUnaligned")
185
186 # Disambiguate the class name for different flavors of stores
187 if self.flavor != "normal":
188 self.Name = "%s_%s" % (self.name.upper(), self.Name)
189
190 def emit(self):
191 # Address computation
192 eaCode = "EA = Base"
193 if not self.post:
194 eaCode += self.offset
195 eaCode += ";"
196
197 if self.flavor == "fp":
198 eaCode += vfpEnabledCheckCode
199
200 self.codeBlobs["ea_code"] = eaCode
201
202 # Code that actually handles the access
203 if self.flavor == "fp":
204 accCode = 'Mem%(suffix)s = cSwap(FpDest_uw, ((CPSR)Cpsr).e);'
205 else:
206 accCode = \
207 'Mem%(suffix)s = cSwap(Dest%(suffix)s, ((CPSR)Cpsr).e);'
208 accCode = accCode % \
209 { "suffix" : buildMemSuffix(self.sign, self.size) }
210
211 self.codeBlobs["memacc_code"] = accCode
212
213 # Push it out to the output files
214 base = buildMemBase(self.basePrefix, self.post, self.writeback)
215 wbDecl = None
216 if self.writeback:
217 wbDecl = self.wbDecl
218 self.emitHelper(base, wbDecl)
219
220 def storeImmClassName(post, add, writeback, size=4, sign=False, user=False):
221 return memClassName("STORE_IMM", post, add, writeback, size, sign, user)
222
223 class StoreImmEx(StoreImmInst, StoreSingle):
224 execBase = 'StoreEx'
225 decConstBase = 'StoreExImm'
226 basePrefix = 'MemoryExImm'
227 nameFunc = staticmethod(storeImmClassName)
228
229 def __init__(self, *args, **kargs):
230 super(StoreImmEx, self).__init__(*args, **kargs)
231 self.codeBlobs["postacc_code"] = "Result = !writeResult;"
231 self.codeBlobs["postacc_code"] = \
232 "Result = !writeResult; SevMailbox = 1; LLSCLock = 0;"
232
233 class StoreImm(StoreImmInst, StoreSingle):
234 decConstBase = 'LoadStoreImm'
235 basePrefix = 'MemoryImm'
236 nameFunc = staticmethod(storeImmClassName)
237
238 def storeRegClassName(post, add, writeback, size=4, sign=False, user=False):
239 return memClassName("STORE_REG", post, add, writeback, size, sign, user)
240
241 class StoreReg(StoreRegInst, StoreSingle):
242 decConstBase = 'StoreReg'
243 basePrefix = 'MemoryReg'
244 nameFunc = staticmethod(storeRegClassName)
245
246 class StoreDouble(StoreInst):
247 def __init__(self, *args, **kargs):
248 super(StoreDouble, self).__init__(*args, **kargs)
249
250 # Build the default class name
251 self.Name = self.nameFunc(self.post, self.add, self.writeback)
252
253 # Add memory request flags where necessary
254 if self.flavor == "exclusive":
255 self.memFlags.append("Request::LLSC")
256 self.memFlags.append("ArmISA::TLB::AlignDoubleWord")
257 else:
258 self.memFlags.append("ArmISA::TLB::AlignWord")
259
260 # Disambiguate the class name for different flavors of stores
261 if self.flavor != "normal":
262 self.Name = "%s_%s" % (self.name.upper(), self.Name)
263
264 def emit(self):
265 # Address computation code
266 eaCode = "EA = Base"
267 if not self.post:
268 eaCode += self.offset
269 eaCode += ";"
270
271 if self.flavor == "fp":
272 eaCode += vfpEnabledCheckCode
273
274 self.codeBlobs["ea_code"] = eaCode
275
276 # Code that actually handles the access
277 if self.flavor == "fp":
278 accCode = '''
279 uint64_t swappedMem = (uint64_t)FpDest_uw |
280 ((uint64_t)FpDest2_uw << 32);
281 Mem_ud = cSwap(swappedMem, ((CPSR)Cpsr).e);
282 '''
283 else:
284 accCode = '''
285 CPSR cpsr = Cpsr;
286 Mem_ud = (uint64_t)cSwap(Dest_uw, cpsr.e) |
287 ((uint64_t)cSwap(Dest2_uw, cpsr.e) << 32);
288 '''
289
290 self.codeBlobs["memacc_code"] = accCode
291
292 # Push it out to the output files
293 base = buildMemBase(self.basePrefix, self.post, self.writeback)
294 wbDecl = None
295 if self.writeback:
296 wbDecl = self.wbDecl
297 self.emitHelper(base, wbDecl)
298
299 def storeDoubleImmClassName(post, add, writeback):
300 return memClassName("STORE_IMMD", post, add, writeback, 4, False, False)
301
302 class StoreDoubleImmEx(StoreImmInst, StoreDouble):
303 execBase = 'StoreEx'
304 decConstBase = 'StoreExDImm'
305 basePrefix = 'MemoryExDImm'
306 nameFunc = staticmethod(storeDoubleImmClassName)
307
308 def __init__(self, *args, **kargs):
309 super(StoreDoubleImmEx, self).__init__(*args, **kargs)
233
234 class StoreImm(StoreImmInst, StoreSingle):
235 decConstBase = 'LoadStoreImm'
236 basePrefix = 'MemoryImm'
237 nameFunc = staticmethod(storeImmClassName)
238
239 def storeRegClassName(post, add, writeback, size=4, sign=False, user=False):
240 return memClassName("STORE_REG", post, add, writeback, size, sign, user)
241
242 class StoreReg(StoreRegInst, StoreSingle):
243 decConstBase = 'StoreReg'
244 basePrefix = 'MemoryReg'
245 nameFunc = staticmethod(storeRegClassName)
246
247 class StoreDouble(StoreInst):
248 def __init__(self, *args, **kargs):
249 super(StoreDouble, self).__init__(*args, **kargs)
250
251 # Build the default class name
252 self.Name = self.nameFunc(self.post, self.add, self.writeback)
253
254 # Add memory request flags where necessary
255 if self.flavor == "exclusive":
256 self.memFlags.append("Request::LLSC")
257 self.memFlags.append("ArmISA::TLB::AlignDoubleWord")
258 else:
259 self.memFlags.append("ArmISA::TLB::AlignWord")
260
261 # Disambiguate the class name for different flavors of stores
262 if self.flavor != "normal":
263 self.Name = "%s_%s" % (self.name.upper(), self.Name)
264
265 def emit(self):
266 # Address computation code
267 eaCode = "EA = Base"
268 if not self.post:
269 eaCode += self.offset
270 eaCode += ";"
271
272 if self.flavor == "fp":
273 eaCode += vfpEnabledCheckCode
274
275 self.codeBlobs["ea_code"] = eaCode
276
277 # Code that actually handles the access
278 if self.flavor == "fp":
279 accCode = '''
280 uint64_t swappedMem = (uint64_t)FpDest_uw |
281 ((uint64_t)FpDest2_uw << 32);
282 Mem_ud = cSwap(swappedMem, ((CPSR)Cpsr).e);
283 '''
284 else:
285 accCode = '''
286 CPSR cpsr = Cpsr;
287 Mem_ud = (uint64_t)cSwap(Dest_uw, cpsr.e) |
288 ((uint64_t)cSwap(Dest2_uw, cpsr.e) << 32);
289 '''
290
291 self.codeBlobs["memacc_code"] = accCode
292
293 # Push it out to the output files
294 base = buildMemBase(self.basePrefix, self.post, self.writeback)
295 wbDecl = None
296 if self.writeback:
297 wbDecl = self.wbDecl
298 self.emitHelper(base, wbDecl)
299
300 def storeDoubleImmClassName(post, add, writeback):
301 return memClassName("STORE_IMMD", post, add, writeback, 4, False, False)
302
303 class StoreDoubleImmEx(StoreImmInst, StoreDouble):
304 execBase = 'StoreEx'
305 decConstBase = 'StoreExDImm'
306 basePrefix = 'MemoryExDImm'
307 nameFunc = staticmethod(storeDoubleImmClassName)
308
309 def __init__(self, *args, **kargs):
310 super(StoreDoubleImmEx, self).__init__(*args, **kargs)
310 self.codeBlobs["postacc_code"] = "Result = !writeResult;"
311 self.codeBlobs["postacc_code"] = \
312 "Result = !writeResult; SevMailbox = 1; LLSCLock = 0;"
311
312 class StoreDoubleImm(StoreImmInst, StoreDouble):
313 decConstBase = 'LoadStoreDImm'
314 basePrefix = 'MemoryDImm'
315 nameFunc = staticmethod(storeDoubleImmClassName)
316
317 def storeDoubleRegClassName(post, add, writeback):
318 return memClassName("STORE_REGD", post, add, writeback, 4, False, False)
319
320 class StoreDoubleReg(StoreRegInst, StoreDouble):
321 decConstBase = 'StoreDReg'
322 basePrefix = 'MemoryDReg'
323 nameFunc = staticmethod(storeDoubleRegClassName)
324
325 def buildStores(mnem, size=4, sign=False, user=False):
326 StoreImm(mnem, True, True, True, size, sign, user).emit()
327 StoreReg(mnem, True, True, True, size, sign, user).emit()
328 StoreImm(mnem, True, False, True, size, sign, user).emit()
329 StoreReg(mnem, True, False, True, size, sign, user).emit()
330 StoreImm(mnem, False, True, True, size, sign, user).emit()
331 StoreReg(mnem, False, True, True, size, sign, user).emit()
332 StoreImm(mnem, False, False, True, size, sign, user).emit()
333 StoreReg(mnem, False, False, True, size, sign, user).emit()
334 StoreImm(mnem, False, True, False, size, sign, user).emit()
335 StoreReg(mnem, False, True, False, size, sign, user).emit()
336 StoreImm(mnem, False, False, False, size, sign, user).emit()
337 StoreReg(mnem, False, False, False, size, sign, user).emit()
338
339 def buildDoubleStores(mnem):
340 StoreDoubleImm(mnem, True, True, True).emit()
341 StoreDoubleReg(mnem, True, True, True).emit()
342 StoreDoubleImm(mnem, True, False, True).emit()
343 StoreDoubleReg(mnem, True, False, True).emit()
344 StoreDoubleImm(mnem, False, True, True).emit()
345 StoreDoubleReg(mnem, False, True, True).emit()
346 StoreDoubleImm(mnem, False, False, True).emit()
347 StoreDoubleReg(mnem, False, False, True).emit()
348 StoreDoubleImm(mnem, False, True, False).emit()
349 StoreDoubleReg(mnem, False, True, False).emit()
350 StoreDoubleImm(mnem, False, False, False).emit()
351 StoreDoubleReg(mnem, False, False, False).emit()
352
353 def buildSrsStores(mnem):
354 SrsInst(mnem, True, True, True).emit()
355 SrsInst(mnem, True, True, False).emit()
356 SrsInst(mnem, True, False, True).emit()
357 SrsInst(mnem, True, False, False).emit()
358 SrsInst(mnem, False, True, True).emit()
359 SrsInst(mnem, False, True, False).emit()
360 SrsInst(mnem, False, False, True).emit()
361 SrsInst(mnem, False, False, False).emit()
362
363 buildStores("str")
364 buildStores("strt", user=True)
365 buildStores("strb", size=1)
366 buildStores("strbt", size=1, user=True)
367 buildStores("strh", size=2)
368 buildStores("strht", size=2, user=True)
369
370 buildSrsStores("srs")
371
372 buildDoubleStores("strd")
373
374 StoreImmEx("strex", False, True, False, size=4, flavor="exclusive",
375 instFlags = ['IsStoreConditional']).emit()
376 StoreImmEx("strexh", False, True, False, size=2, flavor="exclusive",
377 instFlags = ['IsStoreConditional']).emit()
378 StoreImmEx("strexb", False, True, False, size=1, flavor="exclusive",
379 instFlags = ['IsStoreConditional']).emit()
380 StoreDoubleImmEx("strexd", False, True, False, flavor="exclusive",
381 instFlags = ['IsStoreConditional']).emit()
382
383 StoreImm("vstr", False, True, False, size=4, flavor="fp").emit()
384 StoreImm("vstr", False, False, False, size=4, flavor="fp").emit()
385 StoreDoubleImm("vstr", False, True, False, flavor="fp").emit()
386 StoreDoubleImm("vstr", False, False, False, flavor="fp").emit()
387}};
313
314 class StoreDoubleImm(StoreImmInst, StoreDouble):
315 decConstBase = 'LoadStoreDImm'
316 basePrefix = 'MemoryDImm'
317 nameFunc = staticmethod(storeDoubleImmClassName)
318
319 def storeDoubleRegClassName(post, add, writeback):
320 return memClassName("STORE_REGD", post, add, writeback, 4, False, False)
321
322 class StoreDoubleReg(StoreRegInst, StoreDouble):
323 decConstBase = 'StoreDReg'
324 basePrefix = 'MemoryDReg'
325 nameFunc = staticmethod(storeDoubleRegClassName)
326
327 def buildStores(mnem, size=4, sign=False, user=False):
328 StoreImm(mnem, True, True, True, size, sign, user).emit()
329 StoreReg(mnem, True, True, True, size, sign, user).emit()
330 StoreImm(mnem, True, False, True, size, sign, user).emit()
331 StoreReg(mnem, True, False, True, size, sign, user).emit()
332 StoreImm(mnem, False, True, True, size, sign, user).emit()
333 StoreReg(mnem, False, True, True, size, sign, user).emit()
334 StoreImm(mnem, False, False, True, size, sign, user).emit()
335 StoreReg(mnem, False, False, True, size, sign, user).emit()
336 StoreImm(mnem, False, True, False, size, sign, user).emit()
337 StoreReg(mnem, False, True, False, size, sign, user).emit()
338 StoreImm(mnem, False, False, False, size, sign, user).emit()
339 StoreReg(mnem, False, False, False, size, sign, user).emit()
340
341 def buildDoubleStores(mnem):
342 StoreDoubleImm(mnem, True, True, True).emit()
343 StoreDoubleReg(mnem, True, True, True).emit()
344 StoreDoubleImm(mnem, True, False, True).emit()
345 StoreDoubleReg(mnem, True, False, True).emit()
346 StoreDoubleImm(mnem, False, True, True).emit()
347 StoreDoubleReg(mnem, False, True, True).emit()
348 StoreDoubleImm(mnem, False, False, True).emit()
349 StoreDoubleReg(mnem, False, False, True).emit()
350 StoreDoubleImm(mnem, False, True, False).emit()
351 StoreDoubleReg(mnem, False, True, False).emit()
352 StoreDoubleImm(mnem, False, False, False).emit()
353 StoreDoubleReg(mnem, False, False, False).emit()
354
355 def buildSrsStores(mnem):
356 SrsInst(mnem, True, True, True).emit()
357 SrsInst(mnem, True, True, False).emit()
358 SrsInst(mnem, True, False, True).emit()
359 SrsInst(mnem, True, False, False).emit()
360 SrsInst(mnem, False, True, True).emit()
361 SrsInst(mnem, False, True, False).emit()
362 SrsInst(mnem, False, False, True).emit()
363 SrsInst(mnem, False, False, False).emit()
364
365 buildStores("str")
366 buildStores("strt", user=True)
367 buildStores("strb", size=1)
368 buildStores("strbt", size=1, user=True)
369 buildStores("strh", size=2)
370 buildStores("strht", size=2, user=True)
371
372 buildSrsStores("srs")
373
374 buildDoubleStores("strd")
375
376 StoreImmEx("strex", False, True, False, size=4, flavor="exclusive",
377 instFlags = ['IsStoreConditional']).emit()
378 StoreImmEx("strexh", False, True, False, size=2, flavor="exclusive",
379 instFlags = ['IsStoreConditional']).emit()
380 StoreImmEx("strexb", False, True, False, size=1, flavor="exclusive",
381 instFlags = ['IsStoreConditional']).emit()
382 StoreDoubleImmEx("strexd", False, True, False, flavor="exclusive",
383 instFlags = ['IsStoreConditional']).emit()
384
385 StoreImm("vstr", False, True, False, size=4, flavor="fp").emit()
386 StoreImm("vstr", False, False, False, size=4, flavor="fp").emit()
387 StoreDoubleImm("vstr", False, True, False, flavor="fp").emit()
388 StoreDoubleImm("vstr", False, False, False, flavor="fp").emit()
389}};