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