1a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 2a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 3a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// found in the LICENSE file. 4a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 5a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#ifndef V8_IC_ACCESS_COMPILER_H_ 6a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#define V8_IC_ACCESS_COMPILER_H_ 7a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 8a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#include "src/code-stubs.h" 9a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#include "src/macro-assembler.h" 10a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#include "src/objects.h" 11a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 12a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgnamespace v8 { 13a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgnamespace internal { 14a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 15a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 16a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgclass PropertyAccessCompiler BASE_EMBEDDED { 17a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org public: 18a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static Builtins::Name MissBuiltin(Code::Kind kind) { 19a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org switch (kind) { 20a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org case Code::LOAD_IC: 21a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return Builtins::kLoadIC_Miss; 22a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org case Code::STORE_IC: 23a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return Builtins::kStoreIC_Miss; 24a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org case Code::KEYED_LOAD_IC: 25a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return Builtins::kKeyedLoadIC_Miss; 26a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org case Code::KEYED_STORE_IC: 27a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return Builtins::kKeyedStoreIC_Miss; 28a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org default: 29a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org UNREACHABLE(); 30a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 31a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return Builtins::kLoadIC_Miss; 32a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 33a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 34a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static void TailCallBuiltin(MacroAssembler* masm, Builtins::Name name); 35a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 36a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org protected: 37a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org PropertyAccessCompiler(Isolate* isolate, Code::Kind kind, 38a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CacheHolderFlag cache_holder) 39a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : registers_(GetCallingConvention(kind)), 40a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org kind_(kind), 41a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org cache_holder_(cache_holder), 42a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org isolate_(isolate), 43a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org masm_(isolate, NULL, 256) {} 44a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 45a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Code::Kind kind() const { return kind_; } 46a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CacheHolderFlag cache_holder() const { return cache_holder_; } 47a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org MacroAssembler* masm() { return &masm_; } 48a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Isolate* isolate() const { return isolate_; } 49a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Heap* heap() const { return isolate()->heap(); } 50a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Factory* factory() const { return isolate()->factory(); } 51a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 52a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Register receiver() const { return registers_[0]; } 53a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Register name() const { return registers_[1]; } 54a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Register scratch1() const { return registers_[2]; } 55a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Register scratch2() const { return registers_[3]; } 56a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Register scratch3() const { return registers_[4]; } 57a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 58a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // Calling convention between indexed store IC and handler. 59a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Register transition_map() const { return scratch1(); } 60a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 61a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static Register* GetCallingConvention(Code::Kind); 62a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static Register* load_calling_convention(); 63a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static Register* store_calling_convention(); 64a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static Register* keyed_store_calling_convention(); 65a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 66a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Register* registers_; 67a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 68a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code); 69a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 70a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); 71a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name); 72a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 73a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org private: 74a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Code::Kind kind_; 75a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CacheHolderFlag cache_holder_; 76a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 77a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Isolate* isolate_; 78a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org MacroAssembler masm_; 79a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}; 80a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org} 81a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org} // namespace v8::internal 82a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 83a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#endif // V8_IC_ACCESS_COMPILER_H_ 84