str64.isa revision 12527
110037SARM gem5 Developers// -*- mode:c++ -*- 210037SARM gem5 Developers 312219Snikos.nikoleris@arm.com// Copyright (c) 2011-2013,2017 ARM Limited 410037SARM gem5 Developers// All rights reserved 510037SARM gem5 Developers// 610037SARM gem5 Developers// The license below extends only to copyright in the software and shall 710037SARM gem5 Developers// not be construed as granting a license to any other intellectual 810037SARM gem5 Developers// property including but not limited to intellectual property relating 910037SARM gem5 Developers// to a hardware implementation of the functionality of the software 1010037SARM gem5 Developers// licensed hereunder. You may use the software subject to the license 1110037SARM gem5 Developers// terms below provided that you ensure that this notice is replicated 1210037SARM gem5 Developers// unmodified and in its entirety in all distributions of the software, 1310037SARM gem5 Developers// modified or unmodified, in source code or in binary form. 1410037SARM gem5 Developers// 1510037SARM gem5 Developers// Redistribution and use in source and binary forms, with or without 1610037SARM gem5 Developers// modification, are permitted provided that the following conditions are 1710037SARM gem5 Developers// met: redistributions of source code must retain the above copyright 1810037SARM gem5 Developers// notice, this list of conditions and the following disclaimer; 1910037SARM gem5 Developers// redistributions in binary form must reproduce the above copyright 2010037SARM gem5 Developers// notice, this list of conditions and the following disclaimer in the 2110037SARM gem5 Developers// documentation and/or other materials provided with the distribution; 2210037SARM gem5 Developers// neither the name of the copyright holders nor the names of its 2310037SARM gem5 Developers// contributors may be used to endorse or promote products derived from 2410037SARM gem5 Developers// this software without specific prior written permission. 2510037SARM gem5 Developers// 2610037SARM gem5 Developers// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2710037SARM gem5 Developers// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2810037SARM gem5 Developers// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2910037SARM gem5 Developers// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3010037SARM gem5 Developers// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3110037SARM gem5 Developers// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3210037SARM gem5 Developers// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3310037SARM gem5 Developers// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3410037SARM gem5 Developers// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3510037SARM gem5 Developers// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3610037SARM gem5 Developers// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3710037SARM gem5 Developers// 3810037SARM gem5 Developers// Authors: Gabe Black 3910037SARM gem5 Developers 4010037SARM gem5 Developerslet {{ 4110037SARM gem5 Developers 4210037SARM gem5 Developers header_output = "" 4310037SARM gem5 Developers decoder_output = "" 4410037SARM gem5 Developers exec_output = "" 4510037SARM gem5 Developers 4610037SARM gem5 Developers class StoreInst64(LoadStoreInst): 4710037SARM gem5 Developers execBase = 'Store64' 4810037SARM gem5 Developers micro = False 4910037SARM gem5 Developers 5010037SARM gem5 Developers def __init__(self, mnem, Name, size=4, user=False, flavor="normal", 5110037SARM gem5 Developers top = False): 5210037SARM gem5 Developers super(StoreInst64, self).__init__() 5310037SARM gem5 Developers 5410037SARM gem5 Developers self.name = mnem 5510037SARM gem5 Developers self.Name = Name 5610037SARM gem5 Developers self.size = size 5710037SARM gem5 Developers self.user = user 5810037SARM gem5 Developers self.flavor = flavor 5910037SARM gem5 Developers self.top = top 6010037SARM gem5 Developers 6110037SARM gem5 Developers self.memFlags = ["ArmISA::TLB::MustBeOne"] 6210037SARM gem5 Developers self.instFlags = [] 6310037SARM gem5 Developers self.codeBlobs = { "postacc_code" : "" } 6410037SARM gem5 Developers 6510037SARM gem5 Developers # Add memory request flags where necessary 6610037SARM gem5 Developers if self.user: 6710037SARM gem5 Developers self.memFlags.append("ArmISA::TLB::UserMode") 6810037SARM gem5 Developers 6910037SARM gem5 Developers if self.flavor in ("relexp", "exp"): 7010037SARM gem5 Developers # For exclusive pair ops alignment check is based on total size 7110037SARM gem5 Developers self.memFlags.append("%d" % int(math.log(self.size, 2) + 1)) 7210037SARM gem5 Developers elif not (self.size == 16 and self.top): 7310037SARM gem5 Developers # Only the first microop should perform alignment checking. 7410037SARM gem5 Developers self.memFlags.append("%d" % int(math.log(self.size, 2))) 7510037SARM gem5 Developers 7610037SARM gem5 Developers if self.flavor not in ("release", "relex", "exclusive", 7710037SARM gem5 Developers "relexp", "exp"): 7810037SARM gem5 Developers self.memFlags.append("ArmISA::TLB::AllowUnaligned") 7910037SARM gem5 Developers 8010037SARM gem5 Developers if self.micro: 8110037SARM gem5 Developers self.instFlags.append("IsMicroop") 8210037SARM gem5 Developers 8310037SARM gem5 Developers if self.flavor in ("release", "relex", "relexp"): 8410037SARM gem5 Developers self.instFlags.extend(["IsMemBarrier", 8510037SARM gem5 Developers "IsWriteBarrier", 8610037SARM gem5 Developers "IsReadBarrier"]) 8710037SARM gem5 Developers if self.flavor in ("relex", "exclusive", "exp", "relexp"): 8810037SARM gem5 Developers self.instFlags.append("IsStoreConditional") 8910037SARM gem5 Developers self.memFlags.append("Request::LLSC") 9010037SARM gem5 Developers 9110037SARM gem5 Developers def emitHelper(self, base = 'Memory64', wbDecl = None): 9210037SARM gem5 Developers global header_output, decoder_output, exec_output 9310037SARM gem5 Developers 9410037SARM gem5 Developers # If this is a microop itself, don't allow anything that would 9510037SARM gem5 Developers # require further microcoding. 9610037SARM gem5 Developers if self.micro: 9710037SARM gem5 Developers assert not wbDecl 9810037SARM gem5 Developers 9910037SARM gem5 Developers fa_code = None 10010037SARM gem5 Developers if not self.micro and self.flavor in ("normal", "release"): 10110037SARM gem5 Developers fa_code = ''' 10210037SARM gem5 Developers fault->annotate(ArmFault::SAS, %s); 10310037SARM gem5 Developers fault->annotate(ArmFault::SSE, false); 10410037SARM gem5 Developers fault->annotate(ArmFault::SRT, dest); 10510037SARM gem5 Developers fault->annotate(ArmFault::SF, %s); 10610037SARM gem5 Developers fault->annotate(ArmFault::AR, %s); 10710037SARM gem5 Developers ''' % ("0" if self.size == 1 else 10810037SARM gem5 Developers "1" if self.size == 2 else 10910037SARM gem5 Developers "2" if self.size == 4 else "3", 11010037SARM gem5 Developers "true" if self.size == 8 else "false", 11110037SARM gem5 Developers "true" if self.flavor == "release" else "false") 11210037SARM gem5 Developers 11310037SARM gem5 Developers (newHeader, newDecoder, newExec) = \ 11410037SARM gem5 Developers self.fillTemplates(self.name, self.Name, self.codeBlobs, 11510037SARM gem5 Developers self.memFlags, self.instFlags, 11610037SARM gem5 Developers base, wbDecl, faCode=fa_code) 11710037SARM gem5 Developers 11810037SARM gem5 Developers header_output += newHeader 11910037SARM gem5 Developers decoder_output += newDecoder 12010037SARM gem5 Developers exec_output += newExec 12110037SARM gem5 Developers 12210037SARM gem5 Developers def buildEACode(self): 12310037SARM gem5 Developers # Address computation 12410037SARM gem5 Developers eaCode = "" 12510037SARM gem5 Developers if self.flavor == "fp": 12610037SARM gem5 Developers eaCode += vfp64EnabledCheckCode 12710037SARM gem5 Developers 12810037SARM gem5 Developers eaCode += SPAlignmentCheckCode + "EA = XBase" 12910037SARM gem5 Developers if self.size == 16: 13010037SARM gem5 Developers if self.top: 13110037SARM gem5 Developers eaCode += " + (isBigEndian64(xc->tcBase()) ? 0 : 8)" 13210037SARM gem5 Developers else: 13310037SARM gem5 Developers eaCode += " + (isBigEndian64(xc->tcBase()) ? 8 : 0)" 13410037SARM gem5 Developers if not self.post: 13510037SARM gem5 Developers eaCode += self.offset 13610037SARM gem5 Developers eaCode += ";" 13710037SARM gem5 Developers 13810037SARM gem5 Developers self.codeBlobs["ea_code"] = eaCode 13910037SARM gem5 Developers 14010037SARM gem5 Developers 14110037SARM gem5 Developers class StoreImmInst64(StoreInst64): 14210037SARM gem5 Developers def __init__(self, *args, **kargs): 14310037SARM gem5 Developers super(StoreImmInst64, self).__init__(*args, **kargs) 14410037SARM gem5 Developers self.offset = "+ imm" 14510037SARM gem5 Developers 14610037SARM gem5 Developers self.wbDecl = "MicroAddXiUop(machInst, base, base, imm);" 14710037SARM gem5 Developers 14810037SARM gem5 Developers class StoreRegInst64(StoreInst64): 14910037SARM gem5 Developers def __init__(self, *args, **kargs): 15010037SARM gem5 Developers super(StoreRegInst64, self).__init__(*args, **kargs) 15110037SARM gem5 Developers self.offset = "+ extendReg64(XOffset, type, shiftAmt, 64)" 15210037SARM gem5 Developers 15310037SARM gem5 Developers self.wbDecl = \ 15410037SARM gem5 Developers "MicroAddXERegUop(machInst, base, base, " + \ 15510037SARM gem5 Developers " offset, type, shiftAmt);" 15610037SARM gem5 Developers 15710037SARM gem5 Developers class StoreRawRegInst64(StoreInst64): 15810037SARM gem5 Developers def __init__(self, *args, **kargs): 15910037SARM gem5 Developers super(StoreRawRegInst64, self).__init__(*args, **kargs) 16010037SARM gem5 Developers self.offset = "" 16110037SARM gem5 Developers 16210037SARM gem5 Developers class StoreSingle64(StoreInst64): 16310037SARM gem5 Developers def emit(self): 16410037SARM gem5 Developers self.buildEACode() 16510037SARM gem5 Developers 16610037SARM gem5 Developers # Code that actually handles the access 16710037SARM gem5 Developers if self.flavor == "fp": 16810037SARM gem5 Developers if self.size in (1, 2, 4): 16910037SARM gem5 Developers accCode = ''' 17010037SARM gem5 Developers Mem%(suffix)s = 17110037SARM gem5 Developers cSwap(AA64FpDestP0%(suffix)s, isBigEndian64(xc->tcBase())); 17210037SARM gem5 Developers ''' 17310037SARM gem5 Developers elif self.size == 8 or (self.size == 16 and not self.top): 17410037SARM gem5 Developers accCode = ''' 17510037SARM gem5 Developers uint64_t data = AA64FpDestP1_uw; 17610037SARM gem5 Developers data = (data << 32) | AA64FpDestP0_uw; 17710037SARM gem5 Developers Mem%(suffix)s = cSwap(data, isBigEndian64(xc->tcBase())); 17810037SARM gem5 Developers ''' 17910037SARM gem5 Developers elif self.size == 16 and self.top: 18010037SARM gem5 Developers accCode = ''' 18110037SARM gem5 Developers uint64_t data = AA64FpDestP3_uw; 18210037SARM gem5 Developers data = (data << 32) | AA64FpDestP2_uw; 18310037SARM gem5 Developers Mem%(suffix)s = cSwap(data, isBigEndian64(xc->tcBase())); 18410037SARM gem5 Developers ''' 18510037SARM gem5 Developers else: 18610037SARM gem5 Developers accCode = \ 18710037SARM gem5 Developers 'Mem%(suffix)s = cSwap(XDest%(suffix)s, isBigEndian64(xc->tcBase()));' 18810037SARM gem5 Developers if self.size == 16: 18910037SARM gem5 Developers accCode = accCode % \ 19010037SARM gem5 Developers { "suffix" : buildMemSuffix(False, 8) } 19110037SARM gem5 Developers else: 19210037SARM gem5 Developers accCode = accCode % \ 19310037SARM gem5 Developers { "suffix" : buildMemSuffix(False, self.size) } 19410037SARM gem5 Developers 19510037SARM gem5 Developers self.codeBlobs["memacc_code"] = accCode 19610037SARM gem5 Developers 19710037SARM gem5 Developers if self.flavor in ("relex", "exclusive"): 19810037SARM gem5 Developers self.instFlags.append("IsStoreConditional") 19910037SARM gem5 Developers self.memFlags.append("Request::LLSC") 20010037SARM gem5 Developers 20110037SARM gem5 Developers # Push it out to the output files 20210037SARM gem5 Developers wbDecl = None 20310037SARM gem5 Developers if self.writeback and not self.micro: 20410037SARM gem5 Developers wbDecl = self.wbDecl 20510037SARM gem5 Developers self.emitHelper(self.base, wbDecl) 20610037SARM gem5 Developers 20710037SARM gem5 Developers class StoreDouble64(StoreInst64): 20810037SARM gem5 Developers def emit(self): 20910037SARM gem5 Developers self.buildEACode() 21010037SARM gem5 Developers 21110037SARM gem5 Developers # Code that actually handles the access 21210037SARM gem5 Developers if self.flavor == "fp": 21310037SARM gem5 Developers accCode = ''' 21410037SARM gem5 Developers uint64_t data = AA64FpDest2P0_uw; 21512527Schuan.zhu@arm.com data = isBigEndian64(xc->tcBase()) 21612527Schuan.zhu@arm.com ? ((uint64_t(AA64FpDestP0_uw) << 32) | data) 21712527Schuan.zhu@arm.com : ((data << 32) | AA64FpDestP0_uw); 21810037SARM gem5 Developers Mem_ud = cSwap(data, isBigEndian64(xc->tcBase())); 21910037SARM gem5 Developers ''' 22010037SARM gem5 Developers else: 22110037SARM gem5 Developers if self.size == 4: 22210037SARM gem5 Developers accCode = ''' 22310037SARM gem5 Developers uint64_t data = XDest2_uw; 22412527Schuan.zhu@arm.com data = isBigEndian64(xc->tcBase()) 22512527Schuan.zhu@arm.com ? ((uint64_t(XDest_uw) << 32) | data) 22612527Schuan.zhu@arm.com : ((data << 32) | XDest_uw); 22710037SARM gem5 Developers Mem_ud = cSwap(data, isBigEndian64(xc->tcBase())); 22810037SARM gem5 Developers ''' 22910037SARM gem5 Developers elif self.size == 8: 23010037SARM gem5 Developers accCode = ''' 23110037SARM gem5 Developers // This temporary needs to be here so that the parser 23210037SARM gem5 Developers // will correctly identify this instruction as a store. 23312386Sgabeblack@google.com std::array<uint64_t, 2> temp; 23412527Schuan.zhu@arm.com temp[0] = cSwap(XDest_ud,isBigEndian64(xc->tcBase())); 23512527Schuan.zhu@arm.com temp[1] = cSwap(XDest2_ud,isBigEndian64(xc->tcBase())); 23610037SARM gem5 Developers Mem_tud = temp; 23710037SARM gem5 Developers ''' 23810037SARM gem5 Developers self.codeBlobs["memacc_code"] = accCode 23910037SARM gem5 Developers 24010037SARM gem5 Developers # Push it out to the output files 24110037SARM gem5 Developers wbDecl = None 24210037SARM gem5 Developers if self.writeback and not self.micro: 24310037SARM gem5 Developers wbDecl = self.wbDecl 24410037SARM gem5 Developers self.emitHelper(self.base, wbDecl) 24510037SARM gem5 Developers 24610037SARM gem5 Developers class StoreImm64(StoreImmInst64, StoreSingle64): 24710037SARM gem5 Developers decConstBase = 'LoadStoreImm64' 24810037SARM gem5 Developers base = 'ArmISA::MemoryImm64' 24910037SARM gem5 Developers writeback = False 25010037SARM gem5 Developers post = False 25110037SARM gem5 Developers 25210037SARM gem5 Developers class StorePre64(StoreImmInst64, StoreSingle64): 25310037SARM gem5 Developers decConstBase = 'LoadStoreImm64' 25410037SARM gem5 Developers base = 'ArmISA::MemoryPreIndex64' 25510037SARM gem5 Developers writeback = True 25610037SARM gem5 Developers post = False 25710037SARM gem5 Developers 25810037SARM gem5 Developers class StorePost64(StoreImmInst64, StoreSingle64): 25910037SARM gem5 Developers decConstBase = 'LoadStoreImm64' 26010037SARM gem5 Developers base = 'ArmISA::MemoryPostIndex64' 26110037SARM gem5 Developers writeback = True 26210037SARM gem5 Developers post = True 26310037SARM gem5 Developers 26410037SARM gem5 Developers class StoreReg64(StoreRegInst64, StoreSingle64): 26510037SARM gem5 Developers decConstBase = 'LoadStoreReg64' 26610037SARM gem5 Developers base = 'ArmISA::MemoryReg64' 26710037SARM gem5 Developers writeback = False 26810037SARM gem5 Developers post = False 26910037SARM gem5 Developers 27010037SARM gem5 Developers class StoreRaw64(StoreRawRegInst64, StoreSingle64): 27110037SARM gem5 Developers decConstBase = 'LoadStoreRaw64' 27210037SARM gem5 Developers base = 'ArmISA::MemoryRaw64' 27310037SARM gem5 Developers writeback = False 27410037SARM gem5 Developers post = False 27510037SARM gem5 Developers 27610037SARM gem5 Developers class StoreEx64(StoreRawRegInst64, StoreSingle64): 27710037SARM gem5 Developers decConstBase = 'LoadStoreEx64' 27810037SARM gem5 Developers base = 'ArmISA::MemoryEx64' 27910037SARM gem5 Developers writeback = False 28010037SARM gem5 Developers post = False 28110037SARM gem5 Developers execBase = 'StoreEx64' 28210037SARM gem5 Developers def __init__(self, *args, **kargs): 28310037SARM gem5 Developers super(StoreEx64, self).__init__(*args, **kargs) 28412219Snikos.nikoleris@arm.com self.codeBlobs["postacc_code"] = \ 28512219Snikos.nikoleris@arm.com "XResult = !writeResult; SevMailbox = 1; LLSCLock = 0;" 28610037SARM gem5 Developers 28710037SARM gem5 Developers def buildStores64(mnem, NameBase, size, flavor="normal"): 28810037SARM gem5 Developers StoreImm64(mnem, NameBase + "_IMM", size, flavor=flavor).emit() 28910037SARM gem5 Developers StorePre64(mnem, NameBase + "_PRE", size, flavor=flavor).emit() 29010037SARM gem5 Developers StorePost64(mnem, NameBase + "_POST", size, flavor=flavor).emit() 29110037SARM gem5 Developers StoreReg64(mnem, NameBase + "_REG", size, flavor=flavor).emit() 29210037SARM gem5 Developers 29310037SARM gem5 Developers buildStores64("strb", "STRB64", 1) 29410037SARM gem5 Developers buildStores64("strh", "STRH64", 2) 29510037SARM gem5 Developers buildStores64("str", "STRW64", 4) 29610037SARM gem5 Developers buildStores64("str", "STRX64", 8) 29710037SARM gem5 Developers buildStores64("str", "STRBFP64", 1, flavor="fp") 29810037SARM gem5 Developers buildStores64("str", "STRHFP64", 2, flavor="fp") 29910037SARM gem5 Developers buildStores64("str", "STRSFP64", 4, flavor="fp") 30010037SARM gem5 Developers buildStores64("str", "STRDFP64", 8, flavor="fp") 30110037SARM gem5 Developers 30210037SARM gem5 Developers StoreImm64("sturb", "STURB64_IMM", 1).emit() 30310037SARM gem5 Developers StoreImm64("sturh", "STURH64_IMM", 2).emit() 30410037SARM gem5 Developers StoreImm64("stur", "STURW64_IMM", 4).emit() 30510037SARM gem5 Developers StoreImm64("stur", "STURX64_IMM", 8).emit() 30610037SARM gem5 Developers StoreImm64("stur", "STURBFP64_IMM", 1, flavor="fp").emit() 30710037SARM gem5 Developers StoreImm64("stur", "STURHFP64_IMM", 2, flavor="fp").emit() 30810037SARM gem5 Developers StoreImm64("stur", "STURSFP64_IMM", 4, flavor="fp").emit() 30910037SARM gem5 Developers StoreImm64("stur", "STURDFP64_IMM", 8, flavor="fp").emit() 31010037SARM gem5 Developers 31110037SARM gem5 Developers StoreImm64("sttrb", "STTRB64_IMM", 1, user=True).emit() 31210037SARM gem5 Developers StoreImm64("sttrh", "STTRH64_IMM", 2, user=True).emit() 31310037SARM gem5 Developers StoreImm64("sttr", "STTRW64_IMM", 4, user=True).emit() 31410037SARM gem5 Developers StoreImm64("sttr", "STTRX64_IMM", 8, user=True).emit() 31510037SARM gem5 Developers 31610037SARM gem5 Developers StoreRaw64("stlr", "STLRX64", 8, flavor="release").emit() 31710037SARM gem5 Developers StoreRaw64("stlr", "STLRW64", 4, flavor="release").emit() 31810037SARM gem5 Developers StoreRaw64("stlrh", "STLRH64", 2, flavor="release").emit() 31910037SARM gem5 Developers StoreRaw64("stlrb", "STLRB64", 1, flavor="release").emit() 32010037SARM gem5 Developers 32110037SARM gem5 Developers StoreEx64("stlxr", "STLXRX64", 8, flavor="relex").emit() 32210037SARM gem5 Developers StoreEx64("stlxr", "STLXRW64", 4, flavor="relex").emit() 32310037SARM gem5 Developers StoreEx64("stlxrh", "STLXRH64", 2, flavor="relex").emit() 32410037SARM gem5 Developers StoreEx64("stlxrb", "STLXRB64", 1, flavor="relex").emit() 32510037SARM gem5 Developers 32610037SARM gem5 Developers StoreEx64("stxr", "STXRX64", 8, flavor="exclusive").emit() 32710037SARM gem5 Developers StoreEx64("stxr", "STXRW64", 4, flavor="exclusive").emit() 32810037SARM gem5 Developers StoreEx64("stxrh", "STXRH64", 2, flavor="exclusive").emit() 32910037SARM gem5 Developers StoreEx64("stxrb", "STXRB64", 1, flavor="exclusive").emit() 33010037SARM gem5 Developers 33110037SARM gem5 Developers class StoreImmU64(StoreImm64): 33210037SARM gem5 Developers decConstBase = 'LoadStoreImmU64' 33310037SARM gem5 Developers micro = True 33410037SARM gem5 Developers 33510037SARM gem5 Developers class StoreImmDU64(StoreImmInst64, StoreDouble64): 33610037SARM gem5 Developers decConstBase = 'LoadStoreImmDU64' 33710037SARM gem5 Developers base = 'ArmISA::MemoryDImm64' 33810037SARM gem5 Developers micro = True 33910037SARM gem5 Developers post = False 34010037SARM gem5 Developers writeback = False 34110037SARM gem5 Developers 34210037SARM gem5 Developers class StoreImmDEx64(StoreImmInst64, StoreDouble64): 34310037SARM gem5 Developers execBase = 'StoreEx64' 34410037SARM gem5 Developers decConstBase = 'StoreImmDEx64' 34510037SARM gem5 Developers base = 'ArmISA::MemoryDImmEx64' 34610037SARM gem5 Developers micro = False 34710037SARM gem5 Developers post = False 34810037SARM gem5 Developers writeback = False 34910037SARM gem5 Developers def __init__(self, *args, **kargs): 35010037SARM gem5 Developers super(StoreImmDEx64, self).__init__(*args, **kargs) 35112219Snikos.nikoleris@arm.com self.codeBlobs["postacc_code"] = \ 35212219Snikos.nikoleris@arm.com "XResult = !writeResult; SevMailbox = 1; LLSCLock = 0;" 35310037SARM gem5 Developers 35410037SARM gem5 Developers class StoreRegU64(StoreReg64): 35510037SARM gem5 Developers decConstBase = 'LoadStoreRegU64' 35610037SARM gem5 Developers micro = True 35710037SARM gem5 Developers 35810037SARM gem5 Developers StoreImmDEx64("stlxp", "STLXPW64", 4, flavor="relexp").emit() 35910037SARM gem5 Developers StoreImmDEx64("stlxp", "STLXPX64", 8, flavor="relexp").emit() 36010037SARM gem5 Developers StoreImmDEx64("stxp", "STXPW64", 4, flavor="exp").emit() 36110037SARM gem5 Developers StoreImmDEx64("stxp", "STXPX64", 8, flavor="exp").emit() 36210037SARM gem5 Developers 36310037SARM gem5 Developers StoreImmU64("strxi_uop", "MicroStrXImmUop", 8).emit() 36410037SARM gem5 Developers StoreRegU64("strxr_uop", "MicroStrXRegUop", 8).emit() 36510037SARM gem5 Developers StoreImmU64("strfpxi_uop", "MicroStrFpXImmUop", 8, flavor="fp").emit() 36610037SARM gem5 Developers StoreRegU64("strfpxr_uop", "MicroStrFpXRegUop", 8, flavor="fp").emit() 36710037SARM gem5 Developers StoreImmU64("strqbfpxi_uop", "MicroStrQBFpXImmUop", 36810037SARM gem5 Developers 16, flavor="fp", top=False).emit() 36910037SARM gem5 Developers StoreRegU64("strqbfpxr_uop", "MicroStrQBFpXRegUop", 37010037SARM gem5 Developers 16, flavor="fp", top=False).emit() 37110037SARM gem5 Developers StoreImmU64("strqtfpxi_uop", "MicroStrQTFpXImmUop", 37210037SARM gem5 Developers 16, flavor="fp", top=True).emit() 37310037SARM gem5 Developers StoreRegU64("strqtfpxr_uop", "MicroStrQTFpXRegUop", 37410037SARM gem5 Developers 16, flavor="fp", top=True).emit() 37510037SARM gem5 Developers StoreImmDU64("strdxi_uop", "MicroStrDXImmUop", 4).emit() 37610037SARM gem5 Developers StoreImmDU64("strdfpxi_uop", "MicroStrDFpXImmUop", 4, flavor="fp").emit() 37710037SARM gem5 Developers 37810037SARM gem5 Developers}}; 379