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     OFStream os(stdout);
     22     code->Disassemble(name, os);
     23   }
     24 #endif
     25   return code;
     26 }
     27 
     28 
     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 
     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 
     44 
     45 Register* PropertyAccessCompiler::GetCallingConvention(Code::Kind kind) {
     46   if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) {
     47     return load_calling_convention();
     48   }
     49   DCHECK(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC);
     50   return store_calling_convention();
     51 }
     52 
     53 
     54 Register PropertyAccessCompiler::slot() const {
     55   if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) {
     56     return LoadDescriptor::SlotRegister();
     57   }
     58   DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC);
     59   return VectorStoreICDescriptor::SlotRegister();
     60 }
     61 
     62 
     63 Register PropertyAccessCompiler::vector() const {
     64   if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) {
     65     return LoadWithVectorDescriptor::VectorRegister();
     66   }
     67   DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC);
     68   return VectorStoreICDescriptor::VectorRegister();
     69 }
     70 }  // namespace internal
     71 }  // namespace v8
     72