commit | ba341d740a255a508c0977e1ca94b5546de02937 | [log] [tgz] |
---|---|---|
author | Clement Skau <cskau@google.com> | Wed Mar 30 10:57:26 2022 +0000 |
committer | Commit Bot <commit-bot@chromium.org> | Wed Mar 30 10:57:26 2022 +0000 |
tree | 348dd8d894201d2474403fe51269f85996e35562 | |
parent | c78ef90124dfb84215805a19eb91783b0f7ef7e9 [diff] |
[vm] Avoid spills for most FFI leaf calls. Adds an additional `contains_call` mode specifying that the register allocator should block all non-callee-save ABI registers. As opposed to `kCall`, this frees the use of callee-save registers across FfiCallInstr, meaning that live values do not always have to be spilled. For architectures with sufficient free callee-save registers this should result in less overhead for each FfiCall. This change also removes RequiresStackSlot as it was only being used for FfiCall's TypedData, and wasn't implemented in the Register Allocator. Since FfiCall no longer blocks all registers TypedData can now live in a register, so the previous assumptions about it always being on stack have to be relaxed. This change also works around an issue where the register allocator might allocate an FPU register that does not have an associated S register. This causes problems when FFI tries to pass 32 bit floats in said register. As a work around we block all FPU regs. above the 8 that have S regs. for FFI calls in VFPv3-D32 mode. This change also adds an additional temp registers which was previous used but not being reserved in FfiCall IL on Arm64. Some additional prereq. fixes were branched out into: https://dart-review.googlesource.com/c/sdk/+/237690 TEST=Adds IRTest_FfiCallInstrLeafDoesntSpill. Bug: https://github.com/dart-lang/sdk/issues/45468 Change-Id: Icdeccb0de77e46f5bc34dd5bd4e308d27bc1ef99 Cq-Do-Not-Cancel-Tryjobs: true Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-win-release-x64-try, vm-precomp-ffi-qemu-linux-release-arm-try, vm-kernel-mac-release-arm64-try, vm-kernel-nnbd-mac-debug-arm64-try, vm-kernel-nnbd-mac-release-arm64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/221624 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Clement Skau <cskau@google.com>
Dart is:
Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.
Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.