• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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