operands.isa revision 11514
16019Shines@cs.fsu.edu// -*- mode:c++ -*-
26019Shines@cs.fsu.edu// Copyright (c) 2010-2014 ARM Limited
37178Sgblack@eecs.umich.edu// All rights reserved
47178Sgblack@eecs.umich.edu//
57178Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
67178Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
77178Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
87178Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
97178Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
107178Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
117178Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
127178Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
137178Sgblack@eecs.umich.edu//
147178Sgblack@eecs.umich.edu// Copyright (c) 2007-2008 The Florida State University
156019Shines@cs.fsu.edu// All rights reserved.
166019Shines@cs.fsu.edu//
176019Shines@cs.fsu.edu// Redistribution and use in source and binary forms, with or without
186019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are
196019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright
206019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer;
216019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright
226019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the
236019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution;
246019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its
256019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from
266019Shines@cs.fsu.edu// this software without specific prior written permission.
276019Shines@cs.fsu.edu//
286019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
296019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
306019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
316019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
326019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
336019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
346019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
356019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
366019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
376019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
386019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
396019Shines@cs.fsu.edu//
406019Shines@cs.fsu.edu// Authors: Stephen Hines
416019Shines@cs.fsu.edu
426019Shines@cs.fsu.edudef operand_types {{
436019Shines@cs.fsu.edu    'sb' : 'int8_t',
446019Shines@cs.fsu.edu    'ub' : 'uint8_t',
456019Shines@cs.fsu.edu    'sh' : 'int16_t',
466019Shines@cs.fsu.edu    'uh' : 'uint16_t',
476019Shines@cs.fsu.edu    'sw' : 'int32_t',
486019Shines@cs.fsu.edu    'uw' : 'uint32_t',
496019Shines@cs.fsu.edu    'ud' : 'uint64_t',
506019Shines@cs.fsu.edu    'tud' : 'Twin64_t',
516019Shines@cs.fsu.edu    'sf' : 'float',
526019Shines@cs.fsu.edu    'df' : 'double'
536019Shines@cs.fsu.edu}};
546019Shines@cs.fsu.edu
556019Shines@cs.fsu.edulet {{
566019Shines@cs.fsu.edu    maybePCRead = '''
576019Shines@cs.fsu.edu        ((%(reg_idx)s == PCReg) ? readPC(xc) : xc->%(func)s(this, %(op_idx)s))
586243Sgblack@eecs.umich.edu    '''
596243Sgblack@eecs.umich.edu    maybeAlignedPCRead = '''
606243Sgblack@eecs.umich.edu        ((%(reg_idx)s == PCReg) ? (roundDown(readPC(xc), 4)) :
616243Sgblack@eecs.umich.edu         xc->%(func)s(this, %(op_idx)s))
626243Sgblack@eecs.umich.edu    '''
636019Shines@cs.fsu.edu    maybePCWrite = '''
646019Shines@cs.fsu.edu        ((%(reg_idx)s == PCReg) ? setNextPC(xc, %(final_val)s) :
656019Shines@cs.fsu.edu         xc->%(func)s(this, %(op_idx)s, %(final_val)s))
666019Shines@cs.fsu.edu    '''
676019Shines@cs.fsu.edu    maybeIWPCWrite = '''
686019Shines@cs.fsu.edu        ((%(reg_idx)s == PCReg) ? setIWNextPC(xc, %(final_val)s) :
696019Shines@cs.fsu.edu         xc->%(func)s(this, %(op_idx)s, %(final_val)s))
706019Shines@cs.fsu.edu    '''
716019Shines@cs.fsu.edu    maybeAIWPCWrite = '''
726019Shines@cs.fsu.edu        if (%(reg_idx)s == PCReg) {
736019Shines@cs.fsu.edu            bool thumb = THUMB;
746019Shines@cs.fsu.edu            if (thumb) {
756019Shines@cs.fsu.edu                setNextPC(xc, %(final_val)s);
766019Shines@cs.fsu.edu            } else {
776019Shines@cs.fsu.edu                setIWNextPC(xc, %(final_val)s);
786019Shines@cs.fsu.edu            }
796019Shines@cs.fsu.edu        } else {
806019Shines@cs.fsu.edu            xc->%(func)s(this, %(op_idx)s, %(final_val)s);
816019Shines@cs.fsu.edu        }
826019Shines@cs.fsu.edu    '''
836019Shines@cs.fsu.edu    aarch64Read = '''
846019Shines@cs.fsu.edu        ((xc->%(func)s(this, %(op_idx)s)) & mask(intWidth))
856019Shines@cs.fsu.edu    '''
866019Shines@cs.fsu.edu    aarch64Write = '''
876019Shines@cs.fsu.edu        xc->%(func)s(this, %(op_idx)s, (%(final_val)s) & mask(intWidth))
886019Shines@cs.fsu.edu    '''
896019Shines@cs.fsu.edu    aarchX64Read = '''
906019Shines@cs.fsu.edu        ((xc->%(func)s(this, %(op_idx)s)) & mask(aarch64 ? 64 : 32))
916019Shines@cs.fsu.edu    '''
926019Shines@cs.fsu.edu    aarchX64Write = '''
936019Shines@cs.fsu.edu        xc->%(func)s(this, %(op_idx)s, (%(final_val)s) & mask(aarch64 ? 64 : 32))
946252Sgblack@eecs.umich.edu    '''
956243Sgblack@eecs.umich.edu    aarchW64Read = '''
966243Sgblack@eecs.umich.edu        ((xc->%(func)s(this, %(op_idx)s)) & mask(32))
976243Sgblack@eecs.umich.edu    '''
986019Shines@cs.fsu.edu    aarchW64Write = '''
996019Shines@cs.fsu.edu        xc->%(func)s(this, %(op_idx)s, (%(final_val)s) & mask(32))
1006019Shines@cs.fsu.edu    '''
1016019Shines@cs.fsu.edu    cntrlNsBankedWrite = '''
1026019Shines@cs.fsu.edu        xc->setMiscReg(flattenMiscRegNsBanked(dest, xc->tcBase()), %(final_val)s)
1036252Sgblack@eecs.umich.edu    '''
1046243Sgblack@eecs.umich.edu
1056243Sgblack@eecs.umich.edu    cntrlNsBankedRead = '''
1066243Sgblack@eecs.umich.edu        xc->readMiscReg(flattenMiscRegNsBanked(op1, xc->tcBase()))
1076019Shines@cs.fsu.edu    '''
1086019Shines@cs.fsu.edu
1096019Shines@cs.fsu.edu    #PCState operands need to have a sorting index (the number at the end)
1106019Shines@cs.fsu.edu    #less than all the integer registers which might update the PC. That way
1116019Shines@cs.fsu.edu    #if the flag bits of the pc state are updated and a branch happens through
1126019Shines@cs.fsu.edu    #R15, the updates are layered properly and the R15 update isn't lost.
1136019Shines@cs.fsu.edu    srtNormal = 5
1146252Sgblack@eecs.umich.edu    srtCpsr = 4
1156243Sgblack@eecs.umich.edu    srtBase = 3
1166243Sgblack@eecs.umich.edu    srtPC = 2
1176243Sgblack@eecs.umich.edu    srtMode = 1
1186019Shines@cs.fsu.edu    srtEPC = 0
1196019Shines@cs.fsu.edu
1206019Shines@cs.fsu.edu    def floatReg(idx):
1216019Shines@cs.fsu.edu        return ('FloatReg', 'sf', idx, 'IsFloating', srtNormal)
1226019Shines@cs.fsu.edu
1236019Shines@cs.fsu.edu    def intReg(idx):
1246019Shines@cs.fsu.edu        return ('IntReg', 'uw', idx, 'IsInteger', srtNormal,
1256019Shines@cs.fsu.edu                maybePCRead, maybePCWrite)
1266019Shines@cs.fsu.edu
1276019Shines@cs.fsu.edu    def intReg64(idx):
1286019Shines@cs.fsu.edu        return ('IntReg', 'ud', idx, 'IsInteger', srtNormal,
1296019Shines@cs.fsu.edu                aarch64Read, aarch64Write)
1306019Shines@cs.fsu.edu
1316019Shines@cs.fsu.edu    def intRegX64(idx, id = srtNormal):
1326019Shines@cs.fsu.edu        return ('IntReg', 'ud', idx, 'IsInteger', id,
1336019Shines@cs.fsu.edu                aarchX64Read, aarchX64Write)
1346724Sgblack@eecs.umich.edu
1356724Sgblack@eecs.umich.edu    def intRegW64(idx, id = srtNormal):
1366019Shines@cs.fsu.edu        return ('IntReg', 'ud', idx, 'IsInteger', id,
1376019Shines@cs.fsu.edu                aarchW64Read, aarchW64Write)
1386019Shines@cs.fsu.edu
1396019Shines@cs.fsu.edu    def intRegNPC(idx):
1406019Shines@cs.fsu.edu        return ('IntReg', 'uw', idx, 'IsInteger', srtNormal)
1416252Sgblack@eecs.umich.edu
1426243Sgblack@eecs.umich.edu    def intRegAPC(idx, id = srtNormal):
1436243Sgblack@eecs.umich.edu        return ('IntReg', 'uw', idx, 'IsInteger', id,
1446243Sgblack@eecs.umich.edu                maybeAlignedPCRead, maybePCWrite)
1456019Shines@cs.fsu.edu
1466019Shines@cs.fsu.edu    def intRegIWPC(idx):
1476019Shines@cs.fsu.edu        return ('IntReg', 'uw', idx, 'IsInteger', srtNormal,
1486019Shines@cs.fsu.edu                maybePCRead, maybeIWPCWrite)
1496019Shines@cs.fsu.edu
1506019Shines@cs.fsu.edu    def intRegAIWPC(idx):
1517356Sgblack@eecs.umich.edu        return ('IntReg', 'uw', idx, 'IsInteger', srtNormal,
1527356Sgblack@eecs.umich.edu                maybePCRead, maybeAIWPCWrite)
1537356Sgblack@eecs.umich.edu
1547356Sgblack@eecs.umich.edu    def ccReg(idx):
1557356Sgblack@eecs.umich.edu        return ('CCReg', 'uw', idx, None, srtNormal)
1567356Sgblack@eecs.umich.edu
1577356Sgblack@eecs.umich.edu    def cntrlReg(idx, id = srtNormal, type = 'uw'):
1587356Sgblack@eecs.umich.edu        return ('ControlReg', type, idx, None, id)
1597178Sgblack@eecs.umich.edu
1607178Sgblack@eecs.umich.edu    def cntrlNsBankedReg(idx, id = srtNormal, type = 'uw'):
1617178Sgblack@eecs.umich.edu        return ('ControlReg', type, idx, (None, None, 'IsControl'), id, cntrlNsBankedRead, cntrlNsBankedWrite)
1627337Sgblack@eecs.umich.edu
1637178Sgblack@eecs.umich.edu    def cntrlNsBankedReg64(idx, id = srtNormal, type = 'ud'):
1647178Sgblack@eecs.umich.edu        return ('ControlReg', type, idx, (None, None, 'IsControl'), id, cntrlNsBankedRead, cntrlNsBankedWrite)
1657178Sgblack@eecs.umich.edu
1667178Sgblack@eecs.umich.edu    def cntrlRegNC(idx, id = srtNormal, type = 'uw'):
1677178Sgblack@eecs.umich.edu        return ('ControlReg', type, idx, None, id)
1687178Sgblack@eecs.umich.edu
1697178Sgblack@eecs.umich.edu    def pcStateReg(idx, id):
1707178Sgblack@eecs.umich.edu        return ('PCState', 'ud', idx, (None, None, 'IsControl'), id)
1717178Sgblack@eecs.umich.edu}};
1727178Sgblack@eecs.umich.edu
1737178Sgblack@eecs.umich.edudef operands {{
1747335Sgblack@eecs.umich.edu    #Abstracted integer reg operands
1757335Sgblack@eecs.umich.edu    'Dest': intReg('dest'),
1767335Sgblack@eecs.umich.edu    'Dest64': intReg64('dest'),
1777335Sgblack@eecs.umich.edu    'XDest': intRegX64('dest'),
1787335Sgblack@eecs.umich.edu    'WDest': intRegW64('dest'),
1797335Sgblack@eecs.umich.edu    'IWDest': intRegIWPC('dest'),
1807335Sgblack@eecs.umich.edu    'AIWDest': intRegAIWPC('dest'),
1817335Sgblack@eecs.umich.edu    'Dest2': intReg('dest2'),
1827335Sgblack@eecs.umich.edu    'XDest2': intRegX64('dest2'),
1837335Sgblack@eecs.umich.edu    'FDest2': floatReg('dest2'),
1847335Sgblack@eecs.umich.edu    'Result': intReg('result'),
1857335Sgblack@eecs.umich.edu    'XResult': intRegX64('result'),
1867337Sgblack@eecs.umich.edu    'XBase': intRegX64('base', id = srtBase),
1877335Sgblack@eecs.umich.edu    'Base': intRegAPC('base', id = srtBase),
1887335Sgblack@eecs.umich.edu    'XOffset': intRegX64('offset'),
1897335Sgblack@eecs.umich.edu    'Index': intReg('index'),
1907335Sgblack@eecs.umich.edu    'Shift': intReg('shift'),
1917335Sgblack@eecs.umich.edu    'Op1': intReg('op1'),
1927335Sgblack@eecs.umich.edu    'Op2': intReg('op2'),
1937335Sgblack@eecs.umich.edu    'Op3': intReg('op3'),
1947335Sgblack@eecs.umich.edu    'Op164': intReg64('op1'),
1957335Sgblack@eecs.umich.edu    'Op264': intReg64('op2'),
1967335Sgblack@eecs.umich.edu    'Op364': intReg64('op3'),
1977335Sgblack@eecs.umich.edu    'XOp1': intRegX64('op1'),
1987335Sgblack@eecs.umich.edu    'XOp2': intRegX64('op2'),
1997178Sgblack@eecs.umich.edu    'XOp3': intRegX64('op3'),
2007178Sgblack@eecs.umich.edu    'WOp1': intRegW64('op1'),
2017178Sgblack@eecs.umich.edu    'WOp2': intRegW64('op2'),
2027178Sgblack@eecs.umich.edu    'WOp3': intRegW64('op3'),
2037178Sgblack@eecs.umich.edu    'Reg0': intReg('reg0'),
2047178Sgblack@eecs.umich.edu    'Reg1': intReg('reg1'),
2057178Sgblack@eecs.umich.edu    'Reg2': intReg('reg2'),
2067178Sgblack@eecs.umich.edu    'Reg3': intReg('reg3'),
2077178Sgblack@eecs.umich.edu
2087178Sgblack@eecs.umich.edu    #Fixed index integer reg operands
2097178Sgblack@eecs.umich.edu    'SpMode': intRegNPC('intRegInMode((OperatingMode)regMode, INTREG_SP)'),
2107178Sgblack@eecs.umich.edu    'DecodedBankedIntReg': intRegNPC('decodeMrsMsrBankedIntRegIndex(byteMask, r)'),
2117178Sgblack@eecs.umich.edu    'LR': intRegNPC('INTREG_LR'),
2127178Sgblack@eecs.umich.edu    'XLR': intRegX64('INTREG_X30'),
2137178Sgblack@eecs.umich.edu    'R7': intRegNPC('7'),
2147178Sgblack@eecs.umich.edu    # First four arguments are passed in registers
2157178Sgblack@eecs.umich.edu    'R0': intRegNPC('0'),
2167178Sgblack@eecs.umich.edu    'R1': intRegNPC('1'),
2177178Sgblack@eecs.umich.edu    'R2': intRegNPC('2'),
2187178Sgblack@eecs.umich.edu    'R3': intRegNPC('3'),
2197178Sgblack@eecs.umich.edu    'X0': intRegX64('0'),
2207178Sgblack@eecs.umich.edu    'X1': intRegX64('1'),
2217178Sgblack@eecs.umich.edu    'X2': intRegX64('2'),
2227178Sgblack@eecs.umich.edu    'X3': intRegX64('3'),
2237178Sgblack@eecs.umich.edu
2247178Sgblack@eecs.umich.edu    # Condition code registers
2257178Sgblack@eecs.umich.edu    'CondCodesNZ': ccReg('CCREG_NZ'),
2267178Sgblack@eecs.umich.edu    'CondCodesC': ccReg('CCREG_C'),
2277178Sgblack@eecs.umich.edu    'CondCodesV': ccReg('CCREG_V'),
2287346Sgblack@eecs.umich.edu    'CondCodesGE': ccReg('CCREG_GE'),
2297346Sgblack@eecs.umich.edu    'OptCondCodesNZ': ccReg(
2307346Sgblack@eecs.umich.edu            '''((condCode == COND_AL || condCode == COND_UC ||
2317346Sgblack@eecs.umich.edu                 condCode == COND_CC || condCode == COND_CS ||
2327346Sgblack@eecs.umich.edu                 condCode == COND_VS || condCode == COND_VC) ?
2337346Sgblack@eecs.umich.edu                CCREG_ZERO : CCREG_NZ)'''),
2347346Sgblack@eecs.umich.edu    'OptCondCodesC': ccReg(
2357346Sgblack@eecs.umich.edu             '''((condCode == COND_HI || condCode == COND_LS ||
2367346Sgblack@eecs.umich.edu                condCode == COND_CS || condCode == COND_CC) ?
2377346Sgblack@eecs.umich.edu               CCREG_C : CCREG_ZERO)'''),
2387178Sgblack@eecs.umich.edu    'OptShiftRmCondCodesC': ccReg(
2397346Sgblack@eecs.umich.edu            '''((condCode == COND_HI || condCode == COND_LS ||
2407346Sgblack@eecs.umich.edu                 condCode == COND_CS || condCode == COND_CC ||
2417346Sgblack@eecs.umich.edu                 shiftType == ROR) ?
2427346Sgblack@eecs.umich.edu                CCREG_C : CCREG_ZERO)'''),
2437346Sgblack@eecs.umich.edu    'OptCondCodesV': ccReg(
2447346Sgblack@eecs.umich.edu            '''((condCode == COND_VS || condCode == COND_VC ||
2457346Sgblack@eecs.umich.edu                 condCode == COND_GE || condCode == COND_LT ||
2467346Sgblack@eecs.umich.edu                 condCode == COND_GT || condCode == COND_LE) ?
2477346Sgblack@eecs.umich.edu                CCREG_V : CCREG_ZERO)'''),
2487346Sgblack@eecs.umich.edu    'FpCondCodes': ccReg('CCREG_FP'),
2497346Sgblack@eecs.umich.edu
2507346Sgblack@eecs.umich.edu    #Abstracted floating point reg operands
2517346Sgblack@eecs.umich.edu    'FpDest': floatReg('(dest + 0)'),
2527346Sgblack@eecs.umich.edu    'FpDestP0': floatReg('(dest + 0)'),
2537346Sgblack@eecs.umich.edu    'FpDestP1': floatReg('(dest + 1)'),
2547178Sgblack@eecs.umich.edu    'FpDestP2': floatReg('(dest + 2)'),
2557337Sgblack@eecs.umich.edu    'FpDestP3': floatReg('(dest + 3)'),
2567337Sgblack@eecs.umich.edu    'FpDestP4': floatReg('(dest + 4)'),
2577337Sgblack@eecs.umich.edu    'FpDestP5': floatReg('(dest + 5)'),
2587337Sgblack@eecs.umich.edu    'FpDestP6': floatReg('(dest + 6)'),
2597337Sgblack@eecs.umich.edu    'FpDestP7': floatReg('(dest + 7)'),
2607337Sgblack@eecs.umich.edu    'FpDestS0P0': floatReg('(dest + step * 0 + 0)'),
2617337Sgblack@eecs.umich.edu    'FpDestS0P1': floatReg('(dest + step * 0 + 1)'),
2627337Sgblack@eecs.umich.edu    'FpDestS1P0': floatReg('(dest + step * 1 + 0)'),
2637337Sgblack@eecs.umich.edu    'FpDestS1P1': floatReg('(dest + step * 1 + 1)'),
2647337Sgblack@eecs.umich.edu    'FpDestS2P0': floatReg('(dest + step * 2 + 0)'),
2657337Sgblack@eecs.umich.edu    'FpDestS2P1': floatReg('(dest + step * 2 + 1)'),
2667337Sgblack@eecs.umich.edu    'FpDestS3P0': floatReg('(dest + step * 3 + 0)'),
2677337Sgblack@eecs.umich.edu    'FpDestS3P1': floatReg('(dest + step * 3 + 1)'),
2687337Sgblack@eecs.umich.edu
2697337Sgblack@eecs.umich.edu    'FpDest2': floatReg('(dest2 + 0)'),
2707178Sgblack@eecs.umich.edu    'FpDest2P0': floatReg('(dest2 + 0)'),
2717178Sgblack@eecs.umich.edu    'FpDest2P1': floatReg('(dest2 + 1)'),
2727178Sgblack@eecs.umich.edu    'FpDest2P2': floatReg('(dest2 + 2)'),
2737178Sgblack@eecs.umich.edu    'FpDest2P3': floatReg('(dest2 + 3)'),
2747337Sgblack@eecs.umich.edu
2757337Sgblack@eecs.umich.edu    'FpOp1': floatReg('(op1 + 0)'),
2767337Sgblack@eecs.umich.edu    'FpOp1P0': floatReg('(op1 + 0)'),
2777337Sgblack@eecs.umich.edu    'FpOp1P1': floatReg('(op1 + 1)'),
2787346Sgblack@eecs.umich.edu    'FpOp1P2': floatReg('(op1 + 2)'),
2797346Sgblack@eecs.umich.edu    'FpOp1P3': floatReg('(op1 + 3)'),
2807346Sgblack@eecs.umich.edu    'FpOp1P4': floatReg('(op1 + 4)'),
2817346Sgblack@eecs.umich.edu    'FpOp1P5': floatReg('(op1 + 5)'),
2827346Sgblack@eecs.umich.edu    'FpOp1P6': floatReg('(op1 + 6)'),
2837337Sgblack@eecs.umich.edu    'FpOp1P7': floatReg('(op1 + 7)'),
2847178Sgblack@eecs.umich.edu    'FpOp1S0P0': floatReg('(op1 + step * 0 + 0)'),
2857321Sgblack@eecs.umich.edu    'FpOp1S0P1': floatReg('(op1 + step * 0 + 1)'),
2867356Sgblack@eecs.umich.edu    'FpOp1S1P0': floatReg('(op1 + step * 1 + 0)'),
2877321Sgblack@eecs.umich.edu    'FpOp1S1P1': floatReg('(op1 + step * 1 + 1)'),
2887356Sgblack@eecs.umich.edu    'FpOp1S2P0': floatReg('(op1 + step * 2 + 0)'),
2897356Sgblack@eecs.umich.edu    'FpOp1S2P1': floatReg('(op1 + step * 2 + 1)'),
2907356Sgblack@eecs.umich.edu    'FpOp1S3P0': floatReg('(op1 + step * 3 + 0)'),
2917356Sgblack@eecs.umich.edu    'FpOp1S3P1': floatReg('(op1 + step * 3 + 1)'),
2927356Sgblack@eecs.umich.edu
2937356Sgblack@eecs.umich.edu    'FpOp2': floatReg('(op2 + 0)'),
2947356Sgblack@eecs.umich.edu    'FpOp2P0': floatReg('(op2 + 0)'),
2957356Sgblack@eecs.umich.edu    'FpOp2P1': floatReg('(op2 + 1)'),
2967356Sgblack@eecs.umich.edu    'FpOp2P2': floatReg('(op2 + 2)'),
2977356Sgblack@eecs.umich.edu    'FpOp2P3': floatReg('(op2 + 3)'),
2987356Sgblack@eecs.umich.edu
2997356Sgblack@eecs.umich.edu    # Create AArch64 unpacked view of the FP registers
3007321Sgblack@eecs.umich.edu    'AA64FpOp1P0':   floatReg('((op1 * 4) + 0)'),
3017321Sgblack@eecs.umich.edu    'AA64FpOp1P1':   floatReg('((op1 * 4) + 1)'),
3027321Sgblack@eecs.umich.edu    'AA64FpOp1P2':   floatReg('((op1 * 4) + 2)'),
3037321Sgblack@eecs.umich.edu    'AA64FpOp1P3':   floatReg('((op1 * 4) + 3)'),
3047321Sgblack@eecs.umich.edu    'AA64FpOp2P0':   floatReg('((op2 * 4) + 0)'),
3057321Sgblack@eecs.umich.edu    'AA64FpOp2P1':   floatReg('((op2 * 4) + 1)'),
3067321Sgblack@eecs.umich.edu    'AA64FpOp2P2':   floatReg('((op2 * 4) + 2)'),
3077321Sgblack@eecs.umich.edu    'AA64FpOp2P3':   floatReg('((op2 * 4) + 3)'),
3087321Sgblack@eecs.umich.edu    'AA64FpOp3P0':   floatReg('((op3 * 4) + 0)'),
3097321Sgblack@eecs.umich.edu    'AA64FpOp3P1':   floatReg('((op3 * 4) + 1)'),
3107321Sgblack@eecs.umich.edu    'AA64FpOp3P2':   floatReg('((op3 * 4) + 2)'),
3117335Sgblack@eecs.umich.edu    'AA64FpOp3P3':   floatReg('((op3 * 4) + 3)'),
3127335Sgblack@eecs.umich.edu    'AA64FpDestP0':  floatReg('((dest * 4) + 0)'),
3137335Sgblack@eecs.umich.edu    'AA64FpDestP1':  floatReg('((dest * 4) + 1)'),
3147335Sgblack@eecs.umich.edu    'AA64FpDestP2':  floatReg('((dest * 4) + 2)'),
3157335Sgblack@eecs.umich.edu    'AA64FpDestP3':  floatReg('((dest * 4) + 3)'),
3167335Sgblack@eecs.umich.edu    'AA64FpDest2P0': floatReg('((dest2 * 4) + 0)'),
3177335Sgblack@eecs.umich.edu    'AA64FpDest2P1': floatReg('((dest2 * 4) + 1)'),
3187335Sgblack@eecs.umich.edu    'AA64FpDest2P2': floatReg('((dest2 * 4) + 2)'),
3197335Sgblack@eecs.umich.edu    'AA64FpDest2P3': floatReg('((dest2 * 4) + 3)'),
3207321Sgblack@eecs.umich.edu
3217323Sgblack@eecs.umich.edu    'AA64FpOp1P0V0':   floatReg('((((op1+0)) * 4) + 0)'),
3227323Sgblack@eecs.umich.edu    'AA64FpOp1P1V0':   floatReg('((((op1+0)) * 4) + 1)'),
3237323Sgblack@eecs.umich.edu    'AA64FpOp1P2V0':   floatReg('((((op1+0)) * 4) + 2)'),
3247323Sgblack@eecs.umich.edu    'AA64FpOp1P3V0':   floatReg('((((op1+0)) * 4) + 3)'),
3257323Sgblack@eecs.umich.edu
3267323Sgblack@eecs.umich.edu    'AA64FpOp1P0V1':   floatReg('((((op1+1)) * 4) + 0)'),
3277323Sgblack@eecs.umich.edu    'AA64FpOp1P1V1':   floatReg('((((op1+1)) * 4) + 1)'),
3287323Sgblack@eecs.umich.edu    'AA64FpOp1P2V1':   floatReg('((((op1+1)) * 4) + 2)'),
3297323Sgblack@eecs.umich.edu    'AA64FpOp1P3V1':   floatReg('((((op1+1)) * 4) + 3)'),
3307323Sgblack@eecs.umich.edu
3317323Sgblack@eecs.umich.edu    'AA64FpOp1P0V2':   floatReg('((((op1+2)) * 4) + 0)'),
3327323Sgblack@eecs.umich.edu    'AA64FpOp1P1V2':   floatReg('((((op1+2)) * 4) + 1)'),
3337323Sgblack@eecs.umich.edu    'AA64FpOp1P2V2':   floatReg('((((op1+2)) * 4) + 2)'),
3347323Sgblack@eecs.umich.edu    'AA64FpOp1P3V2':   floatReg('((((op1+2)) * 4) + 3)'),
3357323Sgblack@eecs.umich.edu
3367323Sgblack@eecs.umich.edu    'AA64FpOp1P0V3':   floatReg('((((op1+3)) * 4) + 0)'),
3377323Sgblack@eecs.umich.edu    'AA64FpOp1P1V3':   floatReg('((((op1+3)) * 4) + 1)'),
3387321Sgblack@eecs.umich.edu    'AA64FpOp1P2V3':   floatReg('((((op1+3)) * 4) + 2)'),
3397321Sgblack@eecs.umich.edu    'AA64FpOp1P3V3':   floatReg('((((op1+3)) * 4) + 3)'),
3407321Sgblack@eecs.umich.edu
3417335Sgblack@eecs.umich.edu    'AA64FpOp1P0V0S':   floatReg('((((op1+0)%32) * 4) + 0)'),
3427335Sgblack@eecs.umich.edu    'AA64FpOp1P1V0S':   floatReg('((((op1+0)%32) * 4) + 1)'),
3437335Sgblack@eecs.umich.edu    'AA64FpOp1P2V0S':   floatReg('((((op1+0)%32) * 4) + 2)'),
3447335Sgblack@eecs.umich.edu    'AA64FpOp1P3V0S':   floatReg('((((op1+0)%32) * 4) + 3)'),
3457335Sgblack@eecs.umich.edu
3467335Sgblack@eecs.umich.edu    'AA64FpOp1P0V1S':   floatReg('((((op1+1)%32) * 4) + 0)'),
3477335Sgblack@eecs.umich.edu    'AA64FpOp1P1V1S':   floatReg('((((op1+1)%32) * 4) + 1)'),
3487335Sgblack@eecs.umich.edu    'AA64FpOp1P2V1S':   floatReg('((((op1+1)%32) * 4) + 2)'),
3497335Sgblack@eecs.umich.edu    'AA64FpOp1P3V1S':   floatReg('((((op1+1)%32) * 4) + 3)'),
3507335Sgblack@eecs.umich.edu
3517335Sgblack@eecs.umich.edu    'AA64FpOp1P0V2S':   floatReg('((((op1+2)%32) * 4) + 0)'),
3527335Sgblack@eecs.umich.edu    'AA64FpOp1P1V2S':   floatReg('((((op1+2)%32) * 4) + 1)'),
3537335Sgblack@eecs.umich.edu    'AA64FpOp1P2V2S':   floatReg('((((op1+2)%32) * 4) + 2)'),
3547335Sgblack@eecs.umich.edu    'AA64FpOp1P3V2S':   floatReg('((((op1+2)%32) * 4) + 3)'),
3557335Sgblack@eecs.umich.edu
3567335Sgblack@eecs.umich.edu    'AA64FpOp1P0V3S':   floatReg('((((op1+3)%32) * 4) + 0)'),
3577335Sgblack@eecs.umich.edu    'AA64FpOp1P1V3S':   floatReg('((((op1+3)%32) * 4) + 1)'),
3587335Sgblack@eecs.umich.edu    'AA64FpOp1P2V3S':   floatReg('((((op1+3)%32) * 4) + 2)'),
3597335Sgblack@eecs.umich.edu    'AA64FpOp1P3V3S':   floatReg('((((op1+3)%32) * 4) + 3)'),
3607335Sgblack@eecs.umich.edu
3617335Sgblack@eecs.umich.edu    'AA64FpDestP0V0':   floatReg('((((dest+0)) * 4) + 0)'),
3627335Sgblack@eecs.umich.edu    'AA64FpDestP1V0':   floatReg('((((dest+0)) * 4) + 1)'),
3637335Sgblack@eecs.umich.edu    'AA64FpDestP2V0':   floatReg('((((dest+0)) * 4) + 2)'),
3647335Sgblack@eecs.umich.edu    'AA64FpDestP3V0':   floatReg('((((dest+0)) * 4) + 3)'),
3657335Sgblack@eecs.umich.edu
3667335Sgblack@eecs.umich.edu    'AA64FpDestP0V1':   floatReg('((((dest+1)) * 4) + 0)'),
3677335Sgblack@eecs.umich.edu    'AA64FpDestP1V1':   floatReg('((((dest+1)) * 4) + 1)'),
3687335Sgblack@eecs.umich.edu    'AA64FpDestP2V1':   floatReg('((((dest+1)) * 4) + 2)'),
3697335Sgblack@eecs.umich.edu    'AA64FpDestP3V1':   floatReg('((((dest+1)) * 4) + 3)'),
3707335Sgblack@eecs.umich.edu
3717335Sgblack@eecs.umich.edu    'AA64FpDestP0V0L':   floatReg('((((dest+0)%32) * 4) + 0)'),
3727335Sgblack@eecs.umich.edu    'AA64FpDestP1V0L':   floatReg('((((dest+0)%32) * 4) + 1)'),
3737335Sgblack@eecs.umich.edu    'AA64FpDestP2V0L':   floatReg('((((dest+0)%32) * 4) + 2)'),
3747321Sgblack@eecs.umich.edu    'AA64FpDestP3V0L':   floatReg('((((dest+0)%32) * 4) + 3)'),
3757321Sgblack@eecs.umich.edu
3767321Sgblack@eecs.umich.edu    'AA64FpDestP0V1L':   floatReg('((((dest+1)%32) * 4) + 0)'),
3777321Sgblack@eecs.umich.edu    'AA64FpDestP1V1L':   floatReg('((((dest+1)%32) * 4) + 1)'),
3787321Sgblack@eecs.umich.edu    'AA64FpDestP2V1L':   floatReg('((((dest+1)%32) * 4) + 2)'),
3797321Sgblack@eecs.umich.edu    'AA64FpDestP3V1L':   floatReg('((((dest+1)%32) * 4) + 3)'),
3807335Sgblack@eecs.umich.edu
3817335Sgblack@eecs.umich.edu    #Abstracted control reg operands
3827335Sgblack@eecs.umich.edu    'MiscDest': cntrlReg('dest'),
3837335Sgblack@eecs.umich.edu    'MiscOp1': cntrlReg('op1'),
3847335Sgblack@eecs.umich.edu    'MiscNsBankedDest': cntrlNsBankedReg('dest'),
3857335Sgblack@eecs.umich.edu    'MiscNsBankedOp1': cntrlNsBankedReg('op1'),
3867335Sgblack@eecs.umich.edu    'MiscNsBankedDest64': cntrlNsBankedReg64('dest'),
3877335Sgblack@eecs.umich.edu    'MiscNsBankedOp164': cntrlNsBankedReg64('op1'),
3887335Sgblack@eecs.umich.edu
3897321Sgblack@eecs.umich.edu    #Fixed index control regs
3907326Sgblack@eecs.umich.edu    'Cpsr': cntrlReg('MISCREG_CPSR', srtCpsr),
3917326Sgblack@eecs.umich.edu    'CpsrQ': cntrlReg('MISCREG_CPSR_Q', srtCpsr),
3927326Sgblack@eecs.umich.edu    'Spsr': cntrlRegNC('MISCREG_SPSR'),
3937326Sgblack@eecs.umich.edu    'Fpsr': cntrlRegNC('MISCREG_FPSR'),
3947326Sgblack@eecs.umich.edu    'Fpsid': cntrlRegNC('MISCREG_FPSID'),
3957326Sgblack@eecs.umich.edu    'Fpscr': cntrlRegNC('MISCREG_FPSCR'),
3967326Sgblack@eecs.umich.edu    'FpscrQc': cntrlRegNC('MISCREG_FPSCR_QC'),
3977326Sgblack@eecs.umich.edu    'FpscrExc': cntrlRegNC('MISCREG_FPSCR_EXC'),
3987326Sgblack@eecs.umich.edu    'Cpacr': cntrlReg('MISCREG_CPACR'),
3997326Sgblack@eecs.umich.edu    'Cpacr64': cntrlReg('MISCREG_CPACR_EL1'),
4007326Sgblack@eecs.umich.edu    'Fpexc': cntrlRegNC('MISCREG_FPEXC'),
4017326Sgblack@eecs.umich.edu    'Nsacr': cntrlReg('MISCREG_NSACR'),
4027326Sgblack@eecs.umich.edu    'ElrHyp': cntrlRegNC('MISCREG_ELR_HYP'),
4037326Sgblack@eecs.umich.edu    'Hcr': cntrlReg('MISCREG_HCR'),
4047326Sgblack@eecs.umich.edu    'Hcr64': cntrlReg('MISCREG_HCR_EL2'),
4057326Sgblack@eecs.umich.edu    'Hdcr': cntrlReg('MISCREG_HDCR'),
4067326Sgblack@eecs.umich.edu    'Hcptr': cntrlReg('MISCREG_HCPTR'),
4077326Sgblack@eecs.umich.edu    'CptrEl264': cntrlReg('MISCREG_CPTR_EL2'),
4087326Sgblack@eecs.umich.edu    'CptrEl364': cntrlReg('MISCREG_CPTR_EL3'),
4097326Sgblack@eecs.umich.edu    'Hstr': cntrlReg('MISCREG_HSTR'),
4107326Sgblack@eecs.umich.edu    'Scr': cntrlReg('MISCREG_SCR'),
4117326Sgblack@eecs.umich.edu    'Scr64': cntrlReg('MISCREG_SCR_EL3'),
4127326Sgblack@eecs.umich.edu    'Sctlr': cntrlRegNC('MISCREG_SCTLR'),
4137321Sgblack@eecs.umich.edu    'SevMailbox': cntrlRegNC('MISCREG_SEV_MAILBOX'),
4147321Sgblack@eecs.umich.edu    'LLSCLock': cntrlRegNC('MISCREG_LOCKFLAG'),
4157335Sgblack@eecs.umich.edu    'Dczid' : cntrlRegNC('MISCREG_DCZID_EL0'),
4167335Sgblack@eecs.umich.edu
4177335Sgblack@eecs.umich.edu    #Register fields for microops
4187335Sgblack@eecs.umich.edu    'URa' : intReg('ura'),
4197335Sgblack@eecs.umich.edu    'XURa' : intRegX64('ura'),
4207335Sgblack@eecs.umich.edu    'WURa' : intRegW64('ura'),
4217335Sgblack@eecs.umich.edu    'IWRa' : intRegIWPC('ura'),
4227335Sgblack@eecs.umich.edu    'Fa' : floatReg('ura'),
4237335Sgblack@eecs.umich.edu    'FaP1' : floatReg('ura + 1'),
4247335Sgblack@eecs.umich.edu    'URb' : intReg('urb'),
4257335Sgblack@eecs.umich.edu    'XURb' : intRegX64('urb'),
4267335Sgblack@eecs.umich.edu    'URc' : intReg('urc'),
4277335Sgblack@eecs.umich.edu    'XURc' : intRegX64('urc'),
4287335Sgblack@eecs.umich.edu
4297335Sgblack@eecs.umich.edu    #Memory Operand
4307335Sgblack@eecs.umich.edu    'Mem': ('Mem', 'uw', None, ('IsMemRef', 'IsLoad', 'IsStore'), srtNormal),
4317335Sgblack@eecs.umich.edu
4327335Sgblack@eecs.umich.edu    #PCState fields
4337335Sgblack@eecs.umich.edu    'RawPC': pcStateReg('pc', srtPC),
4347335Sgblack@eecs.umich.edu    'PC': pcStateReg('instPC', srtPC),
4357335Sgblack@eecs.umich.edu    'NPC': pcStateReg('instNPC', srtPC),
4367335Sgblack@eecs.umich.edu    'pNPC': pcStateReg('instNPC', srtEPC),
4377335Sgblack@eecs.umich.edu    'IWNPC': pcStateReg('instIWNPC', srtPC),
4387335Sgblack@eecs.umich.edu    'Thumb': pcStateReg('thumb', srtPC),
4397335Sgblack@eecs.umich.edu    'NextThumb': pcStateReg('nextThumb', srtMode),
4407335Sgblack@eecs.umich.edu    'NextJazelle': pcStateReg('nextJazelle', srtMode),
4417335Sgblack@eecs.umich.edu    'NextItState': pcStateReg('nextItstate', srtMode),
4427335Sgblack@eecs.umich.edu    'Itstate': pcStateReg('itstate', srtMode),
4437335Sgblack@eecs.umich.edu    'NextAArch64': pcStateReg('nextAArch64', srtMode),
4447335Sgblack@eecs.umich.edu
4457335Sgblack@eecs.umich.edu    #Register operands depending on a field in the instruction encoding. These
4467335Sgblack@eecs.umich.edu    #should be avoided since they may not be portable across different
4477335Sgblack@eecs.umich.edu    #encodings of the same instruction.
4487335Sgblack@eecs.umich.edu    'Rd': intReg('RD'),
4497335Sgblack@eecs.umich.edu    'Rm': intReg('RM'),
4507335Sgblack@eecs.umich.edu    'Rs': intReg('RS'),
4517335Sgblack@eecs.umich.edu    'Rn': intReg('RN'),
4527335Sgblack@eecs.umich.edu    'Rt': intReg('RT')
4537335Sgblack@eecs.umich.edu}};
4547335Sgblack@eecs.umich.edu