13b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
23b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
33b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// found in the LICENSE file.
43b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
53b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifndef V8_INTERPRETER_INTERPRETER_INTRINSICS_H_
63b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define V8_INTERPRETER_INTERPRETER_INTRINSICS_H_
73b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
83b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/allocation.h"
9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/builtins/builtins.h"
103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/frames.h"
113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/interpreter/bytecodes.h"
123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/interpreter/interpreter-assembler.h"
133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/runtime/runtime.h"
143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace v8 {
163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace internal {
173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace compiler {
193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass Node;
203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace compiler
213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace interpreter {
233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// List of supported intrisics, with upper case name, lower case name and
2513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// expected number of arguments (-1 denoting argument count is variable).
2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define INTRINSICS_LIST(V)                                           \
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Call, call, -1)                                                  \
2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ClassOf, class_of, 1)                                            \
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(CreateIterResultObject, create_iter_result_object, 2)            \
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(CreateAsyncFromSyncIterator, create_async_from_sync_iterator, 1) \
3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(HasProperty, has_property, 2)                                    \
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(IsArray, is_array, 1)                                            \
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(IsJSProxy, is_js_proxy, 1)                                       \
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(IsJSReceiver, is_js_receiver, 1)                                 \
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(IsSmi, is_smi, 1)                                                \
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(IsTypedArray, is_typed_array, 1)                                 \
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(SubString, sub_string, 3)                                        \
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ToString, to_string, 1)                                          \
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ToLength, to_length, 1)                                          \
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ToInteger, to_integer, 1)                                        \
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ToNumber, to_number, 1)                                          \
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(ToObject, to_object, 1)
4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass IntrinsicsHelper {
453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public:
4613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  enum class IntrinsicId {
4713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define DECLARE_INTRINSIC_ID(name, lower_case, count) k##name,
4813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    INTRINSICS_LIST(DECLARE_INTRINSIC_ID)
4913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef DECLARE_INTRINSIC_ID
5013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        kIdCount
5113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  };
5213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STATIC_ASSERT(static_cast<uint32_t>(IntrinsicId::kIdCount) <= kMaxUInt8);
5313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  explicit IntrinsicsHelper(InterpreterAssembler* assembler);
553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  compiler::Node* InvokeIntrinsic(compiler::Node* function_id,
573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  compiler::Node* context,
583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  compiler::Node* first_arg_reg,
593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  compiler::Node* arg_count);
603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static bool IsSupported(Runtime::FunctionId function_id);
6213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static IntrinsicId FromRuntimeId(Runtime::FunctionId function_id);
6313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static Runtime::FunctionId ToRuntimeId(IntrinsicId intrinsic_id);
643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch private:
663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  enum InstanceTypeCompareMode {
673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    kInstanceTypeEqual,
683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    kInstanceTypeGreaterThanOrEqual
693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  };
7013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
7113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  compiler::Node* IsInstanceType(compiler::Node* input, int type);
723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  compiler::Node* CompareInstanceType(compiler::Node* map, int type,
733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                      InstanceTypeCompareMode mode);
7413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  compiler::Node* IntrinsicAsStubCall(compiler::Node* input,
7513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                      compiler::Node* context,
7613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                      Callable const& callable);
773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void AbortIfArgCountMismatch(int expected, compiler::Node* actual);
783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
7913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define DECLARE_INTRINSIC_HELPER(name, lower_case, count)                \
8013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  compiler::Node* name(compiler::Node* input, compiler::Node* arg_count, \
8113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                       compiler::Node* context);
823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  INTRINSICS_LIST(DECLARE_INTRINSIC_HELPER)
833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef DECLARE_INTRINSIC_HELPER
843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate() { return isolate_; }
8613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Zone* zone() { return zone_; }
8713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
8813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate_;
8913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Zone* zone_;
9013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  InterpreterAssembler* assembler_;
9113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(IntrinsicsHelper);
933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch};
943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace interpreter
963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace internal
973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace v8
983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif
100