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 |