xref: /aosp_15_r20/art/compiler/utils/arm/constants_arm.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_UTILS_ARM_CONSTANTS_ARM_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_UTILS_ARM_CONSTANTS_ARM_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <stdint.h>
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include <iosfwd>
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h>
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker #include "arch/arm/registers_arm.h"
27*795d594fSAndroid Build Coastguard Worker #include "base/casts.h"
28*795d594fSAndroid Build Coastguard Worker #include "base/globals.h"
29*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
32*795d594fSAndroid Build Coastguard Worker namespace arm {
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker // Defines constants and accessor classes to assemble, disassemble and
35*795d594fSAndroid Build Coastguard Worker // simulate ARM instructions.
36*795d594fSAndroid Build Coastguard Worker //
37*795d594fSAndroid Build Coastguard Worker // Section references in the code refer to the "ARM Architecture
38*795d594fSAndroid Build Coastguard Worker // Reference Manual ARMv7-A and ARMv7-R edition", issue C.b (24 July
39*795d594fSAndroid Build Coastguard Worker // 2012).
40*795d594fSAndroid Build Coastguard Worker //
41*795d594fSAndroid Build Coastguard Worker // Constants for specific fields are defined in their respective named enums.
42*795d594fSAndroid Build Coastguard Worker // General constants are in an anonymous enum in class Instr.
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker // 4 bits option for the dmb instruction.
45*795d594fSAndroid Build Coastguard Worker // Order and values follows those of the ARM Architecture Reference Manual.
46*795d594fSAndroid Build Coastguard Worker enum DmbOptions {
47*795d594fSAndroid Build Coastguard Worker   SY = 0xf,
48*795d594fSAndroid Build Coastguard Worker   ST = 0xe,
49*795d594fSAndroid Build Coastguard Worker   ISH = 0xb,
50*795d594fSAndroid Build Coastguard Worker   ISHST = 0xa,
51*795d594fSAndroid Build Coastguard Worker   NSH = 0x7,
52*795d594fSAndroid Build Coastguard Worker   NSHST = 0x6
53*795d594fSAndroid Build Coastguard Worker };
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker // Values for double-precision floating point registers.
56*795d594fSAndroid Build Coastguard Worker enum DRegister {  // private marker to avoid generate-operator-out.py from processing.
57*795d594fSAndroid Build Coastguard Worker   D0  = 0,
58*795d594fSAndroid Build Coastguard Worker   D1  = 1,
59*795d594fSAndroid Build Coastguard Worker   D2  = 2,
60*795d594fSAndroid Build Coastguard Worker   D3  = 3,
61*795d594fSAndroid Build Coastguard Worker   D4  = 4,
62*795d594fSAndroid Build Coastguard Worker   D5  = 5,
63*795d594fSAndroid Build Coastguard Worker   D6  = 6,
64*795d594fSAndroid Build Coastguard Worker   D7  = 7,
65*795d594fSAndroid Build Coastguard Worker   D8  = 8,
66*795d594fSAndroid Build Coastguard Worker   D9  = 9,
67*795d594fSAndroid Build Coastguard Worker   D10 = 10,
68*795d594fSAndroid Build Coastguard Worker   D11 = 11,
69*795d594fSAndroid Build Coastguard Worker   D12 = 12,
70*795d594fSAndroid Build Coastguard Worker   D13 = 13,
71*795d594fSAndroid Build Coastguard Worker   D14 = 14,
72*795d594fSAndroid Build Coastguard Worker   D15 = 15,
73*795d594fSAndroid Build Coastguard Worker   D16 = 16,
74*795d594fSAndroid Build Coastguard Worker   D17 = 17,
75*795d594fSAndroid Build Coastguard Worker   D18 = 18,
76*795d594fSAndroid Build Coastguard Worker   D19 = 19,
77*795d594fSAndroid Build Coastguard Worker   D20 = 20,
78*795d594fSAndroid Build Coastguard Worker   D21 = 21,
79*795d594fSAndroid Build Coastguard Worker   D22 = 22,
80*795d594fSAndroid Build Coastguard Worker   D23 = 23,
81*795d594fSAndroid Build Coastguard Worker   D24 = 24,
82*795d594fSAndroid Build Coastguard Worker   D25 = 25,
83*795d594fSAndroid Build Coastguard Worker   D26 = 26,
84*795d594fSAndroid Build Coastguard Worker   D27 = 27,
85*795d594fSAndroid Build Coastguard Worker   D28 = 28,
86*795d594fSAndroid Build Coastguard Worker   D29 = 29,
87*795d594fSAndroid Build Coastguard Worker   D30 = 30,
88*795d594fSAndroid Build Coastguard Worker   D31 = 31,
89*795d594fSAndroid Build Coastguard Worker   kNumberOfDRegisters = 32,
90*795d594fSAndroid Build Coastguard Worker   kNumberOfOverlappingDRegisters = 16,
91*795d594fSAndroid Build Coastguard Worker   kNoDRegister = -1,
92*795d594fSAndroid Build Coastguard Worker };
93*795d594fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const DRegister& rhs);
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker // Opcodes for Data-processing instructions (instructions with a type 0 and 1)
96*795d594fSAndroid Build Coastguard Worker // as defined in section A3.4
97*795d594fSAndroid Build Coastguard Worker enum Opcode {
98*795d594fSAndroid Build Coastguard Worker   kNoOperand = -1,
99*795d594fSAndroid Build Coastguard Worker   AND = 0,   // Logical AND
100*795d594fSAndroid Build Coastguard Worker   EOR = 1,   // Logical Exclusive OR
101*795d594fSAndroid Build Coastguard Worker   SUB = 2,   // Subtract
102*795d594fSAndroid Build Coastguard Worker   RSB = 3,   // Reverse Subtract
103*795d594fSAndroid Build Coastguard Worker   ADD = 4,   // Add
104*795d594fSAndroid Build Coastguard Worker   ADC = 5,   // Add with Carry
105*795d594fSAndroid Build Coastguard Worker   SBC = 6,   // Subtract with Carry
106*795d594fSAndroid Build Coastguard Worker   RSC = 7,   // Reverse Subtract with Carry
107*795d594fSAndroid Build Coastguard Worker   TST = 8,   // Test
108*795d594fSAndroid Build Coastguard Worker   TEQ = 9,   // Test Equivalence
109*795d594fSAndroid Build Coastguard Worker   CMP = 10,  // Compare
110*795d594fSAndroid Build Coastguard Worker   CMN = 11,  // Compare Negated
111*795d594fSAndroid Build Coastguard Worker   ORR = 12,  // Logical (inclusive) OR
112*795d594fSAndroid Build Coastguard Worker   MOV = 13,  // Move
113*795d594fSAndroid Build Coastguard Worker   BIC = 14,  // Bit Clear
114*795d594fSAndroid Build Coastguard Worker   MVN = 15,  // Move Not
115*795d594fSAndroid Build Coastguard Worker   ORN = 16,  // Logical OR NOT.
116*795d594fSAndroid Build Coastguard Worker   kMaxOperand = 17
117*795d594fSAndroid Build Coastguard Worker };
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker // Size (in bytes) of registers.
120*795d594fSAndroid Build Coastguard Worker const int kRegisterSize = 4;
121*795d594fSAndroid Build Coastguard Worker 
122*795d594fSAndroid Build Coastguard Worker // List of registers used in load/store multiple.
123*795d594fSAndroid Build Coastguard Worker using RegList = uint16_t;
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker }  // namespace arm
126*795d594fSAndroid Build Coastguard Worker }  // namespace art
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker #endif  // ART_COMPILER_UTILS_ARM_CONSTANTS_ARM_H_
129