162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file.
462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/code-stub-assembler.h"
662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8 {
862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace internal {
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::Node Node;
1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::CodeAssemblerState CodeAssemblerState;
1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::CodeAssemblerLabel CodeAssemblerLabel;
1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ConstructorBuiltinsAssembler : public CodeStubAssembler {
1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  explicit ConstructorBuiltinsAssembler(CodeAssemblerState* state)
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : CodeStubAssembler(state) {}
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastNewClosure(Node* shared_info, Node* feedback_vector, Node* slot,
2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                           Node* context);
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastNewFunctionContext(Node* closure, Node* slots, Node* context,
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                   ScopeType scope_type);
2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static int MaximumFunctionContextSlots();
2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastCloneRegExp(Node* closure, Node* literal_index, Node* pattern,
2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                            Node* flags, Node* context);
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastCloneShallowArray(Node* closure, Node* literal_index,
2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                  Node* context,
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                  CodeAssemblerLabel* call_runtime,
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                  AllocationSiteMode allocation_site_mode);
3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Maximum number of elements in copied array (chosen so that even an array
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // backed by a double backing store will fit into new-space).
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static const int kMaximumClonedShallowArrayElements =
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      JSArray::kInitialMaxFastElementArray * kPointerSize / kDoubleSize;
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void CreateFastCloneShallowArrayBuiltin(
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      AllocationSiteMode allocation_site_mode);
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Maximum number of properties in copied objects.
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static const int kMaximumClonedShallowObjectProperties = 6;
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static int FastCloneShallowObjectPropertiesCount(int literal_length);
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastCloneShallowObject(CodeAssemblerLabel* call_runtime,
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                   Node* closure, Node* literals_index,
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                   Node* properties_count);
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void CreateFastCloneShallowObjectBuiltin(int properties_count);
4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastNewObject(Node* context, Node* target, Node* new_target);
4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastNewObject(Node* context, Node* target, Node* new_target,
5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                          CodeAssemblerLabel* call_runtime);
5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private:
5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static const int kMaximumSlots = 0x8000;
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static const int kSmallMaximumSlots = 10;
5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* NonEmptyShallowClone(Node* boilerplate, Node* boilerplate_map,
5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                             Node* boilerplate_elements, Node* allocation_site,
5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                             Node* capacity, ElementsKind kind);
6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // FastNewFunctionContext can only allocate closures which fit in the
6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // new space.
6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(((kMaximumSlots + Context::MIN_CONTEXT_SLOTS) * kPointerSize +
6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                 FixedArray::kHeaderSize) < kMaxRegularHeapObjectSize);
6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace internal
6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace v8
69