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