Index: test/unittests/interpreter/interpreter-assembler-unittest.cc |
diff --git a/test/unittests/interpreter/interpreter-assembler-unittest.cc b/test/unittests/interpreter/interpreter-assembler-unittest.cc |
index f8edd83d893aacad054a3bc45c54d0692032c290..ec39bb0067f287956fa725113e7e735b93572d04 100644 |
--- a/test/unittests/interpreter/interpreter-assembler-unittest.cc |
+++ b/test/unittests/interpreter/interpreter-assembler-unittest.cc |
@@ -77,7 +77,7 @@ Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore( |
} |
Matcher<Node*> |
-InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperand( |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsUnsignedByteOperand( |
int offset) { |
return IsLoad( |
MachineType::Uint8(), |
@@ -87,8 +87,9 @@ InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperand( |
IsIntPtrConstant(offset))); |
} |
-Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest:: |
- IsBytecodeOperandSignExtended(int offset) { |
+Matcher<Node*> |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsSignedByteOperand( |
+ int offset) { |
Matcher<Node*> load_matcher = IsLoad( |
MachineType::Int8(), |
IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), |
@@ -102,7 +103,7 @@ Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest:: |
} |
Matcher<Node*> |
-InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperandShort( |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsUnsignedShortOperand( |
int offset) { |
if (TargetSupportsUnalignedAccess()) { |
return IsLoad( |
@@ -139,8 +140,9 @@ InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperandShort( |
} |
} |
-Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest:: |
- IsBytecodeOperandShortSignExtended(int offset) { |
+Matcher<Node*> |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsSignedShortOperand( |
+ int offset) { |
Matcher<Node*> load_matcher; |
if (TargetSupportsUnalignedAccess()) { |
load_matcher = IsLoad( |
@@ -185,6 +187,130 @@ Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest:: |
return load_matcher; |
} |
+Matcher<Node*> |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsUnsignedQuadOperand( |
+ int offset) { |
+ if (TargetSupportsUnalignedAccess()) { |
+ return IsLoad( |
+ MachineType::Uint32(), |
+ IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), |
+ IsIntPtrAdd( |
+ IsParameter( |
+ InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
+ IsIntPtrConstant(offset))); |
+ } else { |
+ Matcher<Node*> bytes[4]; |
+ for (int i = 0; i < static_cast<int>(arraysize(bytes)); i++) { |
+ bytes[i] = IsLoad( |
+ MachineType::Uint8(), |
+ IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), |
+ IsIntPtrAdd( |
+ IsParameter( |
+ InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
+ IsIntPtrConstant(offset + i))); |
+ } |
+ |
+#if V8_TARGET_LITTLE_ENDIAN |
+ Matcher<Node*> upper = |
+ IsWordOr(IsWordShl(bytes[3], IsIntPtrConstant(kBitsPerByte)), bytes[2]); |
+ Matcher<Node*> lower = |
+ IsWordOr(IsWordShl(bytes[1], IsIntPtrConstant(kBitsPerByte)), bytes[0]); |
+ return IsWordOr(IsWordShl(upper, IsIntPtrConstant(2 * kBitsPerByte)), |
+ lower); |
+#elif V8_TARGET_BIG_ENDIAN |
+ Matcher<Node*> upper = |
+ IsWordOr(IsWordShl(bytes[0], IsIntPtrConstant(kBitsPerByte)), bytes[1]); |
+ Matcher<Node*> lower = |
+ IsWordOr(IsWordShl(bytes[2], IsIntPtrConstant(kBitsPerByte)), bytes[3]); |
+ return IsWordOr(IsWordShl(upper, IsIntPtrConstant(2 * kBitsPerByte)), |
+ lower); |
+#else |
+#error "Unknown Architecture" |
+#endif |
+ } |
+} |
+ |
+Matcher<Node*> |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsSignedQuadOperand( |
+ int offset) { |
+ Matcher<Node*> load_matcher; |
+ if (TargetSupportsUnalignedAccess()) { |
+ load_matcher = IsLoad( |
+ MachineType::Int32(), |
+ IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), |
+ IsIntPtrAdd( |
+ IsParameter( |
+ InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
+ IsIntPtrConstant(offset))); |
+ } else { |
+ Matcher<Node*> bytes[4]; |
+ for (int i = 0; i < static_cast<int>(arraysize(bytes)); i++) { |
+ bytes[i] = IsLoad( |
+ MachineType::Uint8(), |
+ IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), |
+ IsIntPtrAdd( |
+ IsParameter( |
+ InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
+ IsIntPtrConstant(offset + i))); |
+ } |
+ |
+#if V8_TARGET_LITTLE_ENDIAN |
+ Matcher<Node*> upper = |
+ IsWordOr(IsWordShl(bytes[3], IsIntPtrConstant(kBitsPerByte)), bytes[2]); |
+ Matcher<Node*> lower = |
+ IsWordOr(IsWordShl(bytes[1], IsIntPtrConstant(kBitsPerByte)), bytes[0]); |
+ load_matcher = |
+ IsWordOr(IsWordShl(upper, IsIntPtrConstant(2 * kBitsPerByte)), lower); |
+#elif V8_TARGET_BIG_ENDIAN |
+ Matcher<Node*> upper = |
+ IsWordOr(IsWordShl(bytes[0], IsIntPtrConstant(kBitsPerByte)), bytes[1]); |
+ Matcher<Node*> lower = |
+ IsWordOr(IsWordShl(bytes[2], IsIntPtrConstant(kBitsPerByte)), bytes[3]); |
+ load_matcher = |
+ IsWordOr(IsWordShl(upper, IsIntPtrConstant(2 * kBitsPerByte)), lower); |
+#else |
+#error "Unknown Architecture" |
+#endif |
+ } |
+ |
+ if (kPointerSize == 8) { |
+ load_matcher = IsChangeInt32ToInt64(load_matcher); |
+ } |
+ return load_matcher; |
+} |
+ |
+Matcher<Node*> |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsSignedOperand( |
+ int offset, OperandSize operand_size) { |
+ switch (operand_size) { |
+ case OperandSize::kByte: |
+ return IsSignedByteOperand(offset); |
+ case OperandSize::kShort: |
+ return IsSignedShortOperand(offset); |
+ case OperandSize::kQuad: |
+ return IsSignedQuadOperand(offset); |
+ case OperandSize::kNone: |
+ UNREACHABLE(); |
+ } |
+ return nullptr; |
+} |
+ |
+Matcher<Node*> |
+InterpreterAssemblerTest::InterpreterAssemblerForTest::IsUnsignedOperand( |
+ int offset, OperandSize operand_size) { |
+ switch (operand_size) { |
+ case OperandSize::kByte: |
+ return IsUnsignedByteOperand(offset); |
+ case OperandSize::kShort: |
+ return IsUnsignedShortOperand(offset); |
+ case OperandSize::kQuad: |
+ return IsUnsignedQuadOperand(offset); |
+ case OperandSize::kNone: |
+ UNREACHABLE(); |
+ } |
+ return nullptr; |
+} |
+ |
TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) { |
TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
InterpreterAssemblerForTest m(this, bytecode); |
@@ -195,9 +321,11 @@ TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) { |
EXPECT_EQ(1, end->InputCount()); |
Node* tail_call_node = end->InputAt(0); |
+ OperandScale operand_scale = OperandScale::k1X; |
Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd( |
IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
- IsIntPtrConstant(interpreter::Bytecodes::Size(bytecode))); |
+ IsIntPtrConstant( |
+ interpreter::Bytecodes::Size(bytecode, operand_scale))); |
Matcher<Node*> target_bytecode_matcher = m.IsLoad( |
MachineType::Uint8(), |
IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), |
@@ -286,8 +414,9 @@ TARGET_TEST_F(InterpreterAssemblerTest, JumpIfWordEqual) { |
Node* end = graph->end(); |
EXPECT_EQ(2, end->InputCount()); |
- int jump_offsets[] = {kJumpIfTrueOffset, |
- interpreter::Bytecodes::Size(bytecode)}; |
+ OperandScale operand_scale = OperandScale::k1X; |
+ int jump_offsets[] = {kJumpIfTrueOffset, interpreter::Bytecodes::Size( |
+ bytecode, operand_scale)}; |
for (int i = 0; i < static_cast<int>(arraysize(jump_offsets)); i++) { |
Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd( |
IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
@@ -352,51 +481,55 @@ TARGET_TEST_F(InterpreterAssemblerTest, InterpreterReturn) { |
} |
TARGET_TEST_F(InterpreterAssemblerTest, BytecodeOperand) { |
+ static const OperandScale kOperandScales[] = { |
+ OperandScale::k1X, OperandScale::k2X, OperandScale::k4X}; |
TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
- InterpreterAssemblerForTest m(this, bytecode); |
- int number_of_operands = interpreter::Bytecodes::NumberOfOperands(bytecode); |
- for (int i = 0; i < number_of_operands; i++) { |
- int offset = interpreter::Bytecodes::GetOperandOffset(bytecode, i); |
- switch (interpreter::Bytecodes::GetOperandType(bytecode, i)) { |
- case interpreter::OperandType::kRegCount8: |
- EXPECT_THAT(m.BytecodeOperandCount(i), m.IsBytecodeOperand(offset)); |
- break; |
- case interpreter::OperandType::kIdx8: |
- EXPECT_THAT(m.BytecodeOperandIdx(i), m.IsBytecodeOperand(offset)); |
- break; |
- case interpreter::OperandType::kImm8: |
- EXPECT_THAT(m.BytecodeOperandImm(i), |
- m.IsBytecodeOperandSignExtended(offset)); |
- break; |
- case interpreter::OperandType::kMaybeReg8: |
- case interpreter::OperandType::kReg8: |
- case interpreter::OperandType::kRegOut8: |
- case interpreter::OperandType::kRegOutPair8: |
- case interpreter::OperandType::kRegOutTriple8: |
- case interpreter::OperandType::kRegPair8: |
- EXPECT_THAT(m.BytecodeOperandReg(i), |
- m.IsBytecodeOperandSignExtended(offset)); |
- break; |
- case interpreter::OperandType::kRegCount16: |
- EXPECT_THAT(m.BytecodeOperandCount(i), |
- m.IsBytecodeOperandShort(offset)); |
- break; |
- case interpreter::OperandType::kIdx16: |
- EXPECT_THAT(m.BytecodeOperandIdx(i), |
- m.IsBytecodeOperandShort(offset)); |
- break; |
- case interpreter::OperandType::kMaybeReg16: |
- case interpreter::OperandType::kReg16: |
- case interpreter::OperandType::kRegOut16: |
- case interpreter::OperandType::kRegOutPair16: |
- case interpreter::OperandType::kRegOutTriple16: |
- case interpreter::OperandType::kRegPair16: |
- EXPECT_THAT(m.BytecodeOperandReg(i), |
- m.IsBytecodeOperandShortSignExtended(offset)); |
- break; |
- case interpreter::OperandType::kNone: |
- UNREACHABLE(); |
- break; |
+ TRACED_FOREACH(interpreter::OperandScale, operand_scale, kOperandScales) { |
+ InterpreterAssemblerForTest m(this, bytecode, operand_scale); |
+ int number_of_operands = |
+ interpreter::Bytecodes::NumberOfOperands(bytecode); |
+ for (int i = 0; i < number_of_operands; i++) { |
+ int offset = interpreter::Bytecodes::GetOperandOffset(bytecode, i, |
+ operand_scale); |
+ OperandType operand_type = |
+ interpreter::Bytecodes::GetOperandType(bytecode, i); |
+ OperandSize operand_size = |
+ Bytecodes::SizeOfOperand(operand_type, operand_scale); |
+ switch (interpreter::Bytecodes::GetOperandType(bytecode, i)) { |
+ case interpreter::OperandType::kRegCount: |
+ EXPECT_THAT(m.BytecodeOperandCount(i), |
+ m.IsUnsignedOperand(offset, operand_size)); |
+ break; |
+ case interpreter::OperandType::kFlag8: |
+ EXPECT_THAT(m.BytecodeOperandFlag(i), |
+ m.IsUnsignedOperand(offset, operand_size)); |
+ break; |
+ case interpreter::OperandType::kIdx: |
+ EXPECT_THAT(m.BytecodeOperandIdx(i), |
+ m.IsUnsignedOperand(offset, operand_size)); |
+ break; |
+ case interpreter::OperandType::kImm: { |
+ EXPECT_THAT(m.BytecodeOperandImm(i), |
+ m.IsSignedOperand(offset, operand_size)); |
+ break; |
+ } |
+ case interpreter::OperandType::kMaybeReg: |
+ case interpreter::OperandType::kReg: |
+ case interpreter::OperandType::kRegOut: |
+ case interpreter::OperandType::kRegOutPair: |
+ case interpreter::OperandType::kRegOutTriple: |
+ case interpreter::OperandType::kRegPair: |
+ EXPECT_THAT(m.BytecodeOperandReg(i), |
+ m.IsSignedOperand(offset, operand_size)); |
+ break; |
+ case interpreter::OperandType::kRuntimeId: |
+ EXPECT_THAT(m.BytecodeOperandRuntimeId(i), |
+ m.IsUnsignedOperand(offset, operand_size)); |
+ break; |
+ case interpreter::OperandType::kNone: |
+ UNREACHABLE(); |
+ break; |
+ } |
} |
} |
} |