summaryrefslogtreecommitdiff
path: root/deps/v8/src/mips/assembler-mips.h
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2017-12-05 16:41:55 +0100
committerMichaël Zasso <targos@protonmail.com>2017-12-06 12:52:07 +0100
commit1854ba04e9a68f062beb299dd6e1479279b26363 (patch)
treed5b2df9b8c1deb6388f7a728fca8e1c98c779abe /deps/v8/src/mips/assembler-mips.h
parentb52c23b75f96e1c9d2c7b3a7e5619170d0a0d8e1 (diff)
downloadnode-new-1854ba04e9a68f062beb299dd6e1479279b26363.tar.gz
deps: update V8 to 6.3.292.46
PR-URL: https://github.com/nodejs/node/pull/16271 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Myles Borins <myles.borins@gmail.com>
Diffstat (limited to 'deps/v8/src/mips/assembler-mips.h')
-rw-r--r--deps/v8/src/mips/assembler-mips.h273
1 files changed, 65 insertions, 208 deletions
diff --git a/deps/v8/src/mips/assembler-mips.h b/deps/v8/src/mips/assembler-mips.h
index 49e143fdeb..d2a9802b5e 100644
--- a/deps/v8/src/mips/assembler-mips.h
+++ b/deps/v8/src/mips/assembler-mips.h
@@ -200,19 +200,15 @@ const int kSafepointRegisterStackIndexMap[kNumRegs] = {kUndefIndex, // zero_reg
// -----------------------------------------------------------------------------
// Implementation of Register and FPURegister.
-struct Register {
- static constexpr int kCpRegister = 23; // cp (s7) is the 23rd register.
-
- enum Code {
-#define REGISTER_CODE(R) kCode_##R,
- GENERAL_REGISTERS(REGISTER_CODE)
+enum RegisterCode {
+#define REGISTER_CODE(R) kRegCode_##R,
+ GENERAL_REGISTERS(REGISTER_CODE)
#undef REGISTER_CODE
- kAfterLast,
- kCode_no_reg = -1
- };
-
- static constexpr int kNumRegisters = Code::kAfterLast;
+ kRegAfterLast
+};
+class Register : public RegisterBase<Register, kRegAfterLast> {
+ public:
#if defined(V8_TARGET_LITTLE_ENDIAN)
static constexpr int kMantissaOffset = 0;
static constexpr int kExponentOffset = 4;
@@ -223,34 +219,19 @@ struct Register {
#error Unknown endianness
#endif
-
- static Register from_code(int code) {
- DCHECK_LE(0, code);
- DCHECK_GT(kNumRegisters, code);
- return Register{code};
- }
- bool is_valid() const { return 0 <= reg_code && reg_code < kNumRegisters; }
- bool is(Register reg) const { return reg_code == reg.reg_code; }
- int code() const {
- DCHECK(is_valid());
- return reg_code;
- }
- int bit() const {
- DCHECK(is_valid());
- return 1 << reg_code;
- }
-
- // Unfortunately we can't make this private in a struct.
- int reg_code;
+ private:
+ friend class RegisterBase;
+ explicit constexpr Register(int code) : RegisterBase(code) {}
};
// s7: context register
// s3: lithium scratch
// s4: lithium scratch2
-#define DECLARE_REGISTER(R) constexpr Register R = {Register::kCode_##R};
+#define DECLARE_REGISTER(R) \
+ constexpr Register R = Register::from_code<kRegCode_##R>();
GENERAL_REGISTERS(DECLARE_REGISTER)
#undef DECLARE_REGISTER
-constexpr Register no_reg = {Register::kCode_no_reg};
+constexpr Register no_reg = Register::no_reg();
int ToNumber(Register reg);
@@ -259,100 +240,43 @@ Register ToRegister(int num);
constexpr bool kSimpleFPAliasing = true;
constexpr bool kSimdMaskRegisters = false;
-// Coprocessor register.
-struct FPURegister {
- enum Code {
-#define REGISTER_CODE(R) kCode_##R,
- DOUBLE_REGISTERS(REGISTER_CODE)
+enum DoubleRegisterCode {
+#define REGISTER_CODE(R) kDoubleCode_##R,
+ DOUBLE_REGISTERS(REGISTER_CODE)
#undef REGISTER_CODE
- kAfterLast,
- kCode_no_reg = kInvalidFPURegister
- };
-
- static constexpr int kMaxNumRegisters = Code::kAfterLast;
-
- inline static int NumRegisters();
-
- // TODO(plind): Warning, inconsistent numbering here. kNumFPURegisters refers
- // to number of 32-bit FPU regs, but kNumAllocatableRegisters refers to
- // number of Double regs (64-bit regs, or FPU-reg-pairs).
+ kDoubleAfterLast
+};
- bool is_valid() const { return 0 <= reg_code && reg_code < kMaxNumRegisters; }
- bool is(FPURegister reg) const { return reg_code == reg.reg_code; }
+// Coprocessor register.
+class FPURegister : public RegisterBase<FPURegister, kDoubleAfterLast> {
+ public:
FPURegister low() const {
// Find low reg of a Double-reg pair, which is the reg itself.
- DCHECK(reg_code % 2 == 0); // Specified Double reg must be even.
- FPURegister reg;
- reg.reg_code = reg_code;
- DCHECK(reg.is_valid());
- return reg;
+ DCHECK(code() % 2 == 0); // Specified Double reg must be even.
+ return FPURegister::from_code(code());
}
FPURegister high() const {
// Find high reg of a Doubel-reg pair, which is reg + 1.
- DCHECK(reg_code % 2 == 0); // Specified Double reg must be even.
- FPURegister reg;
- reg.reg_code = reg_code + 1;
- DCHECK(reg.is_valid());
- return reg;
+ DCHECK(code() % 2 == 0); // Specified Double reg must be even.
+ return FPURegister::from_code(code() + 1);
}
- int code() const {
- DCHECK(is_valid());
- return reg_code;
- }
- int bit() const {
- DCHECK(is_valid());
- return 1 << reg_code;
- }
-
- static FPURegister from_code(int code) {
- FPURegister r = {code};
- return r;
- }
- void setcode(int f) {
- reg_code = f;
- DCHECK(is_valid());
- }
- // Unfortunately we can't make this private in a struct.
- int reg_code;
+ private:
+ friend class RegisterBase;
+ explicit constexpr FPURegister(int code) : RegisterBase(code) {}
};
-// MIPS SIMD (MSA) register
-struct MSARegister {
- enum Code {
-#define REGISTER_CODE(R) kCode_##R,
- SIMD128_REGISTERS(REGISTER_CODE)
+enum MSARegisterCode {
+#define REGISTER_CODE(R) kMsaCode_##R,
+ SIMD128_REGISTERS(REGISTER_CODE)
#undef REGISTER_CODE
- kAfterLast,
- kCode_no_reg = kInvalidMSARegister
- };
-
- static const int kMaxNumRegisters = Code::kAfterLast;
-
- inline static int NumRegisters();
-
- bool is_valid() const { return 0 <= reg_code && reg_code < kMaxNumRegisters; }
- bool is(MSARegister reg) const { return reg_code == reg.reg_code; }
-
- int code() const {
- DCHECK(is_valid());
- return reg_code;
- }
- int bit() const {
- DCHECK(is_valid());
- return 1 << reg_code;
- }
+ kMsaAfterLast
+};
- static MSARegister from_code(int code) {
- MSARegister r = {code};
- return r;
- }
- void setcode(int f) {
- reg_code = f;
- DCHECK(is_valid());
- }
- // Unfortunately we can't make this private in a struct.
- int reg_code;
+// MIPS SIMD (MSA) register
+class MSARegister : public RegisterBase<MSARegister, kMsaAfterLast> {
+ friend class RegisterBase;
+ explicit constexpr MSARegister(int code) : RegisterBase(code) {}
};
// A few double registers are reserved: one as a scratch register and one to
@@ -373,78 +297,22 @@ typedef FPURegister FloatRegister;
typedef FPURegister DoubleRegister;
-constexpr DoubleRegister no_freg = {kInvalidFPURegister};
-
-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};
+#define DECLARE_DOUBLE_REGISTER(R) \
+ constexpr DoubleRegister R = DoubleRegister::from_code<kDoubleCode_##R>();
+DOUBLE_REGISTERS(DECLARE_DOUBLE_REGISTER)
+#undef DECLARE_DOUBLE_REGISTER
+
+constexpr DoubleRegister no_freg = DoubleRegister::no_reg();
// SIMD registers.
typedef MSARegister Simd128Register;
-const Simd128Register no_msareg = {kInvalidMSARegister};
-
-constexpr Simd128Register w0 = {0};
-constexpr Simd128Register w1 = {1};
-constexpr Simd128Register w2 = {2};
-constexpr Simd128Register w3 = {3};
-constexpr Simd128Register w4 = {4};
-constexpr Simd128Register w5 = {5};
-constexpr Simd128Register w6 = {6};
-constexpr Simd128Register w7 = {7};
-constexpr Simd128Register w8 = {8};
-constexpr Simd128Register w9 = {9};
-constexpr Simd128Register w10 = {10};
-constexpr Simd128Register w11 = {11};
-constexpr Simd128Register w12 = {12};
-constexpr Simd128Register w13 = {13};
-constexpr Simd128Register w14 = {14};
-constexpr Simd128Register w15 = {15};
-constexpr Simd128Register w16 = {16};
-constexpr Simd128Register w17 = {17};
-constexpr Simd128Register w18 = {18};
-constexpr Simd128Register w19 = {19};
-constexpr Simd128Register w20 = {20};
-constexpr Simd128Register w21 = {21};
-constexpr Simd128Register w22 = {22};
-constexpr Simd128Register w23 = {23};
-constexpr Simd128Register w24 = {24};
-constexpr Simd128Register w25 = {25};
-constexpr Simd128Register w26 = {26};
-constexpr Simd128Register w27 = {27};
-constexpr Simd128Register w28 = {28};
-constexpr Simd128Register w29 = {29};
-constexpr Simd128Register w30 = {30};
-constexpr Simd128Register w31 = {31};
+#define DECLARE_SIMD128_REGISTER(R) \
+ constexpr Simd128Register R = Simd128Register::from_code<kMsaCode_##R>();
+SIMD128_REGISTERS(DECLARE_SIMD128_REGISTER)
+#undef DECLARE_SIMD128_REGISTER
+
+const Simd128Register no_msareg = Simd128Register::no_reg();
// Register aliases.
// cp is assumed to be a callee saved register.
@@ -518,28 +386,33 @@ class Operand BASE_EMBEDDED {
public:
// Immediate.
INLINE(explicit Operand(int32_t immediate,
- RelocInfo::Mode rmode = RelocInfo::NONE32));
- INLINE(explicit Operand(const ExternalReference& f));
+ RelocInfo::Mode rmode = RelocInfo::NONE32))
+ : rm_(no_reg), rmode_(rmode) {
+ value_.immediate = immediate;
+ }
+ INLINE(explicit Operand(const ExternalReference& f))
+ : rm_(no_reg), rmode_(RelocInfo::EXTERNAL_REFERENCE) {
+ value_.immediate = reinterpret_cast<int32_t>(f.address());
+ }
INLINE(explicit Operand(const char* s));
INLINE(explicit Operand(Object** opp));
INLINE(explicit Operand(Context** cpp));
explicit Operand(Handle<HeapObject> handle);
- INLINE(explicit Operand(Smi* value));
+ INLINE(explicit Operand(Smi* value))
+ : rm_(no_reg), rmode_(RelocInfo::NONE32) {
+ value_.immediate = reinterpret_cast<intptr_t>(value);
+ }
static Operand EmbeddedNumber(double number); // Smi or HeapNumber.
static Operand EmbeddedCode(CodeStub* stub);
// Register.
- INLINE(explicit Operand(Register rm));
+ INLINE(explicit Operand(Register rm)) : rm_(rm) {}
// Return true if this is a register operand.
INLINE(bool is_reg() const);
- inline int32_t immediate() const {
- DCHECK(!is_reg());
- DCHECK(!IsHeapObjectRequest());
- return value_.immediate;
- }
+ inline int32_t immediate() const;
bool IsImmediate() const { return !rm_.is_valid(); }
@@ -726,21 +599,7 @@ class Assembler : public AssemblerBase {
// has already deserialized the lui/ori instructions etc.
inline static void deserialization_set_special_target_at(
Isolate* isolate, Address instruction_payload, Code* code,
- Address target) {
- if (IsMipsArchVariant(kMips32r6)) {
- // On R6 the address location is shifted by one instruction
- set_target_address_at(
- isolate,
- instruction_payload -
- (kInstructionsFor32BitConstant - 1) * kInstrSize,
- code, target);
- } else {
- set_target_address_at(
- isolate,
- instruction_payload - kInstructionsFor32BitConstant * kInstrSize,
- code, target);
- }
- }
+ Address target);
// This sets the internal reference at the pc.
inline static void deserialization_set_target_internal_reference_at(
@@ -2375,9 +2234,7 @@ class Assembler : public AssemblerBase {
class EnsureSpace BASE_EMBEDDED {
public:
- explicit EnsureSpace(Assembler* assembler) {
- assembler->CheckBuffer();
- }
+ explicit inline EnsureSpace(Assembler* assembler);
};
class UseScratchRegisterScope {