intregs.hh revision 10337:85001c018d4c
12068SN/A/*
22068SN/A * Copyright (c) 2010-2014 ARM Limited
32188SN/A * All rights reserved
42068SN/A *
52068SN/A * The license below extends only to copyright in the software and shall
62068SN/A * not be construed as granting a license to any other intellectual
72068SN/A * property including but not limited to intellectual property relating
82068SN/A * to a hardware implementation of the functionality of the software
92068SN/A * licensed hereunder.  You may use the software subject to the license
102068SN/A * terms below provided that you ensure that this notice is replicated
112068SN/A * unmodified and in its entirety in all distributions of the software,
122068SN/A * modified or unmodified, in source code or in binary form.
132068SN/A *
142068SN/A * Copyright (c) 2009 The Regents of The University of Michigan
152068SN/A * All rights reserved.
162068SN/A *
172068SN/A * Redistribution and use in source and binary forms, with or without
182068SN/A * modification, are permitted provided that the following conditions are
192068SN/A * met: redistributions of source code must retain the above copyright
202068SN/A * notice, this list of conditions and the following disclaimer;
212068SN/A * redistributions in binary form must reproduce the above copyright
222068SN/A * notice, this list of conditions and the following disclaimer in the
232068SN/A * documentation and/or other materials provided with the distribution;
242068SN/A * neither the name of the copyright holders nor the names of its
252068SN/A * contributors may be used to endorse or promote products derived from
262068SN/A * this software without specific prior written permission.
272068SN/A *
282665Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
292665Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
302068SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
312649Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
322649Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
332649Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
342649Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
352649Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
362068SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
372068SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
382068SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
392068SN/A *
402068SN/A * Authors: Gabe Black
412068SN/A */
422068SN/A
432068SN/A#include <cassert>
442075SN/A
452075SN/A#ifndef __ARCH_ARM_INTREGS_HH__
462075SN/A#define __ARCH_ARM_INTREGS_HH__
472075SN/A
482075SN/A#include "arch/arm/types.hh"
492075SN/A
502735Sktlim@umich.edunamespace ArmISA
512069SN/A{
522069SN/A
532075SN/Aenum IntRegIndex
542735Sktlim@umich.edu{
552068SN/A    /* All the unique register indices. */
562068SN/A    INTREG_R0,
572068SN/A    INTREG_R1,
582075SN/A    INTREG_R2,
592075SN/A    INTREG_R3,
602068SN/A    INTREG_R4,
612068SN/A    INTREG_R5,
622075SN/A    INTREG_R6,
632075SN/A    INTREG_R7,
642068SN/A    INTREG_R8,
652068SN/A    INTREG_R9,
662068SN/A    INTREG_R10,
672075SN/A    INTREG_R11,
682075SN/A    INTREG_R12,
692075SN/A    INTREG_R13,
702075SN/A    INTREG_SP = INTREG_R13,
712075SN/A    INTREG_R14,
722075SN/A    INTREG_LR = INTREG_R14,
732075SN/A    INTREG_R15,
742735Sktlim@umich.edu    INTREG_PC = INTREG_R15,
752069SN/A
762069SN/A    INTREG_R13_SVC,
772075SN/A    INTREG_SP_SVC = INTREG_R13_SVC,
782735Sktlim@umich.edu    INTREG_R14_SVC,
792068SN/A    INTREG_LR_SVC = INTREG_R14_SVC,
802068SN/A
812068SN/A    INTREG_R13_MON,
822075SN/A    INTREG_SP_MON = INTREG_R13_MON,
832068SN/A    INTREG_R14_MON,
842069SN/A    INTREG_LR_MON = INTREG_R14_MON,
852068SN/A
862068SN/A    INTREG_R13_HYP,
874027Sstever@eecs.umich.edu    INTREG_SP_HYP = INTREG_R13_HYP,
884027Sstever@eecs.umich.edu
894027Sstever@eecs.umich.edu    INTREG_R13_ABT,
902336SN/A    INTREG_SP_ABT = INTREG_R13_ABT,
912075SN/A    INTREG_R14_ABT,
922068SN/A    INTREG_LR_ABT = INTREG_R14_ABT,
932069SN/A
942068SN/A    INTREG_R13_UND,
952068SN/A    INTREG_SP_UND = INTREG_R13_UND,
962068SN/A    INTREG_R14_UND,
972068SN/A    INTREG_LR_UND = INTREG_R14_UND,
982068SN/A
992068SN/A    INTREG_R13_IRQ,
1002068SN/A    INTREG_SP_IRQ = INTREG_R13_IRQ,
1012068SN/A    INTREG_R14_IRQ,
1024027Sstever@eecs.umich.edu    INTREG_LR_IRQ = INTREG_R14_IRQ,
1034027Sstever@eecs.umich.edu
1044027Sstever@eecs.umich.edu    INTREG_R8_FIQ,
1054027Sstever@eecs.umich.edu    INTREG_R9_FIQ,
1064027Sstever@eecs.umich.edu    INTREG_R10_FIQ,
1074027Sstever@eecs.umich.edu    INTREG_R11_FIQ,
1082336SN/A    INTREG_R12_FIQ,
1092068SN/A    INTREG_R13_FIQ,
1102068SN/A    INTREG_SP_FIQ = INTREG_R13_FIQ,
1112068SN/A    INTREG_R14_FIQ,
1122068SN/A    INTREG_LR_FIQ = INTREG_R14_FIQ,
1132068SN/A
1142068SN/A    INTREG_ZERO,
1152068SN/A    INTREG_UREG0,
1162068SN/A    INTREG_UREG1,
1172068SN/A    INTREG_UREG2,
1182068SN/A    INTREG_CONDCODES_NZ,
1192068SN/A    INTREG_CONDCODES_C,
1202068SN/A    INTREG_CONDCODES_V,
1212147SN/A    INTREG_CONDCODES_GE,
1222068SN/A    INTREG_FPCONDCODES,
1232068SN/A    INTREG_DUMMY, // Dummy reg used to throw away int reg results
1242068SN/A
1252068SN/A    INTREG_SP0,
1262068SN/A    INTREG_SP1,
1272068SN/A    INTREG_SP2,
1282068SN/A    INTREG_SP3,
1292068SN/A
1302068SN/A    NUM_INTREGS,
1312068SN/A    NUM_ARCH_INTREGS = 32,
1322068SN/A
1332147SN/A    /* AArch64 registers */
1342068SN/A    INTREG_X0 = 0,
1352068SN/A    INTREG_X1,
1362068SN/A    INTREG_X2,
1372068SN/A    INTREG_X3,
1382068SN/A    INTREG_X4,
1392068SN/A    INTREG_X5,
1402068SN/A    INTREG_X6,
1412068SN/A    INTREG_X7,
1422068SN/A    INTREG_X8,
1432068SN/A    INTREG_X9,
1442068SN/A    INTREG_X10,
1452068SN/A    INTREG_X11,
1462068SN/A    INTREG_X12,
1472147SN/A    INTREG_X13,
1482068SN/A    INTREG_X14,
1492068SN/A    INTREG_X15,
1502068SN/A    INTREG_X16,
1512068SN/A    INTREG_X17,
1522068SN/A    INTREG_X18,
1532068SN/A    INTREG_X19,
1542068SN/A    INTREG_X20,
1552068SN/A    INTREG_X21,
1562068SN/A    INTREG_X22,
1572068SN/A    INTREG_X23,
1582068SN/A    INTREG_X24,
1592068SN/A    INTREG_X25,
1602068SN/A    INTREG_X26,
1612147SN/A    INTREG_X27,
1622068SN/A    INTREG_X28,
1632068SN/A    INTREG_X29,
1642068SN/A    INTREG_X30,
1652068SN/A    INTREG_X31,
1662068SN/A
1672068SN/A    INTREG_SPX = NUM_INTREGS,
1682068SN/A
1692068SN/A    /* All the aliased indexes. */
1702068SN/A
1712068SN/A    /* USR mode */
1722068SN/A    INTREG_R0_USR = INTREG_R0,
1732068SN/A    INTREG_R1_USR = INTREG_R1,
1742068SN/A    INTREG_R2_USR = INTREG_R2,
1752068SN/A    INTREG_R3_USR = INTREG_R3,
1762068SN/A    INTREG_R4_USR = INTREG_R4,
1772068SN/A    INTREG_R5_USR = INTREG_R5,
1782068SN/A    INTREG_R6_USR = INTREG_R6,
1792068SN/A    INTREG_R7_USR = INTREG_R7,
1802068SN/A    INTREG_R8_USR = INTREG_R8,
1812068SN/A    INTREG_R9_USR = INTREG_R9,
1822068SN/A    INTREG_R10_USR = INTREG_R10,
1832068SN/A    INTREG_R11_USR = INTREG_R11,
1842068SN/A    INTREG_R12_USR = INTREG_R12,
1852068SN/A    INTREG_R13_USR = INTREG_R13,
1862068SN/A    INTREG_SP_USR = INTREG_SP,
1872068SN/A    INTREG_R14_USR = INTREG_R14,
1882068SN/A    INTREG_LR_USR = INTREG_LR,
1892068SN/A    INTREG_R15_USR = INTREG_R15,
1902068SN/A    INTREG_PC_USR = INTREG_PC,
1912068SN/A
1922068SN/A    /* SVC mode */
1932068SN/A    INTREG_R0_SVC = INTREG_R0,
1942068SN/A    INTREG_R1_SVC = INTREG_R1,
1952068SN/A    INTREG_R2_SVC = INTREG_R2,
1962068SN/A    INTREG_R3_SVC = INTREG_R3,
1972068SN/A    INTREG_R4_SVC = INTREG_R4,
1982068SN/A    INTREG_R5_SVC = INTREG_R5,
1992068SN/A    INTREG_R6_SVC = INTREG_R6,
2002068SN/A    INTREG_R7_SVC = INTREG_R7,
2012068SN/A    INTREG_R8_SVC = INTREG_R8,
2022068SN/A    INTREG_R9_SVC = INTREG_R9,
2032068SN/A    INTREG_R10_SVC = INTREG_R10,
2042068SN/A    INTREG_R11_SVC = INTREG_R11,
2052068SN/A    INTREG_R12_SVC = INTREG_R12,
2062068SN/A    INTREG_PC_SVC = INTREG_PC,
2072068SN/A    INTREG_R15_SVC = INTREG_R15,
2082068SN/A
2092068SN/A    /* MON mode */
2102068SN/A    INTREG_R0_MON = INTREG_R0,
2112068SN/A    INTREG_R1_MON = INTREG_R1,
2122068SN/A    INTREG_R2_MON = INTREG_R2,
2132068SN/A    INTREG_R3_MON = INTREG_R3,
2142068SN/A    INTREG_R4_MON = INTREG_R4,
2152068SN/A    INTREG_R5_MON = INTREG_R5,
2162068SN/A    INTREG_R6_MON = INTREG_R6,
2172068SN/A    INTREG_R7_MON = INTREG_R7,
2182068SN/A    INTREG_R8_MON = INTREG_R8,
2192068SN/A    INTREG_R9_MON = INTREG_R9,
2202068SN/A    INTREG_R10_MON = INTREG_R10,
2212068SN/A    INTREG_R11_MON = INTREG_R11,
2222068SN/A    INTREG_R12_MON = INTREG_R12,
2232068SN/A    INTREG_PC_MON = INTREG_PC,
2242068SN/A    INTREG_R15_MON = INTREG_R15,
2252068SN/A
2262068SN/A    /* ABT mode */
2272068SN/A    INTREG_R0_ABT = INTREG_R0,
2282068SN/A    INTREG_R1_ABT = INTREG_R1,
2292068SN/A    INTREG_R2_ABT = INTREG_R2,
2302068SN/A    INTREG_R3_ABT = INTREG_R3,
2312068SN/A    INTREG_R4_ABT = INTREG_R4,
2322068SN/A    INTREG_R5_ABT = INTREG_R5,
2332068SN/A    INTREG_R6_ABT = INTREG_R6,
2342068SN/A    INTREG_R7_ABT = INTREG_R7,
2352068SN/A    INTREG_R8_ABT = INTREG_R8,
2362068SN/A    INTREG_R9_ABT = INTREG_R9,
2372068SN/A    INTREG_R10_ABT = INTREG_R10,
2382068SN/A    INTREG_R11_ABT = INTREG_R11,
2392068SN/A    INTREG_R12_ABT = INTREG_R12,
2402068SN/A    INTREG_PC_ABT = INTREG_PC,
2412068SN/A    INTREG_R15_ABT = INTREG_R15,
2422068SN/A
2432068SN/A    /* HYP mode */
2442068SN/A    INTREG_R0_HYP = INTREG_R0,
2452068SN/A    INTREG_R1_HYP = INTREG_R1,
2462068SN/A    INTREG_R2_HYP = INTREG_R2,
2472068SN/A    INTREG_R3_HYP = INTREG_R3,
2482068SN/A    INTREG_R4_HYP = INTREG_R4,
2492068SN/A    INTREG_R5_HYP = INTREG_R5,
2502068SN/A    INTREG_R6_HYP = INTREG_R6,
2512068SN/A    INTREG_R7_HYP = INTREG_R7,
2522068SN/A    INTREG_R8_HYP = INTREG_R8,
2532068SN/A    INTREG_R9_HYP = INTREG_R9,
2542068SN/A    INTREG_R10_HYP = INTREG_R10,
2552068SN/A    INTREG_R11_HYP = INTREG_R11,
2562068SN/A    INTREG_R12_HYP = INTREG_R12,
2572068SN/A    INTREG_LR_HYP = INTREG_LR,
2582068SN/A    INTREG_R14_HYP = INTREG_R14,
2592068SN/A    INTREG_PC_HYP = INTREG_PC,
2602068SN/A    INTREG_R15_HYP = INTREG_R15,
2612068SN/A
2622068SN/A    /* UND mode */
2632068SN/A    INTREG_R0_UND = INTREG_R0,
2642068SN/A    INTREG_R1_UND = INTREG_R1,
2652068SN/A    INTREG_R2_UND = INTREG_R2,
2662068SN/A    INTREG_R3_UND = INTREG_R3,
2672068SN/A    INTREG_R4_UND = INTREG_R4,
2682068SN/A    INTREG_R5_UND = INTREG_R5,
2692068SN/A    INTREG_R6_UND = INTREG_R6,
2702068SN/A    INTREG_R7_UND = INTREG_R7,
2712068SN/A    INTREG_R8_UND = INTREG_R8,
2722068SN/A    INTREG_R9_UND = INTREG_R9,
2732068SN/A    INTREG_R10_UND = INTREG_R10,
2742068SN/A    INTREG_R11_UND = INTREG_R11,
2752068SN/A    INTREG_R12_UND = INTREG_R12,
2762068SN/A    INTREG_PC_UND = INTREG_PC,
2772068SN/A    INTREG_R15_UND = INTREG_R15,
2782068SN/A
2792068SN/A    /* IRQ mode */
2802068SN/A    INTREG_R0_IRQ = INTREG_R0,
2812068SN/A    INTREG_R1_IRQ = INTREG_R1,
2822068SN/A    INTREG_R2_IRQ = INTREG_R2,
2832068SN/A    INTREG_R3_IRQ = INTREG_R3,
2842068SN/A    INTREG_R4_IRQ = INTREG_R4,
2852068SN/A    INTREG_R5_IRQ = INTREG_R5,
2862068SN/A    INTREG_R6_IRQ = INTREG_R6,
2872068SN/A    INTREG_R7_IRQ = INTREG_R7,
2882068SN/A    INTREG_R8_IRQ = INTREG_R8,
2892068SN/A    INTREG_R9_IRQ = INTREG_R9,
2902068SN/A    INTREG_R10_IRQ = INTREG_R10,
2912068SN/A    INTREG_R11_IRQ = INTREG_R11,
2922068SN/A    INTREG_R12_IRQ = INTREG_R12,
2932068SN/A    INTREG_PC_IRQ = INTREG_PC,
2942068SN/A    INTREG_R15_IRQ = INTREG_R15,
2952068SN/A
2962068SN/A    /* FIQ mode */
2972068SN/A    INTREG_R0_FIQ = INTREG_R0,
2982068SN/A    INTREG_R1_FIQ = INTREG_R1,
2992068SN/A    INTREG_R2_FIQ = INTREG_R2,
3002068SN/A    INTREG_R3_FIQ = INTREG_R3,
3012068SN/A    INTREG_R4_FIQ = INTREG_R4,
3022068SN/A    INTREG_R5_FIQ = INTREG_R5,
3032068SN/A    INTREG_R6_FIQ = INTREG_R6,
3042068SN/A    INTREG_R7_FIQ = INTREG_R7,
3052068SN/A    INTREG_PC_FIQ = INTREG_PC,
3062068SN/A    INTREG_R15_FIQ = INTREG_R15
3072068SN/A};
3082068SN/A
3092068SN/Atypedef IntRegIndex IntRegMap[NUM_ARCH_INTREGS];
3102068SN/A
3112068SN/Aconst IntRegMap IntReg64Map = {
3122068SN/A    INTREG_R0,      INTREG_R1,      INTREG_R2,      INTREG_R3,
3132068SN/A    INTREG_R4,      INTREG_R5,      INTREG_R6,      INTREG_R7,
3142068SN/A    INTREG_R8_USR,  INTREG_R9_USR,  INTREG_R10_USR, INTREG_R11_USR,
3152068SN/A    INTREG_R12_USR, INTREG_R13_USR, INTREG_R14_USR, INTREG_R13_HYP,
3162068SN/A    INTREG_R14_IRQ, INTREG_R13_IRQ, INTREG_R14_SVC, INTREG_R13_SVC,
3172068SN/A    INTREG_R14_ABT, INTREG_R13_ABT, INTREG_R14_UND, INTREG_R13_UND,
3182068SN/A    INTREG_R8_FIQ,  INTREG_R9_FIQ,  INTREG_R10_FIQ, INTREG_R11_FIQ,
3192068SN/A    INTREG_R12_FIQ, INTREG_R13_FIQ, INTREG_R14_FIQ, INTREG_ZERO
3202068SN/A};
3212068SN/A
3222147SN/Aconst IntRegMap IntRegUsrMap = {
3232068SN/A    INTREG_R0_USR,  INTREG_R1_USR,  INTREG_R2_USR,  INTREG_R3_USR,
3242068SN/A    INTREG_R4_USR,  INTREG_R5_USR,  INTREG_R6_USR,  INTREG_R7_USR,
3252068SN/A    INTREG_R8_USR,  INTREG_R9_USR,  INTREG_R10_USR, INTREG_R11_USR,
3262068SN/A    INTREG_R12_USR, INTREG_R13_USR, INTREG_R14_USR, INTREG_R15_USR,
3272068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3282068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3292068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3302068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
3312068SN/A};
3322068SN/A
3332147SN/Astatic inline IntRegIndex
3342068SN/AINTREG_USR(unsigned index)
3352068SN/A{
3362068SN/A    assert(index < NUM_ARCH_INTREGS);
3372068SN/A    return IntRegUsrMap[index];
3382068SN/A}
3392068SN/A
3402068SN/Aconst IntRegMap IntRegHypMap = {
3412068SN/A    INTREG_R0_HYP,  INTREG_R1_HYP,  INTREG_R2_HYP,  INTREG_R3_HYP,
3422068SN/A    INTREG_R4_HYP,  INTREG_R5_HYP,  INTREG_R6_HYP,  INTREG_R7_HYP,
3432068SN/A    INTREG_R8_HYP,  INTREG_R9_HYP,  INTREG_R10_HYP, INTREG_R11_HYP,
3442068SN/A    INTREG_R12_HYP, INTREG_R13_HYP, INTREG_R14_HYP, INTREG_R15_HYP,
3452068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3462068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3472068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3482068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
3492068SN/A};
3502068SN/A
3512068SN/Astatic inline IntRegIndex
3522068SN/AINTREG_HYP(unsigned index)
3532068SN/A{
3542068SN/A    assert(index < NUM_ARCH_INTREGS);
3552068SN/A    return IntRegHypMap[index];
3562068SN/A}
3572068SN/A
3582068SN/Aconst IntRegMap IntRegSvcMap = {
3592068SN/A    INTREG_R0_SVC,  INTREG_R1_SVC,  INTREG_R2_SVC,  INTREG_R3_SVC,
3602068SN/A    INTREG_R4_SVC,  INTREG_R5_SVC,  INTREG_R6_SVC,  INTREG_R7_SVC,
3612068SN/A    INTREG_R8_SVC,  INTREG_R9_SVC,  INTREG_R10_SVC, INTREG_R11_SVC,
3622068SN/A    INTREG_R12_SVC, INTREG_R13_SVC, INTREG_R14_SVC, INTREG_R15_SVC,
3632068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3642068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3652068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3662068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
3672068SN/A};
3682068SN/A
3692068SN/Astatic inline IntRegIndex
3702068SN/AINTREG_SVC(unsigned index)
3712068SN/A{
3722068SN/A    assert(index < NUM_ARCH_INTREGS);
3732068SN/A    return IntRegSvcMap[index];
3742068SN/A}
3752068SN/A
3762068SN/Aconst IntRegMap IntRegMonMap = {
3772068SN/A    INTREG_R0_MON,  INTREG_R1_MON,  INTREG_R2_MON,  INTREG_R3_MON,
3782068SN/A    INTREG_R4_MON,  INTREG_R5_MON,  INTREG_R6_MON,  INTREG_R7_MON,
3792068SN/A    INTREG_R8_MON,  INTREG_R9_MON,  INTREG_R10_MON, INTREG_R11_MON,
3802068SN/A    INTREG_R12_MON, INTREG_R13_MON, INTREG_R14_MON, INTREG_R15_MON,
3812068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3822068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3832068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
3842068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
3852068SN/A};
3862068SN/A
3872068SN/Astatic inline IntRegIndex
3882068SN/AINTREG_MON(unsigned index)
3892068SN/A{
3902068SN/A    assert(index < NUM_ARCH_INTREGS);
3912068SN/A    return IntRegMonMap[index];
3922068SN/A}
3932068SN/A
3942068SN/Aconst IntRegMap IntRegAbtMap = {
3952068SN/A    INTREG_R0_ABT,  INTREG_R1_ABT,  INTREG_R2_ABT,  INTREG_R3_ABT,
3962068SN/A    INTREG_R4_ABT,  INTREG_R5_ABT,  INTREG_R6_ABT,  INTREG_R7_ABT,
3972068SN/A    INTREG_R8_ABT,  INTREG_R9_ABT,  INTREG_R10_ABT, INTREG_R11_ABT,
3982068SN/A    INTREG_R12_ABT, INTREG_R13_ABT, INTREG_R14_ABT, INTREG_R15_ABT,
3992068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4002068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4012068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4022068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
4032068SN/A};
4042068SN/A
4052068SN/Astatic inline IntRegIndex
4062068SN/AINTREG_ABT(unsigned index)
4072068SN/A{
4082068SN/A    assert(index < NUM_ARCH_INTREGS);
4092068SN/A    return IntRegAbtMap[index];
4102068SN/A}
4112068SN/A
4122068SN/Aconst IntRegMap IntRegUndMap = {
4132068SN/A    INTREG_R0_UND,  INTREG_R1_UND,  INTREG_R2_UND,  INTREG_R3_UND,
4142068SN/A    INTREG_R4_UND,  INTREG_R5_UND,  INTREG_R6_UND,  INTREG_R7_UND,
4152068SN/A    INTREG_R8_UND,  INTREG_R9_UND,  INTREG_R10_UND, INTREG_R11_UND,
4162068SN/A    INTREG_R12_UND, INTREG_R13_UND, INTREG_R14_UND, INTREG_R15_UND,
4172068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4182068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4192068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4202068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
4212068SN/A};
4222068SN/A
4232068SN/Astatic inline IntRegIndex
4242068SN/AINTREG_UND(unsigned index)
4252068SN/A{
4262068SN/A    assert(index < NUM_ARCH_INTREGS);
4272068SN/A    return IntRegUndMap[index];
4282068SN/A}
4292068SN/A
4302068SN/Aconst IntRegMap IntRegIrqMap = {
4312068SN/A    INTREG_R0_IRQ,  INTREG_R1_IRQ,  INTREG_R2_IRQ,  INTREG_R3_IRQ,
4322068SN/A    INTREG_R4_IRQ,  INTREG_R5_IRQ,  INTREG_R6_IRQ,  INTREG_R7_IRQ,
4332068SN/A    INTREG_R8_IRQ,  INTREG_R9_IRQ,  INTREG_R10_IRQ, INTREG_R11_IRQ,
4342068SN/A    INTREG_R12_IRQ, INTREG_R13_IRQ, INTREG_R14_IRQ, INTREG_R15_IRQ,
4352068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4362068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4372068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4382068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
4392068SN/A};
4402068SN/A
4412068SN/Astatic inline IntRegIndex
4422068SN/AINTREG_IRQ(unsigned index)
4432068SN/A{
4442068SN/A    assert(index < NUM_ARCH_INTREGS);
4452068SN/A    return IntRegIrqMap[index];
4462068SN/A}
4472068SN/A
4482068SN/Aconst IntRegMap IntRegFiqMap = {
4492068SN/A    INTREG_R0_FIQ,  INTREG_R1_FIQ,  INTREG_R2_FIQ,  INTREG_R3_FIQ,
4502147SN/A    INTREG_R4_FIQ,  INTREG_R5_FIQ,  INTREG_R6_FIQ,  INTREG_R7_FIQ,
4512068SN/A    INTREG_R8_FIQ,  INTREG_R9_FIQ,  INTREG_R10_FIQ, INTREG_R11_FIQ,
4522068SN/A    INTREG_R12_FIQ, INTREG_R13_FIQ, INTREG_R14_FIQ, INTREG_R15_FIQ,
4532068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4542068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4552068SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,
4562147SN/A    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO,    INTREG_ZERO
4572068SN/A};
4582068SN/A
4592068SN/Astatic inline IntRegIndex
4602068SN/AINTREG_FIQ(unsigned index)
4612068SN/A{
4622147SN/A    assert(index < NUM_ARCH_INTREGS);
4632068SN/A    return IntRegFiqMap[index];
4642068SN/A}
4652068SN/A
4662068SN/Astatic const unsigned intRegsPerMode = NUM_INTREGS;
4672068SN/A
4682068SN/Astatic inline int
4692068SN/AintRegInMode(OperatingMode mode, int reg)
4702068SN/A{
4712068SN/A    assert(reg < NUM_ARCH_INTREGS);
4722068SN/A    return mode * intRegsPerMode + reg;
4732068SN/A}
4742068SN/A
4752068SN/Astatic inline int
4762068SN/AflattenIntRegModeIndex(int reg)
4772068SN/A{
4782068SN/A    int mode = reg / intRegsPerMode;
4792068SN/A    reg = reg % intRegsPerMode;
4802068SN/A    switch (mode) {
4812068SN/A      case MODE_USER:
4822068SN/A      case MODE_SYSTEM:
4832068SN/A        return INTREG_USR(reg);
4842068SN/A      case MODE_FIQ:
4852068SN/A        return INTREG_FIQ(reg);
4862068SN/A      case MODE_IRQ:
4872068SN/A        return INTREG_IRQ(reg);
4882068SN/A      case MODE_SVC:
4892068SN/A        return INTREG_SVC(reg);
4902068SN/A      case MODE_MON:
4912068SN/A        return INTREG_MON(reg);
4922068SN/A      case MODE_ABORT:
4932068SN/A        return INTREG_ABT(reg);
4942068SN/A      case MODE_HYP:
4952068SN/A        return INTREG_HYP(reg);
4962068SN/A      case MODE_UNDEFINED:
4972068SN/A        return INTREG_UND(reg);
4982068SN/A      default:
4992068SN/A        panic("%d: Flattening into an unknown mode: reg:%#x mode:%#x\n",
5002068SN/A                curTick(), reg, mode);
5012068SN/A    }
5022068SN/A}
5032068SN/A
5042068SN/A
5052068SN/Astatic inline IntRegIndex
5062068SN/AmakeSP(IntRegIndex reg)
5072068SN/A{
5082068SN/A    if (reg == INTREG_X31)
5092068SN/A        reg = INTREG_SPX;
5102068SN/A    return reg;
5112068SN/A}
5122068SN/A
5132068SN/Astatic inline IntRegIndex
5142068SN/AmakeZero(IntRegIndex reg)
5152068SN/A{
5162068SN/A    if (reg == INTREG_X31)
5172068SN/A        reg = INTREG_ZERO;
5182068SN/A    return reg;
5192068SN/A}
5202068SN/A
5212068SN/Astatic inline bool
5222068SN/AisSP(IntRegIndex reg)
5232068SN/A{
5242068SN/A    return reg == INTREG_SPX;
5252068SN/A}
5262068SN/A
5272068SN/A}
5282068SN/A
5292068SN/A#endif
5302068SN/A