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