Revision: 19156
Author:   [email protected]
Date:     Thu Feb  6 13:19:27 2014 UTC
Log:      A64: Eliminate static initializers

[email protected], [email protected]
BUG=none
LOG=y

Review URL: https://codereview.chromium.org/143493006
http://code.google.com/p/v8/source/detail?r=19156

Modified:
 /branches/experimental/a64/src/a64/assembler-a64-inl.h
 /branches/experimental/a64/src/a64/assembler-a64.cc
 /branches/experimental/a64/src/a64/assembler-a64.h
 /branches/experimental/a64/src/a64/code-stubs-a64.cc
 /branches/experimental/a64/src/a64/constants-a64.h
 /branches/experimental/a64/src/a64/debug-a64.cc
 /branches/experimental/a64/src/a64/frames-a64.h
 /branches/experimental/a64/src/a64/instructions-a64.cc
 /branches/experimental/a64/src/a64/instructions-a64.h
 /branches/experimental/a64/src/a64/lithium-gap-resolver-a64.cc
 /branches/experimental/a64/src/a64/lithium-gap-resolver-a64.h
 /branches/experimental/a64/src/a64/macro-assembler-a64.h
 /branches/experimental/a64/src/a64/regexp-macro-assembler-a64.cc
 /branches/experimental/a64/test/cctest/test-utils-a64.cc

=======================================
--- /branches/experimental/a64/src/a64/assembler-a64-inl.h Wed Feb 5 17:41:02 2014 UTC +++ /branches/experimental/a64/src/a64/assembler-a64-inl.h Thu Feb 6 13:19:27 2014 UTC
@@ -55,44 +55,44 @@

 inline unsigned CPURegister::code() const {
   ASSERT(IsValid());
-  return code_;
+  return reg_code;
 }


 inline CPURegister::RegisterType CPURegister::type() const {
   ASSERT(IsValidOrNone());
-  return type_;
+  return reg_type;
 }


 inline RegList CPURegister::Bit() const {
-  ASSERT(code_ < (sizeof(RegList) * kBitsPerByte));
-  return IsValid() ? 1UL << code_ : 0;
+  ASSERT(reg_code < (sizeof(RegList) * kBitsPerByte));
+  return IsValid() ? 1UL << reg_code : 0;
 }


 inline unsigned CPURegister::SizeInBits() const {
   ASSERT(IsValid());
-  return size_;
+  return reg_size;
 }


 inline int CPURegister::SizeInBytes() const {
   ASSERT(IsValid());
   ASSERT(SizeInBits() % 8 == 0);
-  return size_ / 8;
+  return reg_size / 8;
 }


 inline bool CPURegister::Is32Bits() const {
   ASSERT(IsValid());
-  return size_ == 32;
+  return reg_size == 32;
 }


 inline bool CPURegister::Is64Bits() const {
   ASSERT(IsValid());
-  return size_ == 64;
+  return reg_size == 64;
 }


@@ -109,46 +109,46 @@

 inline bool CPURegister::IsValidRegister() const {
   return IsRegister() &&
-         ((size_ == kWRegSize) || (size_ == kXRegSize)) &&
-         ((code_ < kNumberOfRegisters) || (code_ == kSPRegInternalCode));
+         ((reg_size == kWRegSize) || (reg_size == kXRegSize)) &&
+ ((reg_code < kNumberOfRegisters) || (reg_code == kSPRegInternalCode));
 }


 inline bool CPURegister::IsValidFPRegister() const {
   return IsFPRegister() &&
-         ((size_ == kSRegSize) || (size_ == kDRegSize)) &&
-         (code_ < kNumberOfFPRegisters);
+         ((reg_size == kSRegSize) || (reg_size == kDRegSize)) &&
+         (reg_code < kNumberOfFPRegisters);
 }


 inline bool CPURegister::IsNone() const {
   // kNoRegister types should always have size 0 and code 0.
-  ASSERT((type_ != kNoRegister) || (code_ == 0));
-  ASSERT((type_ != kNoRegister) || (size_ == 0));
+  ASSERT((reg_type != kNoRegister) || (reg_code == 0));
+  ASSERT((reg_type != kNoRegister) || (reg_size == 0));

-  return type_ == kNoRegister;
+  return reg_type == kNoRegister;
 }


 inline bool CPURegister::Is(const CPURegister& other) const {
   ASSERT(IsValidOrNone() && other.IsValidOrNone());
-  return (code_ == other.code_) && (size_ == other.size_) &&
-         (type_ == other.type_);
+  return (reg_code == other.reg_code) && (reg_size == other.reg_size) &&
+         (reg_type == other.reg_type);
 }


 inline bool CPURegister::IsRegister() const {
-  return type_ == kRegister;
+  return reg_type == kRegister;
 }


 inline bool CPURegister::IsFPRegister() const {
-  return type_ == kFPRegister;
+  return reg_type == kFPRegister;
 }


inline bool CPURegister::IsSameSizeAndType(const CPURegister& other) const {
-  return (size_ == other.size_) && (type_ == other.type_);
+  return (reg_size == other.reg_size) && (reg_type == other.reg_type);
 }


