Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(726)

Unified Diff: src/mips64/assembler-mips64.h

Issue 2733503003: [assembler] Make register definitions constexpr (Closed)
Patch Set: [assembler] Make register definitions constexpr Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | src/x64/assembler-x64.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/mips64/assembler-mips64.h
diff --git a/src/mips64/assembler-mips64.h b/src/mips64/assembler-mips64.h
index 433c03c1c3fafbf375e45337525295e6166cce62..9dd12bbd4335f5c1119e5d108294a4e91d195d20 100644
--- a/src/mips64/assembler-mips64.h
+++ b/src/mips64/assembler-mips64.h
@@ -97,14 +97,14 @@ namespace internal {
// Implementation of Register and FPURegister.
struct Register {
- static const int kCpRegister = 23; // cp (s7) is the 23rd register.
+ static constexpr int kCpRegister = 23; // cp (s7) is the 23rd register.
#if defined(V8_TARGET_LITTLE_ENDIAN)
- static const int kMantissaOffset = 0;
- static const int kExponentOffset = 4;
+ static constexpr int kMantissaOffset = 0;
+ static constexpr int kExponentOffset = 4;
#elif defined(V8_TARGET_BIG_ENDIAN)
- static const int kMantissaOffset = 4;
- static const int kExponentOffset = 0;
+ static constexpr int kMantissaOffset = 4;
+ static constexpr int kExponentOffset = 0;
#else
#error Unknown endianness
#endif
@@ -117,7 +117,7 @@ struct Register {
kCode_no_reg = -1
};
- static const int kNumRegisters = Code::kAfterLast;
+ static constexpr int kNumRegisters = Code::kAfterLast;
static Register from_code(int code) {
DCHECK(code >= 0);
@@ -132,10 +132,7 @@ struct Register {
DCHECK(is_valid());
return reg_code;
}
- int bit() const {
- DCHECK(is_valid());
- return 1 << reg_code;
- }
+ constexpr int bit() const { return DCHECK(is_valid()), 1 << reg_code; }
// Unfortunately we can't make this private in a struct.
int reg_code;
@@ -144,18 +141,17 @@ struct Register {
// s7: context register
// s3: lithium scratch
// s4: lithium scratch2
-#define DECLARE_REGISTER(R) const Register R = {Register::kCode_##R};
+#define DECLARE_REGISTER(R) constexpr Register R = {Register::kCode_##R};
GENERAL_REGISTERS(DECLARE_REGISTER)
#undef DECLARE_REGISTER
-const Register no_reg = {Register::kCode_no_reg};
-
+constexpr Register no_reg = {Register::kCode_no_reg};
int ToNumber(Register reg);
Register ToRegister(int num);
-static const bool kSimpleFPAliasing = true;
-static const bool kSimdMaskRegisters = false;
+constexpr bool kSimpleFPAliasing = true;
+constexpr bool kSimdMaskRegisters = false;
// Coprocessor register.
struct FPURegister {
@@ -167,7 +163,7 @@ struct FPURegister {
kCode_no_reg = -1
};
- static const int kMaxNumRegisters = Code::kAfterLast;
+ static constexpr int kMaxNumRegisters = Code::kAfterLast;
inline static int NumRegisters();
@@ -200,10 +196,7 @@ struct FPURegister {
DCHECK(is_valid());
return reg_code;
}
- int bit() const {
- DCHECK(is_valid());
- return 1 << reg_code;
- }
+ constexpr int bit() const { return DCHECK(is_valid()), 1 << reg_code; }
static FPURegister from_code(int code) {
FPURegister r = {code};
@@ -238,55 +231,52 @@ typedef FPURegister DoubleRegister;
// TODO(mips64) Define SIMD registers.
typedef FPURegister Simd128Register;
-const DoubleRegister no_freg = {-1};
-
-const DoubleRegister f0 = {0}; // Return value in hard float mode.
-const DoubleRegister f1 = {1};
-const DoubleRegister f2 = {2};
-const DoubleRegister f3 = {3};
-const DoubleRegister f4 = {4};
-const DoubleRegister f5 = {5};
-const DoubleRegister f6 = {6};
-const DoubleRegister f7 = {7};
-const DoubleRegister f8 = {8};
-const DoubleRegister f9 = {9};
-const DoubleRegister f10 = {10};
-const DoubleRegister f11 = {11};
-const DoubleRegister f12 = {12}; // Arg 0 in hard float mode.
-const DoubleRegister f13 = {13};
-const DoubleRegister f14 = {14}; // Arg 1 in hard float mode.
-const DoubleRegister f15 = {15};
-const DoubleRegister f16 = {16};
-const DoubleRegister f17 = {17};
-const DoubleRegister f18 = {18};
-const DoubleRegister f19 = {19};
-const DoubleRegister f20 = {20};
-const DoubleRegister f21 = {21};
-const DoubleRegister f22 = {22};
-const DoubleRegister f23 = {23};
-const DoubleRegister f24 = {24};
-const DoubleRegister f25 = {25};
-const DoubleRegister f26 = {26};
-const DoubleRegister f27 = {27};
-const DoubleRegister f28 = {28};
-const DoubleRegister f29 = {29};
-const DoubleRegister f30 = {30};
-const DoubleRegister f31 = {31};
+constexpr DoubleRegister no_freg = {-1};
+
+constexpr DoubleRegister f0 = {0}; // Return value in hard float mode.
+constexpr DoubleRegister f1 = {1};
+constexpr DoubleRegister f2 = {2};
+constexpr DoubleRegister f3 = {3};
+constexpr DoubleRegister f4 = {4};
+constexpr DoubleRegister f5 = {5};
+constexpr DoubleRegister f6 = {6};
+constexpr DoubleRegister f7 = {7};
+constexpr DoubleRegister f8 = {8};
+constexpr DoubleRegister f9 = {9};
+constexpr DoubleRegister f10 = {10};
+constexpr DoubleRegister f11 = {11};
+constexpr DoubleRegister f12 = {12}; // Arg 0 in hard float mode.
+constexpr DoubleRegister f13 = {13};
+constexpr DoubleRegister f14 = {14}; // Arg 1 in hard float mode.
+constexpr DoubleRegister f15 = {15};
+constexpr DoubleRegister f16 = {16};
+constexpr DoubleRegister f17 = {17};
+constexpr DoubleRegister f18 = {18};
+constexpr DoubleRegister f19 = {19};
+constexpr DoubleRegister f20 = {20};
+constexpr DoubleRegister f21 = {21};
+constexpr DoubleRegister f22 = {22};
+constexpr DoubleRegister f23 = {23};
+constexpr DoubleRegister f24 = {24};
+constexpr DoubleRegister f25 = {25};
+constexpr DoubleRegister f26 = {26};
+constexpr DoubleRegister f27 = {27};
+constexpr DoubleRegister f28 = {28};
+constexpr DoubleRegister f29 = {29};
+constexpr DoubleRegister f30 = {30};
+constexpr DoubleRegister f31 = {31};
// Register aliases.
// cp is assumed to be a callee saved register.
-// Defined using #define instead of "static const Register&" because Clang
-// complains otherwise when a compilation unit that includes this header
-// doesn't use the variables.
-#define kRootRegister s6
-#define cp s7
-#define kLithiumScratchReg s3
-#define kLithiumScratchReg2 s4
-#define kLithiumScratchDouble f30
-#define kDoubleRegZero f28
+constexpr Register kRootRegister = s6;
+constexpr Register cp = s7;
+constexpr Register kLithiumScratchReg = s3;
+constexpr Register kLithiumScratchReg2 = s4;
+constexpr DoubleRegister kLithiumScratchDouble = f30;
+constexpr DoubleRegister kDoubleRegZero = f28;
// Used on mips64r6 for compare operations.
// We use the last non-callee saved odd register for N64 ABI
-#define kDoubleCompareReg f23
+constexpr DoubleRegister kDoubleCompareReg = f23;
// FPU (coprocessor 1) control registers.
// Currently only FCSR (#31) is implemented.
@@ -297,10 +287,7 @@ struct FPUControlRegister {
DCHECK(is_valid());
return reg_code;
}
- int bit() const {
- DCHECK(is_valid());
- return 1 << reg_code;
- }
+ constexpr int bit() const { return DCHECK(is_valid()), 1 << reg_code; }
void setcode(int f) {
reg_code = f;
DCHECK(is_valid());
@@ -309,13 +296,13 @@ struct FPUControlRegister {
int reg_code;
};
-const FPUControlRegister no_fpucreg = { kInvalidFPUControlRegister };
-const FPUControlRegister FCSR = { kFCSRRegister };
+constexpr FPUControlRegister no_fpucreg = {kInvalidFPUControlRegister};
+constexpr FPUControlRegister FCSR = {kFCSRRegister};
// -----------------------------------------------------------------------------
// Machine instruction Operands.
-const int kSmiShift = kSmiTagSize + kSmiShiftSize;
-const uint64_t kSmiShiftMask = (1UL << kSmiShift) - 1;
+constexpr int kSmiShift = kSmiTagSize + kSmiShiftSize;
+constexpr uint64_t kSmiShiftMask = (1UL << kSmiShift) - 1;
// Class Operand represents a shifter operand in data processing instructions.
class Operand BASE_EMBEDDED {
public:
@@ -509,10 +496,10 @@ class Assembler : public AssemblerBase {
RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE);
// Size of an instruction.
- static const int kInstrSize = sizeof(Instr);
+ static constexpr int kInstrSize = sizeof(Instr);
// Difference between address of current opcode and target address offset.
- static const int kBranchPCOffset = 4;
+ static constexpr int kBranchPCOffset = 4;
// Here we are patching the address in the LUI/ORI instruction pair.
// These values are used in the serialization process and must be zero for
@@ -520,46 +507,46 @@ class Assembler : public AssemblerBase {
// are split across two consecutive instructions and don't exist separately
// in the code, so the serializer should not step forwards in memory after
// a target is resolved and written.
- static const int kSpecialTargetSize = 0;
+ static constexpr int kSpecialTargetSize = 0;
// Number of consecutive instructions used to store 32bit/64bit constant.
// This constant was used in RelocInfo::target_address_address() function
// to tell serializer address of the instruction that follows
// LUI/ORI instruction pair.
- static const int kInstructionsFor32BitConstant = 2;
- static const int kInstructionsFor64BitConstant = 4;
+ static constexpr int kInstructionsFor32BitConstant = 2;
+ static constexpr int kInstructionsFor64BitConstant = 4;
// Distance between the instruction referring to the address of the call
// target and the return address.
#ifdef _MIPS_ARCH_MIPS64R6
- static const int kCallTargetAddressOffset = 5 * kInstrSize;
+ static constexpr int kCallTargetAddressOffset = 5 * kInstrSize;
#else
- static const int kCallTargetAddressOffset = 6 * kInstrSize;
+ static constexpr int kCallTargetAddressOffset = 6 * kInstrSize;
#endif
// Distance between start of patched debug break slot and the emitted address
// to jump to.
- static const int kPatchDebugBreakSlotAddressOffset = 6 * kInstrSize;
+ static constexpr int kPatchDebugBreakSlotAddressOffset = 6 * kInstrSize;
// Difference between address of current opcode and value read from pc
// register.
- static const int kPcLoadDelta = 4;
+ static constexpr int kPcLoadDelta = 4;
#ifdef _MIPS_ARCH_MIPS64R6
- static const int kDebugBreakSlotInstructions = 5;
+ static constexpr int kDebugBreakSlotInstructions = 5;
#else
- static const int kDebugBreakSlotInstructions = 6;
+ static constexpr int kDebugBreakSlotInstructions = 6;
#endif
- static const int kDebugBreakSlotLength =
+ static constexpr int kDebugBreakSlotLength =
kDebugBreakSlotInstructions * kInstrSize;
// Max offset for instructions with 16-bit offset field
- static const int kMaxBranchOffset = (1 << (18 - 1)) - 1;
+ static constexpr int kMaxBranchOffset = (1 << (18 - 1)) - 1;
// Max offset for compact branch instructions with 26-bit offset field
- static const int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1;
+ static constexpr int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1;
- static const int kTrampolineSlotsSize = 2 * kInstrSize;
+ static constexpr int kTrampolineSlotsSize = 2 * kInstrSize;
// ---------------------------------------------------------------------------
// Code generation.
@@ -1313,21 +1300,21 @@ class Assembler : public AssemblerBase {
private:
// Buffer size and constant pool distance are checked together at regular
// intervals of kBufferCheckInterval emitted bytes.
- static const int kBufferCheckInterval = 1*KB/2;
+ static constexpr int kBufferCheckInterval = 1 * KB / 2;
// Code generation.
// The relocation writer's position is at least kGap bytes below the end of
// the generated instructions. This is so that multi-instruction sequences do
// not have to check for overflow. The same is true for writes of large
// relocation info entries.
- static const int kGap = 32;
-
+ static constexpr int kGap = 32;
// Repeated checking whether the trampoline pool should be emitted is rather
// expensive. By default we only check again once a number of instructions
// has been generated.
- static const int kCheckConstIntervalInst = 32;
- static const int kCheckConstInterval = kCheckConstIntervalInst * kInstrSize;
+ static constexpr int kCheckConstIntervalInst = 32;
+ static constexpr int kCheckConstInterval =
+ kCheckConstIntervalInst * kInstrSize;
int next_buffer_check_; // pc offset of next buffer check.
@@ -1343,7 +1330,7 @@ class Assembler : public AssemblerBase {
// Relocation information generation.
// Each relocation is encoded as a variable size value.
- static const int kMaxRelocSize = RelocInfoWriter::kMaxSize;
+ static constexpr int kMaxRelocSize = RelocInfoWriter::kMaxSize;
RelocInfoWriter reloc_info_writer;
// The bound position, before this we cannot do instruction elimination.
@@ -1497,7 +1484,7 @@ class Assembler : public AssemblerBase {
// branch instruction generation, where we use jump instructions rather
// than regular branch instructions.
bool trampoline_emitted_;
- static const int kInvalidSlotPos = -1;
+ static constexpr int kInvalidSlotPos = -1;
// Internal reference positions, required for unbounded internal reference
// labels.
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | src/x64/assembler-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698