< prev index next >

src/cpu/aarch64/vm/register_aarch64.hpp

Print this page
rev 12320 : 8170106: AArch64: Multiple JVMCI issues
Reviewed-by: rschatz


  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


< prev index next >