| // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | #include "vm/globals.h" | 
 | #if defined(TARGET_ARCH_IA32) | 
 |  | 
 | #include "vm/runtime_entry.h" | 
 |  | 
 | #include "vm/compiler/assembler/assembler.h" | 
 | #include "vm/stub_code.h" | 
 |  | 
 | namespace dart { | 
 |  | 
 | #define __ assembler-> | 
 |  | 
 | uword RuntimeEntry::GetEntryPoint() const { | 
 |   return reinterpret_cast<uword>(function()); | 
 | } | 
 |  | 
 | #if !defined(DART_PRECOMPILED_RUNTIME) | 
 | // Generate code to call into the stub which will call the runtime | 
 | // function. Input for the stub is as follows: | 
 | // For regular runtime calls - | 
 | //   ESP : points to the arguments and return value array. | 
 | //   ECX : address of the runtime function to call. | 
 | //   EDX : number of arguments to the call as Smi. | 
 | // For leaf calls the caller is responsible to setup the arguments | 
 | // and look for return values based on the C calling convention. | 
 | void RuntimeEntry::CallInternal(const RuntimeEntry* runtime_entry, | 
 |                                 compiler::Assembler* assembler, | 
 |                                 intptr_t argument_count) { | 
 |   if (runtime_entry->is_leaf()) { | 
 |     ASSERT(argument_count == runtime_entry->argument_count()); | 
 |     __ movl(EAX, compiler::Immediate(runtime_entry->GetEntryPoint())); | 
 |     __ movl(compiler::Assembler::VMTagAddress(), EAX); | 
 |     __ call(EAX); | 
 |     __ movl(compiler::Assembler::VMTagAddress(), | 
 |             compiler::Immediate(VMTag::kDartTagId)); | 
 |   } else { | 
 |     // Argument count is not checked here, but in the runtime entry for a more | 
 |     // informative error message. | 
 |     __ movl(ECX, compiler::Immediate(runtime_entry->GetEntryPoint())); | 
 |     __ movl(EDX, compiler::Immediate(argument_count)); | 
 |     __ CallToRuntime(); | 
 |   } | 
 | } | 
 | #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // defined TARGET_ARCH_IA32 |