Index: test/unittests/interpreter/bytecodes-unittest.cc |
diff --git a/test/unittests/interpreter/bytecodes-unittest.cc b/test/unittests/interpreter/bytecodes-unittest.cc |
index 212e02996b65c98a8674dbd453a60a0ef68fcd26..5472927a40630ac98b34345d3da890903c821298 100644 |
--- a/test/unittests/interpreter/bytecodes-unittest.cc |
+++ b/test/unittests/interpreter/bytecodes-unittest.cc |
@@ -14,28 +14,27 @@ namespace internal { |
namespace interpreter { |
TEST(OperandConversion, Registers) { |
- int register_count = Register::MaxRegisterIndex() + 1; |
+ int register_count = 128; |
int step = register_count / 7; |
for (int i = 0; i < register_count; i += step) { |
if (i <= kMaxInt8) { |
- uint8_t operand0 = Register(i).ToOperand(); |
+ uint32_t operand0 = Register(i).ToOperand(); |
Register reg0 = Register::FromOperand(operand0); |
CHECK_EQ(i, reg0.index()); |
} |
- uint16_t operand1 = Register(i).ToWideOperand(); |
- Register reg1 = Register::FromWideOperand(operand1); |
+ uint32_t operand1 = Register(i).ToOperand(); |
+ Register reg1 = Register::FromOperand(operand1); |
CHECK_EQ(i, reg1.index()); |
- uint32_t operand2 = Register(i).ToRawOperand(); |
- Register reg2 = Register::FromRawOperand(operand2); |
+ uint32_t operand2 = Register(i).ToOperand(); |
+ Register reg2 = Register::FromOperand(operand2); |
CHECK_EQ(i, reg2.index()); |
} |
for (int i = 0; i <= kMaxUInt8; i++) { |
- uint8_t operand = static_cast<uint8_t>(i); |
- Register reg = Register::FromOperand(operand); |
- if (i > 0 && i < -kMinInt8) { |
+ Register reg = Register::FromOperand(i); |
+ if (i > 0) { |
CHECK(reg.is_parameter()); |
} else { |
CHECK(!reg.is_parameter()); |
@@ -51,7 +50,7 @@ TEST(OperandConversion, Parameters) { |
int parameter_count = parameter_counts[p]; |
for (int i = 0; i < parameter_count; i++) { |
Register r = Register::FromParameterIndex(i, parameter_count); |
- uint8_t operand_value = r.ToOperand(); |
+ uint32_t operand_value = r.ToOperand(); |
Register s = Register::FromOperand(operand_value); |
CHECK_EQ(i, s.ToParameterIndex(parameter_count)); |
} |
@@ -59,8 +58,8 @@ TEST(OperandConversion, Parameters) { |
} |
TEST(OperandConversion, RegistersParametersNoOverlap) { |
- int register_count = Register::MaxRegisterIndex() + 1; |
- int parameter_count = Register::MaxParameterIndex() + 1; |
+ int register_count = 128; |
+ int parameter_count = 100; |
int32_t register_space_size = base::bits::RoundUpToPowerOfTwo32( |
static_cast<uint32_t>(register_count + parameter_count)); |
uint32_t range = static_cast<uint32_t>(register_space_size); |
@@ -68,18 +67,33 @@ TEST(OperandConversion, RegistersParametersNoOverlap) { |
for (int i = 0; i < register_count; i += 1) { |
Register r = Register(i); |
- uint32_t operand = r.ToWideOperand(); |
- CHECK_LT(operand, operand_count.size()); |
- operand_count[operand] += 1; |
- CHECK_EQ(operand_count[operand], 1); |
+ int32_t operand = r.ToOperand(); |
+ uint8_t index = static_cast<uint8_t>(operand); |
+ CHECK_LT(index, operand_count.size()); |
+ operand_count[index] += 1; |
+ CHECK_EQ(operand_count[index], 1); |
} |
for (int i = 0; i < parameter_count; i += 1) { |
Register r = Register::FromParameterIndex(i, parameter_count); |
- uint32_t operand = r.ToWideOperand(); |
- CHECK_LT(operand, operand_count.size()); |
- operand_count[operand] += 1; |
- CHECK_EQ(operand_count[operand], 1); |
+ uint32_t operand = r.ToOperand(); |
+ uint8_t index = static_cast<uint8_t>(operand); |
+ CHECK_LT(index, operand_count.size()); |
+ operand_count[index] += 1; |
+ CHECK_EQ(operand_count[index], 1); |
+ } |
+} |
+ |
+TEST(OperandScaling, ScalableAndNonScalable) { |
+ for (OperandScale operand_scale = OperandScale::kSingle; |
+ operand_scale <= OperandScale::kMaxValid; |
+ operand_scale = Bytecodes::NextOperandScale(operand_scale)) { |
+ int scale = static_cast<int>(operand_scale); |
+ CHECK_EQ(Bytecodes::Size(Bytecode::kCallRuntime, operand_scale), |
+ 1 + 2 + 2 * scale); |
+ CHECK_EQ(Bytecodes::Size(Bytecode::kCreateObjectLiteral, operand_scale), |
+ 1 + 2 * scale + 1); |
+ CHECK_EQ(Bytecodes::Size(Bytecode::kTestIn, operand_scale), 1 + scale); |
} |
} |
@@ -87,16 +101,11 @@ TEST(Bytecodes, HasAnyRegisterOperands) { |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kAdd), 1); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kCall), 2); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kCallRuntime), 1); |
- CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kCallRuntimeWide), 1); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kCallRuntimeForPair), |
2); |
- CHECK_EQ( |
- Bytecodes::NumberOfRegisterOperands(Bytecode::kCallRuntimeForPairWide), |
- 2); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kDeletePropertyStrict), |
1); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kForInPrepare), 1); |
- CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kForInPrepareWide), 1); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kInc), 0); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kJumpIfTrue), 0); |
CHECK_EQ(Bytecodes::NumberOfRegisterOperands(Bytecode::kNew), 2); |
@@ -116,11 +125,11 @@ TEST(Bytecodes, RegisterOperandBitmaps) { |
} |
TEST(Bytecodes, RegisterOperands) { |
- CHECK(Bytecodes::IsRegisterOperandType(OperandType::kReg8)); |
- CHECK(Bytecodes::IsRegisterInputOperandType(OperandType::kReg8)); |
- CHECK(!Bytecodes::IsRegisterOutputOperandType(OperandType::kReg8)); |
- CHECK(!Bytecodes::IsRegisterInputOperandType(OperandType::kRegOut8)); |
- CHECK(Bytecodes::IsRegisterOutputOperandType(OperandType::kRegOut8)); |
+ CHECK(Bytecodes::IsRegisterOperandType(OperandType::kReg)); |
+ CHECK(Bytecodes::IsRegisterInputOperandType(OperandType::kReg)); |
+ CHECK(!Bytecodes::IsRegisterOutputOperandType(OperandType::kReg)); |
+ CHECK(!Bytecodes::IsRegisterInputOperandType(OperandType::kRegOut)); |
+ CHECK(Bytecodes::IsRegisterOutputOperandType(OperandType::kRegOut)); |
#define IS_REGISTER_OPERAND_TYPE(Name, _) \ |
CHECK(Bytecodes::IsRegisterOperandType(OperandType::k##Name)); |
@@ -155,16 +164,52 @@ TEST(Bytecodes, RegisterOperands) { |
#undef IS_NOT_REGISTER_INPUT_OPERAND_TYPE |
} |
-TEST(Bytecodes, DebugBreak) { |
- for (uint32_t i = 0; i < Bytecodes::ToByte(Bytecode::kLast); i++) { |
- Bytecode bytecode = Bytecodes::FromByte(i); |
- Bytecode debugbreak = Bytecodes::GetDebugBreak(bytecode); |
- if (!Bytecodes::IsDebugBreak(debugbreak)) { |
- PrintF("Bytecode %s has no matching debug break with length %d\n", |
- Bytecodes::ToString(bytecode), Bytecodes::Size(bytecode)); |
- CHECK(false); |
- } |
+TEST(Bytecodes, DebugBreakExistForEachBytecode) { |
+ static const OperandScale kOperandScale = OperandScale::kSingle; |
+#define CHECK_DEBUG_BREAK_SIZE(Name, ...) \ |
+ if (!Bytecodes::IsDebugBreak(Bytecode::k##Name) && \ |
+ !Bytecodes::IsPrefixScalingBytecode(Bytecode::k##Name)) { \ |
+ Bytecode debug_bytecode = Bytecodes::GetDebugBreak(Bytecode::k##Name); \ |
+ CHECK_EQ(Bytecodes::Size(Bytecode::k##Name, kOperandScale), \ |
+ Bytecodes::Size(debug_bytecode, kOperandScale)); \ |
} |
+ BYTECODE_LIST(CHECK_DEBUG_BREAK_SIZE) |
+#undef CHECK_DEBUG_BREAK_SIZE |
+} |
+ |
+TEST(Bytecodes, DebugBreakForPrefixBytecodes) { |
+ CHECK_EQ(Bytecode::kDebugBreakWide, |
+ Bytecodes::GetDebugBreak(Bytecode::kWide)); |
+ CHECK_EQ(Bytecode::kDebugBreakExtraWide, |
+ Bytecodes::GetDebugBreak(Bytecode::kExtraWide)); |
+} |
+ |
+TEST(Bytecodes, PrefixMappings) { |
+ Bytecode prefixes[] = {Bytecode::kWide, Bytecode::kExtraWide}; |
+ TRACED_FOREACH(Bytecode, prefix, prefixes) { |
+ CHECK_EQ(prefix, Bytecodes::OperandScaleToPrefixBytecode( |
+ Bytecodes::PrefixBytecodeToOperandScale(prefix))); |
+ } |
+} |
+ |
+TEST(OperandScale, PrefixesScale) { |
+ CHECK(Bytecodes::NextOperandScale(OperandScale::kSingle) == |
+ OperandScale::kDouble); |
+ CHECK(Bytecodes::NextOperandScale(OperandScale::kDouble) == |
+ OperandScale::kQuadruple); |
+ CHECK(Bytecodes::NextOperandScale(OperandScale::kQuadruple) == |
+ OperandScale::kInvalid); |
+} |
+ |
+TEST(OperandScale, PrefixesRequired) { |
+ CHECK(!Bytecodes::OperandScaleRequiresPrefixBytecode(OperandScale::kSingle)); |
+ CHECK(Bytecodes::OperandScaleRequiresPrefixBytecode(OperandScale::kDouble)); |
+ CHECK( |
+ Bytecodes::OperandScaleRequiresPrefixBytecode(OperandScale::kQuadruple)); |
+ CHECK(Bytecodes::OperandScaleToPrefixBytecode(OperandScale::kDouble) == |
+ Bytecode::kWide); |
+ CHECK(Bytecodes::OperandScaleToPrefixBytecode(OperandScale::kQuadruple) == |
+ Bytecode::kExtraWide); |
} |
} // namespace interpreter |