src/cpu/ppc/vm/register_ppc.hpp

Wed, 15 Apr 2020 11:49:55 +0800

author
aoqi
date
Wed, 15 Apr 2020 11:49:55 +0800
changeset 9852
70aa912cebe5
parent 9703
2fdf635bcf28
permissions
-rw-r--r--

Merge

goetz@6458 1 /*
gromero@9662 2 * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
gromero@9662 3 * Copyright 2012, 2018 SAP AG. All rights reserved.
goetz@6458 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
goetz@6458 5 *
goetz@6458 6 * This code is free software; you can redistribute it and/or modify it
goetz@6458 7 * under the terms of the GNU General Public License version 2 only, as
goetz@6458 8 * published by the Free Software Foundation.
goetz@6458 9 *
goetz@6458 10 * This code is distributed in the hope that it will be useful, but WITHOUT
goetz@6458 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
goetz@6458 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
goetz@6458 13 * version 2 for more details (a copy is included in the LICENSE file that
goetz@6458 14 * accompanied this code).
goetz@6458 15 *
goetz@6458 16 * You should have received a copy of the GNU General Public License version
goetz@6458 17 * 2 along with this work; if not, write to the Free Software Foundation,
goetz@6458 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
goetz@6458 19 *
goetz@6458 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
goetz@6458 21 * or visit www.oracle.com if you need additional information or have any
goetz@6458 22 * questions.
goetz@6458 23 *
goetz@6458 24 */
goetz@6458 25
goetz@6458 26 #ifndef CPU_PPC_VM_REGISTER_PPC_HPP
goetz@6458 27 #define CPU_PPC_VM_REGISTER_PPC_HPP
goetz@6458 28
goetz@6458 29 #include "asm/register.hpp"
goetz@6458 30 #include "vm_version_ppc.hpp"
goetz@6458 31
goetz@6458 32 // forward declaration
goetz@6458 33 class Address;
goetz@6458 34 class VMRegImpl;
goetz@6458 35 typedef VMRegImpl* VMReg;
goetz@6458 36
goetz@6458 37 // PPC64 registers
goetz@6458 38 //
goetz@6458 39 // See "64-bit PowerPC ELF ABI Supplement 1.7", IBM Corp. (2003-10-29).
goetz@6458 40 // (http://math-atlas.sourceforge.net/devel/assembly/PPC-elf64abi-1.7.pdf)
goetz@6458 41 //
goetz@6458 42 // r0 Register used in function prologs (volatile)
goetz@6458 43 // r1 Stack pointer (nonvolatile)
goetz@6458 44 // r2 TOC pointer (volatile)
goetz@6458 45 // r3 Parameter and return value (volatile)
goetz@6458 46 // r4-r10 Function parameters (volatile)
goetz@6458 47 // r11 Register used in calls by pointer and as an environment pointer for languages which require one (volatile)
goetz@6458 48 // r12 Register used for exception handling and glink code (volatile)
goetz@6458 49 // r13 Reserved for use as system thread ID
goetz@6458 50 // r14-r31 Local variables (nonvolatile)
goetz@6458 51 //
goetz@6458 52 // f0 Scratch register (volatile)
goetz@6458 53 // f1-f4 Floating point parameters and return value (volatile)
goetz@6458 54 // f5-f13 Floating point parameters (volatile)
goetz@6458 55 // f14-f31 Floating point values (nonvolatile)
goetz@6458 56 //
goetz@6458 57 // LR Link register for return address (volatile)
goetz@6458 58 // CTR Loop counter (volatile)
goetz@6458 59 // XER Fixed point exception register (volatile)
goetz@6458 60 // FPSCR Floating point status and control register (volatile)
goetz@6458 61 //
goetz@6458 62 // CR0-CR1 Condition code fields (volatile)
goetz@6495 63 // CR2-CR4 Condition code fields (nonvolatile)
goetz@6495 64 // CR5-CR7 Condition code fields (volatile)
goetz@6458 65 //
goetz@6458 66 // ----------------------------------------------
goetz@6458 67 // On processors with the VMX feature:
goetz@6458 68 // v0-v1 Volatile scratch registers
goetz@6458 69 // v2-v13 Volatile vector parameters registers
goetz@6458 70 // v14-v19 Volatile scratch registers
goetz@6458 71 // v20-v31 Non-volatile registers
goetz@6458 72 // vrsave Non-volatile 32-bit register
goetz@6458 73
goetz@6458 74
goetz@6458 75 // Use Register as shortcut
goetz@6458 76 class RegisterImpl;
goetz@6458 77 typedef RegisterImpl* Register;
goetz@6458 78
goetz@6458 79 inline Register as_Register(int encoding) {
goetz@6458 80 assert(encoding >= 0 && encoding < 32, "bad register encoding");
goetz@6458 81 return (Register)(intptr_t)encoding;
goetz@6458 82 }
goetz@6458 83
goetz@6458 84 // The implementation of integer registers for the Power architecture
goetz@6458 85 class RegisterImpl: public AbstractRegisterImpl {
goetz@6458 86 public:
goetz@6458 87 enum {
goetz@6458 88 number_of_registers = 32
goetz@6458 89 };
goetz@6458 90
goetz@6458 91 // general construction
goetz@6458 92 inline friend Register as_Register(int encoding);
goetz@6458 93
goetz@6458 94 // accessors
goetz@6458 95 int encoding() const { assert(is_valid(), "invalid register"); return value(); }
goetz@6458 96 VMReg as_VMReg();
goetz@6458 97 Register successor() const { return as_Register(encoding() + 1); }
goetz@6458 98
goetz@6458 99 // testers
goetz@6458 100 bool is_valid() const { return ( 0 <= (value()&0x7F) && (value()&0x7F) < number_of_registers); }
goetz@6458 101 bool is_volatile() const { return ( 0 <= (value()&0x7F) && (value()&0x7F) <= 13 ); }
goetz@6458 102 bool is_nonvolatile() const { return (14 <= (value()&0x7F) && (value()&0x7F) <= 31 ); }
goetz@6458 103
goetz@6458 104 const char* name() const;
goetz@6458 105 };
goetz@6458 106
goetz@6458 107 // The integer registers of the PPC architecture
goetz@6458 108 CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1));
goetz@6458 109
goetz@6458 110 CONSTANT_REGISTER_DECLARATION(Register, R0, (0));
goetz@6458 111 CONSTANT_REGISTER_DECLARATION(Register, R1, (1));
goetz@6458 112 CONSTANT_REGISTER_DECLARATION(Register, R2, (2));
goetz@6458 113 CONSTANT_REGISTER_DECLARATION(Register, R3, (3));
goetz@6458 114 CONSTANT_REGISTER_DECLARATION(Register, R4, (4));
goetz@6458 115 CONSTANT_REGISTER_DECLARATION(Register, R5, (5));
goetz@6458 116 CONSTANT_REGISTER_DECLARATION(Register, R6, (6));
goetz@6458 117 CONSTANT_REGISTER_DECLARATION(Register, R7, (7));
goetz@6458 118 CONSTANT_REGISTER_DECLARATION(Register, R8, (8));
goetz@6458 119 CONSTANT_REGISTER_DECLARATION(Register, R9, (9));
goetz@6458 120 CONSTANT_REGISTER_DECLARATION(Register, R10, (10));
goetz@6458 121 CONSTANT_REGISTER_DECLARATION(Register, R11, (11));
goetz@6458 122 CONSTANT_REGISTER_DECLARATION(Register, R12, (12));
goetz@6458 123 CONSTANT_REGISTER_DECLARATION(Register, R13, (13));
goetz@6458 124 CONSTANT_REGISTER_DECLARATION(Register, R14, (14));
goetz@6458 125 CONSTANT_REGISTER_DECLARATION(Register, R15, (15));
goetz@6458 126 CONSTANT_REGISTER_DECLARATION(Register, R16, (16));
goetz@6458 127 CONSTANT_REGISTER_DECLARATION(Register, R17, (17));
goetz@6458 128 CONSTANT_REGISTER_DECLARATION(Register, R18, (18));
goetz@6458 129 CONSTANT_REGISTER_DECLARATION(Register, R19, (19));
goetz@6458 130 CONSTANT_REGISTER_DECLARATION(Register, R20, (20));
goetz@6458 131 CONSTANT_REGISTER_DECLARATION(Register, R21, (21));
goetz@6458 132 CONSTANT_REGISTER_DECLARATION(Register, R22, (22));
goetz@6458 133 CONSTANT_REGISTER_DECLARATION(Register, R23, (23));
goetz@6458 134 CONSTANT_REGISTER_DECLARATION(Register, R24, (24));
goetz@6458 135 CONSTANT_REGISTER_DECLARATION(Register, R25, (25));
goetz@6458 136 CONSTANT_REGISTER_DECLARATION(Register, R26, (26));
goetz@6458 137 CONSTANT_REGISTER_DECLARATION(Register, R27, (27));
goetz@6458 138 CONSTANT_REGISTER_DECLARATION(Register, R28, (28));
goetz@6458 139 CONSTANT_REGISTER_DECLARATION(Register, R29, (29));
goetz@6458 140 CONSTANT_REGISTER_DECLARATION(Register, R30, (30));
goetz@6458 141 CONSTANT_REGISTER_DECLARATION(Register, R31, (31));
goetz@6458 142
goetz@6458 143
goetz@6458 144 //
goetz@6458 145 // Because Power has many registers, #define'ing values for them is
goetz@6458 146 // beneficial in code size and is worth the cost of some of the
goetz@6458 147 // dangers of defines. If a particular file has a problem with these
goetz@6458 148 // defines then it's possible to turn them off in that file by
goetz@6458 149 // defining DONT_USE_REGISTER_DEFINES. Register_definition_ppc.cpp
goetz@6458 150 // does that so that it's able to provide real definitions of these
goetz@6458 151 // registers for use in debuggers and such.
goetz@6458 152 //
goetz@6458 153
goetz@6458 154 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 155 #define noreg ((Register)(noreg_RegisterEnumValue))
goetz@6458 156
goetz@6458 157 #define R0 ((Register)(R0_RegisterEnumValue))
goetz@6458 158 #define R1 ((Register)(R1_RegisterEnumValue))
goetz@6458 159 #define R2 ((Register)(R2_RegisterEnumValue))
goetz@6458 160 #define R3 ((Register)(R3_RegisterEnumValue))
goetz@6458 161 #define R4 ((Register)(R4_RegisterEnumValue))
goetz@6458 162 #define R5 ((Register)(R5_RegisterEnumValue))
goetz@6458 163 #define R6 ((Register)(R6_RegisterEnumValue))
goetz@6458 164 #define R7 ((Register)(R7_RegisterEnumValue))
goetz@6458 165 #define R8 ((Register)(R8_RegisterEnumValue))
goetz@6458 166 #define R9 ((Register)(R9_RegisterEnumValue))
goetz@6458 167 #define R10 ((Register)(R10_RegisterEnumValue))
goetz@6458 168 #define R11 ((Register)(R11_RegisterEnumValue))
goetz@6458 169 #define R12 ((Register)(R12_RegisterEnumValue))
goetz@6458 170 #define R13 ((Register)(R13_RegisterEnumValue))
goetz@6458 171 #define R14 ((Register)(R14_RegisterEnumValue))
goetz@6458 172 #define R15 ((Register)(R15_RegisterEnumValue))
goetz@6458 173 #define R16 ((Register)(R16_RegisterEnumValue))
goetz@6458 174 #define R17 ((Register)(R17_RegisterEnumValue))
goetz@6458 175 #define R18 ((Register)(R18_RegisterEnumValue))
goetz@6458 176 #define R19 ((Register)(R19_RegisterEnumValue))
goetz@6458 177 #define R20 ((Register)(R20_RegisterEnumValue))
goetz@6458 178 #define R21 ((Register)(R21_RegisterEnumValue))
goetz@6458 179 #define R22 ((Register)(R22_RegisterEnumValue))
goetz@6458 180 #define R23 ((Register)(R23_RegisterEnumValue))
goetz@6458 181 #define R24 ((Register)(R24_RegisterEnumValue))
goetz@6458 182 #define R25 ((Register)(R25_RegisterEnumValue))
goetz@6458 183 #define R26 ((Register)(R26_RegisterEnumValue))
goetz@6458 184 #define R27 ((Register)(R27_RegisterEnumValue))
goetz@6458 185 #define R28 ((Register)(R28_RegisterEnumValue))
goetz@6458 186 #define R29 ((Register)(R29_RegisterEnumValue))
goetz@6458 187 #define R30 ((Register)(R30_RegisterEnumValue))
goetz@6458 188 #define R31 ((Register)(R31_RegisterEnumValue))
goetz@6458 189 #endif
goetz@6458 190
goetz@6458 191 // Use ConditionRegister as shortcut
goetz@6458 192 class ConditionRegisterImpl;
goetz@6458 193 typedef ConditionRegisterImpl* ConditionRegister;
goetz@6458 194
goetz@6458 195 inline ConditionRegister as_ConditionRegister(int encoding) {
goetz@6458 196 assert(encoding >= 0 && encoding < 8, "bad condition register encoding");
goetz@6458 197 return (ConditionRegister)(intptr_t)encoding;
goetz@6458 198 }
goetz@6458 199
goetz@6458 200 // The implementation of condition register(s) for the PPC architecture
goetz@6458 201 class ConditionRegisterImpl: public AbstractRegisterImpl {
goetz@6458 202 public:
goetz@6458 203 enum {
goetz@6458 204 number_of_registers = 8
goetz@6458 205 };
goetz@6458 206
goetz@6458 207 // construction.
goetz@6458 208 inline friend ConditionRegister as_ConditionRegister(int encoding);
goetz@6458 209
goetz@6458 210 // accessors
goetz@6458 211 int encoding() const { assert(is_valid(), "invalid register"); return value(); }
goetz@6458 212 VMReg as_VMReg();
goetz@6458 213
goetz@6458 214 // testers
goetz@6458 215 bool is_valid() const { return (0 <= value() && value() < number_of_registers); }
goetz@6458 216 bool is_nonvolatile() const { return (2 <= (value()&0x7F) && (value()&0x7F) <= 4 ); }
goetz@6458 217
goetz@6458 218 const char* name() const;
goetz@6458 219 };
goetz@6458 220
goetz@6458 221 // The (parts of the) condition register(s) of the PPC architecture
goetz@6458 222 // sys/ioctl.h on AIX defines CR0-CR3, so I name these CCR.
goetz@6458 223 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR0, (0));
goetz@6458 224 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR1, (1));
goetz@6458 225 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR2, (2));
goetz@6458 226 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR3, (3));
goetz@6458 227 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR4, (4));
goetz@6458 228 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR5, (5));
goetz@6458 229 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR6, (6));
goetz@6458 230 CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR7, (7));
goetz@6458 231
goetz@6458 232 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 233
goetz@6458 234 #define CCR0 ((ConditionRegister)(CCR0_ConditionRegisterEnumValue))
goetz@6458 235 #define CCR1 ((ConditionRegister)(CCR1_ConditionRegisterEnumValue))
goetz@6458 236 #define CCR2 ((ConditionRegister)(CCR2_ConditionRegisterEnumValue))
goetz@6458 237 #define CCR3 ((ConditionRegister)(CCR3_ConditionRegisterEnumValue))
goetz@6458 238 #define CCR4 ((ConditionRegister)(CCR4_ConditionRegisterEnumValue))
goetz@6458 239 #define CCR5 ((ConditionRegister)(CCR5_ConditionRegisterEnumValue))
goetz@6458 240 #define CCR6 ((ConditionRegister)(CCR6_ConditionRegisterEnumValue))
goetz@6458 241 #define CCR7 ((ConditionRegister)(CCR7_ConditionRegisterEnumValue))
goetz@6458 242
goetz@6458 243 #endif // DONT_USE_REGISTER_DEFINES
goetz@6458 244
goetz@6458 245
goetz@6458 246 // Use FloatRegister as shortcut
goetz@6458 247 class FloatRegisterImpl;
goetz@6458 248 typedef FloatRegisterImpl* FloatRegister;
goetz@6458 249
goetz@6458 250 inline FloatRegister as_FloatRegister(int encoding) {
goetz@6458 251 assert(encoding >= 0 && encoding < 32, "bad float register encoding");
goetz@6458 252 return (FloatRegister)(intptr_t)encoding;
goetz@6458 253 }
goetz@6458 254
goetz@6458 255 // The implementation of float registers for the PPC architecture
goetz@6458 256 class FloatRegisterImpl: public AbstractRegisterImpl {
goetz@6458 257 public:
goetz@6458 258 enum {
goetz@6458 259 number_of_registers = 32
goetz@6458 260 };
goetz@6458 261
goetz@6458 262 // construction
goetz@6458 263 inline friend FloatRegister as_FloatRegister(int encoding);
goetz@6458 264
goetz@6458 265 // accessors
goetz@6458 266 int encoding() const { assert(is_valid(), "invalid register"); return value(); }
goetz@6458 267 VMReg as_VMReg();
goetz@6458 268 FloatRegister successor() const { return as_FloatRegister(encoding() + 1); }
goetz@6458 269
goetz@6458 270 // testers
goetz@6458 271 bool is_valid() const { return (0 <= value() && value() < number_of_registers); }
goetz@6458 272
goetz@6458 273 const char* name() const;
goetz@6458 274 };
goetz@6458 275
goetz@6458 276 // The float registers of the PPC architecture
goetz@6458 277 CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg, (-1));
goetz@6458 278
goetz@6458 279 CONSTANT_REGISTER_DECLARATION(FloatRegister, F0, ( 0));
goetz@6458 280 CONSTANT_REGISTER_DECLARATION(FloatRegister, F1, ( 1));
goetz@6458 281 CONSTANT_REGISTER_DECLARATION(FloatRegister, F2, ( 2));
goetz@6458 282 CONSTANT_REGISTER_DECLARATION(FloatRegister, F3, ( 3));
goetz@6458 283 CONSTANT_REGISTER_DECLARATION(FloatRegister, F4, ( 4));
goetz@6458 284 CONSTANT_REGISTER_DECLARATION(FloatRegister, F5, ( 5));
goetz@6458 285 CONSTANT_REGISTER_DECLARATION(FloatRegister, F6, ( 6));
goetz@6458 286 CONSTANT_REGISTER_DECLARATION(FloatRegister, F7, ( 7));
goetz@6458 287 CONSTANT_REGISTER_DECLARATION(FloatRegister, F8, ( 8));
goetz@6458 288 CONSTANT_REGISTER_DECLARATION(FloatRegister, F9, ( 9));
goetz@6458 289 CONSTANT_REGISTER_DECLARATION(FloatRegister, F10, (10));
goetz@6458 290 CONSTANT_REGISTER_DECLARATION(FloatRegister, F11, (11));
goetz@6458 291 CONSTANT_REGISTER_DECLARATION(FloatRegister, F12, (12));
goetz@6458 292 CONSTANT_REGISTER_DECLARATION(FloatRegister, F13, (13));
goetz@6458 293 CONSTANT_REGISTER_DECLARATION(FloatRegister, F14, (14));
goetz@6458 294 CONSTANT_REGISTER_DECLARATION(FloatRegister, F15, (15));
goetz@6458 295 CONSTANT_REGISTER_DECLARATION(FloatRegister, F16, (16));
goetz@6458 296 CONSTANT_REGISTER_DECLARATION(FloatRegister, F17, (17));
goetz@6458 297 CONSTANT_REGISTER_DECLARATION(FloatRegister, F18, (18));
goetz@6458 298 CONSTANT_REGISTER_DECLARATION(FloatRegister, F19, (19));
goetz@6458 299 CONSTANT_REGISTER_DECLARATION(FloatRegister, F20, (20));
goetz@6458 300 CONSTANT_REGISTER_DECLARATION(FloatRegister, F21, (21));
goetz@6458 301 CONSTANT_REGISTER_DECLARATION(FloatRegister, F22, (22));
goetz@6458 302 CONSTANT_REGISTER_DECLARATION(FloatRegister, F23, (23));
goetz@6458 303 CONSTANT_REGISTER_DECLARATION(FloatRegister, F24, (24));
goetz@6458 304 CONSTANT_REGISTER_DECLARATION(FloatRegister, F25, (25));
goetz@6458 305 CONSTANT_REGISTER_DECLARATION(FloatRegister, F26, (26));
goetz@6458 306 CONSTANT_REGISTER_DECLARATION(FloatRegister, F27, (27));
goetz@6458 307 CONSTANT_REGISTER_DECLARATION(FloatRegister, F28, (28));
goetz@6458 308 CONSTANT_REGISTER_DECLARATION(FloatRegister, F29, (29));
goetz@6458 309 CONSTANT_REGISTER_DECLARATION(FloatRegister, F30, (30));
goetz@6458 310 CONSTANT_REGISTER_DECLARATION(FloatRegister, F31, (31));
goetz@6458 311
goetz@6458 312 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 313 #define fnoreg ((FloatRegister)(fnoreg_FloatRegisterEnumValue))
goetz@6458 314 #define F0 ((FloatRegister)( F0_FloatRegisterEnumValue))
goetz@6458 315 #define F1 ((FloatRegister)( F1_FloatRegisterEnumValue))
goetz@6458 316 #define F2 ((FloatRegister)( F2_FloatRegisterEnumValue))
goetz@6458 317 #define F3 ((FloatRegister)( F3_FloatRegisterEnumValue))
goetz@6458 318 #define F4 ((FloatRegister)( F4_FloatRegisterEnumValue))
goetz@6458 319 #define F5 ((FloatRegister)( F5_FloatRegisterEnumValue))
goetz@6458 320 #define F6 ((FloatRegister)( F6_FloatRegisterEnumValue))
goetz@6458 321 #define F7 ((FloatRegister)( F7_FloatRegisterEnumValue))
goetz@6458 322 #define F8 ((FloatRegister)( F8_FloatRegisterEnumValue))
goetz@6458 323 #define F9 ((FloatRegister)( F9_FloatRegisterEnumValue))
goetz@6458 324 #define F10 ((FloatRegister)( F10_FloatRegisterEnumValue))
goetz@6458 325 #define F11 ((FloatRegister)( F11_FloatRegisterEnumValue))
goetz@6458 326 #define F12 ((FloatRegister)( F12_FloatRegisterEnumValue))
goetz@6458 327 #define F13 ((FloatRegister)( F13_FloatRegisterEnumValue))
goetz@6458 328 #define F14 ((FloatRegister)( F14_FloatRegisterEnumValue))
goetz@6458 329 #define F15 ((FloatRegister)( F15_FloatRegisterEnumValue))
goetz@6458 330 #define F16 ((FloatRegister)( F16_FloatRegisterEnumValue))
goetz@6458 331 #define F17 ((FloatRegister)( F17_FloatRegisterEnumValue))
goetz@6458 332 #define F18 ((FloatRegister)( F18_FloatRegisterEnumValue))
goetz@6458 333 #define F19 ((FloatRegister)( F19_FloatRegisterEnumValue))
goetz@6458 334 #define F20 ((FloatRegister)( F20_FloatRegisterEnumValue))
goetz@6458 335 #define F21 ((FloatRegister)( F21_FloatRegisterEnumValue))
goetz@6458 336 #define F22 ((FloatRegister)( F22_FloatRegisterEnumValue))
goetz@6458 337 #define F23 ((FloatRegister)( F23_FloatRegisterEnumValue))
goetz@6458 338 #define F24 ((FloatRegister)( F24_FloatRegisterEnumValue))
goetz@6458 339 #define F25 ((FloatRegister)( F25_FloatRegisterEnumValue))
goetz@6458 340 #define F26 ((FloatRegister)( F26_FloatRegisterEnumValue))
goetz@6458 341 #define F27 ((FloatRegister)( F27_FloatRegisterEnumValue))
goetz@6458 342 #define F28 ((FloatRegister)( F28_FloatRegisterEnumValue))
goetz@6458 343 #define F29 ((FloatRegister)( F29_FloatRegisterEnumValue))
goetz@6458 344 #define F30 ((FloatRegister)( F30_FloatRegisterEnumValue))
goetz@6458 345 #define F31 ((FloatRegister)( F31_FloatRegisterEnumValue))
goetz@6458 346 #endif // DONT_USE_REGISTER_DEFINES
goetz@6458 347
goetz@6458 348 // Use SpecialRegister as shortcut
goetz@6458 349 class SpecialRegisterImpl;
goetz@6458 350 typedef SpecialRegisterImpl* SpecialRegister;
goetz@6458 351
goetz@6458 352 inline SpecialRegister as_SpecialRegister(int encoding) {
goetz@6458 353 return (SpecialRegister)(intptr_t)encoding;
goetz@6458 354 }
goetz@6458 355
goetz@6458 356 // The implementation of special registers for the Power architecture (LR, CTR and friends)
goetz@6458 357 class SpecialRegisterImpl: public AbstractRegisterImpl {
goetz@6458 358 public:
goetz@6458 359 enum {
goetz@6458 360 number_of_registers = 6
goetz@6458 361 };
goetz@6458 362
goetz@6458 363 // construction
goetz@6458 364 inline friend SpecialRegister as_SpecialRegister(int encoding);
goetz@6458 365
goetz@6458 366 // accessors
goetz@6458 367 int encoding() const { assert(is_valid(), "invalid register"); return value(); }
goetz@6458 368 VMReg as_VMReg();
goetz@6458 369
goetz@6458 370 // testers
goetz@6458 371 bool is_valid() const { return 0 <= value() && value() < number_of_registers; }
goetz@6458 372
goetz@6458 373 const char* name() const;
goetz@6458 374 };
goetz@6458 375
goetz@6458 376 // The special registers of the PPC architecture
goetz@6458 377 CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_XER, (0));
goetz@6458 378 CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_LR, (1));
goetz@6458 379 CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_CTR, (2));
goetz@6458 380 CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_VRSAVE, (3));
goetz@6458 381 CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_SPEFSCR, (4));
goetz@6458 382 CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_PPR, (5));
goetz@6458 383
goetz@6458 384 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 385 #define SR_XER ((SpecialRegister)(SR_XER_SpecialRegisterEnumValue))
goetz@6458 386 #define SR_LR ((SpecialRegister)(SR_LR_SpecialRegisterEnumValue))
goetz@6458 387 #define SR_CTR ((SpecialRegister)(SR_CTR_SpecialRegisterEnumValue))
goetz@6458 388 #define SR_VRSAVE ((SpecialRegister)(SR_VRSAVE_SpecialRegisterEnumValue))
goetz@6458 389 #define SR_SPEFSCR ((SpecialRegister)(SR_SPEFSCR_SpecialRegisterEnumValue))
goetz@6458 390 #define SR_PPR ((SpecialRegister)(SR_PPR_SpecialRegisterEnumValue))
goetz@6458 391 #endif // DONT_USE_REGISTER_DEFINES
goetz@6458 392
goetz@6458 393
goetz@6458 394 // Use VectorRegister as shortcut
goetz@6458 395 class VectorRegisterImpl;
goetz@6458 396 typedef VectorRegisterImpl* VectorRegister;
goetz@6458 397
goetz@6458 398 inline VectorRegister as_VectorRegister(int encoding) {
goetz@6458 399 return (VectorRegister)(intptr_t)encoding;
goetz@6458 400 }
goetz@6458 401
gromero@9687 402 // Forward declaration
gromero@9687 403 // Use VectorSRegister as a shortcut.
gromero@9687 404 class VectorSRegisterImpl;
gromero@9687 405 typedef VectorSRegisterImpl* VectorSRegister;
gromero@9687 406
goetz@6458 407 // The implementation of vector registers for the Power architecture
goetz@6458 408 class VectorRegisterImpl: public AbstractRegisterImpl {
goetz@6458 409 public:
goetz@6458 410 enum {
goetz@6458 411 number_of_registers = 32
goetz@6458 412 };
goetz@6458 413
goetz@6458 414 // construction
goetz@6458 415 inline friend VectorRegister as_VectorRegister(int encoding);
goetz@6458 416
goetz@6458 417 // accessors
goetz@6458 418 int encoding() const { assert(is_valid(), "invalid register"); return value(); }
goetz@6458 419
goetz@6458 420 // testers
goetz@6458 421 bool is_valid() const { return 0 <= value() && value() < number_of_registers; }
goetz@6458 422
goetz@6458 423 const char* name() const;
gromero@9687 424
gromero@9687 425 // convert to VSR
gromero@9687 426 VectorSRegister to_vsr() const;
goetz@6458 427 };
goetz@6458 428
goetz@6458 429 // The Vector registers of the Power architecture
goetz@6458 430
goetz@6458 431 CONSTANT_REGISTER_DECLARATION(VectorRegister, vnoreg, (-1));
goetz@6458 432
goetz@6458 433 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR0, ( 0));
goetz@6458 434 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR1, ( 1));
goetz@6458 435 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR2, ( 2));
goetz@6458 436 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR3, ( 3));
goetz@6458 437 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR4, ( 4));
goetz@6458 438 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR5, ( 5));
goetz@6458 439 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR6, ( 6));
goetz@6458 440 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR7, ( 7));
goetz@6458 441 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR8, ( 8));
goetz@6458 442 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR9, ( 9));
goetz@6458 443 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR10, (10));
goetz@6458 444 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR11, (11));
goetz@6458 445 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR12, (12));
goetz@6458 446 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR13, (13));
goetz@6458 447 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR14, (14));
goetz@6458 448 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR15, (15));
goetz@6458 449 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR16, (16));
goetz@6458 450 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR17, (17));
goetz@6458 451 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR18, (18));
goetz@6458 452 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR19, (19));
goetz@6458 453 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR20, (20));
goetz@6458 454 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR21, (21));
goetz@6458 455 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR22, (22));
goetz@6458 456 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR23, (23));
goetz@6458 457 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR24, (24));
goetz@6458 458 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR25, (25));
goetz@6458 459 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR26, (26));
goetz@6458 460 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR27, (27));
goetz@6458 461 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR28, (28));
goetz@6458 462 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR29, (29));
goetz@6458 463 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR30, (30));
goetz@6458 464 CONSTANT_REGISTER_DECLARATION(VectorRegister, VR31, (31));
goetz@6458 465
goetz@6458 466 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 467 #define vnoreg ((VectorRegister)(vnoreg_VectorRegisterEnumValue))
goetz@6458 468 #define VR0 ((VectorRegister)( VR0_VectorRegisterEnumValue))
goetz@6458 469 #define VR1 ((VectorRegister)( VR1_VectorRegisterEnumValue))
goetz@6458 470 #define VR2 ((VectorRegister)( VR2_VectorRegisterEnumValue))
goetz@6458 471 #define VR3 ((VectorRegister)( VR3_VectorRegisterEnumValue))
goetz@6458 472 #define VR4 ((VectorRegister)( VR4_VectorRegisterEnumValue))
goetz@6458 473 #define VR5 ((VectorRegister)( VR5_VectorRegisterEnumValue))
goetz@6458 474 #define VR6 ((VectorRegister)( VR6_VectorRegisterEnumValue))
goetz@6458 475 #define VR7 ((VectorRegister)( VR7_VectorRegisterEnumValue))
goetz@6458 476 #define VR8 ((VectorRegister)( VR8_VectorRegisterEnumValue))
goetz@6458 477 #define VR9 ((VectorRegister)( VR9_VectorRegisterEnumValue))
goetz@6458 478 #define VR10 ((VectorRegister)( VR10_VectorRegisterEnumValue))
goetz@6458 479 #define VR11 ((VectorRegister)( VR11_VectorRegisterEnumValue))
goetz@6458 480 #define VR12 ((VectorRegister)( VR12_VectorRegisterEnumValue))
goetz@6458 481 #define VR13 ((VectorRegister)( VR13_VectorRegisterEnumValue))
goetz@6458 482 #define VR14 ((VectorRegister)( VR14_VectorRegisterEnumValue))
goetz@6458 483 #define VR15 ((VectorRegister)( VR15_VectorRegisterEnumValue))
goetz@6458 484 #define VR16 ((VectorRegister)( VR16_VectorRegisterEnumValue))
goetz@6458 485 #define VR17 ((VectorRegister)( VR17_VectorRegisterEnumValue))
goetz@6458 486 #define VR18 ((VectorRegister)( VR18_VectorRegisterEnumValue))
goetz@6458 487 #define VR19 ((VectorRegister)( VR19_VectorRegisterEnumValue))
goetz@6458 488 #define VR20 ((VectorRegister)( VR20_VectorRegisterEnumValue))
goetz@6458 489 #define VR21 ((VectorRegister)( VR21_VectorRegisterEnumValue))
goetz@6458 490 #define VR22 ((VectorRegister)( VR22_VectorRegisterEnumValue))
goetz@6458 491 #define VR23 ((VectorRegister)( VR23_VectorRegisterEnumValue))
goetz@6458 492 #define VR24 ((VectorRegister)( VR24_VectorRegisterEnumValue))
goetz@6458 493 #define VR25 ((VectorRegister)( VR25_VectorRegisterEnumValue))
goetz@6458 494 #define VR26 ((VectorRegister)( VR26_VectorRegisterEnumValue))
goetz@6458 495 #define VR27 ((VectorRegister)( VR27_VectorRegisterEnumValue))
goetz@6458 496 #define VR28 ((VectorRegister)( VR28_VectorRegisterEnumValue))
goetz@6458 497 #define VR29 ((VectorRegister)( VR29_VectorRegisterEnumValue))
goetz@6458 498 #define VR30 ((VectorRegister)( VR30_VectorRegisterEnumValue))
goetz@6458 499 #define VR31 ((VectorRegister)( VR31_VectorRegisterEnumValue))
goetz@6458 500 #endif // DONT_USE_REGISTER_DEFINES
goetz@6458 501
goetz@6458 502
gromero@9662 503 inline VectorSRegister as_VectorSRegister(int encoding) {
gromero@9662 504 return (VectorSRegister)(intptr_t)encoding;
gromero@9662 505 }
gromero@9662 506
gromero@9662 507 // The implementation of Vector-Scalar (VSX) registers on POWER architecture.
gromero@9662 508 class VectorSRegisterImpl: public AbstractRegisterImpl {
gromero@9662 509 public:
gromero@9662 510 enum {
gromero@9687 511 number_of_registers = 64
gromero@9662 512 };
gromero@9662 513
gromero@9662 514 // construction
gromero@9662 515 inline friend VectorSRegister as_VectorSRegister(int encoding);
gromero@9662 516
gromero@9662 517 // accessors
gromero@9662 518 int encoding() const { assert(is_valid(), "invalid register"); return value(); }
gromero@9662 519
gromero@9662 520 // testers
gromero@9662 521 bool is_valid() const { return 0 <= value() && value() < number_of_registers; }
gromero@9662 522
gromero@9662 523 const char* name() const;
gromero@9662 524 };
gromero@9662 525
gromero@9662 526 // The Vector-Scalar (VSX) registers of the POWER architecture.
gromero@9662 527
gromero@9662 528 CONSTANT_REGISTER_DECLARATION(VectorSRegister, vsnoreg, (-1));
gromero@9662 529
gromero@9662 530 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR0, ( 0));
gromero@9662 531 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR1, ( 1));
gromero@9662 532 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR2, ( 2));
gromero@9662 533 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR3, ( 3));
gromero@9662 534 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR4, ( 4));
gromero@9662 535 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR5, ( 5));
gromero@9662 536 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR6, ( 6));
gromero@9662 537 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR7, ( 7));
gromero@9662 538 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR8, ( 8));
gromero@9662 539 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR9, ( 9));
gromero@9662 540 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR10, (10));
gromero@9662 541 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR11, (11));
gromero@9662 542 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR12, (12));
gromero@9662 543 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR13, (13));
gromero@9662 544 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR14, (14));
gromero@9662 545 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR15, (15));
gromero@9662 546 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR16, (16));
gromero@9662 547 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR17, (17));
gromero@9662 548 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR18, (18));
gromero@9662 549 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR19, (19));
gromero@9662 550 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR20, (20));
gromero@9662 551 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR21, (21));
gromero@9662 552 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR22, (22));
gromero@9662 553 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR23, (23));
gromero@9662 554 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR24, (24));
gromero@9662 555 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR25, (25));
gromero@9662 556 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR26, (26));
gromero@9662 557 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR27, (27));
gromero@9662 558 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR28, (28));
gromero@9662 559 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR29, (29));
gromero@9662 560 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR30, (30));
gromero@9662 561 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR31, (31));
gromero@9687 562 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR32, (32));
gromero@9687 563 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR33, (33));
gromero@9687 564 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR34, (34));
gromero@9687 565 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR35, (35));
gromero@9687 566 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR36, (36));
gromero@9687 567 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR37, (37));
gromero@9687 568 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR38, (38));
gromero@9687 569 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR39, (39));
gromero@9687 570 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR40, (40));
gromero@9687 571 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR41, (41));
gromero@9687 572 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR42, (42));
gromero@9687 573 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR43, (43));
gromero@9687 574 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR44, (44));
gromero@9687 575 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR45, (45));
gromero@9687 576 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR46, (46));
gromero@9687 577 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR47, (47));
gromero@9687 578 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR48, (48));
gromero@9687 579 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR49, (49));
gromero@9687 580 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR50, (50));
gromero@9687 581 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR51, (51));
gromero@9687 582 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR52, (52));
gromero@9687 583 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR53, (53));
gromero@9687 584 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR54, (54));
gromero@9687 585 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR55, (55));
gromero@9687 586 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR56, (56));
gromero@9687 587 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR57, (57));
gromero@9687 588 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR58, (58));
gromero@9687 589 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR59, (59));
gromero@9687 590 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR60, (60));
gromero@9687 591 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR61, (61));
gromero@9687 592 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR62, (62));
gromero@9687 593 CONSTANT_REGISTER_DECLARATION(VectorSRegister, VSR63, (63));
gromero@9662 594
gromero@9662 595 #ifndef DONT_USE_REGISTER_DEFINES
gromero@9662 596 #define vsnoregi ((VectorSRegister)(vsnoreg_VectorSRegisterEnumValue))
gromero@9662 597 #define VSR0 ((VectorSRegister)( VSR0_VectorSRegisterEnumValue))
gromero@9662 598 #define VSR1 ((VectorSRegister)( VSR1_VectorSRegisterEnumValue))
gromero@9662 599 #define VSR2 ((VectorSRegister)( VSR2_VectorSRegisterEnumValue))
gromero@9662 600 #define VSR3 ((VectorSRegister)( VSR3_VectorSRegisterEnumValue))
gromero@9662 601 #define VSR4 ((VectorSRegister)( VSR4_VectorSRegisterEnumValue))
gromero@9662 602 #define VSR5 ((VectorSRegister)( VSR5_VectorSRegisterEnumValue))
gromero@9662 603 #define VSR6 ((VectorSRegister)( VSR6_VectorSRegisterEnumValue))
gromero@9662 604 #define VSR7 ((VectorSRegister)( VSR7_VectorSRegisterEnumValue))
gromero@9662 605 #define VSR8 ((VectorSRegister)( VSR8_VectorSRegisterEnumValue))
gromero@9662 606 #define VSR9 ((VectorSRegister)( VSR9_VectorSRegisterEnumValue))
gromero@9662 607 #define VSR10 ((VectorSRegister)( VSR10_VectorSRegisterEnumValue))
gromero@9662 608 #define VSR11 ((VectorSRegister)( VSR11_VectorSRegisterEnumValue))
gromero@9662 609 #define VSR12 ((VectorSRegister)( VSR12_VectorSRegisterEnumValue))
gromero@9662 610 #define VSR13 ((VectorSRegister)( VSR13_VectorSRegisterEnumValue))
gromero@9662 611 #define VSR14 ((VectorSRegister)( VSR14_VectorSRegisterEnumValue))
gromero@9662 612 #define VSR15 ((VectorSRegister)( VSR15_VectorSRegisterEnumValue))
gromero@9662 613 #define VSR16 ((VectorSRegister)( VSR16_VectorSRegisterEnumValue))
gromero@9662 614 #define VSR17 ((VectorSRegister)( VSR17_VectorSRegisterEnumValue))
gromero@9662 615 #define VSR18 ((VectorSRegister)( VSR18_VectorSRegisterEnumValue))
gromero@9662 616 #define VSR19 ((VectorSRegister)( VSR19_VectorSRegisterEnumValue))
gromero@9662 617 #define VSR20 ((VectorSRegister)( VSR20_VectorSRegisterEnumValue))
gromero@9662 618 #define VSR21 ((VectorSRegister)( VSR21_VectorSRegisterEnumValue))
gromero@9662 619 #define VSR22 ((VectorSRegister)( VSR22_VectorSRegisterEnumValue))
gromero@9662 620 #define VSR23 ((VectorSRegister)( VSR23_VectorSRegisterEnumValue))
gromero@9662 621 #define VSR24 ((VectorSRegister)( VSR24_VectorSRegisterEnumValue))
gromero@9662 622 #define VSR25 ((VectorSRegister)( VSR25_VectorSRegisterEnumValue))
gromero@9662 623 #define VSR26 ((VectorSRegister)( VSR26_VectorSRegisterEnumValue))
gromero@9662 624 #define VSR27 ((VectorSRegister)( VSR27_VectorSRegisterEnumValue))
gromero@9662 625 #define VSR28 ((VectorSRegister)( VSR28_VectorSRegisterEnumValue))
gromero@9662 626 #define VSR29 ((VectorSRegister)( VSR29_VectorSRegisterEnumValue))
gromero@9662 627 #define VSR30 ((VectorSRegister)( VSR30_VectorSRegisterEnumValue))
gromero@9662 628 #define VSR31 ((VectorSRegister)( VSR31_VectorSRegisterEnumValue))
gromero@9687 629 #define VSR32 ((VectorSRegister)( VSR32_VectorSRegisterEnumValue))
gromero@9687 630 #define VSR33 ((VectorSRegister)( VSR33_VectorSRegisterEnumValue))
gromero@9687 631 #define VSR34 ((VectorSRegister)( VSR34_VectorSRegisterEnumValue))
gromero@9687 632 #define VSR35 ((VectorSRegister)( VSR35_VectorSRegisterEnumValue))
gromero@9687 633 #define VSR36 ((VectorSRegister)( VSR36_VectorSRegisterEnumValue))
gromero@9687 634 #define VSR37 ((VectorSRegister)( VSR37_VectorSRegisterEnumValue))
gromero@9687 635 #define VSR38 ((VectorSRegister)( VSR38_VectorSRegisterEnumValue))
gromero@9687 636 #define VSR39 ((VectorSRegister)( VSR39_VectorSRegisterEnumValue))
gromero@9687 637 #define VSR40 ((VectorSRegister)( VSR40_VectorSRegisterEnumValue))
gromero@9687 638 #define VSR41 ((VectorSRegister)( VSR41_VectorSRegisterEnumValue))
gromero@9687 639 #define VSR42 ((VectorSRegister)( VSR42_VectorSRegisterEnumValue))
gromero@9687 640 #define VSR43 ((VectorSRegister)( VSR43_VectorSRegisterEnumValue))
gromero@9687 641 #define VSR44 ((VectorSRegister)( VSR44_VectorSRegisterEnumValue))
gromero@9687 642 #define VSR45 ((VectorSRegister)( VSR45_VectorSRegisterEnumValue))
gromero@9687 643 #define VSR46 ((VectorSRegister)( VSR46_VectorSRegisterEnumValue))
gromero@9687 644 #define VSR47 ((VectorSRegister)( VSR47_VectorSRegisterEnumValue))
gromero@9687 645 #define VSR48 ((VectorSRegister)( VSR48_VectorSRegisterEnumValue))
gromero@9687 646 #define VSR49 ((VectorSRegister)( VSR49_VectorSRegisterEnumValue))
gromero@9687 647 #define VSR50 ((VectorSRegister)( VSR50_VectorSRegisterEnumValue))
gromero@9687 648 #define VSR51 ((VectorSRegister)( VSR51_VectorSRegisterEnumValue))
gromero@9687 649 #define VSR52 ((VectorSRegister)( VSR52_VectorSRegisterEnumValue))
gromero@9687 650 #define VSR53 ((VectorSRegister)( VSR53_VectorSRegisterEnumValue))
gromero@9687 651 #define VSR54 ((VectorSRegister)( VSR54_VectorSRegisterEnumValue))
gromero@9687 652 #define VSR55 ((VectorSRegister)( VSR55_VectorSRegisterEnumValue))
gromero@9687 653 #define VSR56 ((VectorSRegister)( VSR56_VectorSRegisterEnumValue))
gromero@9687 654 #define VSR57 ((VectorSRegister)( VSR57_VectorSRegisterEnumValue))
gromero@9687 655 #define VSR58 ((VectorSRegister)( VSR58_VectorSRegisterEnumValue))
gromero@9687 656 #define VSR59 ((VectorSRegister)( VSR59_VectorSRegisterEnumValue))
gromero@9687 657 #define VSR60 ((VectorSRegister)( VSR60_VectorSRegisterEnumValue))
gromero@9687 658 #define VSR61 ((VectorSRegister)( VSR61_VectorSRegisterEnumValue))
gromero@9687 659 #define VSR62 ((VectorSRegister)( VSR62_VectorSRegisterEnumValue))
gromero@9687 660 #define VSR63 ((VectorSRegister)( VSR63_VectorSRegisterEnumValue))
gromero@9662 661 #endif // DONT_USE_REGISTER_DEFINES
gromero@9662 662
goetz@6458 663 // Maximum number of incoming arguments that can be passed in i registers.
goetz@6458 664 const int PPC_ARGS_IN_REGS_NUM = 8;
goetz@6458 665
goetz@6458 666
goetz@6458 667 // Need to know the total number of registers of all sorts for SharedInfo.
goetz@6458 668 // Define a class that exports it.
goetz@6458 669 class ConcreteRegisterImpl : public AbstractRegisterImpl {
goetz@6458 670 public:
goetz@6458 671 enum {
goetz@6458 672 // This number must be large enough to cover REG_COUNT (defined by c2) registers.
goetz@6458 673 // There is no requirement that any ordering here matches any ordering c2 gives
goetz@6458 674 // it's optoregs.
goetz@6458 675 number_of_registers =
goetz@6458 676 ( RegisterImpl::number_of_registers +
goetz@6458 677 FloatRegisterImpl::number_of_registers )
goetz@6458 678 * 2 // register halves
goetz@6458 679 + ConditionRegisterImpl::number_of_registers // condition code registers
goetz@6458 680 + SpecialRegisterImpl::number_of_registers // special registers
gromero@9687 681 + VectorRegisterImpl::number_of_registers // VSX registers
goetz@6458 682 };
goetz@6458 683
goetz@6458 684 static const int max_gpr;
goetz@6458 685 static const int max_fpr;
goetz@6458 686 static const int max_cnd;
goetz@6458 687 };
goetz@6458 688
goetz@6458 689 // Common register declarations used in assembler code.
goetz@6458 690 REGISTER_DECLARATION(Register, R0_SCRATCH, R0); // volatile
goetz@6458 691 REGISTER_DECLARATION(Register, R1_SP, R1); // non-volatile
goetz@6458 692 REGISTER_DECLARATION(Register, R2_TOC, R2); // volatile
goetz@6458 693 REGISTER_DECLARATION(Register, R3_RET, R3); // volatile
goetz@6458 694 REGISTER_DECLARATION(Register, R3_ARG1, R3); // volatile
goetz@6458 695 REGISTER_DECLARATION(Register, R4_ARG2, R4); // volatile
goetz@6458 696 REGISTER_DECLARATION(Register, R5_ARG3, R5); // volatile
goetz@6458 697 REGISTER_DECLARATION(Register, R6_ARG4, R6); // volatile
goetz@6458 698 REGISTER_DECLARATION(Register, R7_ARG5, R7); // volatile
goetz@6458 699 REGISTER_DECLARATION(Register, R8_ARG6, R8); // volatile
goetz@6458 700 REGISTER_DECLARATION(Register, R9_ARG7, R9); // volatile
goetz@6458 701 REGISTER_DECLARATION(Register, R10_ARG8, R10); // volatile
goetz@6495 702 REGISTER_DECLARATION(FloatRegister, F0_SCRATCH, F0); // volatile
goetz@6458 703 REGISTER_DECLARATION(FloatRegister, F1_RET, F1); // volatile
goetz@6458 704 REGISTER_DECLARATION(FloatRegister, F1_ARG1, F1); // volatile
goetz@6458 705 REGISTER_DECLARATION(FloatRegister, F2_ARG2, F2); // volatile
goetz@6458 706 REGISTER_DECLARATION(FloatRegister, F3_ARG3, F3); // volatile
goetz@6458 707 REGISTER_DECLARATION(FloatRegister, F4_ARG4, F4); // volatile
goetz@6458 708 REGISTER_DECLARATION(FloatRegister, F5_ARG5, F5); // volatile
goetz@6458 709 REGISTER_DECLARATION(FloatRegister, F6_ARG6, F6); // volatile
goetz@6458 710 REGISTER_DECLARATION(FloatRegister, F7_ARG7, F7); // volatile
goetz@6458 711 REGISTER_DECLARATION(FloatRegister, F8_ARG8, F8); // volatile
goetz@6458 712 REGISTER_DECLARATION(FloatRegister, F9_ARG9, F9); // volatile
goetz@6458 713 REGISTER_DECLARATION(FloatRegister, F10_ARG10, F10); // volatile
goetz@6458 714 REGISTER_DECLARATION(FloatRegister, F11_ARG11, F11); // volatile
goetz@6458 715 REGISTER_DECLARATION(FloatRegister, F12_ARG12, F12); // volatile
goetz@6458 716 REGISTER_DECLARATION(FloatRegister, F13_ARG13, F13); // volatile
goetz@6458 717
goetz@6458 718 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 719 #define R0_SCRATCH AS_REGISTER(Register, R0)
goetz@6458 720 #define R1_SP AS_REGISTER(Register, R1)
goetz@6458 721 #define R2_TOC AS_REGISTER(Register, R2)
goetz@6458 722 #define R3_RET AS_REGISTER(Register, R3)
goetz@6458 723 #define R3_ARG1 AS_REGISTER(Register, R3)
goetz@6458 724 #define R4_ARG2 AS_REGISTER(Register, R4)
goetz@6458 725 #define R5_ARG3 AS_REGISTER(Register, R5)
goetz@6458 726 #define R6_ARG4 AS_REGISTER(Register, R6)
goetz@6458 727 #define R7_ARG5 AS_REGISTER(Register, R7)
goetz@6458 728 #define R8_ARG6 AS_REGISTER(Register, R8)
goetz@6458 729 #define R9_ARG7 AS_REGISTER(Register, R9)
goetz@6458 730 #define R10_ARG8 AS_REGISTER(Register, R10)
goetz@6495 731 #define F0_SCRATCH AS_REGISTER(FloatRegister, F0)
goetz@6458 732 #define F1_RET AS_REGISTER(FloatRegister, F1)
goetz@6458 733 #define F1_ARG1 AS_REGISTER(FloatRegister, F1)
goetz@6458 734 #define F2_ARG2 AS_REGISTER(FloatRegister, F2)
goetz@6458 735 #define F3_ARG3 AS_REGISTER(FloatRegister, F3)
goetz@6458 736 #define F4_ARG4 AS_REGISTER(FloatRegister, F4)
goetz@6458 737 #define F5_ARG5 AS_REGISTER(FloatRegister, F5)
goetz@6458 738 #define F6_ARG6 AS_REGISTER(FloatRegister, F6)
goetz@6458 739 #define F7_ARG7 AS_REGISTER(FloatRegister, F7)
goetz@6458 740 #define F8_ARG8 AS_REGISTER(FloatRegister, F8)
goetz@6458 741 #define F9_ARG9 AS_REGISTER(FloatRegister, F9)
goetz@6458 742 #define F10_ARG10 AS_REGISTER(FloatRegister, F10)
goetz@6458 743 #define F11_ARG11 AS_REGISTER(FloatRegister, F11)
goetz@6458 744 #define F12_ARG12 AS_REGISTER(FloatRegister, F12)
goetz@6458 745 #define F13_ARG13 AS_REGISTER(FloatRegister, F13)
goetz@6458 746 #endif
goetz@6458 747
goetz@6458 748 // Register declarations to be used in frame manager assembly code.
goetz@6458 749 // Use only non-volatile registers in order to keep values across C-calls.
goetz@6512 750 #ifdef CC_INTERP
goetz@6458 751 REGISTER_DECLARATION(Register, R14_state, R14); // address of new cInterpreter.
goetz@6458 752 REGISTER_DECLARATION(Register, R15_prev_state, R15); // address of old cInterpreter
goetz@6512 753 #else // CC_INTERP
goetz@6512 754 REGISTER_DECLARATION(Register, R14_bcp, R14);
goetz@6512 755 REGISTER_DECLARATION(Register, R15_esp, R15);
goetz@6512 756 REGISTER_DECLARATION(FloatRegister, F15_ftos, F15);
goetz@6512 757 #endif // CC_INTERP
goetz@6458 758 REGISTER_DECLARATION(Register, R16_thread, R16); // address of current thread
goetz@6458 759 REGISTER_DECLARATION(Register, R17_tos, R17); // address of Java tos (prepushed).
goetz@6458 760 REGISTER_DECLARATION(Register, R18_locals, R18); // address of first param slot (receiver).
goetz@6458 761 REGISTER_DECLARATION(Register, R19_method, R19); // address of current method
goetz@6458 762 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6512 763 #ifdef CC_INTERP
goetz@6458 764 #define R14_state AS_REGISTER(Register, R14)
goetz@6458 765 #define R15_prev_state AS_REGISTER(Register, R15)
goetz@6512 766 #else // CC_INTERP
goetz@6512 767 #define R14_bcp AS_REGISTER(Register, R14)
goetz@6512 768 #define R15_esp AS_REGISTER(Register, R15)
goetz@6512 769 #define F15_ftos AS_REGISTER(FloatRegister, F15)
goetz@6512 770 #endif // CC_INTERP
goetz@6458 771 #define R16_thread AS_REGISTER(Register, R16)
goetz@6458 772 #define R17_tos AS_REGISTER(Register, R17)
goetz@6458 773 #define R18_locals AS_REGISTER(Register, R18)
goetz@6458 774 #define R19_method AS_REGISTER(Register, R19)
goetz@6458 775 #define R21_sender_SP AS_REGISTER(Register, R21)
goetz@6458 776 #define R23_method_handle AS_REGISTER(Register, R23)
goetz@6458 777 #endif
goetz@6458 778
goetz@6458 779 // Temporary registers to be used within frame manager. We can use
goetz@6458 780 // the non-volatiles because the call stub has saved them.
goetz@6458 781 // Use only non-volatile registers in order to keep values across C-calls.
goetz@6458 782 REGISTER_DECLARATION(Register, R21_tmp1, R21);
goetz@6458 783 REGISTER_DECLARATION(Register, R22_tmp2, R22);
goetz@6458 784 REGISTER_DECLARATION(Register, R23_tmp3, R23);
goetz@6458 785 REGISTER_DECLARATION(Register, R24_tmp4, R24);
goetz@6458 786 REGISTER_DECLARATION(Register, R25_tmp5, R25);
goetz@6458 787 REGISTER_DECLARATION(Register, R26_tmp6, R26);
goetz@6458 788 REGISTER_DECLARATION(Register, R27_tmp7, R27);
goetz@6458 789 REGISTER_DECLARATION(Register, R28_tmp8, R28);
goetz@6458 790 REGISTER_DECLARATION(Register, R29_tmp9, R29);
goetz@6512 791 #ifndef CC_INTERP
goetz@6512 792 REGISTER_DECLARATION(Register, R24_dispatch_addr, R24);
goetz@6512 793 REGISTER_DECLARATION(Register, R25_templateTableBase, R25);
goetz@6512 794 REGISTER_DECLARATION(Register, R26_monitor, R26);
goetz@6512 795 REGISTER_DECLARATION(Register, R27_constPoolCache, R27);
goetz@6512 796 REGISTER_DECLARATION(Register, R28_mdx, R28);
goetz@6512 797 #endif // CC_INTERP
goetz@6512 798
goetz@6458 799 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 800 #define R21_tmp1 AS_REGISTER(Register, R21)
goetz@6458 801 #define R22_tmp2 AS_REGISTER(Register, R22)
goetz@6458 802 #define R23_tmp3 AS_REGISTER(Register, R23)
goetz@6458 803 #define R24_tmp4 AS_REGISTER(Register, R24)
goetz@6458 804 #define R25_tmp5 AS_REGISTER(Register, R25)
goetz@6458 805 #define R26_tmp6 AS_REGISTER(Register, R26)
goetz@6458 806 #define R27_tmp7 AS_REGISTER(Register, R27)
goetz@6458 807 #define R28_tmp8 AS_REGISTER(Register, R28)
goetz@6458 808 #define R29_tmp9 AS_REGISTER(Register, R29)
goetz@6512 809 #ifndef CC_INTERP
goetz@6512 810 // Lmonitors : monitor pointer
goetz@6512 811 // LcpoolCache: constant pool cache
goetz@6512 812 // mdx: method data index
goetz@6512 813 #define R24_dispatch_addr AS_REGISTER(Register, R24)
goetz@6512 814 #define R25_templateTableBase AS_REGISTER(Register, R25)
goetz@6512 815 #define R26_monitor AS_REGISTER(Register, R26)
goetz@6512 816 #define R27_constPoolCache AS_REGISTER(Register, R27)
goetz@6512 817 #define R28_mdx AS_REGISTER(Register, R28)
goetz@6512 818 #endif
goetz@6458 819
goetz@6458 820 #define CCR4_is_synced AS_REGISTER(ConditionRegister, CCR4)
goetz@6458 821 #endif
goetz@6458 822
goetz@6458 823 // Scratch registers are volatile.
goetz@6458 824 REGISTER_DECLARATION(Register, R11_scratch1, R11);
goetz@6458 825 REGISTER_DECLARATION(Register, R12_scratch2, R12);
goetz@6458 826 #ifndef DONT_USE_REGISTER_DEFINES
goetz@6458 827 #define R11_scratch1 AS_REGISTER(Register, R11)
goetz@6458 828 #define R12_scratch2 AS_REGISTER(Register, R12)
goetz@6458 829 #endif
goetz@6458 830
goetz@6458 831 #endif // CPU_PPC_VM_REGISTER_PPC_HPP

mercurial