interpreter-intrinsics.h revision 13e2dadd00298019ed862f2b2fc5068bba730bcf
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"
93b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/base/smart-pointers.h"
103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/builtins.h"
113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/frames.h"
123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/interpreter/bytecodes.h"
133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/interpreter/interpreter-assembler.h"
143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/runtime/runtime.h"
153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace v8 {
173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace internal {
183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace compiler {
203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass Node;
213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace compiler
223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace interpreter {
243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// List of supported intrisics, with upper case name, lower case name and
2613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// expected number of arguments (-1 denoting argument count is variable).
2713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define INTRINSICS_LIST(V)                              \
2813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(Call, call, -1)                                     \
2913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(HasProperty, has_property, 2)                       \
3013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(IsArray, is_array, 1)                               \
3113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(IsJSProxy, is_js_proxy, 1)                          \
3213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(IsJSReceiver, is_js_receiver, 1)                    \
3313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(IsRegExp, is_regexp, 1)                             \
3413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(IsSmi, is_smi, 1)                                   \
3513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(IsTypedArray, is_typed_array, 1)                    \
3613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(MathPow, math_pow, 2)                               \
3713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(NewObject, new_object, 2)                           \
3813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(NumberToString, number_to_string, 1)                \
3913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(RegExpConstructResult, reg_exp_construct_result, 3) \
4013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(RegExpExec, reg_exp_exec, 4)                        \
4113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(SubString, sub_string, 3)                           \
4213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ToString, to_string, 1)                             \
4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ToName, to_name, 1)                                 \
4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ToLength, to_length, 1)                             \
4513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ToInteger, to_integer, 1)                           \
4613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ToNumber, to_number, 1)                             \
4713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ToObject, to_object, 1)                             \
4813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ValueOf, value_of, 1)
4913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass IntrinsicsHelper {
513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public:
5213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  enum class IntrinsicId {
5313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define DECLARE_INTRINSIC_ID(name, lower_case, count) k##name,
5413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    INTRINSICS_LIST(DECLARE_INTRINSIC_ID)
5513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef DECLARE_INTRINSIC_ID
5613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        kIdCount
5713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  };
5813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  STATIC_ASSERT(static_cast<uint32_t>(IntrinsicId::kIdCount) <= kMaxUInt8);
5913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  explicit IntrinsicsHelper(InterpreterAssembler* assembler);
613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  compiler::Node* InvokeIntrinsic(compiler::Node* function_id,
633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  compiler::Node* context,
643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  compiler::Node* first_arg_reg,
653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  compiler::Node* arg_count);
663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  static bool IsSupported(Runtime::FunctionId function_id);
6813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static IntrinsicId FromRuntimeId(Runtime::FunctionId function_id);
6913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  static Runtime::FunctionId ToRuntimeId(IntrinsicId intrinsic_id);
703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch private:
723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  enum InstanceTypeCompareMode {
733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    kInstanceTypeEqual,
743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    kInstanceTypeGreaterThanOrEqual
753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  };
7613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
7713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  compiler::Node* IsInstanceType(compiler::Node* input, int type);
783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  compiler::Node* CompareInstanceType(compiler::Node* map, int type,
793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                      InstanceTypeCompareMode mode);
8013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  compiler::Node* IntrinsicAsStubCall(compiler::Node* input,
8113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                      compiler::Node* context,
8213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                      Callable const& callable);
833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void AbortIfArgCountMismatch(int expected, compiler::Node* actual);
843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define DECLARE_INTRINSIC_HELPER(name, lower_case, count)                \
8613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  compiler::Node* name(compiler::Node* input, compiler::Node* arg_count, \
8713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                       compiler::Node* context);
883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  INTRINSICS_LIST(DECLARE_INTRINSIC_HELPER)
893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef DECLARE_INTRINSIC_HELPER
903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
9113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate() { return isolate_; }
9213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Zone* zone() { return zone_; }
9313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
9413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate_;
9513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Zone* zone_;
9613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  InterpreterAssembler* assembler_;
9713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(IntrinsicsHelper);
993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch};
1003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace interpreter
1023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace internal
1033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace v8
1043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif
106