1 // 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 #include "src/ic/access-compiler.h"
6
7 namespace v8 {
8 namespace internal {
9
10
GetCodeWithFlags(Code::Flags flags,const char * name)11 Handle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags,
12 const char* name) {
13 // Create code object in the heap.
14 CodeDesc desc;
15 masm()->GetCode(&desc);
16 Handle<Code> code = factory()->NewCode(desc, flags, masm()->CodeObject());
17 if (code->IsCodeStubOrIC()) code->set_stub_key(CodeStub::NoCacheKey());
18 #ifdef ENABLE_DISASSEMBLER
19 if (FLAG_print_code_stubs) {
20 CodeTracer::Scope trace_scope(isolate()->GetCodeTracer());
21 OFStream os(trace_scope.file());
22 code->Disassemble(name, os);
23 }
24 #endif
25 return code;
26 }
27
28
GetCodeWithFlags(Code::Flags flags,Handle<Name> name)29 Handle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags,
30 Handle<Name> name) {
31 return (FLAG_print_code_stubs && !name.is_null() && name->IsString())
32 ? GetCodeWithFlags(flags,
33 Handle<String>::cast(name)->ToCString().get())
34 : GetCodeWithFlags(flags, NULL);
35 }
36
37
TailCallBuiltin(MacroAssembler * masm,Builtins::Name name)38 void PropertyAccessCompiler::TailCallBuiltin(MacroAssembler* masm,
39 Builtins::Name name) {
40 Handle<Code> code(masm->isolate()->builtins()->builtin(name));
41 GenerateTailCall(masm, code);
42 }
43
GetCallingConvention(Isolate * isolate,Code::Kind kind)44 Register* PropertyAccessCompiler::GetCallingConvention(Isolate* isolate,
45 Code::Kind kind) {
46 AccessCompilerData* data = isolate->access_compiler_data();
47 if (!data->IsInitialized()) {
48 InitializePlatformSpecific(data);
49 }
50 if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) {
51 return data->load_calling_convention();
52 }
53 DCHECK(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC);
54 return data->store_calling_convention();
55 }
56
57
slot() const58 Register PropertyAccessCompiler::slot() const {
59 if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) {
60 return LoadDescriptor::SlotRegister();
61 }
62 DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC);
63 return StoreWithVectorDescriptor::SlotRegister();
64 }
65
66
vector() const67 Register PropertyAccessCompiler::vector() const {
68 if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) {
69 return LoadWithVectorDescriptor::VectorRegister();
70 }
71 DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC);
72 return StoreWithVectorDescriptor::VectorRegister();
73 }
74 } // namespace internal
75 } // namespace v8
76