1// -*- mode:c++ -*- 2 |
3// Copyright (c) 2010-2011,2017,2019 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 --- 166 unchanged lines hidden (view full) --- 178 self.Name = self.nameFunc(self.post, self.add, self.writeback, 179 self.size, self.sign, self.user) 180 181 # Add memory request flags where necessary 182 self.memFlags.append("%d" % int(math.log(self.size, 2))) 183 if self.user: 184 self.memFlags.append("ArmISA::TLB::UserMode") 185 |
186 if self.flavor in ("exclusive", "relex"): |
187 self.instFlags.append("IsStoreConditional") 188 self.memFlags.append("Request::LLSC") 189 elif self.flavor != "fp": 190 self.memFlags.append("ArmISA::TLB::AllowUnaligned") 191 |
192 if self.flavor in ("release", "relex"): 193 self.instFlags.extend(["IsMemBarrier", 194 "IsWriteBarrier", 195 "IsReadBarrier"]) 196 |
197 # Disambiguate the class name for different flavors of stores 198 if self.flavor != "normal": 199 self.Name = "%s_%s" % (self.name.upper(), self.Name) 200 201 def emit(self): 202 # Address computation 203 eaCode = "EA = Base" 204 if not self.post: --- 53 unchanged lines hidden (view full) --- 258 class StoreDouble(StoreInst): 259 def __init__(self, *args, **kargs): 260 super(StoreDouble, self).__init__(*args, **kargs) 261 262 # Build the default class name 263 self.Name = self.nameFunc(self.post, self.add, self.writeback) 264 265 # Add memory request flags where necessary |
266 if self.flavor in ("exclusive", "relex"): |
267 self.instFlags.append("IsStoreConditional") 268 self.memFlags.append("Request::LLSC") 269 self.memFlags.append("ArmISA::TLB::AlignDoubleWord") 270 else: 271 self.memFlags.append("ArmISA::TLB::AlignWord") 272 |
273 if self.flavor in ("release", "relex"): 274 self.instFlags.extend(["IsMemBarrier", 275 "IsWriteBarrier", 276 "IsReadBarrier"]) 277 |
278 # Disambiguate the class name for different flavors of stores 279 if self.flavor != "normal": 280 self.Name = "%s_%s" % (self.name.upper(), self.Name) 281 282 def emit(self): 283 # Address computation code 284 eaCode = "EA = Base" 285 if not self.post: --- 108 unchanged lines hidden (view full) --- 394 flavor="exclusive").emit() 395 StoreImmEx("strexh", False, True, False, size=2, 396 flavor="exclusive").emit() 397 StoreImmEx("strexb", False, True, False, size=1, 398 flavor="exclusive").emit() 399 StoreDoubleImmEx("strexd", False, True, False, 400 flavor="exclusive").emit() 401 |
402 StoreImm("stl", False, True, False, size=4, flavor="release").emit() 403 StoreImm("stlh", False, True, False, size=2, flavor="release").emit() 404 StoreImm("stlb", False, True, False, size=1, flavor="release").emit() 405 StoreImmEx("stlex", False, True, False, size=4, flavor="relex").emit() 406 StoreImmEx("stlexh", False, True, False, size=2, flavor="relex").emit() 407 StoreImmEx("stlexb", False, True, False, size=1, flavor="relex").emit() 408 StoreDoubleImmEx("stlexd", False, True, False, flavor="relex").emit() 409 |
410 StoreImm("vstr", False, True, False, size=4, flavor="fp").emit() 411 StoreImm("vstr", False, False, False, size=4, flavor="fp").emit() 412 StoreDoubleImm("vstr", False, True, False, flavor="fp").emit() 413 StoreDoubleImm("vstr", False, False, False, flavor="fp").emit() 414}}; |