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