1 /*
   2  * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * Copyright (c) 2014, Red Hat Inc. All rights reserved.
   4  * Copyright (c) 2015, Linaro Ltd. All rights reserved.
   5  * Copyright (c) 2015-2018, Azul Systems, Inc. All rights reserved.
   6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   7  *
   8  * This code is free software; you can redistribute it and/or modify it
   9  * under the terms of the GNU General Public License version 2 only, as
  10  * published by the Free Software Foundation.
  11  *
  12  * This code is distributed in the hope that it will be useful, but WITHOUT
  13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15  * version 2 for more details (a copy is included in the LICENSE file that
  16  * accompanied this code).
  17  *
  18  * You should have received a copy of the GNU General Public License version
  19  * 2 along with this work; if not, write to the Free Software Foundation,
  20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  21  *
  22  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  23  * or visit www.oracle.com if you need additional information or have any
  24  * questions.
  25  *
  26  */
  27 
  28 #ifndef CPU_AARCH32_VM_REGISTER_AARCH32_HPP
  29 #define CPU_AARCH32_VM_REGISTER_AARCH32_HPP
  30 
  31 #include "asm/register.hpp"
  32 
  33 class VMRegImpl;
  34 typedef VMRegImpl* VMReg;
  35 
  36 // Implementation of integer registers for AArch32 architecture
  37 
  38 class RegisterImpl;
  39 typedef RegisterImpl* Register;
  40 
  41 inline Register as_Register(int encoding) {
  42   return (Register)(intptr_t) encoding;
  43 }
  44 
  45 class RegisterImpl : public AbstractRegisterImpl {
  46  public:
  47   enum {
  48     number_of_registers = 16
  49   };
  50 
  51   // Construction
  52   inline friend Register as_Register(int encoding);
  53 
  54   // Accessors
  55   int encoding() const {
  56     assert(is_valid(), "invalid register");
  57     return (intptr_t) this;
  58   }
  59   int encoding_nocheck() const {
  60     return (intptr_t) this;
  61   }
  62   VMReg as_VMReg();
  63   Register successor() const {
  64     return as_Register(encoding() + 1);
  65   }
  66 
  67   // Testers
  68   bool is_valid() const {
  69     return 0 <= (intptr_t) this && (intptr_t) this < number_of_registers;
  70   }
  71 
  72   // Return the bit which represents this register. This is intended to be
  73   // used in bitmasks. See RegSet class below.
  74   unsigned long bit(bool should_set = true) const {
  75     return should_set ? 1 << encoding() : 0;
  76   }
  77 
  78   // Return the name of this register
  79   const char* name() const;
  80 };
  81 
  82 // Integer registers of AArch32 architecture
  83 #define R(r)   ((Register)(r))
  84 
  85 #define Rmh_SP_save     r11  // for C2
  86 
  87 CONSTANT_REGISTER_DECLARATION(Register, noreg, -1);
  88 
  89 CONSTANT_REGISTER_DECLARATION(Register, r0,     0);
  90 CONSTANT_REGISTER_DECLARATION(Register, r1,     1);
  91 CONSTANT_REGISTER_DECLARATION(Register, r2,     2);
  92 CONSTANT_REGISTER_DECLARATION(Register, r3,     3);
  93 CONSTANT_REGISTER_DECLARATION(Register, r4,     4);
  94 CONSTANT_REGISTER_DECLARATION(Register, r5,     5);
  95 CONSTANT_REGISTER_DECLARATION(Register, r6,     6);
  96 CONSTANT_REGISTER_DECLARATION(Register, r7,     7);
  97 CONSTANT_REGISTER_DECLARATION(Register, r8,     8);
  98 CONSTANT_REGISTER_DECLARATION(Register, r9,     9);
  99 CONSTANT_REGISTER_DECLARATION(Register, r10,   10);
 100 CONSTANT_REGISTER_DECLARATION(Register, r11,   11);
 101 CONSTANT_REGISTER_DECLARATION(Register, r12,   12);
 102 CONSTANT_REGISTER_DECLARATION(Register, r13,   13);
 103 CONSTANT_REGISTER_DECLARATION(Register, r14,   14);
 104 CONSTANT_REGISTER_DECLARATION(Register, r15,   15);
 105 
 106 // Implementation of floating point registers for AArch32 (VFPv3-D16)
 107 // architecture
 108 
 109 class FloatRegisterImpl;
 110 typedef FloatRegisterImpl* FloatRegister;
 111 
 112 // Return FloatRegister corresponding to the given s-type (aka f-type in this
 113 // port) register number
 114 inline FloatRegister as_FloatRegister(int encoding) {
 115   return (FloatRegister)(intptr_t) encoding;
 116 }
 117 
 118 // Return FloatRegister corresponding to the given d-type register number
 119 inline FloatRegister as_DoubleFloatRegister(int encoding) {
 120   return as_FloatRegister(2 * encoding);
 121 }
 122 
 123 class FloatRegisterImpl : public AbstractRegisterImpl {
 124  public:
 125   enum {
 126     // VFPv3-D16 architecture includes 16 doubleword registers, which can be
 127     // also observed as 32 singleword registers. We count the singleword
 128     // registers here.
 129     number_of_registers = 32
 130   };
 131 
 132   enum FloatRegisterSize {
 133     SINGLE = 1,
 134     DOUBLE = 2,
 135     QUAD = 4
 136   };
 137 
 138   // Construction
 139   inline friend FloatRegister as_FloatRegister(int encoding);
 140   inline friend FloatRegister as_DoubleFloatRegister(int encoding);
 141 
 142   // Accessors
 143   int encoding() const {
 144     assert(is_valid(), "invalid register");
 145     return (intptr_t) this;
 146   }
 147   int encoding_nocheck() const {
 148     return (intptr_t) this;
 149   }
 150   VMReg as_VMReg();
 151   FloatRegister successor(enum FloatRegisterSize size) const {
 152     return (as_FloatRegister((encoding() + (int)size) % number_of_registers |
 153             (encoding() + (int)size) / number_of_registers));
 154   }
 155 
 156   // Testers
 157   bool is_valid() const {
 158     return 0 <= (intptr_t) this && (intptr_t) this < number_of_registers;
 159   }
 160 
 161   // Return the bit which represents this register. This is intended to be
 162   // used in bitmasks. See FloatRegSet class below.
 163   unsigned long bit(bool should_set = true) const {
 164     return should_set ? 1 << encoding() : 0;
 165   }
 166 
 167   // Return the name of this register
 168   const char* name() const;
 169 };
 170 
 171 // Floating point registers of AArch32 (VFPv3-D16, D32 and SIMD) architecture
 172 
 173 // Only the first 8 doubleword registers can be used for parameter passing
 174 // and thus are caller-saved. The rest 8 registers are callee-saved.
 175 // In VFPv3-D32 there are additional 16 doubleword registers that are
 176 // caller-saved again.
 177 
 178 // Here we introduce the symbolic names for doubleword registers and the
 179 // corresponding singleword views for the first 16 of them. The instruction
 180 // set allows us to encode the doubleword register numbers directly using
 181 // the constants below.
 182 
 183 // The respective names are as well defined for quad-word registers with
 184 // encoding set by the same principles.
 185 
 186 CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg, -1);
 187 
 188 CONSTANT_REGISTER_DECLARATION(FloatRegister, d0,      0);
 189 CONSTANT_REGISTER_DECLARATION(FloatRegister, d1,      2);
 190 CONSTANT_REGISTER_DECLARATION(FloatRegister, d2,      4);
 191 CONSTANT_REGISTER_DECLARATION(FloatRegister, d3,      6);
 192 CONSTANT_REGISTER_DECLARATION(FloatRegister, d4,      8);
 193 CONSTANT_REGISTER_DECLARATION(FloatRegister, d5,     10);
 194 CONSTANT_REGISTER_DECLARATION(FloatRegister, d6,     12);
 195 CONSTANT_REGISTER_DECLARATION(FloatRegister, d7,     14);
 196 CONSTANT_REGISTER_DECLARATION(FloatRegister, d8,     16);
 197 CONSTANT_REGISTER_DECLARATION(FloatRegister, d9,     18);
 198 CONSTANT_REGISTER_DECLARATION(FloatRegister, d10,    20);
 199 CONSTANT_REGISTER_DECLARATION(FloatRegister, d11,    22);
 200 CONSTANT_REGISTER_DECLARATION(FloatRegister, d12,    24);
 201 CONSTANT_REGISTER_DECLARATION(FloatRegister, d13,    26);
 202 CONSTANT_REGISTER_DECLARATION(FloatRegister, d14,    28);
 203 CONSTANT_REGISTER_DECLARATION(FloatRegister, d15,    30);
 204 CONSTANT_REGISTER_DECLARATION(FloatRegister, d16,     1);
 205 CONSTANT_REGISTER_DECLARATION(FloatRegister, d17,     3);
 206 CONSTANT_REGISTER_DECLARATION(FloatRegister, d18,     5);
 207 CONSTANT_REGISTER_DECLARATION(FloatRegister, d19,     7);
 208 CONSTANT_REGISTER_DECLARATION(FloatRegister, d20,     9);
 209 CONSTANT_REGISTER_DECLARATION(FloatRegister, d21,    11);
 210 CONSTANT_REGISTER_DECLARATION(FloatRegister, d22,    13);
 211 CONSTANT_REGISTER_DECLARATION(FloatRegister, d23,    15);
 212 CONSTANT_REGISTER_DECLARATION(FloatRegister, d24,    17);
 213 CONSTANT_REGISTER_DECLARATION(FloatRegister, d25,    19);
 214 CONSTANT_REGISTER_DECLARATION(FloatRegister, d26,    21);
 215 CONSTANT_REGISTER_DECLARATION(FloatRegister, d27,    23);
 216 CONSTANT_REGISTER_DECLARATION(FloatRegister, d28,    25);
 217 CONSTANT_REGISTER_DECLARATION(FloatRegister, d29,    27);
 218 CONSTANT_REGISTER_DECLARATION(FloatRegister, d30,    29);
 219 CONSTANT_REGISTER_DECLARATION(FloatRegister, d31,    31);
 220 
 221 CONSTANT_REGISTER_DECLARATION(FloatRegister, q0,      0);
 222 CONSTANT_REGISTER_DECLARATION(FloatRegister, q1,      4);
 223 CONSTANT_REGISTER_DECLARATION(FloatRegister, q2,      8);
 224 CONSTANT_REGISTER_DECLARATION(FloatRegister, q3,     12);
 225 CONSTANT_REGISTER_DECLARATION(FloatRegister, q4,     16);
 226 CONSTANT_REGISTER_DECLARATION(FloatRegister, q5,     20);
 227 CONSTANT_REGISTER_DECLARATION(FloatRegister, q6,     24);
 228 CONSTANT_REGISTER_DECLARATION(FloatRegister, q7,     28);
 229 CONSTANT_REGISTER_DECLARATION(FloatRegister, q8,      1);
 230 CONSTANT_REGISTER_DECLARATION(FloatRegister, q9,      5);
 231 CONSTANT_REGISTER_DECLARATION(FloatRegister, q10,     9);
 232 CONSTANT_REGISTER_DECLARATION(FloatRegister, q11,    13);
 233 CONSTANT_REGISTER_DECLARATION(FloatRegister, q12,    17);
 234 CONSTANT_REGISTER_DECLARATION(FloatRegister, q13,    21);
 235 CONSTANT_REGISTER_DECLARATION(FloatRegister, q14,    25);
 236 CONSTANT_REGISTER_DECLARATION(FloatRegister, q15,    29);
 237 
 238 CONSTANT_REGISTER_DECLARATION(FloatRegister, f0,      0);
 239 CONSTANT_REGISTER_DECLARATION(FloatRegister, f1,      1);
 240 CONSTANT_REGISTER_DECLARATION(FloatRegister, f2,      2);
 241 CONSTANT_REGISTER_DECLARATION(FloatRegister, f3,      3);
 242 CONSTANT_REGISTER_DECLARATION(FloatRegister, f4,      4);
 243 CONSTANT_REGISTER_DECLARATION(FloatRegister, f5,      5);
 244 CONSTANT_REGISTER_DECLARATION(FloatRegister, f6,      6);
 245 CONSTANT_REGISTER_DECLARATION(FloatRegister, f7,      7);
 246 CONSTANT_REGISTER_DECLARATION(FloatRegister, f8,      8);
 247 CONSTANT_REGISTER_DECLARATION(FloatRegister, f9,      9);
 248 CONSTANT_REGISTER_DECLARATION(FloatRegister, f10,    10);
 249 CONSTANT_REGISTER_DECLARATION(FloatRegister, f11,    11);
 250 CONSTANT_REGISTER_DECLARATION(FloatRegister, f12,    12);
 251 CONSTANT_REGISTER_DECLARATION(FloatRegister, f13,    13);
 252 CONSTANT_REGISTER_DECLARATION(FloatRegister, f14,    14);
 253 CONSTANT_REGISTER_DECLARATION(FloatRegister, f15,    15);
 254 CONSTANT_REGISTER_DECLARATION(FloatRegister, f16,    16);
 255 CONSTANT_REGISTER_DECLARATION(FloatRegister, f17,    17);
 256 CONSTANT_REGISTER_DECLARATION(FloatRegister, f18,    18);
 257 CONSTANT_REGISTER_DECLARATION(FloatRegister, f19,    19);
 258 CONSTANT_REGISTER_DECLARATION(FloatRegister, f20,    20);
 259 CONSTANT_REGISTER_DECLARATION(FloatRegister, f21,    21);
 260 CONSTANT_REGISTER_DECLARATION(FloatRegister, f22,    22);
 261 CONSTANT_REGISTER_DECLARATION(FloatRegister, f23,    23);
 262 CONSTANT_REGISTER_DECLARATION(FloatRegister, f24,    24);
 263 CONSTANT_REGISTER_DECLARATION(FloatRegister, f25,    25);
 264 CONSTANT_REGISTER_DECLARATION(FloatRegister, f26,    26);
 265 CONSTANT_REGISTER_DECLARATION(FloatRegister, f27,    27);
 266 CONSTANT_REGISTER_DECLARATION(FloatRegister, f28,    28);
 267 CONSTANT_REGISTER_DECLARATION(FloatRegister, f29,    29);
 268 CONSTANT_REGISTER_DECLARATION(FloatRegister, f30,    30);
 269 CONSTANT_REGISTER_DECLARATION(FloatRegister, f31,    31);
 270 
 271 // Set of singleword floating point registers
 272 
 273 class FloatRegSet {
 274  private:
 275   uint32_t _bitset;
 276 
 277   FloatRegSet(uint32_t bitset) : _bitset(bitset) { }
 278 
 279  public:
 280   FloatRegSet() : _bitset(0) { }
 281 
 282   FloatRegSet(FloatRegister r1) : _bitset(r1->bit()) { }
 283 
 284   FloatRegSet operator+(const FloatRegSet aSet) const {
 285     FloatRegSet result(_bitset | aSet._bitset);
 286     return result;
 287   }
 288 
 289   FloatRegSet operator-(const FloatRegSet aSet) const {
 290     FloatRegSet result(_bitset & ~aSet._bitset);
 291     return result;
 292   }
 293 
 294   FloatRegSet& operator+=(const FloatRegSet aSet) {
 295     *this = *this + aSet;
 296     return *this;
 297   }
 298 
 299   static FloatRegSet of(FloatRegister r1) {
 300     return FloatRegSet(r1);
 301   }
 302 
 303   static FloatRegSet of(FloatRegister r1, FloatRegister r2) {
 304     return of(r1) + r2;
 305   }
 306 
 307   static FloatRegSet of(FloatRegister r1, FloatRegister r2, FloatRegister r3) {
 308     return of(r1, r2) + r3;
 309   }
 310 
 311   static FloatRegSet of(FloatRegister r1, FloatRegister r2, FloatRegister r3,
 312                         FloatRegister r4) {
 313     return of(r1, r2, r3) + r4;
 314   }
 315 
 316   static FloatRegSet range(FloatRegister start, FloatRegister end) {
 317     uint32_t bits = ~0;
 318     bits <<= start->encoding();
 319     bits <<= 31 - end->encoding();
 320     bits >>= 31 - end->encoding();
 321     return FloatRegSet(bits);
 322   }
 323 
 324   uint32_t bits() const {
 325     return _bitset;
 326   }
 327 };
 328 
 329 // Set of doubleword floating point registers
 330 
 331 class DoubleFloatRegSet {
 332  private:
 333   uint32_t _bitset;
 334 
 335   DoubleFloatRegSet(uint32_t bitset) : _bitset(bitset) { }
 336 
 337  public:
 338   DoubleFloatRegSet() : _bitset(0) { }
 339 
 340   DoubleFloatRegSet(FloatRegister r1) : _bitset(1 << (r1->encoding()>>1)+((r1->encoding()%2)?16:0)) { }
 341 
 342   DoubleFloatRegSet operator+(const DoubleFloatRegSet aSet) const {
 343     DoubleFloatRegSet result(_bitset | aSet._bitset);
 344     return result;
 345   }
 346 
 347   DoubleFloatRegSet operator-(const DoubleFloatRegSet aSet) const {
 348     DoubleFloatRegSet result(_bitset & ~aSet._bitset);
 349     return result;
 350   }
 351 
 352   DoubleFloatRegSet& operator+=(const DoubleFloatRegSet aSet) {
 353     *this = *this + aSet;
 354     return *this;
 355   }
 356 
 357   static DoubleFloatRegSet of(FloatRegister r1) {
 358     return DoubleFloatRegSet(r1);
 359   }
 360 
 361   static DoubleFloatRegSet of(FloatRegister r1, FloatRegister r2) {
 362     return of(r1) + r2;
 363   }
 364 
 365   static DoubleFloatRegSet of(FloatRegister r1, FloatRegister r2,
 366                               FloatRegister r3) {
 367     return of(r1, r2) + r3;
 368   }
 369 
 370   static DoubleFloatRegSet of(FloatRegister r1, FloatRegister r2,
 371                               FloatRegister r3, FloatRegister r4) {
 372     return of(r1, r2, r3) + r4;
 373   }
 374 
 375   static DoubleFloatRegSet range(FloatRegister start, FloatRegister end) {
 376     int start_reg = (start->encoding() >> 1)+((start->encoding()%2)?16:0);
 377     int end_reg = (end->encoding() >> 1)+((end->encoding()%2)?16:0);
 378     uint32_t bits = ~0;
 379     bits <<= start_reg;
 380     bits <<= 31 - end_reg;
 381     bits >>= 31 - end_reg;
 382     return DoubleFloatRegSet(bits);
 383   }
 384 
 385   uint32_t bits() const {
 386     return _bitset;
 387   }
 388 };
 389 
 390 // Total number of registers of all sorts
 391 
 392 class ConcreteRegisterImpl : public AbstractRegisterImpl {
 393  public:
 394   enum {
 395     // Here we count the total number of 32-bit slots available in registers.
 396     // This number must be large enough to cover REG_COUNT (defined by C2)
 397     // registers. There is no requirement that any ordering here matches
 398     // any ordering C2 gives its OptoReg's.
 399     // C2 port is made to be able to operate on all 32 double registers of VFPD32
 400     // but the register count is 32 since high half of 32-bit regs are not addressable
 401     // so need to double the amount of known registers to get expected 64
 402 #ifndef COMPILER2
 403     number_of_registers = RegisterImpl::number_of_registers +
 404                           FloatRegisterImpl::number_of_registers
 405 #else
 406     number_of_registers = RegisterImpl::number_of_registers +
 407                           (FloatRegisterImpl::number_of_registers*2) +
 408                           2
 409 #endif
 410   };
 411 
 412   static const int max_gpr;
 413   static const int max_fpr;
 414 };
 415 
 416 
 417 // Set of integer registers
 418 
 419 class RegSet {
 420  private:
 421   uint32_t _bitset;
 422 
 423   RegSet(uint32_t bitset) : _bitset(bitset) { }
 424 
 425  public:
 426   RegSet() : _bitset(0) { }
 427 
 428   RegSet(Register r1) : _bitset(r1->bit()) { }
 429 
 430   RegSet operator+(const RegSet aSet) const {
 431     RegSet result(_bitset | aSet._bitset);
 432     return result;
 433   }
 434 
 435   RegSet operator-(const RegSet aSet) const {
 436     RegSet result(_bitset & ~aSet._bitset);
 437     return result;
 438   }
 439 
 440   RegSet& operator+=(const RegSet aSet) {
 441     *this = *this + aSet;
 442     return *this;
 443   }
 444 
 445   static RegSet of(Register r1) {
 446     return RegSet(r1);
 447   }
 448 
 449   static RegSet of(Register r1, Register r2) {
 450     return of(r1) + r2;
 451   }
 452 
 453   static RegSet of(Register r1, Register r2, Register r3) {
 454     return of(r1, r2) + r3;
 455   }
 456 
 457   static RegSet of(Register r1, Register r2, Register r3, Register r4) {
 458     return of(r1, r2, r3) + r4;
 459   }
 460 
 461   static RegSet of(Register r1, Register r2, Register r3, Register r4, Register r5) {
 462     return of(r1, r2, r3, r4) + r5;
 463   }
 464 
 465   static RegSet of(Register r1, Register r2, Register r3, Register r4, Register r5, Register r6) {
 466     return of(r1, r2, r3, r4, r5) + r6;
 467   }
 468 
 469   static RegSet range(Register start, Register end) {
 470     uint32_t bits = ~0;
 471     bits <<= start->encoding();
 472     bits <<= 31 - end->encoding();
 473     bits >>= 31 - end->encoding();
 474     return RegSet(bits);
 475   }
 476 
 477   uint32_t bits() const {
 478     return _bitset;
 479   }
 480 };
 481 
 482 
 483 #endif // CPU_AARCH32_VM_REGISTER_AARCH32_HPP