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