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