mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 00:37:42 +00:00
1dc4e979d9
By moving all stubs that do runtime calls into the isolate we don't need to cache the current isolate in each context object. This saves space on each context at the cost of duplicating stubs in each isolate. Most stubs are already isolate-specific and the total number of stubs is small enough for this to be a good trade-off. R=vegorov@google.com Review URL: https://codereview.chromium.org//668193002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@41279 260f80e4-7a28-3924-810f-c04153c831b5
59 lines
2 KiB
C++
59 lines
2 KiB
C++
// Copyright (c) 2013, 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_MIPS)
|
|
|
|
#include "vm/runtime_entry.h"
|
|
|
|
#include "vm/assembler.h"
|
|
#include "vm/simulator.h"
|
|
#include "vm/stub_code.h"
|
|
|
|
namespace dart {
|
|
|
|
#define __ assembler->
|
|
|
|
|
|
// Generate code to call into the stub which will call the runtime
|
|
// function. Input for the stub is as follows:
|
|
// SP : points to the arguments and return value array.
|
|
// S5 : address of the runtime function to call.
|
|
// S4 : number of arguments to the call.
|
|
void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
|
|
// Compute the effective address. When running under the simulator,
|
|
// this is a redirection address that forces the simulator to call
|
|
// into the runtime system.
|
|
uword entry = GetEntryPoint();
|
|
#if defined(USING_SIMULATOR)
|
|
// Redirection to leaf runtime calls supports a maximum of 4 arguments passed
|
|
// in registers (maximum 2 double arguments for leaf float runtime calls).
|
|
ASSERT(argument_count >= 0);
|
|
ASSERT(!is_leaf() ||
|
|
(!is_float() && (argument_count <= 4)) ||
|
|
(argument_count <= 2));
|
|
Simulator::CallKind call_kind =
|
|
is_leaf() ? (is_float() ? Simulator::kLeafFloatRuntimeCall
|
|
: Simulator::kLeafRuntimeCall)
|
|
: Simulator::kRuntimeCall;
|
|
entry =
|
|
Simulator::RedirectExternalReference(entry, call_kind, argument_count);
|
|
#endif
|
|
if (is_leaf()) {
|
|
ASSERT(argument_count == this->argument_count());
|
|
ExternalLabel label(entry);
|
|
__ BranchLink(&label);
|
|
} else {
|
|
// Argument count is not checked here, but in the runtime entry for a more
|
|
// informative error message.
|
|
__ LoadImmediate(S5, entry);
|
|
__ LoadImmediate(S4, argument_count);
|
|
__ BranchLink(&Isolate::Current()->stub_code()->CallToRuntimeLabel());
|
|
}
|
|
}
|
|
|
|
} // namespace dart
|
|
|
|
#endif // defined TARGET_ARCH_MIPS
|