Index: src/mips64/constants-mips64.h |
diff --git a/src/mips/constants-mips.h b/src/mips64/constants-mips64.h |
similarity index 89% |
copy from src/mips/constants-mips.h |
copy to src/mips64/constants-mips64.h |
index fc64f7dbbf99431e5cdd21866ef41f905680bb0e..942c49750875434bd5e935a32fd161018ed1fd75 100644 |
--- a/src/mips/constants-mips.h |
+++ b/src/mips64/constants-mips64.h |
@@ -19,32 +19,45 @@ |
enum ArchVariants { |
kMips32r2, |
kMips32r1, |
- kLoongson |
+ kLoongson, |
+ kMips64r2 |
}; |
-#ifdef _MIPS_ARCH_MIPS32R2 |
- static const ArchVariants kArchVariant = kMips32r2; |
+ |
+#ifdef _MIPS_ARCH_MIPS64R2 |
+ static const ArchVariants kArchVariant = kMips64r2; |
#elif _MIPS_ARCH_LOONGSON |
// The loongson flag refers to the LOONGSON architectures based on MIPS-III, |
// which predates (and is a subset of) the mips32r2 and r1 architectures. |
static const ArchVariants kArchVariant = kLoongson; |
#else |
- static const ArchVariants kArchVariant = kMips32r1; |
+ static const ArchVariants kArchVariant = kMips64r1; |
#endif |
-enum Endianness { |
- kLittle, |
- kBig |
+ |
+// TODO(plind): consider deriving ABI from compiler flags or build system. |
+ |
+// ABI-dependent definitions are made with #define in simulator-mips64.h, |
+// so the ABI choice must be available to the pre-processor. However, in all |
+// other cases, we should use the enum AbiVariants with normal if statements. |
+ |
+#define MIPS_ABI_N64 1 |
+// #define MIPS_ABI_O32 1 |
+ |
+// The only supported Abi's are O32, and n64. |
+enum AbiVariants { |
+ kO32, |
+ kN64 // Use upper case N for 'n64' ABI to conform to style standard. |
}; |
-#if defined(V8_TARGET_LITTLE_ENDIAN) |
- static const Endianness kArchEndian = kLittle; |
-#elif defined(V8_TARGET_BIG_ENDIAN) |
- static const Endianness kArchEndian = kBig; |
+#ifdef MIPS_ABI_N64 |
+static const AbiVariants kMipsAbi = kN64; |
#else |
-#error Unknown endianness |
+static const AbiVariants kMipsAbi = kO32; |
#endif |
+ |
+// TODO(plind): consider renaming these ... |
#if(defined(__mips_hard_float) && __mips_hard_float != 0) |
// Use floating-point coprocessor instructions. This flag is raised when |
// -mhard-float is passed to the compiler. |
@@ -58,15 +71,10 @@ const bool IsMipsSoftFloatABI = true; |
const bool IsMipsSoftFloatABI = true; |
#endif |
-#if defined(V8_TARGET_LITTLE_ENDIAN) |
-const uint32_t kHoleNanUpper32Offset = 4; |
-const uint32_t kHoleNanLower32Offset = 0; |
-#elif defined(V8_TARGET_BIG_ENDIAN) |
-const uint32_t kHoleNanUpper32Offset = 0; |
-const uint32_t kHoleNanLower32Offset = 4; |
-#else |
-#error Unknown endianness |
-#endif |
+ |
+#define __STDC_FORMAT_MACROS |
+#include <inttypes.h> |
+ |
// Defines constants and accessor classes to assemble, disassemble and |
// simulate MIPS32 instructions. |
@@ -99,6 +107,8 @@ const int kInvalidFPURegister = -1; |
const int kFCSRRegister = 31; |
const int kInvalidFPUControlRegister = -1; |
const uint32_t kFPUInvalidResult = static_cast<uint32_t>(1 << 31) - 1; |
+const uint64_t kFPU64InvalidResult = |
+ static_cast<uint64_t>(static_cast<uint64_t>(1) << 63) - 1; |
// FCSR constants. |
const uint32_t kFCSRInexactFlagBit = 2; |
@@ -146,8 +156,8 @@ class Registers { |
const char* name; |
}; |
- static const int32_t kMaxValue = 0x7fffffff; |
- static const int32_t kMinValue = 0x80000000; |
+ static const int64_t kMaxValue = 0x7fffffffffffffffl; |
+ static const int64_t kMinValue = 0x8000000000000000l; |
private: |
static const char* names_[kNumSimuRegisters]; |
@@ -220,6 +230,8 @@ const int kImm26Shift = 0; |
const int kImm26Bits = 26; |
const int kImm28Shift = 0; |
const int kImm28Bits = 28; |
+const int kImm32Shift = 0; |
+const int kImm32Bits = 32; |
// In branches and jumps immediate fields point to words, not bytes, |
// and are therefore shifted by 2. |
@@ -256,6 +268,9 @@ const int kHiMask = 0xffff << 16; |
const int kLoMask = 0xffff; |
const int kSignMask = 0x80000000; |
const int kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1; |
+const int64_t kHi16MaskOf64 = (int64_t)0xffff << 48; |
+const int64_t kSe16MaskOf64 = (int64_t)0xffff << 32; |
+const int64_t kTh16MaskOf64 = (int64_t)0xffff << 16; |
// ----- MIPS Opcodes and Function Fields. |
// We use this presentation to stay close to the table representation in |
@@ -286,6 +301,10 @@ enum Opcode { |
BLEZL = ((2 << 3) + 6) << kOpcodeShift, |
BGTZL = ((2 << 3) + 7) << kOpcodeShift, |
+ DADDI = ((3 << 3) + 0) << kOpcodeShift, |
+ DADDIU = ((3 << 3) + 1) << kOpcodeShift, |
+ LDL = ((3 << 3) + 2) << kOpcodeShift, |
+ LDR = ((3 << 3) + 3) << kOpcodeShift, |
SPECIAL2 = ((3 << 3) + 4) << kOpcodeShift, |
SPECIAL3 = ((3 << 3) + 7) << kOpcodeShift, |
@@ -296,19 +315,27 @@ enum Opcode { |
LBU = ((4 << 3) + 4) << kOpcodeShift, |
LHU = ((4 << 3) + 5) << kOpcodeShift, |
LWR = ((4 << 3) + 6) << kOpcodeShift, |
+ LWU = ((4 << 3) + 7) << kOpcodeShift, |
+ |
SB = ((5 << 3) + 0) << kOpcodeShift, |
SH = ((5 << 3) + 1) << kOpcodeShift, |
SWL = ((5 << 3) + 2) << kOpcodeShift, |
SW = ((5 << 3) + 3) << kOpcodeShift, |
+ SDL = ((5 << 3) + 4) << kOpcodeShift, |
+ SDR = ((5 << 3) + 5) << kOpcodeShift, |
SWR = ((5 << 3) + 6) << kOpcodeShift, |
LWC1 = ((6 << 3) + 1) << kOpcodeShift, |
+ LLD = ((6 << 3) + 4) << kOpcodeShift, |
LDC1 = ((6 << 3) + 5) << kOpcodeShift, |
+ LD = ((6 << 3) + 7) << kOpcodeShift, |
PREF = ((6 << 3) + 3) << kOpcodeShift, |
SWC1 = ((7 << 3) + 1) << kOpcodeShift, |
+ SCD = ((7 << 3) + 4) << kOpcodeShift, |
SDC1 = ((7 << 3) + 5) << kOpcodeShift, |
+ SD = ((7 << 3) + 7) << kOpcodeShift, |
COP1X = ((1 << 4) + 3) << kOpcodeShift |
}; |
@@ -331,11 +358,18 @@ enum SecondaryField { |
MFHI = ((2 << 3) + 0), |
MFLO = ((2 << 3) + 2), |
+ DSLLV = ((2 << 3) + 4), |
+ DSRLV = ((2 << 3) + 6), |
+ DSRAV = ((2 << 3) + 7), |
MULT = ((3 << 3) + 0), |
MULTU = ((3 << 3) + 1), |
DIV = ((3 << 3) + 2), |
DIVU = ((3 << 3) + 3), |
+ DMULT = ((3 << 3) + 4), |
+ DMULTU = ((3 << 3) + 5), |
+ DDIV = ((3 << 3) + 6), |
+ DDIVU = ((3 << 3) + 7), |
ADD = ((4 << 3) + 0), |
ADDU = ((4 << 3) + 1), |
@@ -348,6 +382,10 @@ enum SecondaryField { |
SLT = ((5 << 3) + 2), |
SLTU = ((5 << 3) + 3), |
+ DADD = ((5 << 3) + 4), |
+ DADDU = ((5 << 3) + 5), |
+ DSUB = ((5 << 3) + 6), |
+ DSUBU = ((5 << 3) + 7), |
TGE = ((6 << 3) + 0), |
TGEU = ((6 << 3) + 1), |
@@ -356,6 +394,14 @@ enum SecondaryField { |
TEQ = ((6 << 3) + 4), |
TNE = ((6 << 3) + 6), |
+ DSLL = ((7 << 3) + 0), |
+ DSRL = ((7 << 3) + 2), |
+ DSRA = ((7 << 3) + 3), |
+ DSLL32 = ((7 << 3) + 4), |
+ DSRL32 = ((7 << 3) + 6), |
+ DSRA32 = ((7 << 3) + 7), |
+ // drotr in special4? |
+ |
// SPECIAL2 Encoding of Function Field. |
MUL = ((0 << 3) + 2), |
CLZ = ((4 << 3) + 0), |
@@ -363,7 +409,15 @@ enum SecondaryField { |
// SPECIAL3 Encoding of Function Field. |
EXT = ((0 << 3) + 0), |
+ DEXTM = ((0 << 3) + 1), |
+ DEXTU = ((0 << 3) + 2), |
+ DEXT = ((0 << 3) + 3), |
INS = ((0 << 3) + 4), |
+ DINSM = ((0 << 3) + 5), |
+ DINSU = ((0 << 3) + 6), |
+ DINS = ((0 << 3) + 7), |
+ |
+ DSBH = ((4 << 3) + 4), |
// REGIMM encoding of rt Field. |
BLTZ = ((0 << 3) + 0) << 16, |
@@ -373,9 +427,11 @@ enum SecondaryField { |
// COP1 Encoding of rs Field. |
MFC1 = ((0 << 3) + 0) << 21, |
+ DMFC1 = ((0 << 3) + 1) << 21, |
CFC1 = ((0 << 3) + 2) << 21, |
MFHC1 = ((0 << 3) + 3) << 21, |
MTC1 = ((0 << 3) + 4) << 21, |
+ DMTC1 = ((0 << 3) + 5) << 21, |
CTC1 = ((0 << 3) + 6) << 21, |
MTHC1 = ((0 << 3) + 7) << 21, |
BC1 = ((1 << 3) + 0) << 21, |
@@ -805,12 +861,11 @@ class Instruction { |
// MIPS assembly various constants. |
// C/C++ argument slots size. |
-const int kCArgSlotCount = 4; |
-const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize; |
-// JS argument slots size. |
-const int kJSArgsSlotsSize = 0 * Instruction::kInstrSize; |
-// Assembly builtins argument slots size. |
-const int kBArgsSlotsSize = 0 * Instruction::kInstrSize; |
+const int kCArgSlotCount = (kMipsAbi == kN64) ? 0 : 4; |
+ |
+// TODO(plind): below should be based on kPointerSize |
+// TODO(plind): find all usages and remove the needless instructions for n64. |
+const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize * 2; |
const int kBranchReturnOffset = 2 * Instruction::kInstrSize; |