amo64.isa revision 14157
114150Sjordi.vaquero@metempsy.com// -*- mode:c++ -*- 214150Sjordi.vaquero@metempsy.com 314150Sjordi.vaquero@metempsy.com// Copyright (c) 2018 Metempsy Technology Consulting 414150Sjordi.vaquero@metempsy.com// All rights reserved 514150Sjordi.vaquero@metempsy.com// 614150Sjordi.vaquero@metempsy.com// The license below extends only to copyright in the software and shall 714150Sjordi.vaquero@metempsy.com// not be construed as granting a license to any other intellectual 814150Sjordi.vaquero@metempsy.com// property including but not limited to intellectual property relating 914150Sjordi.vaquero@metempsy.com// to a hardware implementation of the functionality of the software 1014150Sjordi.vaquero@metempsy.com// licensed hereunder. You may use the software subject to the license 1114150Sjordi.vaquero@metempsy.com// terms below provided that you ensure that this notice is replicated 1214150Sjordi.vaquero@metempsy.com// unmodified and in its entirety in all distributions of the software, 1314150Sjordi.vaquero@metempsy.com// modified or unmodified, in source code or in binary form. 1414150Sjordi.vaquero@metempsy.com// 1514150Sjordi.vaquero@metempsy.com// Redistribution and use in source and binary forms, with or without 1614150Sjordi.vaquero@metempsy.com// modification, are permitted provided that the following conditions are 1714150Sjordi.vaquero@metempsy.com// met: redistributions of source code must retain the above copyright 1814150Sjordi.vaquero@metempsy.com// notice, this list of conditions and the following disclaimer; 1914150Sjordi.vaquero@metempsy.com// redistributions in binary form must reproduce the above copyright 2014150Sjordi.vaquero@metempsy.com// notice, this list of conditions and the following disclaimer in the 2114150Sjordi.vaquero@metempsy.com// documentation and/or other materials provided with the distribution; 2214150Sjordi.vaquero@metempsy.com// neither the name of the copyright holders nor the names of its 2314150Sjordi.vaquero@metempsy.com// contributors may be used to endorse or promote products derived from 2414150Sjordi.vaquero@metempsy.com// this software without specific prior written permission. 2514150Sjordi.vaquero@metempsy.com// 2614150Sjordi.vaquero@metempsy.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2714150Sjordi.vaquero@metempsy.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2814150Sjordi.vaquero@metempsy.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2914150Sjordi.vaquero@metempsy.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3014150Sjordi.vaquero@metempsy.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3114150Sjordi.vaquero@metempsy.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3214150Sjordi.vaquero@metempsy.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3314150Sjordi.vaquero@metempsy.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3414150Sjordi.vaquero@metempsy.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3514150Sjordi.vaquero@metempsy.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3614150Sjordi.vaquero@metempsy.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3714150Sjordi.vaquero@metempsy.com// 3814150Sjordi.vaquero@metempsy.com// Authors: Jordi Vaquero 3914150Sjordi.vaquero@metempsy.com 4014150Sjordi.vaquero@metempsy.comlet {{ 4114150Sjordi.vaquero@metempsy.com 4214150Sjordi.vaquero@metempsy.com import math 4314150Sjordi.vaquero@metempsy.com 4414150Sjordi.vaquero@metempsy.com OP_DICT = { "CAS" : 'if (a == *b){*b = c;}', 4514150Sjordi.vaquero@metempsy.com "SWP" : '*b = c;', 4614150Sjordi.vaquero@metempsy.com "ADD" : '*b += c;', 4714150Sjordi.vaquero@metempsy.com "EOR" : '*b ^= c;', 4814150Sjordi.vaquero@metempsy.com "CLR" : '*b &= ~c;', 4914150Sjordi.vaquero@metempsy.com "SET" : '*b |= c;', 5014150Sjordi.vaquero@metempsy.com "MAX" : '*b = std::max(*b, c);', 5114150Sjordi.vaquero@metempsy.com "MIN" : '*b = std::min(*b, c);', } 5214150Sjordi.vaquero@metempsy.com 5314150Sjordi.vaquero@metempsy.com MASKS = { 1: 0xFF, 5414150Sjordi.vaquero@metempsy.com 2: 0xFFFF, 5514150Sjordi.vaquero@metempsy.com 4: 0xFFFFFFFF, 5614150Sjordi.vaquero@metempsy.com 8: 0xFFFFFFFFFFFFFFFF, 5714150Sjordi.vaquero@metempsy.com } 5814150Sjordi.vaquero@metempsy.com 5914150Sjordi.vaquero@metempsy.com header_output = "" 6014150Sjordi.vaquero@metempsy.com decoder_output = "" 6114150Sjordi.vaquero@metempsy.com exec_output = "" 6214150Sjordi.vaquero@metempsy.com 6314150Sjordi.vaquero@metempsy.com class AtomicInst64(LoadStoreInst): 6414150Sjordi.vaquero@metempsy.com execBase = 'AtomicInst64' 6514150Sjordi.vaquero@metempsy.com micro = False 6614150Sjordi.vaquero@metempsy.com 6714150Sjordi.vaquero@metempsy.com def __init__(self, mnem, Name, size=4, user=False, flavor="normal", 6814157Sjordi.vaquero@metempsy.com unsign=True, top = False, paired=False, ret_op=True): 6914150Sjordi.vaquero@metempsy.com super(AtomicInst64, self).__init__() 7014150Sjordi.vaquero@metempsy.com 7114150Sjordi.vaquero@metempsy.com self.name= mnem 7214150Sjordi.vaquero@metempsy.com self.Name = Name 7314150Sjordi.vaquero@metempsy.com self.size = size 7414150Sjordi.vaquero@metempsy.com self.user = user 7514150Sjordi.vaquero@metempsy.com self.flavor = flavor 7614150Sjordi.vaquero@metempsy.com self.unsign = unsign 7714150Sjordi.vaquero@metempsy.com self.top = top 7814150Sjordi.vaquero@metempsy.com self.paired = paired 7914150Sjordi.vaquero@metempsy.com 8014150Sjordi.vaquero@metempsy.com self.memFlags = ["ArmISA::TLB::MustBeOne"] 8114150Sjordi.vaquero@metempsy.com self.instFlags = ["IsAtomic"] 8214150Sjordi.vaquero@metempsy.com self.codeBlobs = { "postacc_code" : "" } 8314150Sjordi.vaquero@metempsy.com self.codeBlobs['usrDecl'] = "" 8414150Sjordi.vaquero@metempsy.com 8514150Sjordi.vaquero@metempsy.com # Add memory request flags where necessary 8614150Sjordi.vaquero@metempsy.com if self.user: 8714150Sjordi.vaquero@metempsy.com self.memFlags.append("ArmISA::TLB::UserMode") 8814150Sjordi.vaquero@metempsy.com 8914150Sjordi.vaquero@metempsy.com sz = self.size*2 if paired else self.size 9014150Sjordi.vaquero@metempsy.com self.memFlags.append("%d" % int(math.log(sz, 2))) 9114150Sjordi.vaquero@metempsy.com 9214150Sjordi.vaquero@metempsy.com if self.micro: 9314150Sjordi.vaquero@metempsy.com self.instFlags.append("IsMicroop") 9414150Sjordi.vaquero@metempsy.com 9514150Sjordi.vaquero@metempsy.com if self.flavor in ("release", "acquire_release", "acquire"): 9614150Sjordi.vaquero@metempsy.com self.instFlags.append("IsMemBarrier") 9714150Sjordi.vaquero@metempsy.com if self.flavor in ("release", "acquire_release"): 9814150Sjordi.vaquero@metempsy.com self.instFlags.append("IsWriteBarrier") 9914150Sjordi.vaquero@metempsy.com if self.flavor in ("acquire_release", "acquire"): 10014150Sjordi.vaquero@metempsy.com self.instFlags.append("IsReadBarrier") 10114157Sjordi.vaquero@metempsy.com if ret_op: 10214157Sjordi.vaquero@metempsy.com self.memFlags.append('Request::ATOMIC_RETURN_OP') 10314157Sjordi.vaquero@metempsy.com else: 10414157Sjordi.vaquero@metempsy.com self.memFlags.append('Request::ATOMIC_NO_RETURN_OP') 10514150Sjordi.vaquero@metempsy.com 10614150Sjordi.vaquero@metempsy.com def emitHelper(self, base = 'Memory64', wbDecl = None, ): 10714150Sjordi.vaquero@metempsy.com global header_output, decoder_output, exec_output 10814150Sjordi.vaquero@metempsy.com 10914150Sjordi.vaquero@metempsy.com # If this is a microop itself, don't allow anything that would 11014150Sjordi.vaquero@metempsy.com # require further microcoding. 11114150Sjordi.vaquero@metempsy.com if self.micro: 11214150Sjordi.vaquero@metempsy.com assert not wbDecl 11314150Sjordi.vaquero@metempsy.com 11414150Sjordi.vaquero@metempsy.com sas_code = "3" 11514150Sjordi.vaquero@metempsy.com if self.size == 1 : 11614150Sjordi.vaquero@metempsy.com sas_code = "0" 11714150Sjordi.vaquero@metempsy.com elif self.size == 2: 11814150Sjordi.vaquero@metempsy.com sas_code = "1" 11914150Sjordi.vaquero@metempsy.com elif self.size == 4: 12014150Sjordi.vaquero@metempsy.com sas_code = "2" 12114150Sjordi.vaquero@metempsy.com 12214150Sjordi.vaquero@metempsy.com if self.paired and sas_code == "3": 12314150Sjordi.vaquero@metempsy.com sas_code = "4" 12414150Sjordi.vaquero@metempsy.com if self.paired and sas_code == "2": 12514150Sjordi.vaquero@metempsy.com sas_code = "3" 12614150Sjordi.vaquero@metempsy.com 12714150Sjordi.vaquero@metempsy.com 12814150Sjordi.vaquero@metempsy.com fa_code = ''' 12914150Sjordi.vaquero@metempsy.com fault->annotate(ArmFault::SAS, %s); 13014150Sjordi.vaquero@metempsy.com fault->annotate(ArmFault::SSE, %s); 13114150Sjordi.vaquero@metempsy.com fault->annotate(ArmFault::SRT, dest); 13214150Sjordi.vaquero@metempsy.com fault->annotate(ArmFault::SF, %s); 13314150Sjordi.vaquero@metempsy.com fault->annotate(ArmFault::AR, %s); 13414150Sjordi.vaquero@metempsy.com ''' % (sas_code, 13514150Sjordi.vaquero@metempsy.com "true" if not self.unsign else "false", 13614150Sjordi.vaquero@metempsy.com "true" if self.size == 8 else "false", 13714150Sjordi.vaquero@metempsy.com "true" if self.flavor != "normal" else "false") 13814150Sjordi.vaquero@metempsy.com 13914150Sjordi.vaquero@metempsy.com (newHeader, newDecoder, newExec) = \ 14014150Sjordi.vaquero@metempsy.com self.fillTemplates(self.name, self.Name, self.codeBlobs, 14114150Sjordi.vaquero@metempsy.com self.memFlags, self.instFlags, 14214150Sjordi.vaquero@metempsy.com base, wbDecl, faCode=fa_code) 14314150Sjordi.vaquero@metempsy.com 14414150Sjordi.vaquero@metempsy.com header_output += newHeader 14514150Sjordi.vaquero@metempsy.com decoder_output += newDecoder 14614150Sjordi.vaquero@metempsy.com exec_output += newExec 14714150Sjordi.vaquero@metempsy.com 14814150Sjordi.vaquero@metempsy.com def buildEACode(self): 14914150Sjordi.vaquero@metempsy.com # Address computation 15014150Sjordi.vaquero@metempsy.com eaCode = SPAlignmentCheckCode + "EA = XBase" 15114150Sjordi.vaquero@metempsy.com if self.size == 16: 15214150Sjordi.vaquero@metempsy.com if self.top: 15314150Sjordi.vaquero@metempsy.com eaCode += " + (isBigEndian64(xc->tcBase()) ? 0 : 8)" 15414150Sjordi.vaquero@metempsy.com else: 15514150Sjordi.vaquero@metempsy.com eaCode += " + (isBigEndian64(xc->tcBase()) ? 8 : 0)" 15614150Sjordi.vaquero@metempsy.com if not self.post: 15714150Sjordi.vaquero@metempsy.com eaCode += self.offset 15814150Sjordi.vaquero@metempsy.com eaCode += ";" 15914150Sjordi.vaquero@metempsy.com self.codeBlobs["ea_code"] = eaCode 16014150Sjordi.vaquero@metempsy.com 16114150Sjordi.vaquero@metempsy.com 16214150Sjordi.vaquero@metempsy.com class AtomicSingleOp(AtomicInst64): 16314150Sjordi.vaquero@metempsy.com decConstBase = 'AmoOp' 16414150Sjordi.vaquero@metempsy.com base = 'ArmISA::MemoryEx64' 16514150Sjordi.vaquero@metempsy.com writeback = True 16614150Sjordi.vaquero@metempsy.com post = False 16714150Sjordi.vaquero@metempsy.com execBase = 'AmoOp' 16814150Sjordi.vaquero@metempsy.com 16914150Sjordi.vaquero@metempsy.com def __init__(self, *args, **kargs): 17014150Sjordi.vaquero@metempsy.com super(AtomicSingleOp, self).__init__(*args, **kargs) 17114150Sjordi.vaquero@metempsy.com self.suffix = buildMemSuffix(not self.unsign, self.size) 17214150Sjordi.vaquero@metempsy.com if self.size == 8: 17314150Sjordi.vaquero@metempsy.com self.res = 'XResult_ud' #if self.unsign else 'XResult_sd' 17414150Sjordi.vaquero@metempsy.com self.des = 'XDest_ud' #if self.unsign else 'XDest_sd' 17514150Sjordi.vaquero@metempsy.com self.tp = 'uint64_t' if self.unsign else 'int64_t' 17614150Sjordi.vaquero@metempsy.com self.utp = 'uint64_t' 17714150Sjordi.vaquero@metempsy.com self.suffix = '_sd' if not self.unsign else '_ud' 17814150Sjordi.vaquero@metempsy.com elif self.size == 4: 17914150Sjordi.vaquero@metempsy.com self.res = 'XResult_uw' #if self.unsign else 'XResult_sw' 18014150Sjordi.vaquero@metempsy.com self.des = 'XDest_uw' #if self.unsign else 'XDest_sw' 18114150Sjordi.vaquero@metempsy.com self.tp = 'uint32_t' if self.unsign else 'int32_t' 18214150Sjordi.vaquero@metempsy.com self.utp = 'uint32_t' 18314150Sjordi.vaquero@metempsy.com elif self.size == 2: 18414150Sjordi.vaquero@metempsy.com self.res = 'XResult_uh' #if self.unsign else 'XResult_sh' 18514150Sjordi.vaquero@metempsy.com self.des = 'XDest_uh' #if self.unsign else 'XDest_sh' 18614150Sjordi.vaquero@metempsy.com self.tp = 'uint16_t' if self.unsign else 'int16_t' 18714150Sjordi.vaquero@metempsy.com self.utp = 'uint16_t' 18814150Sjordi.vaquero@metempsy.com elif self.size == 1: 18914150Sjordi.vaquero@metempsy.com self.res = 'XResult_ub' #if self.unsign else 'XResult_sb' 19014150Sjordi.vaquero@metempsy.com self.des = 'XDest_ub' #if self.unsign else 'XDest_sb' 19114150Sjordi.vaquero@metempsy.com self.tp = 'uint8_t' if self.unsign else 'int8_t' 19214150Sjordi.vaquero@metempsy.com self.utp = 'uint8_t' 19314150Sjordi.vaquero@metempsy.com self.offset = "" 19414150Sjordi.vaquero@metempsy.com store_res = ''' 19514150Sjordi.vaquero@metempsy.com %(result)s = cSwap(Mem%(suffix)s, 19614150Sjordi.vaquero@metempsy.com isBigEndian64(xc->tcBase())); 19714150Sjordi.vaquero@metempsy.com ''' 19814150Sjordi.vaquero@metempsy.com store_res = store_res % {"result":self.res, "suffix":self.suffix} 19914150Sjordi.vaquero@metempsy.com self.codeBlobs["postacc_code"] = \ 20014150Sjordi.vaquero@metempsy.com store_res + " SevMailbox = 1; LLSCLock = 0;" 20114150Sjordi.vaquero@metempsy.com 20214150Sjordi.vaquero@metempsy.com def emit(self, op): 20314150Sjordi.vaquero@metempsy.com self.buildEACode() 20414150Sjordi.vaquero@metempsy.com usrDecl = "%(type)s valRs;\n" % {'type': self.tp} 20514150Sjordi.vaquero@metempsy.com self.codeBlobs['usrDecl'] = usrDecl 20614150Sjordi.vaquero@metempsy.com 20714150Sjordi.vaquero@metempsy.com opcode = "valRs = cSwap(%(dest)s,"\ 20814150Sjordi.vaquero@metempsy.com " isBigEndian64(xc->tcBase()));\n" 20914150Sjordi.vaquero@metempsy.com opcode += "TypedAtomicOpFunctor<%(type)s> *amo_op = "\ 21014150Sjordi.vaquero@metempsy.com "new AtomicGeneric3Op<%(type)s>(Mem%(suffix)s,"\ 21114150Sjordi.vaquero@metempsy.com " valRs, [](%(type)s* b, %(type)s a,"\ 21214150Sjordi.vaquero@metempsy.com " %(type)s c){ %(op)s });\n" 21314150Sjordi.vaquero@metempsy.com 21414150Sjordi.vaquero@metempsy.com opcode = opcode % {"suffix": self.suffix, 21514150Sjordi.vaquero@metempsy.com "type": self.tp , 21614150Sjordi.vaquero@metempsy.com "dest": self.des, 21714150Sjordi.vaquero@metempsy.com "op": op} 21814150Sjordi.vaquero@metempsy.com self.codeBlobs['amo_code'] = opcode 21914150Sjordi.vaquero@metempsy.com accCode = "Mem%(suffix)s = cSwap(%(result)s,"\ 22014150Sjordi.vaquero@metempsy.com " isBigEndian64(xc->tcBase()));" 22114150Sjordi.vaquero@metempsy.com accCode = accCode % { "result": self.res, "type":self.tp, 22214150Sjordi.vaquero@metempsy.com "suffix": self.suffix} 22314150Sjordi.vaquero@metempsy.com self.codeBlobs["memacc_code"] = accCode 22414150Sjordi.vaquero@metempsy.com self.emitHelper(self.base) 22514150Sjordi.vaquero@metempsy.com 22614150Sjordi.vaquero@metempsy.com 22714150Sjordi.vaquero@metempsy.com AtomicSingleOp("cas", "CAS64", 8, unsign=True, 22814150Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CAS']) 22914150Sjordi.vaquero@metempsy.com AtomicSingleOp("casa", "CASA64", 8, unsign=True, 23014150Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CAS']) 23114150Sjordi.vaquero@metempsy.com AtomicSingleOp("casal", "CASAL64", 8, unsign=True, 23214150Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CAS']) 23314150Sjordi.vaquero@metempsy.com AtomicSingleOp("casl", "CASL64", 8, unsign=True, 23414150Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CAS']) 23514150Sjordi.vaquero@metempsy.com 23614150Sjordi.vaquero@metempsy.com AtomicSingleOp("casb", "CASB", 1, unsign=True, 23714150Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CAS']) 23814150Sjordi.vaquero@metempsy.com AtomicSingleOp("casab", "CASAB", 1, unsign=True, 23914150Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CAS']) 24014150Sjordi.vaquero@metempsy.com AtomicSingleOp("casalb", "CASALB", 1, unsign=True, 24114150Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CAS']) 24214150Sjordi.vaquero@metempsy.com AtomicSingleOp("caslb", "CASLB", 1, unsign=True, 24314150Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CAS']) 24414150Sjordi.vaquero@metempsy.com 24514150Sjordi.vaquero@metempsy.com AtomicSingleOp("cash", "CASH", 2, unsign=True, 24614150Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CAS']) 24714150Sjordi.vaquero@metempsy.com AtomicSingleOp("casah", "CASAH", 2, unsign=True, 24814150Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CAS']) 24914150Sjordi.vaquero@metempsy.com AtomicSingleOp("casalh", "CASALH", 2, unsign=True, 25014150Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CAS']) 25114150Sjordi.vaquero@metempsy.com AtomicSingleOp("caslh", "CASLH", 2, unsign=True, 25214150Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CAS']) 25314150Sjordi.vaquero@metempsy.com 25414150Sjordi.vaquero@metempsy.com AtomicSingleOp("cas", "CAS32", 4, unsign=True, 25514150Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CAS']) 25614150Sjordi.vaquero@metempsy.com AtomicSingleOp("casa", "CASA32", 4, unsign=True, 25714150Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CAS']) 25814150Sjordi.vaquero@metempsy.com AtomicSingleOp("casal", "CASAL32", 4, unsign=True, 25914150Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CAS']) 26014150Sjordi.vaquero@metempsy.com AtomicSingleOp("casl", "CASL32", 4, unsign=True, 26114150Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CAS']) 26214150Sjordi.vaquero@metempsy.com 26314150Sjordi.vaquero@metempsy.com class CasPair64(AtomicInst64): 26414150Sjordi.vaquero@metempsy.com decConstBase = 'AmoPairOp' 26514150Sjordi.vaquero@metempsy.com base = 'ArmISA::MemoryEx64' 26614150Sjordi.vaquero@metempsy.com writeback = True 26714150Sjordi.vaquero@metempsy.com post = False 26814150Sjordi.vaquero@metempsy.com execBase = 'AmoOp' 26914150Sjordi.vaquero@metempsy.com 27014150Sjordi.vaquero@metempsy.com def __init__(self, *args, **kargs): 27114150Sjordi.vaquero@metempsy.com super(CasPair64, self).__init__(*args, **kargs) 27214150Sjordi.vaquero@metempsy.com self.paired = True 27314150Sjordi.vaquero@metempsy.com self.offset = "" 27414150Sjordi.vaquero@metempsy.com if self.size == 8: 27514150Sjordi.vaquero@metempsy.com self.res = 'XResult_ud' 27614150Sjordi.vaquero@metempsy.com self.des = 'XDest_ud' 27714150Sjordi.vaquero@metempsy.com self.tp = 'std::array<uint64_t, 2>' 27814150Sjordi.vaquero@metempsy.com self.suffix = "_tud" 27914150Sjordi.vaquero@metempsy.com store_res = ''' 28014150Sjordi.vaquero@metempsy.com %(result)s = cSwap(Mem%(suffix)s[0], 28114150Sjordi.vaquero@metempsy.com isBigEndian64(xc->tcBase())); 28214150Sjordi.vaquero@metempsy.com uint64_t result2 = cSwap(Mem%(suffix)s[1], 28314150Sjordi.vaquero@metempsy.com isBigEndian64(xc->tcBase())); 28414150Sjordi.vaquero@metempsy.com xc->setIntRegOperand(this, r2_dst, (result2) 28514150Sjordi.vaquero@metempsy.com & mask(aarch64 ? 64 : 32)); 28614150Sjordi.vaquero@metempsy.com ''' 28714150Sjordi.vaquero@metempsy.com elif self.size == 4: 28814150Sjordi.vaquero@metempsy.com self.res = 'Result_uw' 28914150Sjordi.vaquero@metempsy.com self.des = 'WDest_uw' 29014150Sjordi.vaquero@metempsy.com self.tp = 'uint64_t' 29114150Sjordi.vaquero@metempsy.com self.suffix = "_ud" 29214150Sjordi.vaquero@metempsy.com store_res = ''' 29314150Sjordi.vaquero@metempsy.com uint64_t data = cSwap(Mem%(suffix)s, 29414150Sjordi.vaquero@metempsy.com isBigEndian64(xc->tcBase())); 29514150Sjordi.vaquero@metempsy.com %(result)s = isBigEndian64(xc->tcBase()) 29614150Sjordi.vaquero@metempsy.com ? (data >> 32) 29714150Sjordi.vaquero@metempsy.com : (uint32_t)data; 29814150Sjordi.vaquero@metempsy.com uint32_t result2 = isBigEndian64(xc->tcBase()) 29914150Sjordi.vaquero@metempsy.com ? (uint32_t)data 30014150Sjordi.vaquero@metempsy.com : (data >> 32); 30114150Sjordi.vaquero@metempsy.com xc->setIntRegOperand(this, r2_dst, (result2) & 30214150Sjordi.vaquero@metempsy.com mask(aarch64 ? 64 : 32)); 30314150Sjordi.vaquero@metempsy.com ''' 30414150Sjordi.vaquero@metempsy.com 30514150Sjordi.vaquero@metempsy.com store_res = store_res % {"result":self.res, "suffix":self.suffix} 30614150Sjordi.vaquero@metempsy.com usrDecl = "%(type)s valRs;\n" % {'type': self.tp} 30714150Sjordi.vaquero@metempsy.com self.codeBlobs['usrDecl'] = usrDecl 30814150Sjordi.vaquero@metempsy.com self.codeBlobs["postacc_code"] = \ 30914150Sjordi.vaquero@metempsy.com store_res + " SevMailbox = 1; LLSCLock = 0;" 31014150Sjordi.vaquero@metempsy.com 31114150Sjordi.vaquero@metempsy.com def emit(self): 31214150Sjordi.vaquero@metempsy.com self.buildEACode() 31314150Sjordi.vaquero@metempsy.com 31414150Sjordi.vaquero@metempsy.com # Code that actually handles the access 31514150Sjordi.vaquero@metempsy.com 31614150Sjordi.vaquero@metempsy.com if self.size == 4: 31714150Sjordi.vaquero@metempsy.com accCode = \ 31814150Sjordi.vaquero@metempsy.com "uint32_t result2 = ((xc->readIntRegOperand(this, r2_src))"\ 31914150Sjordi.vaquero@metempsy.com " & mask(aarch64 ? 64 : 32)) ;\n"\ 32014150Sjordi.vaquero@metempsy.com " uint32_t dest2 = ((xc->readIntRegOperand(this, d2_src)) "\ 32114150Sjordi.vaquero@metempsy.com " & mask(aarch64 ? 64 : 32)) ;" 32214150Sjordi.vaquero@metempsy.com accCode += ''' 32314150Sjordi.vaquero@metempsy.com uint64_t data = dest2; 32414150Sjordi.vaquero@metempsy.com data = isBigEndian64(xc->tcBase()) 32514150Sjordi.vaquero@metempsy.com ? ((uint64_t(WDest_uw) << 32) | data) 32614150Sjordi.vaquero@metempsy.com : ((data << 32) | WDest_uw); 32714150Sjordi.vaquero@metempsy.com valRs = cSwap(data, isBigEndian64(xc->tcBase())); 32814150Sjordi.vaquero@metempsy.com uint64_t data2 = result2 ; 32914150Sjordi.vaquero@metempsy.com data2 = isBigEndian64(xc->tcBase()) 33014150Sjordi.vaquero@metempsy.com ? ((uint64_t(Result_uw) << 32) | data2) 33114150Sjordi.vaquero@metempsy.com : ((data2 << 32) | Result_uw); 33214150Sjordi.vaquero@metempsy.com Mem_ud = cSwap(data2, isBigEndian64(xc->tcBase())); 33314150Sjordi.vaquero@metempsy.com ''' 33414150Sjordi.vaquero@metempsy.com 33514150Sjordi.vaquero@metempsy.com opcode = "TypedAtomicOpFunctor<%(type)s> *amo_op = "\ 33614150Sjordi.vaquero@metempsy.com "new AtomicGeneric3Op<%(type)s>(Mem%(suffix)s,"\ 33714150Sjordi.vaquero@metempsy.com " valRs, [](%(type)s* b, %(type)s a,"\ 33814150Sjordi.vaquero@metempsy.com " %(type)s c){ %(op)s });\n" 33914150Sjordi.vaquero@metempsy.com 34014150Sjordi.vaquero@metempsy.com elif self.size == 8: 34114150Sjordi.vaquero@metempsy.com accCode = ""\ 34214150Sjordi.vaquero@metempsy.com "uint64_t result2 = ((xc->readIntRegOperand(this, r2_src))"\ 34314150Sjordi.vaquero@metempsy.com " & mask(aarch64 ? 64 : 32)) ;\n"\ 34414150Sjordi.vaquero@metempsy.com " uint64_t dest2 = ((xc->readIntRegOperand(this, d2_src)) "\ 34514150Sjordi.vaquero@metempsy.com " & mask(aarch64 ? 64 : 32)) ;" 34614150Sjordi.vaquero@metempsy.com accCode += ''' 34714150Sjordi.vaquero@metempsy.com // This temporary needs to be here so that the parser 34814150Sjordi.vaquero@metempsy.com // will correctly identify this instruction as a store. 34914150Sjordi.vaquero@metempsy.com std::array<uint64_t, 2> temp; 35014150Sjordi.vaquero@metempsy.com temp[0] = cSwap(XDest_ud,isBigEndian64(xc->tcBase())); 35114150Sjordi.vaquero@metempsy.com temp[1] = cSwap(dest2,isBigEndian64(xc->tcBase())); 35214150Sjordi.vaquero@metempsy.com valRs = temp; 35314150Sjordi.vaquero@metempsy.com std::array<uint64_t, 2> temp2; 35414150Sjordi.vaquero@metempsy.com temp2[0] = cSwap(XResult_ud,isBigEndian64(xc->tcBase())); 35514150Sjordi.vaquero@metempsy.com temp2[1] = cSwap(result2,isBigEndian64(xc->tcBase())); 35614150Sjordi.vaquero@metempsy.com Mem_tud = temp2; 35714150Sjordi.vaquero@metempsy.com ''' 35814150Sjordi.vaquero@metempsy.com 35914150Sjordi.vaquero@metempsy.com opcode = "TypedAtomicOpFunctor<uint64_t> *amo_op = "\ 36014150Sjordi.vaquero@metempsy.com "new AtomicGenericPair3Op<uint64_t>(Mem_tud, "\ 36114150Sjordi.vaquero@metempsy.com "valRs, [](uint64_t* b, std::array<uint64_t,2> a,"\ 36214150Sjordi.vaquero@metempsy.com ''' 36314150Sjordi.vaquero@metempsy.com std::array<uint64_t,2> c){ 36414150Sjordi.vaquero@metempsy.com if(a[0]==b[0] && a[1]==b[1]){ 36514150Sjordi.vaquero@metempsy.com b[0] = c[0]; b[1] = c[1]; 36614150Sjordi.vaquero@metempsy.com } 36714150Sjordi.vaquero@metempsy.com });''' 36814150Sjordi.vaquero@metempsy.com 36914150Sjordi.vaquero@metempsy.com opcode = opcode % { "suffix" : self.suffix, 37014150Sjordi.vaquero@metempsy.com "type": self.tp, 37114150Sjordi.vaquero@metempsy.com "op": OP_DICT['CAS']} 37214150Sjordi.vaquero@metempsy.com self.codeBlobs['amo_code'] = opcode 37314150Sjordi.vaquero@metempsy.com self.codeBlobs["memacc_code"] = accCode % {"type": self.tp} 37414150Sjordi.vaquero@metempsy.com 37514150Sjordi.vaquero@metempsy.com # Push it out to the output files 37614150Sjordi.vaquero@metempsy.com self.emitHelper(self.base) 37714150Sjordi.vaquero@metempsy.com 37814150Sjordi.vaquero@metempsy.com CasPair64("casp", "CASP64", 8, flavor="normal", paired=True).emit() 37914150Sjordi.vaquero@metempsy.com CasPair64("caspa", "CASPA64", 8, flavor="acquire", paired=True).emit() 38014150Sjordi.vaquero@metempsy.com CasPair64("caspal", "CASPAL64", 8, flavor="acquire_release", 38114150Sjordi.vaquero@metempsy.com paired=True).emit() 38214150Sjordi.vaquero@metempsy.com CasPair64("caspl", "CASPL64", 8, flavor="release", paired=True).emit() 38314150Sjordi.vaquero@metempsy.com 38414150Sjordi.vaquero@metempsy.com CasPair64("casp", "CASP32", 4, flavor="normal", paired=True).emit() 38514150Sjordi.vaquero@metempsy.com CasPair64("caspa", "CASPA32", 4, flavor="acquire", paired=True).emit() 38614150Sjordi.vaquero@metempsy.com CasPair64("caspal", "CASPAL32", 4, flavor="acquire_release", 38714150Sjordi.vaquero@metempsy.com paired=True).emit() 38814150Sjordi.vaquero@metempsy.com CasPair64("caspl", "CASPL32", 4, flavor="release", paired=True).emit() 38914150Sjordi.vaquero@metempsy.com 39014157Sjordi.vaquero@metempsy.com #Set of LD<OP> atomic instructions 39114157Sjordi.vaquero@metempsy.com 39214157Sjordi.vaquero@metempsy.com class AtomicArithmeticSingleOp(AtomicSingleOp): 39314157Sjordi.vaquero@metempsy.com decConstBase = 'AmoArithmeticOp' 39414157Sjordi.vaquero@metempsy.com base = 'ArmISA::MemoryEx64' 39514157Sjordi.vaquero@metempsy.com writeback = True 39614157Sjordi.vaquero@metempsy.com post = False 39714157Sjordi.vaquero@metempsy.com execBase = 'AmoOp' 39814157Sjordi.vaquero@metempsy.com 39914157Sjordi.vaquero@metempsy.com def __init__(self, *args, **kargs): 40014157Sjordi.vaquero@metempsy.com super(AtomicArithmeticSingleOp, self).__init__(*args, **kargs) 40114157Sjordi.vaquero@metempsy.com store_res = "%(utype)s unsMem = Mem%(suffix)s" 40214157Sjordi.vaquero@metempsy.com 40314157Sjordi.vaquero@metempsy.com if self.size != 8: 40414157Sjordi.vaquero@metempsy.com store_res += " & %(mask)s" 40514157Sjordi.vaquero@metempsy.com 40614157Sjordi.vaquero@metempsy.com store_res += ";\n" 40714157Sjordi.vaquero@metempsy.com store_res += ''' if (!isXZR) %(dest)s = cSwap(unsMem, 40814157Sjordi.vaquero@metempsy.com isBigEndian64(xc->tcBase())); 40914157Sjordi.vaquero@metempsy.com ''' 41014157Sjordi.vaquero@metempsy.com store_res = store_res % { "dest": self.des, "suffix":self.suffix, 41114157Sjordi.vaquero@metempsy.com "mask": MASKS[self.size], "utype": self.utp} 41214157Sjordi.vaquero@metempsy.com self.codeBlobs["postacc_code"] = \ 41314157Sjordi.vaquero@metempsy.com store_res + " SevMailbox = 1; LLSCLock = 0;" 41414157Sjordi.vaquero@metempsy.com 41514157Sjordi.vaquero@metempsy.com def emit(self, op): 41614157Sjordi.vaquero@metempsy.com self.buildEACode() 41714157Sjordi.vaquero@metempsy.com 41814157Sjordi.vaquero@metempsy.com opcode = "%(type)s val = cSwap(%(result)s,"\ 41914157Sjordi.vaquero@metempsy.com " isBigEndian64(xc->tcBase()));\n" 42014157Sjordi.vaquero@metempsy.com opcode += "TypedAtomicOpFunctor<%(type)s> *amo_op = "\ 42114157Sjordi.vaquero@metempsy.com "new AtomicGeneric3Op<%(type)s>(Mem%(suffix)s,"\ 42214157Sjordi.vaquero@metempsy.com " val, [](%(type)s* b, %(type)s a,"\ 42314157Sjordi.vaquero@metempsy.com " %(type)s c){ %(op)s });\n" 42414157Sjordi.vaquero@metempsy.com 42514157Sjordi.vaquero@metempsy.com opcode = opcode % { "suffix" : self.suffix, 42614157Sjordi.vaquero@metempsy.com "type": self.tp , "result": self.res, "op": op} 42714157Sjordi.vaquero@metempsy.com self.codeBlobs['amo_code'] = opcode 42814157Sjordi.vaquero@metempsy.com accCode = "Mem%(suffix)s = cSwap(%(dest)s,"\ 42914157Sjordi.vaquero@metempsy.com "isBigEndian64(xc->tcBase()));" 43014157Sjordi.vaquero@metempsy.com accCode = accCode % { "dest": self.des, "suffix":self.suffix} 43114157Sjordi.vaquero@metempsy.com self.codeBlobs["memacc_code"] = accCode 43214157Sjordi.vaquero@metempsy.com self.emitHelper(self.base) 43314157Sjordi.vaquero@metempsy.com 43414157Sjordi.vaquero@metempsy.com 43514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddb", "LDADDB", 1, unsign=True, 43614157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['ADD']) 43714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddlb", "LDADDLB", 1, unsign=True, 43814157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['ADD']) 43914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddab", "LDADDAB", 1, unsign=True, 44014157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['ADD']) 44114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddlab", "LDADDLAB", 1, unsign=True, 44214157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['ADD']) 44314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddh", "LDADDH", 2, unsign=True, 44414157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['ADD']) 44514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddlh", "LDADDLH", 2, unsign=True, 44614157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['ADD']) 44714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddah", "LDADDAH", 2, unsign=True, 44814157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['ADD']) 44914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddlah", "LDADDLAH", 2, unsign=True, 45014157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['ADD']) 45114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldadd", "LDADD", 4, unsign=True, 45214157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['ADD']) 45314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddl", "LDADDL", 4, unsign=True, 45414157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['ADD']) 45514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldadda", "LDADDA", 4, unsign=True, 45614157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['ADD']) 45714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddla", "LDADDLA", 4, unsign=True, 45814157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['ADD']) 45914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldadd64", "LDADD64", 8, unsign=True, 46014157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['ADD']) 46114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddl64", "LDADDL64", 8, unsign=True, 46214157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['ADD']) 46314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldadda64", "LDADDA64", 8, unsign=True, 46414157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['ADD']) 46514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldaddla64", "LDADDLA64", 8, unsign=True, 46614157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['ADD']) 46714157Sjordi.vaquero@metempsy.com 46814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrb", "LDCLRB", 1, unsign=True, 46914157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CLR']) 47014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrlb", "LDCLRLB", 1, unsign=True, 47114157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CLR']) 47214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrab", "LDCLRAB", 1, unsign=True, 47314157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CLR']) 47414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrlab", "LDCLRLAB", 1, unsign=True, 47514157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CLR']) 47614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrh", "LDCLRH", 2, unsign=True, 47714157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CLR']) 47814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrlh", "LDCLRLH", 2, unsign=True, 47914157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CLR']) 48014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrah", "LDCLRAH", 2, unsign=True, 48114157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CLR']) 48214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrlah", "LDCLRLAH", 2, unsign=True, 48314157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CLR']) 48414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclr", "LDCLR", 4, unsign=True, 48514157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CLR']) 48614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrl", "LDCLRL", 4, unsign=True, 48714157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CLR']) 48814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclra", "LDCLRA", 4, unsign=True, 48914157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CLR']) 49014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrla", "LDCLRLA", 4, unsign=True, 49114157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CLR']) 49214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclr64", "LDCLR64", 8, unsign=True, 49314157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['CLR']) 49414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrl64", "LDCLRL64", 8, unsign=True, 49514157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['CLR']) 49614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclra64", "LDCLRA64", 8, unsign=True, 49714157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['CLR']) 49814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldclrla64", "LDCLRLA64", 8, unsign=True, 49914157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['CLR']) 50014157Sjordi.vaquero@metempsy.com 50114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorb", "LDEORB", 1, unsign=True, 50214157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['EOR']) 50314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorlb", "LDEORLB", 1, unsign=True, 50414157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['EOR']) 50514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorab", "LDEORAB", 1, unsign=True, 50614157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['EOR']) 50714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorlab", "LDEORLAB", 1, unsign=True, 50814157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['EOR']) 50914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorh", "LDEORH", 2, unsign=True, 51014157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['EOR']) 51114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorlh", "LDEORLH", 2, unsign=True, 51214157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['EOR']) 51314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorah", "LDEORAH", 2, unsign=True, 51414157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['EOR']) 51514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorlah", "LDEORLAH", 2, unsign=True, 51614157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['EOR']) 51714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeor", "LDEOR", 4, unsign=True, 51814157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['EOR']) 51914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorl", "LDEORL", 4, unsign=True, 52014157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['EOR']) 52114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeora", "LDEORA", 4, unsign=True, 52214157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['EOR']) 52314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorla", "LDEORLA", 4, unsign=True, 52414157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['EOR']) 52514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeor64", "LDEOR64", 8, unsign=True, 52614157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['EOR']) 52714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorl64", "LDEORL64", 8, unsign=True, 52814157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['EOR']) 52914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeora64", "LDEORA64", 8, unsign=True, 53014157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['EOR']) 53114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldeorla64", "LDEORLA64", 8, unsign=True, 53214157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['EOR']) 53314157Sjordi.vaquero@metempsy.com 53414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetb", "LDSETB", 1, unsign=True, 53514157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['SET']) 53614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetlb", "LDSETLB", 1, unsign=True, 53714157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['SET']) 53814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetab", "LDSETAB", 1, unsign=True, 53914157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['SET']) 54014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetlab", "LDSETLAB", 1, unsign=True, 54114157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['SET']) 54214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldseth", "LDSETH", 2, unsign=True, 54314157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['SET']) 54414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetlh", "LDSETLH", 2, unsign=True, 54514157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['SET']) 54614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetah", "LDSETAH", 2, unsign=True, 54714157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['SET']) 54814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetlah", "LDSETLAH", 2, unsign=True, 54914157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['SET']) 55014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldset", "LDSET", 4, unsign=True, 55114157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['SET']) 55214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetl", "LDSETL", 4, unsign=True, 55314157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['SET']) 55414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldseta", "LDSETA", 4, unsign=True, 55514157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['SET']) 55614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetla", "LDSETLA", 4, unsign=True, 55714157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['SET']) 55814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldset64", "LDSET64", 8, unsign=True, 55914157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['SET']) 56014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetl64", "LDSETL64", 8, unsign=True, 56114157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['SET']) 56214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldseta64", "LDSETA64", 8, unsign=True, 56314157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['SET']) 56414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsetla64", "LDSETLA64", 8, unsign=True, 56514157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['SET']) 56614157Sjordi.vaquero@metempsy.com 56714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxb", "LDSMAXB", 1, unsign=False, 56814157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 56914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxlb", "LDSMAXLB", 1, unsign=False, 57014157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 57114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxab", "LDSMAXAB", 1, unsign=False, 57214157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 57314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxlab", "LDSMAXLAB", 1, unsign=False, 57414157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 57514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxh", "LDSMAXH", 2, unsign=False, 57614157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 57714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxlh", "LDSMAXLH", 2, unsign=False, 57814157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 57914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxah", "LDSMAXAH", 2, unsign=False, 58014157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 58114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxlah", "LDSMAXLAH", 2, unsign=False, 58214157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 58314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmax", "LDSMAX", 4, unsign=False, 58414157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 58514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxl", "LDSMAXL", 4, unsign=False, 58614157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 58714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxa", "LDSMAXA", 4, unsign=False, 58814157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 58914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxla", "LDSMAXLA", 4, unsign=False, 59014157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 59114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmax64", "LDSMAX64", 8, unsign=False, 59214157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 59314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxl64", "LDSMAXL64", 8, unsign=False, 59414157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 59514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxa64", "LDSMAXA64", 8, unsign=False, 59614157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 59714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmaxla64", "LDSMAXLA64", 8, unsign=False, 59814157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 59914157Sjordi.vaquero@metempsy.com 60014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminb", "LDSMINB", 1, unsign=False, 60114157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 60214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminlb", "LDSMINLB", 1, unsign=False, 60314157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 60414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminab", "LDSMINAB", 1, unsign=False, 60514157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 60614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminlab", "LDSMINLAB", 1, unsign=False, 60714157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 60814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminh", "LDSMINH", 2, unsign=False, 60914157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 61014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminlh", "LDSMINLH", 2, unsign=False, 61114157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 61214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminah", "LDSMINAH", 2, unsign=False, 61314157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 61414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminlah", "LDSMINLAH", 2, unsign=False, 61514157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 61614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmin", "LDSMIN", 4, unsign=False, 61714157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 61814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminl", "LDSMINL", 4, unsign=False, 61914157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 62014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmina", "LDSMINA", 4, unsign=False, 62114157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 62214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminla", "LDSMINLA", 4, unsign=False, 62314157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 62414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmin64", "LDSMIN64", 8, unsign=False, 62514157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 62614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminl64", "LDSMINL64", 8, unsign=False, 62714157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 62814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsmina64", "LDSMINA64", 8, unsign=False, 62914157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 63014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldsminla64", "LDSMINLA64", 8, unsign=False, 63114157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 63214157Sjordi.vaquero@metempsy.com 63314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxb", "LDUMAXB", 1, unsign=True, 63414157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 63514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxlb", "LDUMAXLB", 1, unsign=True, 63614157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 63714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxab", "LDUMAXAB", 1, unsign=True, 63814157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 63914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxlab", "LDUMAXLAB", 1, unsign=True, 64014157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 64114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxh", "LDUMAXH", 2, unsign=True, 64214157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 64314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxlh", "LDUMAXLH", 2, unsign=True, 64414157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 64514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxah", "LDUMAXAH", 2, unsign=True, 64614157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 64714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxlah", "LDUMAXLAH", 2, unsign=True, 64814157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 64914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumax", "LDUMAX", 4, unsign=True, 65014157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 65114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxl", "LDUMAXL", 4, unsign=True, 65214157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 65314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxa", "LDUMAXA", 4, unsign=True, 65414157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 65514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxla", "LDUMAXLA", 4, unsign=True, 65614157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 65714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumax64", "LDUMAX64", 8, unsign=True, 65814157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MAX']) 65914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxl64", "LDUMAXL64", 8, unsign=True, 66014157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MAX']) 66114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxa64", "LDUMAXA64", 8, unsign=True, 66214157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MAX']) 66314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumaxla64", "LDUMAXLA64", 8, unsign=True, 66414157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MAX']) 66514157Sjordi.vaquero@metempsy.com 66614157Sjordi.vaquero@metempsy.com 66714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminb", "LDUMINB", 1, unsign=True, 66814157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 66914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminlb", "LDUMINLB", 1, unsign=True, 67014157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 67114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminab", "LDUMINAB", 1, unsign=True, 67214157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 67314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminlab", "LDUMINLAB", 1, unsign=True, 67414157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 67514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminh", "LDUMINH", 2, unsign=True, 67614157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 67714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminlh", "LDUMINLH", 2, unsign=True, 67814157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 67914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminah", "LDUMINAH", 2, unsign=True, 68014157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 68114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminlah", "LDUMINLAH", 2, unsign=True, 68214157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 68314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumin", "LDUMIN", 4, unsign=True, 68414157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 68514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminl", "LDUMINL", 4, unsign=True, 68614157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 68714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumina", "LDUMINA", 4, unsign=True, 68814157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 68914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminla", "LDUMINLA", 4, unsign=True, 69014157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 69114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumin64", "LDUMIN64", 8, unsign=True, 69214157Sjordi.vaquero@metempsy.com flavor="normal").emit(OP_DICT['MIN']) 69314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminl64", "LDUMINL64", 8, unsign=True, 69414157Sjordi.vaquero@metempsy.com flavor="release").emit(OP_DICT['MIN']) 69514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("ldumina64", "LDUMINA64", 8, unsign=True, 69614157Sjordi.vaquero@metempsy.com flavor="acquire").emit(OP_DICT['MIN']) 69714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("lduminla64", "LDUMINLA64", 8, unsign=True, 69814157Sjordi.vaquero@metempsy.com flavor="acquire_release").emit(OP_DICT['MIN']) 69914157Sjordi.vaquero@metempsy.com 70014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("staddb", "STADDB", 1, unsign=True, 70114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['ADD']) 70214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("staddlb", "STADDLB", 1, unsign=True, 70314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['ADD']) 70414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("staddh", "STADDH", 2, unsign=True, 70514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['ADD']) 70614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("staddlh", "STADDLH", 2, unsign=True, 70714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['ADD']) 70814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stadd", "STADD", 4, unsign=True, 70914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['ADD']) 71014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("staddl", "STADDL", 4, unsign=True, 71114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['ADD']) 71214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stadd64", "STADD64", 8, unsign=True, 71314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['ADD']) 71414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("staddl64", "STADDL64", 8, unsign=True, 71514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['ADD']) 71614157Sjordi.vaquero@metempsy.com 71714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclrb", "STCLRB", 1, unsign=True, 71814157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['CLR']) 71914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclrlb", "STCLRLB", 1, unsign=True, 72014157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['CLR']) 72114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclrh", "STCLRH", 2, unsign=True, 72214157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['CLR']) 72314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclrlh", "STCLRLH", 2, unsign=True, 72414157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['CLR']) 72514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclr", "STCLR", 4, unsign=True, 72614157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['CLR']) 72714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclrl", "STCLRL", 4, unsign=True, 72814157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['CLR']) 72914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclr64", "STCLR64", 8, unsign=True, 73014157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['CLR']) 73114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stclrl64", "STCLRL64", 8, unsign=True, 73214157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['CLR']) 73314157Sjordi.vaquero@metempsy.com 73414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steorb", "STEORB", 1, unsign=True, 73514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['EOR']) 73614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steorlb", "STEORLB", 1, unsign=True, 73714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['EOR']) 73814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steorh", "STEORH", 2, unsign=True, 73914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['EOR']) 74014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steorlh", "STEORLH", 2, unsign=True, 74114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['EOR']) 74214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steor", "STEOR", 4, unsign=True, 74314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['EOR']) 74414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steorl", "STEORL", 4, unsign=True, 74514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['EOR']) 74614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steor64", "STEOR64", 8, unsign=True, 74714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['EOR']) 74814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("steorl64", "STEORL64", 8, unsign=True, 74914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['EOR']) 75014157Sjordi.vaquero@metempsy.com 75114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsetb", "STSETB", 1, unsign=True, 75214157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SET']) 75314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsetlb", "STSETLB", 1, unsign=True, 75414157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SET']) 75514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsetab", "STSETAB", 1, unsign=True, 75614157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire").emit(OP_DICT['SET']) 75714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsetlab", "STSETLAB", 1, unsign=True, 75814157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire_release").emit(OP_DICT['SET']) 75914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stseth", "STSETH", 2, unsign=True, 76014157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SET']) 76114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsetlh", "STSETLH", 2, unsign=True, 76214157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SET']) 76314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stset", "STSET", 4, unsign=True, 76414157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SET']) 76514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsetl", "STSETL", 4, unsign=True, 76614157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SET']) 76714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stset64", "STSET64", 8, unsign=True, 76814157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SET']) 76914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsetl64", "STSETL64", 8, unsign=True, 77014157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SET']) 77114157Sjordi.vaquero@metempsy.com 77214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmaxb", "STSMAXB", 1, unsign=False, 77314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 77414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmaxlb", "STSMAXLB", 1, unsign=False, 77514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 77614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmaxh", "STSMAXH", 2, unsign=False, 77714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 77814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmaxlh", "STSMAXLH", 2, unsign=False, 77914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 78014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmax", "STSMAX", 4, unsign=False, 78114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 78214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmaxl", "STSMAXL", 4, unsign=False, 78314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 78414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmax64", "STSMAX64", 8, unsign=False, 78514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 78614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmaxl64", "STSMAXL64", 8, unsign=False, 78714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 78814157Sjordi.vaquero@metempsy.com 78914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsminb", "STSMINB", 1, unsign=False, 79014157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 79114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsminlb", "STSMINLB", 1, unsign=False, 79214157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 79314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsminh", "STSMINH", 2, unsign=False, 79414157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 79514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsminlh", "STSMINLH", 2, unsign=False, 79614157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 79714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmin", "STSMIN", 4, unsign=False, 79814157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 79914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsminl", "STSMINL", 4, unsign=False, 80014157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 80114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsmin64", "STSMIN64", 8, unsign=False, 80214157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 80314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stsminl64", "STSMINL64", 8, unsign=False, 80414157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 80514157Sjordi.vaquero@metempsy.com 80614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumaxb", "STUMAXB", 1, unsign=True, 80714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 80814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumaxlb", "STUMAXLB", 1, unsign=True, 80914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 81014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumaxh", "STUMAXH", 2, unsign=True, 81114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 81214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumaxlh", "STUMAXLH", 2, unsign=True, 81314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 81414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumax", "STUMAX", 4, unsign=True, 81514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 81614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumaxl", "STUMAXL", 4, unsign=True, 81714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 81814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumax64", "STUMAX64", 8, unsign=True, 81914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MAX']) 82014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumaxl64", "STUMAXL64", 8, unsign=True, 82114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MAX']) 82214157Sjordi.vaquero@metempsy.com 82314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stuminb", "STUMINB", 1, unsign=True, 82414157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 82514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stuminlb", "STUMINLB", 1, unsign=True, 82614157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 82714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stuminh", "STUMINH", 2, unsign=True, 82814157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 82914157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stuminlh", "STUMINLH", 2, unsign=True, 83014157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 83114157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumin", "STUMIN", 4, unsign=True, 83214157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 83314157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stuminl", "STUMINL", 4, unsign=True, 83414157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 83514157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stumin64", "STUMIN64", 8, unsign=True, 83614157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['MIN']) 83714157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("stuminl64", "STUMINL64", 8, unsign=True, 83814157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['MIN']) 83914157Sjordi.vaquero@metempsy.com 84014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpb", "SWPB", 1, unsign=True, 84114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SWP']) 84214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swplb", "SWPLB", 1, unsign=True, 84314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SWP']) 84414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpab", "SWPAB", 1, unsign=True, 84514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire").emit(OP_DICT['SWP']) 84614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swplab", "SWPLAB", 1, unsign=True, 84714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire_release").emit(OP_DICT['SWP']) 84814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swph", "SWPH", 2, unsign=True, 84914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SWP']) 85014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swplh", "SWPLH", 2, unsign=True, 85114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SWP']) 85214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpah", "SWPAH", 2, unsign=True, 85314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire").emit(OP_DICT['SWP']) 85414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swplah", "SWPLAH", 2, unsign=True, 85514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire_release").emit(OP_DICT['SWP']) 85614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swp", "SWP", 4, unsign=True, 85714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SWP']) 85814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpl", "SWPL", 4, unsign=True, 85914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SWP']) 86014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpa", "SWPA", 4, unsign=True, 86114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire").emit(OP_DICT['SWP']) 86214157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpla", "SWPLA", 4, unsign=True, 86314157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire_release").emit(OP_DICT['SWP']) 86414157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swp64", "SWP64", 8, unsign=True, 86514157Sjordi.vaquero@metempsy.com ret_op=False, flavor="normal").emit(OP_DICT['SWP']) 86614157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpl64", "SWPL64", 8, unsign=True, 86714157Sjordi.vaquero@metempsy.com ret_op=False, flavor="release").emit(OP_DICT['SWP']) 86814157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpa64", "SWPA64", 8, unsign=True, 86914157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire").emit(OP_DICT['SWP']) 87014157Sjordi.vaquero@metempsy.com AtomicArithmeticSingleOp("swpla64", "SWPLA64", 8, unsign=True, 87114157Sjordi.vaquero@metempsy.com ret_op=False, flavor="acquire_release").emit(OP_DICT['SWP']) 87214150Sjordi.vaquero@metempsy.com}}; 873