26 #ifndef CPU_AARCH64_VM_REGISTER_AARCH64_HPP
27 #define CPU_AARCH64_VM_REGISTER_AARCH64_HPP
28
29 #include "asm/register.hpp"
30
31 class VMRegImpl;
32 typedef VMRegImpl* VMReg;
33
34 // Use Register as shortcut
35 class RegisterImpl;
36 typedef RegisterImpl* Register;
37
38 inline Register as_Register(int encoding) {
39 return (Register)(intptr_t) encoding;
40 }
41
42 class RegisterImpl: public AbstractRegisterImpl {
43 public:
44 enum {
45 number_of_registers = 32,
46 number_of_byte_registers = 32
47 };
48
49 // derived registers, offsets, and addresses
50 Register successor() const { return as_Register(encoding() + 1); }
51
52 // construction
53 inline friend Register as_Register(int encoding);
54
55 VMReg as_VMReg();
56
57 // accessors
58 int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; }
59 bool is_valid() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; }
60 bool has_byte_register() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_byte_registers; }
61 const char* name() const;
62 int encoding_nocheck() const { return (intptr_t)this; }
63
64 // Return the bit which represents this register. This is intended
65 // to be ORed into a bitmask: for usage see class RegSet below.
66 unsigned long bit(bool should_set = true) const { return should_set ? 1 << encoding() : 0; }
86 CONSTANT_REGISTER_DECLARATION(Register, r12, (12));
87 CONSTANT_REGISTER_DECLARATION(Register, r13, (13));
88 CONSTANT_REGISTER_DECLARATION(Register, r14, (14));
89 CONSTANT_REGISTER_DECLARATION(Register, r15, (15));
90 CONSTANT_REGISTER_DECLARATION(Register, r16, (16));
91 CONSTANT_REGISTER_DECLARATION(Register, r17, (17));
92 CONSTANT_REGISTER_DECLARATION(Register, r18, (18));
93 CONSTANT_REGISTER_DECLARATION(Register, r19, (19));
94 CONSTANT_REGISTER_DECLARATION(Register, r20, (20));
95 CONSTANT_REGISTER_DECLARATION(Register, r21, (21));
96 CONSTANT_REGISTER_DECLARATION(Register, r22, (22));
97 CONSTANT_REGISTER_DECLARATION(Register, r23, (23));
98 CONSTANT_REGISTER_DECLARATION(Register, r24, (24));
99 CONSTANT_REGISTER_DECLARATION(Register, r25, (25));
100 CONSTANT_REGISTER_DECLARATION(Register, r26, (26));
101 CONSTANT_REGISTER_DECLARATION(Register, r27, (27));
102 CONSTANT_REGISTER_DECLARATION(Register, r28, (28));
103 CONSTANT_REGISTER_DECLARATION(Register, r29, (29));
104 CONSTANT_REGISTER_DECLARATION(Register, r30, (30));
105
106 CONSTANT_REGISTER_DECLARATION(Register, r31_sp, (31));
107 CONSTANT_REGISTER_DECLARATION(Register, zr, (32));
108 CONSTANT_REGISTER_DECLARATION(Register, sp, (33));
109
110 // Used as a filler in instructions where a register field is unused.
111 const Register dummy_reg = r31_sp;
112
113 // Use FloatRegister as shortcut
114 class FloatRegisterImpl;
115 typedef FloatRegisterImpl* FloatRegister;
116
117 inline FloatRegister as_FloatRegister(int encoding) {
118 return (FloatRegister)(intptr_t) encoding;
119 }
120
121 // The implementation of floating point registers for the architecture
122 class FloatRegisterImpl: public AbstractRegisterImpl {
123 public:
124 enum {
125 number_of_registers = 32
|
26 #ifndef CPU_AARCH64_VM_REGISTER_AARCH64_HPP
27 #define CPU_AARCH64_VM_REGISTER_AARCH64_HPP
28
29 #include "asm/register.hpp"
30
31 class VMRegImpl;
32 typedef VMRegImpl* VMReg;
33
34 // Use Register as shortcut
35 class RegisterImpl;
36 typedef RegisterImpl* Register;
37
38 inline Register as_Register(int encoding) {
39 return (Register)(intptr_t) encoding;
40 }
41
42 class RegisterImpl: public AbstractRegisterImpl {
43 public:
44 enum {
45 number_of_registers = 32,
46 number_of_byte_registers = 32,
47 number_of_registers_for_jvmci = 34 // Including SP and ZR.
48 };
49
50 // derived registers, offsets, and addresses
51 Register successor() const { return as_Register(encoding() + 1); }
52
53 // construction
54 inline friend Register as_Register(int encoding);
55
56 VMReg as_VMReg();
57
58 // accessors
59 int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; }
60 bool is_valid() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; }
61 bool has_byte_register() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_byte_registers; }
62 const char* name() const;
63 int encoding_nocheck() const { return (intptr_t)this; }
64
65 // Return the bit which represents this register. This is intended
66 // to be ORed into a bitmask: for usage see class RegSet below.
67 unsigned long bit(bool should_set = true) const { return should_set ? 1 << encoding() : 0; }
87 CONSTANT_REGISTER_DECLARATION(Register, r12, (12));
88 CONSTANT_REGISTER_DECLARATION(Register, r13, (13));
89 CONSTANT_REGISTER_DECLARATION(Register, r14, (14));
90 CONSTANT_REGISTER_DECLARATION(Register, r15, (15));
91 CONSTANT_REGISTER_DECLARATION(Register, r16, (16));
92 CONSTANT_REGISTER_DECLARATION(Register, r17, (17));
93 CONSTANT_REGISTER_DECLARATION(Register, r18, (18));
94 CONSTANT_REGISTER_DECLARATION(Register, r19, (19));
95 CONSTANT_REGISTER_DECLARATION(Register, r20, (20));
96 CONSTANT_REGISTER_DECLARATION(Register, r21, (21));
97 CONSTANT_REGISTER_DECLARATION(Register, r22, (22));
98 CONSTANT_REGISTER_DECLARATION(Register, r23, (23));
99 CONSTANT_REGISTER_DECLARATION(Register, r24, (24));
100 CONSTANT_REGISTER_DECLARATION(Register, r25, (25));
101 CONSTANT_REGISTER_DECLARATION(Register, r26, (26));
102 CONSTANT_REGISTER_DECLARATION(Register, r27, (27));
103 CONSTANT_REGISTER_DECLARATION(Register, r28, (28));
104 CONSTANT_REGISTER_DECLARATION(Register, r29, (29));
105 CONSTANT_REGISTER_DECLARATION(Register, r30, (30));
106
107
108 // r31 is not a general purpose register, but represents either the
109 // stack pointer or the zero/discard register depending on the
110 // instruction.
111 CONSTANT_REGISTER_DECLARATION(Register, r31_sp, (31));
112 CONSTANT_REGISTER_DECLARATION(Register, zr, (32));
113 CONSTANT_REGISTER_DECLARATION(Register, sp, (33));
114
115 // Used as a filler in instructions where a register field is unused.
116 const Register dummy_reg = r31_sp;
117
118 // Use FloatRegister as shortcut
119 class FloatRegisterImpl;
120 typedef FloatRegisterImpl* FloatRegister;
121
122 inline FloatRegister as_FloatRegister(int encoding) {
123 return (FloatRegister)(intptr_t) encoding;
124 }
125
126 // The implementation of floating point registers for the architecture
127 class FloatRegisterImpl: public AbstractRegisterImpl {
128 public:
129 enum {
130 number_of_registers = 32
|