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

Unified Diff: src/interpreter/interpreter.cc

Issue 2263253002: [interpreter] Make the binary op with Smi bytecode handlers collect type feedback. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Update. Created 4 years, 4 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/interpreter/bytecodes.h ('k') | src/mips/interface-descriptors-mips.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/interpreter/interpreter.cc
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
index 93bfebaff2cf8846a4d121de98d7ea4b0df30e76..68f0342180de90769facf1c81372031f098668cb 100644
--- a/src/interpreter/interpreter.cc
+++ b/src/interpreter/interpreter.cc
@@ -810,8 +810,8 @@ void Interpreter::DoBinaryOpWithFeedback(InterpreterAssembler* assembler) {
Node* context = __ GetContext();
Node* slot_index = __ BytecodeOperandIdx(1);
Node* type_feedback_vector = __ LoadTypeFeedbackVector();
- Node* result = Generator::Generate(assembler, lhs, rhs, context,
- type_feedback_vector, slot_index);
+ Node* result = Generator::Generate(assembler, lhs, rhs, slot_index,
+ type_feedback_vector, context);
__ SetAccumulator(result);
__ Dispatch();
}
@@ -987,6 +987,8 @@ void Interpreter::DoAddSmi(InterpreterAssembler* assembler) {
Node* left = __ LoadRegister(reg_index);
Node* raw_int = __ BytecodeOperandImm(0);
Node* right = __ SmiTag(raw_int);
+ Node* slot_index = __ BytecodeOperandIdx(2);
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector();
// {right} is known to be a Smi.
// Check if the {left} is a Smi take the fast path.
@@ -1002,6 +1004,8 @@ void Interpreter::DoAddSmi(InterpreterAssembler* assembler) {
__ BranchIf(overflow, &slowpath, &if_notoverflow);
__ Bind(&if_notoverflow);
{
+ __ UpdateFeedback(__ Int32Constant(BinaryOperationFeedback::kSignedSmall),
+ type_feedback_vector, slot_index);
var_result.Bind(__ Projection(0, pair));
__ Goto(&end);
}
@@ -1009,8 +1013,11 @@ void Interpreter::DoAddSmi(InterpreterAssembler* assembler) {
__ Bind(&slowpath);
{
Node* context = __ GetContext();
- Callable callable = CodeFactory::Add(__ isolate());
- var_result.Bind(__ CallStub(callable, context, left, right));
+ AddWithFeedbackStub stub(__ isolate());
+ Callable callable =
+ Callable(stub.GetCode(), AddWithFeedbackStub::Descriptor(__ isolate()));
+ Node* args[] = {left, right, slot_index, type_feedback_vector, context};
+ var_result.Bind(__ CallStubN(callable, args, 1));
__ Goto(&end);
}
__ Bind(&end);
@@ -1033,6 +1040,8 @@ void Interpreter::DoSubSmi(InterpreterAssembler* assembler) {
Node* left = __ LoadRegister(reg_index);
Node* raw_int = __ BytecodeOperandImm(0);
Node* right = __ SmiTag(raw_int);
+ Node* slot_index = __ BytecodeOperandIdx(2);
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector();
// {right} is known to be a Smi.
// Check if the {left} is a Smi take the fast path.
@@ -1048,6 +1057,8 @@ void Interpreter::DoSubSmi(InterpreterAssembler* assembler) {
__ BranchIf(overflow, &slowpath, &if_notoverflow);
__ Bind(&if_notoverflow);
{
+ __ UpdateFeedback(__ Int32Constant(BinaryOperationFeedback::kSignedSmall),
+ type_feedback_vector, slot_index);
var_result.Bind(__ Projection(0, pair));
__ Goto(&end);
}
@@ -1055,8 +1066,11 @@ void Interpreter::DoSubSmi(InterpreterAssembler* assembler) {
__ Bind(&slowpath);
{
Node* context = __ GetContext();
- Callable callable = CodeFactory::Subtract(__ isolate());
- var_result.Bind(__ CallStub(callable, context, left, right));
+ SubtractWithFeedbackStub stub(__ isolate());
+ Callable callable = Callable(
+ stub.GetCode(), SubtractWithFeedbackStub::Descriptor(__ isolate()));
+ Node* args[] = {left, right, slot_index, type_feedback_vector, context};
+ var_result.Bind(__ CallStubN(callable, args, 1));
__ Goto(&end);
}
__ Bind(&end);
@@ -1076,10 +1090,20 @@ void Interpreter::DoBitwiseOrSmi(InterpreterAssembler* assembler) {
Node* raw_int = __ BytecodeOperandImm(0);
Node* right = __ SmiTag(raw_int);
Node* context = __ GetContext();
- Node* lhs_value = __ TruncateTaggedToWord32(context, left);
+ Node* slot_index = __ BytecodeOperandIdx(2);
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector();
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32);
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback(
+ context, left, &var_lhs_type_feedback);
Node* rhs_value = __ SmiToWord32(right);
Node* value = __ Word32Or(lhs_value, rhs_value);
Node* result = __ ChangeInt32ToTagged(value);
+ Node* result_type =
+ __ Select(__ WordIsSmi(result),
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall),
+ __ Int32Constant(BinaryOperationFeedback::kNumber));
+ __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()),
+ type_feedback_vector, slot_index);
__ SetAccumulator(result);
__ Dispatch();
}
@@ -1094,10 +1118,20 @@ void Interpreter::DoBitwiseAndSmi(InterpreterAssembler* assembler) {
Node* raw_int = __ BytecodeOperandImm(0);
Node* right = __ SmiTag(raw_int);
Node* context = __ GetContext();
- Node* lhs_value = __ TruncateTaggedToWord32(context, left);
+ Node* slot_index = __ BytecodeOperandIdx(2);
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector();
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32);
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback(
+ context, left, &var_lhs_type_feedback);
Node* rhs_value = __ SmiToWord32(right);
Node* value = __ Word32And(lhs_value, rhs_value);
Node* result = __ ChangeInt32ToTagged(value);
+ Node* result_type =
+ __ Select(__ WordIsSmi(result),
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall),
+ __ Int32Constant(BinaryOperationFeedback::kNumber));
+ __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()),
+ type_feedback_vector, slot_index);
__ SetAccumulator(result);
__ Dispatch();
}
@@ -1113,11 +1147,21 @@ void Interpreter::DoShiftLeftSmi(InterpreterAssembler* assembler) {
Node* raw_int = __ BytecodeOperandImm(0);
Node* right = __ SmiTag(raw_int);
Node* context = __ GetContext();
- Node* lhs_value = __ TruncateTaggedToWord32(context, left);
+ Node* slot_index = __ BytecodeOperandIdx(2);
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector();
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32);
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback(
+ context, left, &var_lhs_type_feedback);
Node* rhs_value = __ SmiToWord32(right);
Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f));
Node* value = __ Word32Shl(lhs_value, shift_count);
Node* result = __ ChangeInt32ToTagged(value);
+ Node* result_type =
+ __ Select(__ WordIsSmi(result),
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall),
+ __ Int32Constant(BinaryOperationFeedback::kNumber));
+ __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()),
+ type_feedback_vector, slot_index);
__ SetAccumulator(result);
__ Dispatch();
}
@@ -1133,11 +1177,21 @@ void Interpreter::DoShiftRightSmi(InterpreterAssembler* assembler) {
Node* raw_int = __ BytecodeOperandImm(0);
Node* right = __ SmiTag(raw_int);
Node* context = __ GetContext();
- Node* lhs_value = __ TruncateTaggedToWord32(context, left);
+ Node* slot_index = __ BytecodeOperandIdx(2);
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector();
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32);
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback(
+ context, left, &var_lhs_type_feedback);
Node* rhs_value = __ SmiToWord32(right);
Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f));
Node* value = __ Word32Sar(lhs_value, shift_count);
Node* result = __ ChangeInt32ToTagged(value);
+ Node* result_type =
+ __ Select(__ WordIsSmi(result),
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall),
+ __ Int32Constant(BinaryOperationFeedback::kNumber));
+ __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()),
+ type_feedback_vector, slot_index);
__ SetAccumulator(result);
__ Dispatch();
}
« no previous file with comments | « src/interpreter/bytecodes.h ('k') | src/mips/interface-descriptors-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698