@@ -159,13 +159,13 @@

 inline bool CPURegister::IsZero() const {
   ASSERT(IsValid());
-  return IsRegister() && (code_ == kZeroRegCode);
+  return IsRegister() && (reg_code == kZeroRegCode);
 }


 inline bool CPURegister::IsSP() const {
   ASSERT(IsValid());
-  return IsRegister() && (code_ == kSPRegInternalCode);
+  return IsRegister() && (reg_code == kSPRegInternalCode);
 }


@@ -201,65 +201,65 @@

 inline void CPURegList::Combine(int code) {
   ASSERT(IsValid());
-  ASSERT(CPURegister(code, size_, type_).IsValid());
+  ASSERT(CPURegister::Create(code, size_, type_).IsValid());
   list_ |= (1UL << code);
 }


 inline void CPURegList::Remove(int code) {
   ASSERT(IsValid());
-  ASSERT(CPURegister(code, size_, type_).IsValid());
+  ASSERT(CPURegister::Create(code, size_, type_).IsValid());
   list_ &= ~(1UL << code);
 }


-inline const Register& Register::XRegFromCode(unsigned code) {
+inline Register Register::XRegFromCode(unsigned code) {
// This function returns the zero register when code = 31. The stack pointer
   // can not be returned.
   ASSERT(code < kNumberOfRegisters);
-  return xregisters[code];
+  return Register::Create(code, kXRegSize);
 }


-inline const Register& Register::WRegFromCode(unsigned code) {
+inline Register Register::WRegFromCode(unsigned code) {
   ASSERT(code < kNumberOfRegisters);
-  return wregisters[code];
+  return Register::Create(code, kWRegSize);
 }


-inline const FPRegister& FPRegister::SRegFromCode(unsigned code) {
+inline FPRegister FPRegister::SRegFromCode(unsigned code) {
   ASSERT(code < kNumberOfFPRegisters);
-  return sregisters[code];
+  return FPRegister::Create(code, kSRegSize);
 }


-inline const FPRegister& FPRegister::DRegFromCode(unsigned code) {
+inline FPRegister FPRegister::DRegFromCode(unsigned code) {
   ASSERT(code < kNumberOfFPRegisters);
-  return dregisters[code];
+  return FPRegister::Create(code, kDRegSize);
 }


-inline const Register& CPURegister::W() const {
+inline Register CPURegister::W() const {
   ASSERT(IsValidRegister());
-  return Register::WRegFromCode(code_);
+  return Register::WRegFromCode(reg_code);
 }


-inline const Register& CPURegister::X() const {
+inline Register CPURegister::X() const {
   ASSERT(IsValidRegister());
-  return Register::XRegFromCode(code_);
+  return Register::XRegFromCode(reg_code);
 }


-inline const FPRegister& CPURegister::S() const {
+inline FPRegister CPURegister::S() const {
   ASSERT(IsValidFPRegister());
-  return FPRegister::SRegFromCode(code_);
+  return FPRegister::SRegFromCode(reg_code);
 }


-inline const FPRegister& CPURegister::D() const {
+inline FPRegister CPURegister::D() const {
   ASSERT(IsValidFPRegister());
-  return FPRegister::DRegFromCode(code_);
+  return FPRegister::DRegFromCode(reg_code);
 }


=======================================
--- /branches/experimental/a64/src/a64/assembler-a64.cc Thu Feb 6 11:53:35 2014 UTC +++ /branches/experimental/a64/src/a64/assembler-a64.cc Thu Feb 6 13:19:27 2014 UTC
@@ -30,6 +30,8 @@

 #if V8_TARGET_ARCH_A64

+#define A64_DEFINE_REG_STATICS
+
 #include "a64/assembler-a64-inl.h"

 namespace v8 {
@@ -55,7 +57,7 @@
   int index = CountTrailingZeros(list_, kRegListSizeInBits);
   ASSERT((1 << index) & list_);
   Remove(index);
-  return CPURegister(index, size_, type_);
+  return CPURegister::Create(index, size_, type_);
 }


@@ -68,7 +70,7 @@
   index = kRegListSizeInBits - 1 - index;
   ASSERT((1 << index) & list_);
   Remove(index);
-  return CPURegister(index, size_, type_);
+  return CPURegister::Create(index, size_, type_);
 }


@@ -109,12 +111,6 @@
   list.Combine(CPURegList(CPURegister::kFPRegister, size, 16, 31));
   return list;
 }
-
-
-const CPURegList kCalleeSaved = CPURegList::GetCalleeSaved();
-const CPURegList kCalleeSavedFP = CPURegList::GetCalleeSavedFP();
-const CPURegList kCallerSaved = CPURegList::GetCallerSaved();
-const CPURegList kCallerSavedFP = CPURegList::GetCallerSavedFP();


 // This function defines the list of registers which are associated with a
@@ -183,31 +179,6 @@
   UNIMPLEMENTED();
 }

-
-// Registers.
-#define XREG(n) x##n,
-const Register Register::xregisters[] = {
-REGISTER_CODE_LIST(XREG)
-};
-#undef XREG
-
-#define WREG(n) w##n,
-const Register Register::wregisters[] = {
-REGISTER_CODE_LIST(WREG)
-};
-#undef WREG
-
-#define SREG(n) s##n,
-const FPRegister FPRegister::sregisters[] = {
-REGISTER_CODE_LIST(SREG)
-};
-#undef SREG
-
-#define DREG(n) d##n,
-const FPRegister FPRegister::dregisters[] = {
-REGISTER_CODE_LIST(DREG)
-};
-#undef DREG

 bool AreAliased(const CPURegister& reg1, const CPURegister& reg2,
                 const CPURegister& reg3, const CPURegister& reg4,
@@ -1955,7 +1926,7 @@
   ASSERT(rd.SizeInBits() >= rn.SizeInBits());
   unsigned reg_size = rd.SizeInBits();
   // Use the correct size of register.
-  Register rn_ = Register(rn.code(), rd.SizeInBits());
+  Register rn_ = Register::Create(rn.code(), rd.SizeInBits());
   // Bits extracted are high_bit:0.
   unsigned high_bit = (8 << (extend & 0x3)) - 1;
// Number of bits left in the result that are not introduced by the shift.
=======================================
--- /branches/experimental/a64/src/a64/assembler-a64.h Wed Feb 5 17:41:02 2014 UTC +++ /branches/experimental/a64/src/a64/assembler-a64.h Thu Feb 6 13:19:27 2014 UTC
@@ -60,8 +60,7 @@
 class FPRegister;


-class CPURegister {
- public:
+struct CPURegister {
   enum RegisterType {
     // The kInvalid value is used to detect uninitialized static instances,
// which are always zero-initialized before any constructors are called.
@@ -71,25 +70,9 @@
     kNoRegister
   };

-  CPURegister() : code_(0), size_(0), type_(kNoRegister) {
-    ASSERT(!IsValid());
-    ASSERT(IsNone());
-  }
-
-  CPURegister(unsigned code, unsigned size, RegisterType type)
-      : code_(code), size_(size), type_(type) {
-    ASSERT(IsValidOrNone());
-  }
-
- // This copy constructor is used by the Register and FPRegister classes for
-  // converting a CPURegister into a more specialized type. It is necessary
- // because (FP)Register cannot directly access other.size_ and suchlike and
-  // the accessor methods don't allow NoCPUReg. Unfortunately, it cannot be
- // explicit because otherwise the simple (FP)Register->CPURegister casts do
-  // not work.
-  CPURegister(const CPURegister& other)
-      : code_(other.code_), size_(other.size_), type_(other.type_) {
-    ASSERT(IsValidOrNone());
+ static CPURegister Create(unsigned code, unsigned size, RegisterType type) {
+    CPURegister r = {code, size, type};
+    return r;
   }

   unsigned code() const;
@@ -111,10 +94,10 @@
   bool IsRegister() const;
   bool IsFPRegister() const;

-  const Register& X() const;
-  const Register& W() const;
-  const FPRegister& D() const;
-  const FPRegister& S() const;
+  Register X() const;
+  Register W() const;
+  FPRegister D() const;
+  FPRegister S() const;

   bool IsSameSizeAndType(const CPURegister& other) const;

@@ -122,32 +105,40 @@
   bool is(const CPURegister& other) const { return Is(other); }
   bool is_valid() const { return IsValid(); }

- protected:
-  unsigned code_;
-  unsigned size_;
-  RegisterType type_;
+  unsigned reg_code;
+  unsigned reg_size;
+  RegisterType reg_type;

  private:
   bool IsValidOrNone() const;
 };


-class Register : public CPURegister {
- public:
-  Register() : CPURegister() {}
-  explicit Register(const CPURegister& other) : CPURegister(other) {
-    ASSERT(IsValidRegister() || IsNone());
+struct Register : public CPURegister {
+  static Register Create(unsigned code, unsigned size) {
+    return CPURegister::Create(code, size, CPURegister::kRegister);
   }
-  Register(unsigned code, unsigned size)
-      : CPURegister(code, size, kRegister) {}
+
+  Register() {
+    reg_code = 0;
+    reg_size = 0;
+    reg_type = CPURegister::kNoRegister;
+  }
+
+  Register(const CPURegister& r) {  // NOLINT(runtime/explicit)
+    reg_code = r.reg_code;
+    reg_size = r.reg_size;
+    reg_type = r.reg_type;
+    ASSERT(IsValid());
+  }

   bool IsValid() const {
     ASSERT(IsRegister() || IsNone());
     return IsValidRegister();
   }

-  static const Register& XRegFromCode(unsigned code);
-  static const Register& WRegFromCode(unsigned code);
+  static Register XRegFromCode(unsigned code);
+  static Register WRegFromCode(unsigned code);

   // Start of V8 compatibility section ---------------------
   // These memebers are necessary for compilation.
@@ -181,9 +172,9 @@

   // Return true if the register is one that crankshaft can allocate.
   bool IsAllocatable() const {
-    return (code_ <= kAllocatableLowRangeEnd) ||
-        ((code_ >= kAllocatableHighRangeBegin) &&
-         (code_ <= kAllocatableHighRangeEnd));
+    return (reg_code <= kAllocatableLowRangeEnd) ||
+        ((reg_code >= kAllocatableHighRangeBegin) &&
+         (reg_code <= kAllocatableHighRangeEnd));
   }

   static Register FromAllocationIndex(unsigned index) {
@@ -219,34 +210,38 @@

   static Register from_code(int code) {
     // Always return an X register.
-    Register r(code, kXRegSize);
-    return r;
+    return Register::Create(code, kXRegSize);
   }

   // End of V8 compatibility section -----------------------
-
- private:
-  static const Register xregisters[];
-  static const Register wregisters[];
 };


-class FPRegister : public CPURegister {
- public:
-  FPRegister() : CPURegister() {}
-  explicit FPRegister(const CPURegister& other) : CPURegister(other) {
-    ASSERT(IsValidFPRegister() || IsNone());
+struct FPRegister : public CPURegister {
+  static FPRegister Create(unsigned code, unsigned size) {
+    return CPURegister::Create(code, size, CPURegister::kFPRegister);
   }
-  FPRegister(unsigned code, unsigned size)
-      : CPURegister(code, size, kFPRegister) {}
+
+  FPRegister() {
+    reg_code = 0;
+    reg_size = 0;
+    reg_type = CPURegister::kNoRegister;
+  }
+
+  FPRegister(const CPURegister& r) {  // NOLINT(runtime/explicit)
+    reg_code = r.reg_code;
+    reg_size = r.reg_size;
+    reg_type = r.reg_type;
+    ASSERT(IsValid());
+  }

   bool IsValid() const {
     ASSERT(IsFPRegister() || IsNone());
     return IsValidFPRegister();
   }

-  static const FPRegister& SRegFromCode(unsigned code);
-  static const FPRegister& DRegFromCode(unsigned code);
+  static FPRegister SRegFromCode(unsigned code);
+  static FPRegister DRegFromCode(unsigned code);

   // Start of V8 compatibility section ---------------------
   static const int kMaxNumRegisters = kNumberOfFPRegisters;
@@ -286,71 +281,91 @@

   static FPRegister from_code(int code) {
     // Always return a D register.
-    FPRegister r(code, kDRegSize);
-    return r;
+    return FPRegister::Create(code, kDRegSize);
   }
   // End of V8 compatibility section -----------------------
+};
+
+
+STATIC_ASSERT(sizeof(CPURegister) == sizeof(Register));
+STATIC_ASSERT(sizeof(CPURegister) == sizeof(FPRegister));

- private:
-  static const FPRegister sregisters[];
-  static const FPRegister dregisters[];
-};

+#if defined(A64_DEFINE_REG_STATICS)
+#define INITIALIZE_REGISTER(register_class, name, code, size, type)      \
+  const CPURegister init_##register_class##_##name = {code, size, type}; \
+  const register_class& name = *reinterpret_cast<const register_class*>( \
+                                    &init_##register_class##_##name)
+#define ALIAS_REGISTER(register_class, alias, name)                       \
+  const register_class& alias = *reinterpret_cast<const register_class*>( \
+                                     &init_##register_class##_##name)
+#else
+#define INITIALIZE_REGISTER(register_class, name, code, size, type) \
+  extern const register_class& name
+#define ALIAS_REGISTER(register_class, alias, name) \
+  extern const register_class& alias
+#endif  // defined(A64_DEFINE_REG_STATICS)

// No*Reg is used to indicate an unused argument, or an error case. Note that // these all compare equal (using the Is() method). The Register and FPRegister
 // variants are provided for convenience.
-const Register NoReg;
-const FPRegister NoFPReg;
-const CPURegister NoCPUReg;
-
-const Register no_reg;    // v8 compatibility.
+INITIALIZE_REGISTER(Register, NoReg, 0, 0, CPURegister::kNoRegister);
+INITIALIZE_REGISTER(FPRegister, NoFPReg, 0, 0, CPURegister::kNoRegister);
+INITIALIZE_REGISTER(CPURegister, NoCPUReg, 0, 0, CPURegister::kNoRegister);

+// v8 compatibility.
+INITIALIZE_REGISTER(Register, no_reg, 0, 0, CPURegister::kNoRegister);

-#define DEFINE_REGISTERS(N)  \
-const Register w##N(N, kWRegSize);  \
-const Register x##N(N, kXRegSize);
+#define DEFINE_REGISTERS(N) \ + INITIALIZE_REGISTER(Register, w##N, N, kWRegSize, CPURegister::kRegister); \ + INITIALIZE_REGISTER(Register, x##N, N, kXRegSize, CPURegister::kRegister);
 REGISTER_CODE_LIST(DEFINE_REGISTERS)
 #undef DEFINE_REGISTERS
-const Register wcsp(kSPRegInternalCode, kWRegSize);
-const Register csp(kSPRegInternalCode, kXRegSize);

+INITIALIZE_REGISTER(Register, wcsp, kSPRegInternalCode, kWRegSize,
+                    CPURegister::kRegister);
+INITIALIZE_REGISTER(Register, csp, kSPRegInternalCode, kXRegSize,
+                    CPURegister::kRegister);

-#define DEFINE_FPREGISTERS(N)  \
-const FPRegister s##N(N, kSRegSize);  \
-const FPRegister d##N(N, kDRegSize);
+#define DEFINE_FPREGISTERS(N)                         \
+  INITIALIZE_REGISTER(FPRegister, s##N, N, kSRegSize, \
+                      CPURegister::kFPRegister);      \
+ INITIALIZE_REGISTER(FPRegister, d##N, N, kDRegSize, CPURegister::kFPRegister);
 REGISTER_CODE_LIST(DEFINE_FPREGISTERS)
 #undef DEFINE_FPREGISTERS

+#undef INITIALIZE_REGISTER

 // Registers aliases.
-const Register ip0 = x16;
-const Register ip1 = x17;
-const Register wip0 = w16;
-const Register wip1 = w17;
+ALIAS_REGISTER(Register, ip0, x16);
+ALIAS_REGISTER(Register, ip1, x17);
+ALIAS_REGISTER(Register, wip0, w16);
+ALIAS_REGISTER(Register, wip1, w17);
 // Root register.
-const Register root = x26;
-const Register rr = root;
+ALIAS_REGISTER(Register, root, x26);
+ALIAS_REGISTER(Register, rr, x26);
 // Context pointer register.
-const Register cp = x27;
+ALIAS_REGISTER(Register, cp, x27);
// We use a register as a JS stack pointer to overcome the restriction on the
 // architectural SP alignment.
 // We chose x28 because it is contiguous with the other specific purpose
 // registers.
 STATIC_ASSERT(kJSSPCode == 28);
-const Register jssp = x28;
-const Register wjssp = w28;
-const Register fp = x29;
-const Register lr = x30;
-const Register xzr = x31;
-const Register wzr = w31;
+ALIAS_REGISTER(Register, jssp, x28);
+ALIAS_REGISTER(Register, wjssp, w28);
+ALIAS_REGISTER(Register, fp, x29);
+ALIAS_REGISTER(Register, lr, x30);
+ALIAS_REGISTER(Register, xzr, x31);
+ALIAS_REGISTER(Register, wzr, w31);

 // Crankshaft double scratch register.
-const FPRegister crankshaft_fp_scratch = d29;
+ALIAS_REGISTER(FPRegister, crankshaft_fp_scratch, d29);
 // Keeps the 0 double value.
-const FPRegister fp_zero = d30;
+ALIAS_REGISTER(FPRegister, fp_zero, d30);
 // MacroAssembler double scratch register.
-const FPRegister fp_scratch = d31;
+ALIAS_REGISTER(FPRegister, fp_scratch, d31);
+
+#undef ALIAS_REGISTER

// AreAliased returns true if any of the named registers overlap. Arguments set
 // to NoReg are ignored. The system stack pointer may be specified.
@@ -497,7 +512,7 @@
       // Try to create a CPURegister for each element in the list.
       for (int i = 0; i < kRegListSizeInBits; i++) {
         if (((list_ >> i) & 1) != 0) {
-          is_valid &= CPURegister(i, size_, type_).IsValid();
+          is_valid &= CPURegister::Create(i, size_, type_).IsValid();
         }
       }
       return is_valid;
@@ -513,13 +528,13 @@


 // AAPCS64 callee-saved registers.
-extern const CPURegList kCalleeSaved;
-extern const CPURegList kCalleeSavedFP;
+#define kCalleeSaved CPURegList::GetCalleeSaved()
+#define kCalleeSavedFP CPURegList::GetCalleeSavedFP()


 // AAPCS64 caller-saved registers. Note that this includes lr.
-extern const CPURegList kCallerSaved;
-extern const CPURegList kCallerSavedFP;
+#define kCallerSaved CPURegList::GetCallerSaved()
+#define kCallerSavedFP CPURegList::GetCallerSavedFP()


// -----------------------------------------------------------------------------
=======================================
--- /branches/experimental/a64/src/a64/code-stubs-a64.cc Wed Feb 5 19:41:46 2014 UTC +++ /branches/experimental/a64/src/a64/code-stubs-a64.cc Thu Feb 6 13:19:27 2014 UTC
@@ -5180,40 +5180,43 @@
   __ Pop(x1, x0);
 }

+#define MINOR_KEY_FOR(obj, value, addr, action, fp_mode)        \
+  ((obj) | ((value) << 5) | ((addr) << 10) | ((action) << 15) | \
+  ((fp_mode) << 16))

 const int RecordWriteStub::kAheadOfTime[] = {
   // Arguments to MinorKeyFor() are object, value and address registers.

   // Used in StoreArrayLiteralElementStub::Generate.
-  MinorKeyFor(x10, x0, x11, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(10, 0, 11, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in FastNewClosure::Generate.
-  MinorKeyFor(x5, x4, x1, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(5, 4, 1, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in KeyedStoreStubCompiler::GenerateStoreFastElement.
-  MinorKeyFor(x3, x2, x10, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(3, 2, 10, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in KeyedStoreStubCompiler::GenerateStoreFastDoubleElement.
-  MinorKeyFor(x2, x3, x10, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(2, 3, 10, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in ElementsTransitionGenerator::GenerateSmiToDouble.
-  MinorKeyFor(x2, x3, x6, OMIT_REMEMBERED_SET, kDontSaveFPRegs),
-  MinorKeyFor(x2, x10, x6, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(2, 3, 6, OMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(2, 10, 6, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in ElementsTransitionGenerator::GenerateDoubleToObject.
-  MinorKeyFor(x7, x5, x13, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
-  MinorKeyFor(x2, x7, x13, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
-  MinorKeyFor(x2, x3, x13, OMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(7, 5, 13, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(2, 7, 13, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(2, 3, 13, OMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in KeyedStoreIC::GenerateGeneric helper function.
-  MinorKeyFor(x4, x10, x11, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(4, 10, 11, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in RegExpExecStub::Generate.
-  MinorKeyFor(x21, x10, x11, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(21, 10, 11, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // Used in StringAddStub::Generate.
-  MinorKeyFor(x0, x10, x3, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
-  MinorKeyFor(x0, x11, x3, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(0, 10, 3, EMIT_REMEMBERED_SET, kDontSaveFPRegs),
+  MINOR_KEY_FOR(0, 11, 3, EMIT_REMEMBERED_SET, kDontSaveFPRegs),

   // TODO(jbramley): There are many more sites that want a pregenerated
// instance of this stub, but they are currently unimplemented. Once they are
@@ -5226,6 +5229,9 @@
 };


+#undef MINOR_KEY_FOR
+
+
 void RecordWriteStub::GenerateFixedRegStubsAheadOfTime(Isolate* isolate) {
   // Pregenerate all of the stub variants in the kAheadOfTime list.
   for (const int* entry = kAheadOfTime; *entry != 0; entry++) {
=======================================
--- /branches/experimental/a64/src/a64/constants-a64.h Wed Jan 22 12:46:44 2014 UTC +++ /branches/experimental/a64/src/a64/constants-a64.h Thu Feb 6 13:19:27 2014 UTC
@@ -65,19 +65,19 @@
 // TODO(all): k<Y>RegSize should probably be k<Y>RegSizeInBits.
 const unsigned kWRegSize = 32;
 const unsigned kWRegSizeLog2 = 5;
-const unsigned kWRegSizeInBytes = kWRegSize / 8;
+const unsigned kWRegSizeInBytes = kWRegSize >> 3;
 const unsigned kWRegSizeInBytesLog2 = kWRegSizeLog2 - 3;
 const unsigned kXRegSize = 64;
 const unsigned kXRegSizeLog2 = 6;
-const unsigned kXRegSizeInBytes = kXRegSize / 8;
+const unsigned kXRegSizeInBytes = kXRegSize >> 3;
 const unsigned kXRegSizeInBytesLog2 = kXRegSizeLog2 - 3;
 const unsigned kSRegSize = 32;
 const unsigned kSRegSizeLog2 = 5;
-const unsigned kSRegSizeInBytes = kSRegSize / 8;
+const unsigned kSRegSizeInBytes = kSRegSize >> 3;
 const unsigned kSRegSizeInBytesLog2 = kSRegSizeLog2 - 3;
 const unsigned kDRegSize = 64;
 const unsigned kDRegSizeLog2 = 6;
-const unsigned kDRegSizeInBytes = kDRegSize / 8;
+const unsigned kDRegSizeInBytes = kDRegSize >> 3;
 const unsigned kDRegSizeInBytesLog2 = kDRegSizeLog2 - 3;
 const int64_t kWRegMask = 0x00000000ffffffffL;
 const int64_t kXRegMask = 0xffffffffffffffffL;
@@ -108,19 +108,19 @@
 const unsigned kRegCodeMask = 0x1f;
 // Standard machine types defined by AAPCS64.
 const unsigned kByteSize = 8;
-const unsigned kByteSizeInBytes = kByteSize / 8;
+const unsigned kByteSizeInBytes = kByteSize >> 3;
 const unsigned kHalfWordSize = 16;
 const unsigned kHalfWordSizeLog2 = 4;
-const unsigned kHalfWordSizeInBytes = kHalfWordSizeInBytes / 8;
+const unsigned kHalfWordSizeInBytes = kHalfWordSize >> 3;
 const unsigned kHalfWordSizeInBytesLog2 = kHalfWordSizeLog2 - 3;
 const unsigned kWordSize = 32;
 const unsigned kWordSizeLog2 = 5;
-const unsigned kWordSizeInBytes = kWordSizeInBytes / 8;
+const unsigned kWordSizeInBytes = kWordSize >> 3;
 const unsigned kWordSizeInBytesLog2 = kWordSizeLog2 - 3;
 const unsigned kDoubleWordSize = 64;
-const unsigned kDoubleWordSizeInBytes = kDoubleWordSizeInBytes / 8;
+const unsigned kDoubleWordSizeInBytes = kDoubleWordSize >> 3;
 const unsigned kQuadWordSize = 128;
-const unsigned kQuadWordSizeInBytes = kQuadWordSizeInBytes / 8;
+const unsigned kQuadWordSizeInBytes = kQuadWordSize >> 3;
 // AArch64 floating-point specifics. These match IEEE-754.
 const unsigned kDoubleMantissaBits = 52;
 const unsigned kDoubleExponentBits = 11;
=======================================
--- /branches/experimental/a64/src/a64/debug-a64.cc Tue Feb 4 12:58:02 2014 UTC +++ /branches/experimental/a64/src/a64/debug-a64.cc Thu Feb 6 13:19:27 2014 UTC
@@ -183,7 +183,7 @@
         CPURegList(CPURegister::kRegister, kXRegSize, non_object_regs);
     while (!non_object_list.IsEmpty()) {
       // Store each non-object register as two SMIs.
-      Register reg(non_object_list.PopLowestIndex());
+      Register reg = Register(non_object_list.PopLowestIndex());
       __ Push(reg);
       __ Poke(wzr, 0);
       __ Push(reg.W(), wzr);
@@ -222,7 +222,7 @@
       //  jssp[8]: 0x00000000 (SMI tag & padding)
       //  jssp[4]: reg[31:0]
       //  jssp[0]: 0x00000000 (SMI tag & padding)
-      Register reg(non_object_list.PopHighestIndex());
+      Register reg = Register(non_object_list.PopHighestIndex());
       __ Pop(scratch, reg);
       __ Bfxil(reg, scratch, 32, 32);
     }
=======================================
--- /branches/experimental/a64/src/a64/frames-a64.h Thu Feb 6 11:53:35 2014 UTC +++ /branches/experimental/a64/src/a64/frames-a64.h Thu Feb 6 13:19:27 2014 UTC
@@ -48,10 +48,9 @@
 // Define the list of registers actually saved at safepoints.
 // Note that the number of saved registers may be smaller than the reserved
 // space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
-const RegList kSafepointSavedRegisters =
-    CPURegList::GetSafepointSavedRegisters().list();
-const int kNumSafepointSavedRegisters =
-    CPURegList::GetSafepointSavedRegisters().Count();
+#define kSafepointSavedRegisters CPURegList::GetSafepointSavedRegisters().list()
+#define kNumSafepointSavedRegisters \
+  CPURegList::GetSafepointSavedRegisters().Count();

 class EntryFrameConstants : public AllStatic {
  public:
=======================================
--- /branches/experimental/a64/src/a64/instructions-a64.cc Fri Jan 31 17:26:22 2014 UTC +++ /branches/experimental/a64/src/a64/instructions-a64.cc Thu Feb 6 13:19:27 2014 UTC
@@ -29,6 +29,8 @@

 #if V8_TARGET_ARCH_A64

+#define A64_DEFINE_FP_STATICS
+
 #include "a64/instructions-a64.h"
 #include "a64/assembler-a64-inl.h"

=======================================
--- /branches/experimental/a64/src/a64/instructions-a64.h Fri Jan 31 17:26:22 2014 UTC +++ /branches/experimental/a64/src/a64/instructions-a64.h Thu Feb 6 13:19:27 2014 UTC
@@ -40,19 +40,35 @@
// ISA constants. --------------------------------------------------------------

 typedef uint32_t Instr;
-const float kFP32PositiveInfinity = rawbits_to_float(0x7f800000);
-const float kFP32NegativeInfinity = rawbits_to_float(0xff800000);
-const double kFP64PositiveInfinity = rawbits_to_double(0x7ff0000000000000UL); -const double kFP64NegativeInfinity = rawbits_to_double(0xfff0000000000000UL);
+
+// The following macros initialize a float/double variable with a bit pattern +// without using static initializers: If A64_DEFINE_FP_STATICS is defined, the
+// symbol is defined as uint32_t/uint64_t initialized with the desired bit
+// pattern. Otherwise, the same symbol is declared as an external float/double.
+#if defined(A64_DEFINE_FP_STATICS)
+#define DEFINE_FLOAT(name, value) extern const uint32_t name = value
+#define DEFINE_DOUBLE(name, value) extern const uint64_t name = value
+#else
+#define DEFINE_FLOAT(name, value) extern const float name
+#define DEFINE_DOUBLE(name, value) extern const double name
+#endif  // defined(A64_DEFINE_FP_STATICS)
+
+DEFINE_FLOAT(kFP32PositiveInfinity, 0x7f800000);
+DEFINE_FLOAT(kFP32NegativeInfinity, 0xff800000);
+DEFINE_DOUBLE(kFP64PositiveInfinity, 0x7ff0000000000000UL);
+DEFINE_DOUBLE(kFP64NegativeInfinity, 0xfff0000000000000UL);

// This value is a signalling NaN as both a double and as a float (taking the
 // least-significant word).
-static const double kFP64SignallingNaN = rawbits_to_double(0x7ff000007f800001);
-static const float kFP32SignallingNaN = rawbits_to_float(0x7f800001);
+DEFINE_DOUBLE(kFP64SignallingNaN, 0x7ff000007f800001);
+DEFINE_FLOAT(kFP32SignallingNaN, 0x7f800001);

 // A similar value, but as a quiet NaN.
-static const double kFP64QuietNaN = rawbits_to_double(0x7ff800007fc00001);
-static const float kFP32QuietNaN = rawbits_to_float(0x7fc00001);
+DEFINE_DOUBLE(kFP64QuietNaN, 0x7ff800007fc00001);
+DEFINE_FLOAT(kFP32QuietNaN, 0x7fc00001);
+
+#undef DEFINE_FLOAT
+#undef DEFINE_DOUBLE


 enum LSDataSize {
=======================================
--- /branches/experimental/a64/src/a64/lithium-gap-resolver-a64.cc Wed Feb 5 08:06:23 2014 UTC +++ /branches/experimental/a64/src/a64/lithium-gap-resolver-a64.cc Thu Feb 6 13:19:27 2014 UTC
@@ -40,8 +40,7 @@
 //    with any of the moves we are resolving.
// - We don't need to push it on the stack, as we can reload it with its value
 //    once we have resolved a cycle.
-const Register LGapResolver::kSavedValue = root;
-
+#define kSavedValue root

 LGapResolver::LGapResolver(LCodeGen* owner)
: cgen_(owner), moves_(32, owner->zone()), root_index_(0), in_cycle_(false),
=======================================
--- /branches/experimental/a64/src/a64/lithium-gap-resolver-a64.h Wed Jan 22 12:46:44 2014 UTC +++ /branches/experimental/a64/src/a64/lithium-gap-resolver-a64.h Thu Feb 6 13:19:27 2014 UTC
@@ -71,9 +71,6 @@
   // Verify the move list before performing moves.
   void Verify();

-  // Register used to break cycle in moves list.
-  static const Register kSavedValue;
-
   LCodeGen* cgen_;

   // List of moves not yet resolved.
=======================================
--- /branches/experimental/a64/src/a64/macro-assembler-a64.h Thu Feb 6 11:53:35 2014 UTC +++ /branches/experimental/a64/src/a64/macro-assembler-a64.h Thu Feb 6 13:19:27 2014 UTC
@@ -1862,11 +1862,11 @@
   }

   const Register WTmp0() const {
-    return Register(tmp0_.code(), kWRegSize);
+    return Register::Create(tmp0_.code(), kWRegSize);
   }

   const Register WTmp1() const {
-    return Register(tmp1_.code(), kWRegSize);
+    return Register::Create(tmp1_.code(), kWRegSize);
   }

   void SetFPScratchRegister(const FPRegister& fptmp0) {
@@ -1882,7 +1882,7 @@
       const CPURegister& forbidden = NoCPUReg) const {
     Register candidate = forbidden.Is(Tmp0()) ? Tmp1() : Tmp0();
     ASSERT(!candidate.Is(target));
-    return Register(candidate.code(), target.SizeInBits());
+    return Register::Create(candidate.code(), target.SizeInBits());
   }

   const FPRegister AppropriateTempFor(
@@ -1892,7 +1892,7 @@
     FPRegister candidate = FPTmp0();
     ASSERT(!candidate.Is(forbidden));
     ASSERT(!candidate.Is(target));
-    return FPRegister(candidate.code(), target.SizeInBits());
+    return FPRegister::Create(candidate.code(), target.SizeInBits());
   }

   // Like printf, but print at run-time from generated code.
=======================================
--- /branches/experimental/a64/src/a64/regexp-macro-assembler-a64.cc Tue Feb 4 12:58:02 2014 UTC +++ /branches/experimental/a64/src/a64/regexp-macro-assembler-a64.cc Thu Feb 6 13:19:27 2014 UTC
@@ -1558,7 +1558,7 @@

 Register RegExpMacroAssemblerA64::GetCachedRegister(int register_index) {
   ASSERT(register_index < kNumCachedRegisters);
-  return Register(register_index / 2, kXRegSize);
+  return Register::Create(register_index / 2, kXRegSize);
 }


=======================================
--- /branches/experimental/a64/test/cctest/test-utils-a64.cc Wed Jan 22 12:46:44 2014 UTC +++ /branches/experimental/a64/test/cctest/test-utils-a64.cc Thu Feb 6 13:19:27 2014 UTC
@@ -218,13 +218,13 @@
     if (((1UL << n) & allowed) != 0) {
       // Only assign allowed registers.
       if (r) {
-        r[i] = Register(n, reg_size);
+        r[i] = Register::Create(n, reg_size);
       }
       if (x) {
-        x[i] = Register(n, kXRegSize);
+        x[i] = Register::Create(n, kXRegSize);
       }
       if (w) {
-        w[i] = Register(n, kWRegSize);
+        w[i] = Register::Create(n, kWRegSize);
       }
       list |= (1UL << n);
       i++;
@@ -245,13 +245,13 @@
     if (((1UL << n) & allowed) != 0) {
       // Only assigned allowed registers.
       if (v) {
-        v[i] = FPRegister(n, reg_size);
+        v[i] = FPRegister::Create(n, reg_size);
       }
       if (d) {
-        d[i] = FPRegister(n, kDRegSize);
+        d[i] = FPRegister::Create(n, kDRegSize);
       }
       if (s) {
-        s[i] = FPRegister(n, kSRegSize);
+        s[i] = FPRegister::Create(n, kSRegSize);
       }
       list |= (1UL << n);
       i++;
@@ -268,7 +268,7 @@
   Register first = NoReg;
   for (unsigned i = 0; i < kNumberOfRegisters; i++) {
     if (reg_list & (1UL << i)) {
-      Register xn(i, kXRegSize);
+      Register xn = Register::Create(i, kXRegSize);
       // We should never write into csp here.
       ASSERT(!xn.Is(csp));
       if (!xn.IsZero()) {
@@ -291,7 +291,7 @@
   FPRegister first = NoFPReg;
   for (unsigned i = 0; i < kNumberOfFPRegisters; i++) {
     if (reg_list & (1UL << i)) {
-      FPRegister dn(i, kDRegSize);
+      FPRegister dn = FPRegister::Create(i, kDRegSize);
       if (!first.IsValid()) {
         // This is the first register we've hit, so construct the literal.
         __ Fmov(dn, value);

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to