| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/interpreter/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
| 6 | 6 |
| 7 #include <fstream> | 7 #include <fstream> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
| (...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1051 __ Word32Equal(lhs_instance_type, __ Int32Constant(ODDBALL_TYPE)), | 1051 __ Word32Equal(lhs_instance_type, __ Int32Constant(ODDBALL_TYPE)), |
| 1052 &lhs_is_not_oddball); | 1052 &lhs_is_not_oddball); |
| 1053 | 1053 |
| 1054 var_type_feedback.Bind( | 1054 var_type_feedback.Bind( |
| 1055 __ Int32Constant(CompareOperationFeedback::kNumberOrOddball)); | 1055 __ Int32Constant(CompareOperationFeedback::kNumberOrOddball)); |
| 1056 __ Goto(&gather_rhs_type); | 1056 __ Goto(&gather_rhs_type); |
| 1057 | 1057 |
| 1058 __ Bind(&lhs_is_not_oddball); | 1058 __ Bind(&lhs_is_not_oddball); |
| 1059 } | 1059 } |
| 1060 | 1060 |
| 1061 var_type_feedback.Bind( | 1061 var_type_feedback.Bind(__ SelectInt32Constant( |
| 1062 __ Select(__ IsStringInstanceType(lhs_instance_type), | 1062 __ IsStringInstanceType(lhs_instance_type), |
| 1063 __ Int32Constant(CompareOperationFeedback::kString), | 1063 CompareOperationFeedback::kString, CompareOperationFeedback::kAny)); |
| 1064 __ Int32Constant(CompareOperationFeedback::kAny))); | |
| 1065 __ Goto(&gather_rhs_type); | 1064 __ Goto(&gather_rhs_type); |
| 1066 } | 1065 } |
| 1067 } | 1066 } |
| 1068 | 1067 |
| 1069 __ Bind(&gather_rhs_type); | 1068 __ Bind(&gather_rhs_type); |
| 1070 { | 1069 { |
| 1071 Label rhs_is_not_smi(assembler), rhs_is_not_number(assembler); | 1070 Label rhs_is_not_smi(assembler), rhs_is_not_number(assembler); |
| 1072 | 1071 |
| 1073 __ GotoUnless(__ TaggedIsSmi(rhs), &rhs_is_not_smi); | 1072 __ GotoUnless(__ TaggedIsSmi(rhs), &rhs_is_not_smi); |
| 1074 | 1073 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1099 var_type_feedback.Bind(__ Word32Or( | 1098 var_type_feedback.Bind(__ Word32Or( |
| 1100 var_type_feedback.value(), | 1099 var_type_feedback.value(), |
| 1101 __ Int32Constant(CompareOperationFeedback::kNumberOrOddball))); | 1100 __ Int32Constant(CompareOperationFeedback::kNumberOrOddball))); |
| 1102 __ Goto(&update_feedback); | 1101 __ Goto(&update_feedback); |
| 1103 | 1102 |
| 1104 __ Bind(&rhs_is_not_oddball); | 1103 __ Bind(&rhs_is_not_oddball); |
| 1105 } | 1104 } |
| 1106 | 1105 |
| 1107 var_type_feedback.Bind(__ Word32Or( | 1106 var_type_feedback.Bind(__ Word32Or( |
| 1108 var_type_feedback.value(), | 1107 var_type_feedback.value(), |
| 1109 __ Select(__ IsStringInstanceType(rhs_instance_type), | 1108 __ SelectInt32Constant(__ IsStringInstanceType(rhs_instance_type), |
| 1110 __ Int32Constant(CompareOperationFeedback::kString), | 1109 CompareOperationFeedback::kString, |
| 1111 __ Int32Constant(CompareOperationFeedback::kAny)))); | 1110 CompareOperationFeedback::kAny))); |
| 1112 __ Goto(&update_feedback); | 1111 __ Goto(&update_feedback); |
| 1113 } | 1112 } |
| 1114 } | 1113 } |
| 1115 } | 1114 } |
| 1116 | 1115 |
| 1117 __ Bind(&update_feedback); | 1116 __ Bind(&update_feedback); |
| 1118 { | 1117 { |
| 1119 __ UpdateFeedback(var_type_feedback.value(), type_feedback_vector, | 1118 __ UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
| 1120 slot_index); | 1119 slot_index); |
| 1121 __ Goto(&do_compare); | 1120 __ Goto(&do_compare); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1237 } break; | 1236 } break; |
| 1238 case Token::SAR: { | 1237 case Token::SAR: { |
| 1239 Node* value = __ Word32Sar( | 1238 Node* value = __ Word32Sar( |
| 1240 lhs_value, __ Word32And(rhs_value, __ Int32Constant(0x1f))); | 1239 lhs_value, __ Word32And(rhs_value, __ Int32Constant(0x1f))); |
| 1241 result = __ ChangeInt32ToTagged(value); | 1240 result = __ ChangeInt32ToTagged(value); |
| 1242 } break; | 1241 } break; |
| 1243 default: | 1242 default: |
| 1244 UNREACHABLE(); | 1243 UNREACHABLE(); |
| 1245 } | 1244 } |
| 1246 | 1245 |
| 1247 Node* result_type = | 1246 Node* result_type = __ SelectInt32Constant( |
| 1248 __ Select(__ TaggedIsSmi(result), | 1247 __ TaggedIsSmi(result), BinaryOperationFeedback::kSignedSmall, |
| 1249 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | 1248 BinaryOperationFeedback::kNumber); |
| 1250 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 1251 | 1249 |
| 1252 if (FLAG_debug_code) { | 1250 if (FLAG_debug_code) { |
| 1253 Label ok(assembler); | 1251 Label ok(assembler); |
| 1254 __ GotoIf(__ TaggedIsSmi(result), &ok); | 1252 __ GotoIf(__ TaggedIsSmi(result), &ok); |
| 1255 Node* result_map = __ LoadMap(result); | 1253 Node* result_map = __ LoadMap(result); |
| 1256 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), | 1254 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), |
| 1257 kExpectedHeapNumber); | 1255 kExpectedHeapNumber); |
| 1258 __ Goto(&ok); | 1256 __ Goto(&ok); |
| 1259 __ Bind(&ok); | 1257 __ Bind(&ok); |
| 1260 } | 1258 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 Node* right = __ SmiTag(raw_int); | 1435 Node* right = __ SmiTag(raw_int); |
| 1438 Node* context = __ GetContext(); | 1436 Node* context = __ GetContext(); |
| 1439 Node* slot_index = __ BytecodeOperandIdx(2); | 1437 Node* slot_index = __ BytecodeOperandIdx(2); |
| 1440 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 1438 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 1441 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); | 1439 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); |
| 1442 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | 1440 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
| 1443 context, left, &var_lhs_type_feedback); | 1441 context, left, &var_lhs_type_feedback); |
| 1444 Node* rhs_value = __ SmiToWord32(right); | 1442 Node* rhs_value = __ SmiToWord32(right); |
| 1445 Node* value = __ Word32Or(lhs_value, rhs_value); | 1443 Node* value = __ Word32Or(lhs_value, rhs_value); |
| 1446 Node* result = __ ChangeInt32ToTagged(value); | 1444 Node* result = __ ChangeInt32ToTagged(value); |
| 1447 Node* result_type = | 1445 Node* result_type = __ SelectInt32Constant( |
| 1448 __ Select(__ TaggedIsSmi(result), | 1446 __ TaggedIsSmi(result), BinaryOperationFeedback::kSignedSmall, |
| 1449 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | 1447 BinaryOperationFeedback::kNumber); |
| 1450 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 1451 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), | 1448 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), |
| 1452 type_feedback_vector, slot_index); | 1449 type_feedback_vector, slot_index); |
| 1453 __ SetAccumulator(result); | 1450 __ SetAccumulator(result); |
| 1454 __ Dispatch(); | 1451 __ Dispatch(); |
| 1455 } | 1452 } |
| 1456 | 1453 |
| 1457 // BitwiseAnd <imm> <reg> | 1454 // BitwiseAnd <imm> <reg> |
| 1458 // | 1455 // |
| 1459 // BitwiseAnd <reg> with <imm>. For this operation <reg> is the lhs | 1456 // BitwiseAnd <reg> with <imm>. For this operation <reg> is the lhs |
| 1460 // operand and <imm> is the rhs operand. | 1457 // operand and <imm> is the rhs operand. |
| 1461 void Interpreter::DoBitwiseAndSmi(InterpreterAssembler* assembler) { | 1458 void Interpreter::DoBitwiseAndSmi(InterpreterAssembler* assembler) { |
| 1462 Node* reg_index = __ BytecodeOperandReg(1); | 1459 Node* reg_index = __ BytecodeOperandReg(1); |
| 1463 Node* left = __ LoadRegister(reg_index); | 1460 Node* left = __ LoadRegister(reg_index); |
| 1464 Node* raw_int = __ BytecodeOperandImm(0); | 1461 Node* raw_int = __ BytecodeOperandImm(0); |
| 1465 Node* right = __ SmiTag(raw_int); | 1462 Node* right = __ SmiTag(raw_int); |
| 1466 Node* context = __ GetContext(); | 1463 Node* context = __ GetContext(); |
| 1467 Node* slot_index = __ BytecodeOperandIdx(2); | 1464 Node* slot_index = __ BytecodeOperandIdx(2); |
| 1468 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 1465 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 1469 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); | 1466 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); |
| 1470 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | 1467 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
| 1471 context, left, &var_lhs_type_feedback); | 1468 context, left, &var_lhs_type_feedback); |
| 1472 Node* rhs_value = __ SmiToWord32(right); | 1469 Node* rhs_value = __ SmiToWord32(right); |
| 1473 Node* value = __ Word32And(lhs_value, rhs_value); | 1470 Node* value = __ Word32And(lhs_value, rhs_value); |
| 1474 Node* result = __ ChangeInt32ToTagged(value); | 1471 Node* result = __ ChangeInt32ToTagged(value); |
| 1475 Node* result_type = | 1472 Node* result_type = __ SelectInt32Constant( |
| 1476 __ Select(__ TaggedIsSmi(result), | 1473 __ TaggedIsSmi(result), BinaryOperationFeedback::kSignedSmall, |
| 1477 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | 1474 BinaryOperationFeedback::kNumber); |
| 1478 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 1479 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), | 1475 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), |
| 1480 type_feedback_vector, slot_index); | 1476 type_feedback_vector, slot_index); |
| 1481 __ SetAccumulator(result); | 1477 __ SetAccumulator(result); |
| 1482 __ Dispatch(); | 1478 __ Dispatch(); |
| 1483 } | 1479 } |
| 1484 | 1480 |
| 1485 // ShiftLeftSmi <imm> <reg> | 1481 // ShiftLeftSmi <imm> <reg> |
| 1486 // | 1482 // |
| 1487 // Left shifts register <src> by the count specified in <imm>. | 1483 // Left shifts register <src> by the count specified in <imm>. |
| 1488 // Register <src> is converted to an int32 before the operation. The 5 | 1484 // Register <src> is converted to an int32 before the operation. The 5 |
| 1489 // lsb bits from <imm> are used as count i.e. <src> << (<imm> & 0x1F). | 1485 // lsb bits from <imm> are used as count i.e. <src> << (<imm> & 0x1F). |
| 1490 void Interpreter::DoShiftLeftSmi(InterpreterAssembler* assembler) { | 1486 void Interpreter::DoShiftLeftSmi(InterpreterAssembler* assembler) { |
| 1491 Node* reg_index = __ BytecodeOperandReg(1); | 1487 Node* reg_index = __ BytecodeOperandReg(1); |
| 1492 Node* left = __ LoadRegister(reg_index); | 1488 Node* left = __ LoadRegister(reg_index); |
| 1493 Node* raw_int = __ BytecodeOperandImm(0); | 1489 Node* raw_int = __ BytecodeOperandImm(0); |
| 1494 Node* right = __ SmiTag(raw_int); | 1490 Node* right = __ SmiTag(raw_int); |
| 1495 Node* context = __ GetContext(); | 1491 Node* context = __ GetContext(); |
| 1496 Node* slot_index = __ BytecodeOperandIdx(2); | 1492 Node* slot_index = __ BytecodeOperandIdx(2); |
| 1497 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 1493 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 1498 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); | 1494 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); |
| 1499 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | 1495 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
| 1500 context, left, &var_lhs_type_feedback); | 1496 context, left, &var_lhs_type_feedback); |
| 1501 Node* rhs_value = __ SmiToWord32(right); | 1497 Node* rhs_value = __ SmiToWord32(right); |
| 1502 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); | 1498 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); |
| 1503 Node* value = __ Word32Shl(lhs_value, shift_count); | 1499 Node* value = __ Word32Shl(lhs_value, shift_count); |
| 1504 Node* result = __ ChangeInt32ToTagged(value); | 1500 Node* result = __ ChangeInt32ToTagged(value); |
| 1505 Node* result_type = | 1501 Node* result_type = __ SelectInt32Constant( |
| 1506 __ Select(__ TaggedIsSmi(result), | 1502 __ TaggedIsSmi(result), BinaryOperationFeedback::kSignedSmall, |
| 1507 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | 1503 BinaryOperationFeedback::kNumber); |
| 1508 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 1509 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), | 1504 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), |
| 1510 type_feedback_vector, slot_index); | 1505 type_feedback_vector, slot_index); |
| 1511 __ SetAccumulator(result); | 1506 __ SetAccumulator(result); |
| 1512 __ Dispatch(); | 1507 __ Dispatch(); |
| 1513 } | 1508 } |
| 1514 | 1509 |
| 1515 // ShiftRightSmi <imm> <reg> | 1510 // ShiftRightSmi <imm> <reg> |
| 1516 // | 1511 // |
| 1517 // Right shifts register <src> by the count specified in <imm>. | 1512 // Right shifts register <src> by the count specified in <imm>. |
| 1518 // Register <src> is converted to an int32 before the operation. The 5 | 1513 // Register <src> is converted to an int32 before the operation. The 5 |
| 1519 // lsb bits from <imm> are used as count i.e. <src> << (<imm> & 0x1F). | 1514 // lsb bits from <imm> are used as count i.e. <src> << (<imm> & 0x1F). |
| 1520 void Interpreter::DoShiftRightSmi(InterpreterAssembler* assembler) { | 1515 void Interpreter::DoShiftRightSmi(InterpreterAssembler* assembler) { |
| 1521 Node* reg_index = __ BytecodeOperandReg(1); | 1516 Node* reg_index = __ BytecodeOperandReg(1); |
| 1522 Node* left = __ LoadRegister(reg_index); | 1517 Node* left = __ LoadRegister(reg_index); |
| 1523 Node* raw_int = __ BytecodeOperandImm(0); | 1518 Node* raw_int = __ BytecodeOperandImm(0); |
| 1524 Node* right = __ SmiTag(raw_int); | 1519 Node* right = __ SmiTag(raw_int); |
| 1525 Node* context = __ GetContext(); | 1520 Node* context = __ GetContext(); |
| 1526 Node* slot_index = __ BytecodeOperandIdx(2); | 1521 Node* slot_index = __ BytecodeOperandIdx(2); |
| 1527 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 1522 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 1528 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); | 1523 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32); |
| 1529 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | 1524 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( |
| 1530 context, left, &var_lhs_type_feedback); | 1525 context, left, &var_lhs_type_feedback); |
| 1531 Node* rhs_value = __ SmiToWord32(right); | 1526 Node* rhs_value = __ SmiToWord32(right); |
| 1532 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); | 1527 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); |
| 1533 Node* value = __ Word32Sar(lhs_value, shift_count); | 1528 Node* value = __ Word32Sar(lhs_value, shift_count); |
| 1534 Node* result = __ ChangeInt32ToTagged(value); | 1529 Node* result = __ ChangeInt32ToTagged(value); |
| 1535 Node* result_type = | 1530 Node* result_type = __ SelectInt32Constant( |
| 1536 __ Select(__ TaggedIsSmi(result), | 1531 __ TaggedIsSmi(result), BinaryOperationFeedback::kSignedSmall, |
| 1537 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | 1532 BinaryOperationFeedback::kNumber); |
| 1538 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 1539 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), | 1533 __ UpdateFeedback(__ Word32Or(result_type, var_lhs_type_feedback.value()), |
| 1540 type_feedback_vector, slot_index); | 1534 type_feedback_vector, slot_index); |
| 1541 __ SetAccumulator(result); | 1535 __ SetAccumulator(result); |
| 1542 __ Dispatch(); | 1536 __ Dispatch(); |
| 1543 } | 1537 } |
| 1544 | 1538 |
| 1545 Node* Interpreter::BuildUnaryOp(Callable callable, | 1539 Node* Interpreter::BuildUnaryOp(Callable callable, |
| 1546 InterpreterAssembler* assembler) { | 1540 InterpreterAssembler* assembler) { |
| 1547 Node* target = __ HeapConstant(callable.code()); | 1541 Node* target = __ HeapConstant(callable.code()); |
| 1548 Node* accumulator = __ GetAccumulator(); | 1542 Node* accumulator = __ GetAccumulator(); |
| (...skipping 1228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2777 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 2771 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
| 2778 __ SmiTag(new_state)); | 2772 __ SmiTag(new_state)); |
| 2779 __ SetAccumulator(old_state); | 2773 __ SetAccumulator(old_state); |
| 2780 | 2774 |
| 2781 __ Dispatch(); | 2775 __ Dispatch(); |
| 2782 } | 2776 } |
| 2783 | 2777 |
| 2784 } // namespace interpreter | 2778 } // namespace interpreter |
| 2785 } // namespace internal | 2779 } // namespace internal |
| 2786 } // namespace v8 | 2780 } // namespace v8 |
| OLD | NEW |