operands.isa revision 7783:9b880b40ac10
17732SAli.Saidi@ARM.com// -*- mode:c++ -*- 27732SAli.Saidi@ARM.com// Copyright (c) 2010 ARM Limited 37732SAli.Saidi@ARM.com// All rights reserved 47732SAli.Saidi@ARM.com// 57732SAli.Saidi@ARM.com// The license below extends only to copyright in the software and shall 67732SAli.Saidi@ARM.com// not be construed as granting a license to any other intellectual 77732SAli.Saidi@ARM.com// property including but not limited to intellectual property relating 87732SAli.Saidi@ARM.com// to a hardware implementation of the functionality of the software 97732SAli.Saidi@ARM.com// licensed hereunder. You may use the software subject to the license 107732SAli.Saidi@ARM.com// terms below provided that you ensure that this notice is replicated 117732SAli.Saidi@ARM.com// unmodified and in its entirety in all distributions of the software, 127732SAli.Saidi@ARM.com// modified or unmodified, in source code or in binary form. 137732SAli.Saidi@ARM.com// 147732SAli.Saidi@ARM.com// Copyright (c) 2007-2008 The Florida State University 157732SAli.Saidi@ARM.com// All rights reserved. 167732SAli.Saidi@ARM.com// 177732SAli.Saidi@ARM.com// Redistribution and use in source and binary forms, with or without 187732SAli.Saidi@ARM.com// modification, are permitted provided that the following conditions are 197732SAli.Saidi@ARM.com// met: redistributions of source code must retain the above copyright 207732SAli.Saidi@ARM.com// notice, this list of conditions and the following disclaimer; 217732SAli.Saidi@ARM.com// redistributions in binary form must reproduce the above copyright 227732SAli.Saidi@ARM.com// notice, this list of conditions and the following disclaimer in the 237732SAli.Saidi@ARM.com// documentation and/or other materials provided with the distribution; 247732SAli.Saidi@ARM.com// neither the name of the copyright holders nor the names of its 257732SAli.Saidi@ARM.com// contributors may be used to endorse or promote products derived from 267732SAli.Saidi@ARM.com// this software without specific prior written permission. 277732SAli.Saidi@ARM.com// 287732SAli.Saidi@ARM.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 297732SAli.Saidi@ARM.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 307732SAli.Saidi@ARM.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 317732SAli.Saidi@ARM.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 327732SAli.Saidi@ARM.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 337732SAli.Saidi@ARM.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 347732SAli.Saidi@ARM.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 357732SAli.Saidi@ARM.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 367732SAli.Saidi@ARM.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 377732SAli.Saidi@ARM.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 387732SAli.Saidi@ARM.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 397732SAli.Saidi@ARM.com// 407732SAli.Saidi@ARM.com// Authors: Stephen Hines 419554Sandreas.hansson@arm.com 429554Sandreas.hansson@arm.comdef operand_types {{ 439554Sandreas.hansson@arm.com 'sb' : ('signed int', 8), 448204SAli.Saidi@ARM.com 'ub' : ('unsigned int', 8), 458204SAli.Saidi@ARM.com 'sh' : ('signed int', 16), 468204SAli.Saidi@ARM.com 'uh' : ('unsigned int', 16), 478204SAli.Saidi@ARM.com 'sw' : ('signed int', 32), 488204SAli.Saidi@ARM.com 'uw' : ('unsigned int', 32), 498204SAli.Saidi@ARM.com 'ud' : ('unsigned int', 64), 508204SAli.Saidi@ARM.com 'tud' : ('twin64 int', 64), 518204SAli.Saidi@ARM.com 'sf' : ('float', 32), 528204SAli.Saidi@ARM.com 'df' : ('float', 64) 538204SAli.Saidi@ARM.com}}; 548204SAli.Saidi@ARM.com 558204SAli.Saidi@ARM.comlet {{ 568204SAli.Saidi@ARM.com maybePCRead = ''' 577732SAli.Saidi@ARM.com ((%(reg_idx)s == PCReg) ? readPC(xc) : xc->%(func)s(this, %(op_idx)s)) 587732SAli.Saidi@ARM.com ''' 597732SAli.Saidi@ARM.com maybeAlignedPCRead = ''' 607732SAli.Saidi@ARM.com ((%(reg_idx)s == PCReg) ? (roundDown(readPC(xc), 4)) : 617732SAli.Saidi@ARM.com xc->%(func)s(this, %(op_idx)s)) 627732SAli.Saidi@ARM.com ''' 637732SAli.Saidi@ARM.com maybePCWrite = ''' 647732SAli.Saidi@ARM.com ((%(reg_idx)s == PCReg) ? setNextPC(xc, %(final_val)s) : 657732SAli.Saidi@ARM.com xc->%(func)s(this, %(op_idx)s, %(final_val)s)) 667732SAli.Saidi@ARM.com ''' 677732SAli.Saidi@ARM.com maybeIWPCWrite = ''' 687732SAli.Saidi@ARM.com ((%(reg_idx)s == PCReg) ? setIWNextPC(xc, %(final_val)s) : 697732SAli.Saidi@ARM.com xc->%(func)s(this, %(op_idx)s, %(final_val)s)) 708204SAli.Saidi@ARM.com ''' 717732SAli.Saidi@ARM.com maybeAIWPCWrite = ''' 727732SAli.Saidi@ARM.com if (%(reg_idx)s == PCReg) { 737732SAli.Saidi@ARM.com bool thumb = THUMB; 747732SAli.Saidi@ARM.com if (thumb) { 757732SAli.Saidi@ARM.com setNextPC(xc, %(final_val)s); 767732SAli.Saidi@ARM.com } else { 777732SAli.Saidi@ARM.com setIWNextPC(xc, %(final_val)s); 788142SAli.Saidi@ARM.com } 797732SAli.Saidi@ARM.com } else { 807732SAli.Saidi@ARM.com xc->%(func)s(this, %(op_idx)s, %(final_val)s); 818204SAli.Saidi@ARM.com } 827732SAli.Saidi@ARM.com ''' 837732SAli.Saidi@ARM.com}}; 847732SAli.Saidi@ARM.com 857732SAli.Saidi@ARM.comdef operands {{ 867732SAli.Saidi@ARM.com #Abstracted integer reg operands 877732SAli.Saidi@ARM.com 'Dest': ('IntReg', 'uw', 'dest', 'IsInteger', 3, 887732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 897732SAli.Saidi@ARM.com 'FpDest': ('FloatReg', 'sf', '(dest + 0)', 'IsFloating', 3), 908142SAli.Saidi@ARM.com 'FpDestP0': ('FloatReg', 'sf', '(dest + 0)', 'IsFloating', 3), 917732SAli.Saidi@ARM.com 'FpDestP1': ('FloatReg', 'sf', '(dest + 1)', 'IsFloating', 3), 927732SAli.Saidi@ARM.com 'FpDestP2': ('FloatReg', 'sf', '(dest + 2)', 'IsFloating', 3), 938204SAli.Saidi@ARM.com 'FpDestP3': ('FloatReg', 'sf', '(dest + 3)', 'IsFloating', 3), 947732SAli.Saidi@ARM.com 'FpDestP4': ('FloatReg', 'sf', '(dest + 4)', 'IsFloating', 3), 957732SAli.Saidi@ARM.com 'FpDestP5': ('FloatReg', 'sf', '(dest + 5)', 'IsFloating', 3), 967732SAli.Saidi@ARM.com 'FpDestP6': ('FloatReg', 'sf', '(dest + 6)', 'IsFloating', 3), 977732SAli.Saidi@ARM.com 'FpDestP7': ('FloatReg', 'sf', '(dest + 7)', 'IsFloating', 3), 987732SAli.Saidi@ARM.com 'FpDestS0P0': ('FloatReg', 'sf', '(dest + step * 0 + 0)', 'IsFloating', 3), 997732SAli.Saidi@ARM.com 'FpDestS0P1': ('FloatReg', 'sf', '(dest + step * 0 + 1)', 'IsFloating', 3), 1007732SAli.Saidi@ARM.com 'FpDestS1P0': ('FloatReg', 'sf', '(dest + step * 1 + 0)', 'IsFloating', 3), 1017732SAli.Saidi@ARM.com 'FpDestS1P1': ('FloatReg', 'sf', '(dest + step * 1 + 1)', 'IsFloating', 3), 1028142SAli.Saidi@ARM.com 'FpDestS2P0': ('FloatReg', 'sf', '(dest + step * 2 + 0)', 'IsFloating', 3), 1037732SAli.Saidi@ARM.com 'FpDestS2P1': ('FloatReg', 'sf', '(dest + step * 2 + 1)', 'IsFloating', 3), 1047732SAli.Saidi@ARM.com 'FpDestS3P0': ('FloatReg', 'sf', '(dest + step * 3 + 0)', 'IsFloating', 3), 1058204SAli.Saidi@ARM.com 'FpDestS3P1': ('FloatReg', 'sf', '(dest + step * 3 + 1)', 'IsFloating', 3), 1068204SAli.Saidi@ARM.com 'Result': ('IntReg', 'uw', 'result', 'IsInteger', 3, 1078204SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1087732SAli.Saidi@ARM.com 'Dest2': ('IntReg', 'uw', 'dest2', 'IsInteger', 3, 1097732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1107732SAli.Saidi@ARM.com 'FpDest2': ('FloatReg', 'sf', '(dest2 + 0)', 'IsFloating', 3), 1117732SAli.Saidi@ARM.com 'FpDest2P0': ('FloatReg', 'sf', '(dest2 + 0)', 'IsFloating', 3), 1127732SAli.Saidi@ARM.com 'FpDest2P1': ('FloatReg', 'sf', '(dest2 + 1)', 'IsFloating', 3), 1137732SAli.Saidi@ARM.com 'FpDest2P2': ('FloatReg', 'sf', '(dest2 + 2)', 'IsFloating', 3), 1147732SAli.Saidi@ARM.com 'FpDest2P3': ('FloatReg', 'sf', '(dest2 + 3)', 'IsFloating', 3), 1157732SAli.Saidi@ARM.com 'IWDest': ('IntReg', 'uw', 'dest', 'IsInteger', 3, 1167732SAli.Saidi@ARM.com maybePCRead, maybeIWPCWrite), 1177732SAli.Saidi@ARM.com 'AIWDest': ('IntReg', 'uw', 'dest', 'IsInteger', 3, 1188204SAli.Saidi@ARM.com maybePCRead, maybeAIWPCWrite), 1198204SAli.Saidi@ARM.com 'SpMode': ('IntReg', 'uw', 1208204SAli.Saidi@ARM.com 'intRegInMode((OperatingMode)regMode, INTREG_SP)', 1218204SAli.Saidi@ARM.com 'IsInteger', 3), 1228204SAli.Saidi@ARM.com 'MiscDest': ('ControlReg', 'uw', 'dest', (None, None, 'IsControl'), 3), 1238204SAli.Saidi@ARM.com 'Base': ('IntReg', 'uw', 'base', 'IsInteger', 1, 1247732SAli.Saidi@ARM.com maybeAlignedPCRead, maybePCWrite), 1258204SAli.Saidi@ARM.com 'Index': ('IntReg', 'uw', 'index', 'IsInteger', 3, 1267732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1277732SAli.Saidi@ARM.com 'Op1': ('IntReg', 'uw', 'op1', 'IsInteger', 3, 1287732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1297732SAli.Saidi@ARM.com 'FpOp1': ('FloatReg', 'sf', '(op1 + 0)', 'IsFloating', 3), 1307732SAli.Saidi@ARM.com 'FpOp1P0': ('FloatReg', 'sf', '(op1 + 0)', 'IsFloating', 3), 1317732SAli.Saidi@ARM.com 'FpOp1P1': ('FloatReg', 'sf', '(op1 + 1)', 'IsFloating', 3), 1328204SAli.Saidi@ARM.com 'FpOp1P2': ('FloatReg', 'sf', '(op1 + 2)', 'IsFloating', 3), 1338204SAli.Saidi@ARM.com 'FpOp1P3': ('FloatReg', 'sf', '(op1 + 3)', 'IsFloating', 3), 1348204SAli.Saidi@ARM.com 'FpOp1P4': ('FloatReg', 'sf', '(op1 + 4)', 'IsFloating', 3), 1358204SAli.Saidi@ARM.com 'FpOp1P5': ('FloatReg', 'sf', '(op1 + 5)', 'IsFloating', 3), 1367732SAli.Saidi@ARM.com 'FpOp1P6': ('FloatReg', 'sf', '(op1 + 6)', 'IsFloating', 3), 1378204SAli.Saidi@ARM.com 'FpOp1P7': ('FloatReg', 'sf', '(op1 + 7)', 'IsFloating', 3), 1388204SAli.Saidi@ARM.com 'FpOp1S0P0': ('FloatReg', 'sf', '(op1 + step * 0 + 0)', 'IsFloating', 3), 1398204SAli.Saidi@ARM.com 'FpOp1S0P1': ('FloatReg', 'sf', '(op1 + step * 0 + 1)', 'IsFloating', 3), 1407732SAli.Saidi@ARM.com 'FpOp1S1P0': ('FloatReg', 'sf', '(op1 + step * 1 + 0)', 'IsFloating', 3), 1417732SAli.Saidi@ARM.com 'FpOp1S1P1': ('FloatReg', 'sf', '(op1 + step * 1 + 1)', 'IsFloating', 3), 1427732SAli.Saidi@ARM.com 'FpOp1S2P0': ('FloatReg', 'sf', '(op1 + step * 2 + 0)', 'IsFloating', 3), 1437732SAli.Saidi@ARM.com 'FpOp1S2P1': ('FloatReg', 'sf', '(op1 + step * 2 + 1)', 'IsFloating', 3), 1447732SAli.Saidi@ARM.com 'FpOp1S3P0': ('FloatReg', 'sf', '(op1 + step * 3 + 0)', 'IsFloating', 3), 1457732SAli.Saidi@ARM.com 'FpOp1S3P1': ('FloatReg', 'sf', '(op1 + step * 3 + 1)', 'IsFloating', 3), 1467732SAli.Saidi@ARM.com 'MiscOp1': ('ControlReg', 'uw', 'op1', (None, None, 'IsControl'), 3), 1477732SAli.Saidi@ARM.com 'Op2': ('IntReg', 'uw', 'op2', 'IsInteger', 3, 1487732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1497732SAli.Saidi@ARM.com 'FpOp2': ('FloatReg', 'sf', '(op2 + 0)', 'IsFloating', 3), 1507732SAli.Saidi@ARM.com 'FpOp2P0': ('FloatReg', 'sf', '(op2 + 0)', 'IsFloating', 3), 1517732SAli.Saidi@ARM.com 'FpOp2P1': ('FloatReg', 'sf', '(op2 + 1)', 'IsFloating', 3), 1527732SAli.Saidi@ARM.com 'FpOp2P2': ('FloatReg', 'sf', '(op2 + 2)', 'IsFloating', 3), 1537732SAli.Saidi@ARM.com 'FpOp2P3': ('FloatReg', 'sf', '(op2 + 3)', 'IsFloating', 3), 1547732SAli.Saidi@ARM.com 'Op3': ('IntReg', 'uw', 'op3', 'IsInteger', 3, 1557732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1567732SAli.Saidi@ARM.com 'Shift': ('IntReg', 'uw', 'shift', 'IsInteger', 3, 1577732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1587732SAli.Saidi@ARM.com 'Reg0': ('IntReg', 'uw', 'reg0', 'IsInteger', 3, 1597732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1607732SAli.Saidi@ARM.com 'Reg1': ('IntReg', 'uw', 'reg1', 'IsInteger', 3, 1617732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1627732SAli.Saidi@ARM.com 'Reg2': ('IntReg', 'uw', 'reg2', 'IsInteger', 3, 1637732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1647732SAli.Saidi@ARM.com 'Reg3': ('IntReg', 'uw', 'reg3', 'IsInteger', 3, 1657732SAli.Saidi@ARM.com maybePCRead, maybePCWrite), 1667732SAli.Saidi@ARM.com #General Purpose Integer Reg Operands 1677732SAli.Saidi@ARM.com 'Rd': ('IntReg', 'uw', 'RD', 'IsInteger', 3, maybePCRead, maybePCWrite), 1687732SAli.Saidi@ARM.com 'Rm': ('IntReg', 'uw', 'RM', 'IsInteger', 3, maybePCRead, maybePCWrite), 1697732SAli.Saidi@ARM.com 'Rs': ('IntReg', 'uw', 'RS', 'IsInteger', 3, maybePCRead, maybePCWrite), 1707732SAli.Saidi@ARM.com 'Rn': ('IntReg', 'uw', 'RN', 'IsInteger', 3, maybePCRead, maybePCWrite), 1718204SAli.Saidi@ARM.com 'R7': ('IntReg', 'uw', '7', 'IsInteger', 3), 1728204SAli.Saidi@ARM.com 'R0': ('IntReg', 'uw', '0', 'IsInteger', 3), 1738204SAli.Saidi@ARM.com 'R1': ('IntReg', 'uw', '0', 'IsInteger', 3), 1747732SAli.Saidi@ARM.com 'R2': ('IntReg', 'uw', '1', 'IsInteger', 3), 1758204SAli.Saidi@ARM.com 'Rt' : ('IntReg', 'uw', 'RT', 'IsInteger', 3, maybePCRead, maybePCWrite), 1768204SAli.Saidi@ARM.com 1778204SAli.Saidi@ARM.com 'LR': ('IntReg', 'uw', 'INTREG_LR', 'IsInteger', 3), 1787732SAli.Saidi@ARM.com 'CondCodes': ('IntReg', 'uw', 'INTREG_CONDCODES', None, 3), 1797732SAli.Saidi@ARM.com 'OptCondCodes': ('IntReg', 'uw', 1807732SAli.Saidi@ARM.com '''(condCode == COND_AL || condCode == COND_UC) ? 1817732SAli.Saidi@ARM.com INTREG_ZERO : INTREG_CONDCODES''', None, 3), 1827732SAli.Saidi@ARM.com 'FpCondCodes': ('IntReg', 'uw', 'INTREG_FPCONDCODES', None, 3), 1837732SAli.Saidi@ARM.com 1847732SAli.Saidi@ARM.com #Register fields for microops 1857732SAli.Saidi@ARM.com 'Ra' : ('IntReg', 'uw', 'ura', 'IsInteger', 3, maybePCRead, maybePCWrite), 1867732SAli.Saidi@ARM.com 'IWRa' : ('IntReg', 'uw', 'ura', 'IsInteger', 3, 1877732SAli.Saidi@ARM.com maybePCRead, maybeIWPCWrite), 1887732SAli.Saidi@ARM.com 'Fa' : ('FloatReg', 'sf', 'ura', 'IsFloating', 3), 1897732SAli.Saidi@ARM.com 'Rb' : ('IntReg', 'uw', 'urb', 'IsInteger', 3, maybePCRead, maybePCWrite), 1907732SAli.Saidi@ARM.com 'Rc' : ('IntReg', 'uw', 'urc', 'IsInteger', 3, maybePCRead, maybePCWrite), 1917732SAli.Saidi@ARM.com 1927732SAli.Saidi@ARM.com #General Purpose Floating Point Reg Operands 1937732SAli.Saidi@ARM.com 'Fd': ('FloatReg', 'df', 'FD', 'IsFloating', 3), 1947732SAli.Saidi@ARM.com 'Fn': ('FloatReg', 'df', 'FN', 'IsFloating', 3), 1958659SAli.Saidi@ARM.com 'Fm': ('FloatReg', 'df', 'FM', 'IsFloating', 3), 1968659SAli.Saidi@ARM.com 1978659SAli.Saidi@ARM.com #Memory Operand 1987732SAli.Saidi@ARM.com 'Mem': ('Mem', 'uw', None, ('IsMemRef', 'IsLoad', 'IsStore'), 3), 1997732SAli.Saidi@ARM.com 2007732SAli.Saidi@ARM.com 'Cpsr': ('ControlReg', 'uw', 'MISCREG_CPSR', (None, None, 'IsControl'), 2), 2017732SAli.Saidi@ARM.com 'Itstate': ('ControlReg', 'ub', 'MISCREG_ITSTATE', None, 3), 2028659SAli.Saidi@ARM.com 'Spsr': ('ControlReg', 'uw', 'MISCREG_SPSR', None, 3), 2038659SAli.Saidi@ARM.com 'Fpsr': ('ControlReg', 'uw', 'MISCREG_FPSR', None, 3), 2047732SAli.Saidi@ARM.com 'Fpsid': ('ControlReg', 'uw', 'MISCREG_FPSID', None, 3), 2057732SAli.Saidi@ARM.com 'Fpscr': ('ControlReg', 'uw', 'MISCREG_FPSCR', None, 3), 2067732SAli.Saidi@ARM.com 'FpscrQc': ('ControlReg', 'uw', 'MISCREG_FPSCR_QC', None, 3), 2077732SAli.Saidi@ARM.com 'FpscrExc': ('ControlReg', 'uw', 'MISCREG_FPSCR_EXC', None, 3), 2088204SAli.Saidi@ARM.com 'Cpacr': ('ControlReg', 'uw', 'MISCREG_CPACR', (None, None, 'IsControl'), 3), 2098204SAli.Saidi@ARM.com 'Fpexc': ('ControlReg', 'uw', 'MISCREG_FPEXC', None, 3), 2108204SAli.Saidi@ARM.com 'Sctlr': ('ControlReg', 'uw', 'MISCREG_SCTLR', None, 3), 2118204SAli.Saidi@ARM.com 'SevMailbox': ('ControlReg', 'uw', 'MISCREG_SEV_MAILBOX', None, 3), 2127732SAli.Saidi@ARM.com #PCS needs to have a sorting index (the number at the end) less than all 2138204SAli.Saidi@ARM.com #the integer registers which might update the PC. That way if the flag 2147732SAli.Saidi@ARM.com #bits of the pc state are updated and a branch happens through R15, the 2157732SAli.Saidi@ARM.com #updates are layered properly and the R15 update isn't lost. 2167732SAli.Saidi@ARM.com 'PCS': ('PCState', 'uw', None, (None, None, 'IsControl'), 0) 2177732SAli.Saidi@ARM.com}}; 2187732SAli.Saidi@ARM.com