Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index acc69c43967019bac0b29301ed753a55330c5c41..3bfe6fd9de7c382e2063a7d46cb53946cb12403f 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -815,21 +815,135 @@ void Interpreter::DoMod(InterpreterAssembler* assembler) { |
// |
// BitwiseOr register <src> to accumulator. |
void Interpreter::DoBitwiseOr(InterpreterAssembler* assembler) { |
- DoBinaryOp<BitwiseOrStub>(assembler); |
+ typedef InterpreterAssembler::Label Label; |
+ typedef InterpreterAssembler::Variable Variable; |
rmcilroy
2016/08/11 13:31:07
Typedefs are unecessary here
epertoso
2016/08/11 14:03:11
Done.
|
+ |
+ Node* reg_index = __ BytecodeOperandReg(0); |
+ Node* lhs = __ LoadRegister(reg_index); |
+ Node* rhs = __ GetAccumulator(); |
+ Node* context = __ GetContext(); |
+ Node* slot_index = __ BytecodeOperandIdx(1); |
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
+ |
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), |
+ var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, lhs, &var_lhs_type_feedback); |
+ Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, rhs, &var_rhs_type_feedback); |
+ Node* value = __ Word32Or(lhs_value, rhs_value); |
+ Node* result = __ ChangeInt32ToTagged(value); |
+ |
+ Node* result_type = |
+ __ Select(__ WordIsSmi(result), |
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall), |
+ __ Int32Constant(BinaryOperationFeedback::kNumber)); |
+ |
+ if (FLAG_debug_code) { |
+ Label ok(assembler); |
+ __ GotoIf(__ WordIsSmi(result), &ok); |
+ Node* result_map = __ LoadMap(result); |
+ __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), |
+ kExpectedHeapNumber); |
+ __ Bind(&ok); |
+ } |
+ |
+ Node* input_feedback = |
+ __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); |
+ __ UpdateFeedback(__ Word32Or(result_type, input_feedback), |
+ type_feedback_vector, slot_index); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
rmcilroy
2016/08/11 13:31:07
Could we share all the code in a single helper whi
epertoso
2016/08/11 14:03:11
Done.
|
} |
// BitwiseXor <src> |
// |
// BitwiseXor register <src> to accumulator. |
void Interpreter::DoBitwiseXor(InterpreterAssembler* assembler) { |
- DoBinaryOp<BitwiseXorStub>(assembler); |
+ typedef InterpreterAssembler::Label Label; |
+ typedef InterpreterAssembler::Variable Variable; |
+ |
+ Node* reg_index = __ BytecodeOperandReg(0); |
+ Node* lhs = __ LoadRegister(reg_index); |
+ Node* rhs = __ GetAccumulator(); |
+ Node* context = __ GetContext(); |
+ Node* slot_index = __ BytecodeOperandIdx(1); |
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
+ |
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), |
+ var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, lhs, &var_lhs_type_feedback); |
+ Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, rhs, &var_rhs_type_feedback); |
+ Node* value = __ Word32Xor(lhs_value, rhs_value); |
+ Node* result = __ ChangeInt32ToTagged(value); |
+ |
+ Node* result_type = |
+ __ Select(__ WordIsSmi(result), |
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall), |
+ __ Int32Constant(BinaryOperationFeedback::kNumber)); |
+ |
+ if (FLAG_debug_code) { |
+ Label ok(assembler); |
+ __ GotoIf(__ WordIsSmi(result), &ok); |
+ Node* result_map = __ LoadMap(result); |
+ __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), |
+ kExpectedHeapNumber); |
+ __ Bind(&ok); |
+ } |
+ |
+ Node* input_feedback = |
+ __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); |
+ __ UpdateFeedback(__ Word32Or(result_type, input_feedback), |
+ type_feedback_vector, slot_index); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
} |
// BitwiseAnd <src> |
// |
// BitwiseAnd register <src> to accumulator. |
void Interpreter::DoBitwiseAnd(InterpreterAssembler* assembler) { |
- DoBinaryOp<BitwiseAndStub>(assembler); |
+ typedef InterpreterAssembler::Label Label; |
+ typedef InterpreterAssembler::Variable Variable; |
+ |
+ Node* reg_index = __ BytecodeOperandReg(0); |
+ Node* lhs = __ LoadRegister(reg_index); |
+ Node* rhs = __ GetAccumulator(); |
+ Node* context = __ GetContext(); |
+ Node* slot_index = __ BytecodeOperandIdx(1); |
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
+ |
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), |
+ var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, lhs, &var_lhs_type_feedback); |
+ Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, rhs, &var_rhs_type_feedback); |
+ Node* value = __ Word32And(lhs_value, rhs_value); |
+ Node* result = __ ChangeInt32ToTagged(value); |
+ |
+ Node* result_type = |
+ __ Select(__ WordIsSmi(result), |
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall), |
+ __ Int32Constant(BinaryOperationFeedback::kNumber)); |
+ |
+ if (FLAG_debug_code) { |
+ Label ok(assembler); |
+ __ GotoIf(__ WordIsSmi(result), &ok); |
+ Node* result_map = __ LoadMap(result); |
+ __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), |
+ kExpectedHeapNumber); |
+ __ Bind(&ok); |
+ } |
+ |
+ Node* input_feedback = |
+ __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); |
+ __ UpdateFeedback(__ Word32Or(result_type, input_feedback), |
+ type_feedback_vector, slot_index); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
} |
// ShiftLeft <src> |
@@ -839,7 +953,45 @@ void Interpreter::DoBitwiseAnd(InterpreterAssembler* assembler) { |
// before the operation. 5 lsb bits from the accumulator are used as count |
// i.e. <src> << (accumulator & 0x1F). |
void Interpreter::DoShiftLeft(InterpreterAssembler* assembler) { |
- DoBinaryOp<ShiftLeftStub>(assembler); |
+ typedef InterpreterAssembler::Variable Variable; |
+ |
+ Node* reg_index = __ BytecodeOperandReg(0); |
+ Node* lhs = __ LoadRegister(reg_index); |
+ Node* rhs = __ GetAccumulator(); |
+ Node* context = __ GetContext(); |
+ Node* slot_index = __ BytecodeOperandIdx(1); |
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
+ |
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), |
+ var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, lhs, &var_lhs_type_feedback); |
+ Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, rhs, &var_rhs_type_feedback); |
+ 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)); |
+ |
+ if (FLAG_debug_code) { |
+ InterpreterAssembler::Label ok(assembler); |
+ __ GotoIf(__ WordIsSmi(result), &ok); |
+ Node* result_map = __ LoadMap(result); |
+ __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), |
+ kExpectedHeapNumber); |
+ __ Bind(&ok); |
+ } |
+ |
+ Node* input_feedback = |
+ __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); |
+ __ UpdateFeedback(__ Word32Or(result_type, input_feedback), |
+ type_feedback_vector, slot_index); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
} |
// ShiftRight <src> |
@@ -849,7 +1001,45 @@ void Interpreter::DoShiftLeft(InterpreterAssembler* assembler) { |
// accumulator to uint32 before the operation. 5 lsb bits from the accumulator |
// are used as count i.e. <src> >> (accumulator & 0x1F). |
void Interpreter::DoShiftRight(InterpreterAssembler* assembler) { |
- DoBinaryOp<ShiftRightStub>(assembler); |
+ typedef InterpreterAssembler::Variable Variable; |
+ |
+ Node* reg_index = __ BytecodeOperandReg(0); |
+ Node* lhs = __ LoadRegister(reg_index); |
+ Node* rhs = __ GetAccumulator(); |
+ Node* context = __ GetContext(); |
+ Node* slot_index = __ BytecodeOperandIdx(1); |
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
+ |
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), |
+ var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, lhs, &var_lhs_type_feedback); |
+ Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, rhs, &var_rhs_type_feedback); |
+ 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)); |
+ |
+ if (FLAG_debug_code) { |
+ InterpreterAssembler::Label ok(assembler); |
+ __ GotoIf(__ WordIsSmi(result), &ok); |
+ Node* result_map = __ LoadMap(result); |
+ __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), |
+ kExpectedHeapNumber); |
+ __ Bind(&ok); |
+ } |
+ |
+ Node* input_feedback = |
+ __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); |
+ __ UpdateFeedback(__ Word32Or(result_type, input_feedback), |
+ type_feedback_vector, slot_index); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
} |
// ShiftRightLogical <src> |
@@ -859,7 +1049,45 @@ void Interpreter::DoShiftRight(InterpreterAssembler* assembler) { |
// uint32 before the operation 5 lsb bits from the accumulator are used as |
// count i.e. <src> << (accumulator & 0x1F). |
void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { |
- DoBinaryOp<ShiftRightLogicalStub>(assembler); |
+ typedef InterpreterAssembler::Variable Variable; |
+ |
+ Node* reg_index = __ BytecodeOperandReg(0); |
+ Node* lhs = __ LoadRegister(reg_index); |
+ Node* rhs = __ GetAccumulator(); |
+ Node* context = __ GetContext(); |
+ Node* slot_index = __ BytecodeOperandIdx(1); |
+ Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
+ |
+ Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), |
+ var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); |
+ Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, lhs, &var_lhs_type_feedback); |
+ Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( |
+ context, rhs, &var_rhs_type_feedback); |
+ Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); |
+ Node* value = __ Word32Shr(lhs_value, shift_count); |
+ Node* result = __ ChangeUint32ToTagged(value); |
+ |
+ Node* result_type = |
+ __ Select(__ WordIsSmi(result), |
+ __ Int32Constant(BinaryOperationFeedback::kSignedSmall), |
+ __ Int32Constant(BinaryOperationFeedback::kNumber)); |
+ |
+ if (FLAG_debug_code) { |
+ InterpreterAssembler::Label ok(assembler); |
+ __ GotoIf(__ WordIsSmi(result), &ok); |
+ Node* result_map = __ LoadMap(result); |
+ __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), |
+ kExpectedHeapNumber); |
+ __ Bind(&ok); |
+ } |
+ |
+ Node* input_feedback = |
+ __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); |
+ __ UpdateFeedback(__ Word32Or(result_type, input_feedback), |
+ type_feedback_vector, slot_index); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
} |
// AddSmi <imm> <reg> |