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