| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 7594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7605 if (argument_count == 3 && check_type == RECEIVER_MAP_CHECK) { | 7605 if (argument_count == 3 && check_type == RECEIVER_MAP_CHECK) { |
| 7606 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | 7606 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); |
| 7607 HValue* right = Pop(); | 7607 HValue* right = Pop(); |
| 7608 HValue* left = Pop(); | 7608 HValue* left = Pop(); |
| 7609 Drop(1); // Receiver. | 7609 Drop(1); // Receiver. |
| 7610 HInstruction* result = HMul::NewImul(zone(), context(), left, right); | 7610 HInstruction* result = HMul::NewImul(zone(), context(), left, right); |
| 7611 ast_context()->ReturnInstruction(result, expr->id()); | 7611 ast_context()->ReturnInstruction(result, expr->id()); |
| 7612 return true; | 7612 return true; |
| 7613 } | 7613 } |
| 7614 break; | 7614 break; |
| 7615 case kArrayPop: { | |
| 7616 if (!expr->IsMonomorphic() || expr->check_type() != RECEIVER_MAP_CHECK) { | |
| 7617 return false; | |
| 7618 } | |
| 7619 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; | |
| 7620 ElementsKind elements_kind = receiver_map->elements_kind(); | |
| 7621 if (!IsFastElementsKind(elements_kind)) return false; | |
| 7622 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | |
| 7623 | |
| 7624 Drop(expr->arguments()->length()); | |
| 7625 HValue* result; | |
| 7626 HValue* checked_object; | |
| 7627 HValue* reduced_length; | |
| 7628 HValue* receiver = Pop(); | |
| 7629 { NoObservableSideEffectsScope scope(this); | |
| 7630 checked_object = AddCheckMap(receiver, receiver_map); | |
| 7631 HValue* elements = AddLoadElements(checked_object); | |
| 7632 // Ensure that we aren't popping from a copy-on-write array. | |
| 7633 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | |
| 7634 Add<HCheckMaps>( | |
| 7635 elements, isolate()->factory()->fixed_array_map(), top_info()); | |
| 7636 } | |
| 7637 HValue* length = Add<HLoadNamedField>( | |
| 7638 checked_object, HObjectAccess::ForArrayLength(elements_kind)); | |
| 7639 reduced_length = AddUncasted<HSub>(length, graph()->GetConstant1()); | |
| 7640 HValue* bounds_check = Add<HBoundsCheck>( | |
| 7641 graph()->GetConstant0(), length); | |
| 7642 result = AddElementAccess(elements, reduced_length, NULL, | |
| 7643 bounds_check, elements_kind, false); | |
| 7644 Factory* factory = isolate()->factory(); | |
| 7645 double nan_double = FixedDoubleArray::hole_nan_as_double(); | |
| 7646 HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) | |
| 7647 ? Add<HConstant>(factory->the_hole_value()) | |
| 7648 : Add<HConstant>(nan_double); | |
| 7649 if (IsFastSmiOrObjectElementsKind(elements_kind)) { | |
| 7650 elements_kind = FAST_HOLEY_ELEMENTS; | |
| 7651 } | |
| 7652 AddElementAccess( | |
| 7653 elements, reduced_length, hole, bounds_check, elements_kind, true); | |
| 7654 } | |
| 7655 Add<HStoreNamedField>( | |
| 7656 checked_object, HObjectAccess::ForArrayLength(elements_kind), | |
| 7657 reduced_length); | |
| 7658 ast_context()->ReturnValue(result); | |
| 7659 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); | |
| 7660 return true; | |
| 7661 } | |
| 7662 case kArrayPush: { | |
| 7663 if (!expr->IsMonomorphic() || expr->check_type() != RECEIVER_MAP_CHECK) { | |
| 7664 return false; | |
| 7665 } | |
| 7666 if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false; | |
| 7667 ElementsKind elements_kind = receiver_map->elements_kind(); | |
| 7668 if (!IsFastElementsKind(elements_kind)) return false; | |
| 7669 AddCheckConstantFunction(expr->holder(), receiver, receiver_map); | |
| 7670 | |
| 7671 HValue* op_vals[] = { | |
| 7672 context(), | |
| 7673 // Receiver. | |
| 7674 environment()->ExpressionStackAt(expr->arguments()->length()) | |
| 7675 }; | |
| 7676 | |
| 7677 const int argc = expr->arguments()->length(); | |
| 7678 // Includes receiver. | |
| 7679 PushArgumentsFromEnvironment(argc + 1); | |
| 7680 | |
| 7681 CallInterfaceDescriptor* descriptor = | |
| 7682 isolate()->call_descriptor(Isolate::CallHandler); | |
| 7683 | |
| 7684 ArrayPushStub stub(receiver_map->elements_kind(), argc); | |
| 7685 Handle<Code> code = stub.GetCode(isolate()); | |
| 7686 HConstant* code_value = Add<HConstant>(code); | |
| 7687 | |
| 7688 ASSERT((sizeof(op_vals) / kPointerSize) == | |
| 7689 descriptor->environment_length()); | |
| 7690 | |
| 7691 HInstruction* call = New<HCallWithDescriptor>( | |
| 7692 code_value, argc + 1, descriptor, | |
| 7693 Vector<HValue*>(op_vals, descriptor->environment_length())); | |
| 7694 ast_context()->ReturnInstruction(call, expr->id()); | |
| 7695 return true; | |
| 7696 } | |
| 7697 default: | 7615 default: |
| 7698 // Not yet supported for inlining. | 7616 // Not yet supported for inlining. |
| 7699 break; | 7617 break; |
| 7700 } | 7618 } |
| 7701 return false; | 7619 return false; |
| 7702 } | 7620 } |
| 7703 | 7621 |
| 7704 | 7622 |
| 7705 bool HOptimizedGraphBuilder::TryCallApply(Call* expr) { | 7623 bool HOptimizedGraphBuilder::TryCallApply(Call* expr) { |
| 7706 Expression* callee = expr->expression(); | 7624 Expression* callee = expr->expression(); |
| (...skipping 3374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11081 if (ShouldProduceTraceOutput()) { | 10999 if (ShouldProduceTraceOutput()) { |
| 11082 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11000 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 11083 } | 11001 } |
| 11084 | 11002 |
| 11085 #ifdef DEBUG | 11003 #ifdef DEBUG |
| 11086 graph_->Verify(false); // No full verify. | 11004 graph_->Verify(false); // No full verify. |
| 11087 #endif | 11005 #endif |
| 11088 } | 11006 } |
| 11089 | 11007 |
| 11090 } } // namespace v8::internal | 11008 } } // namespace v8::internal |
| OLD | NEW |