2019-07-19 14:59:57 +00:00
|
|
|
// Copyright (c) 2019, 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.
|
|
|
|
|
|
|
|
// TODO(37581): Generate this file.
|
|
|
|
|
|
|
|
// Micro-benchmarks for ffi memory stores and loads.
|
|
|
|
//
|
|
|
|
// These micro benchmarks track the speed of reading and writing C memory from
|
|
|
|
// Dart with a specific marshalling and unmarshalling of data.
|
|
|
|
|
|
|
|
import 'dart:ffi';
|
2021-02-23 12:41:49 +00:00
|
|
|
import 'dart:typed_data';
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2019-10-10 13:17:43 +00:00
|
|
|
import 'package:ffi/ffi.dart';
|
2019-07-19 14:59:57 +00:00
|
|
|
import 'package:benchmark_harness/benchmark_harness.dart';
|
|
|
|
|
|
|
|
//
|
|
|
|
// Pointer store.
|
|
|
|
//
|
|
|
|
|
|
|
|
void doStoreInt8(Pointer<Int8> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-23 12:41:49 +00:00
|
|
|
void doStoreInt8TypedData(Int8List typedData, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
typedData[i] = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-19 14:59:57 +00:00
|
|
|
void doStoreUint8(Pointer<Uint8> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreInt16(Pointer<Int16> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreUint16(Pointer<Uint16> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreInt32(Pointer<Int32> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreUint32(Pointer<Uint32> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreInt64(Pointer<Int64> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreUint64(Pointer<Uint64> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[vm/ffi] ABI-specific integers
This CL adds support for users defining integers which are mapped to
differing sizes and signedness based on the application binary interface
the Dart VM is running on.
Notable implementation design decisions:
- ABIs are open world, so that adding an ABI to the Dart VM does not
break existing definitions. Thus, we only figure out in the VM that
we're missing a mapping. We throw compile-time errors.
- In AOT, these show up in the precompilation step.
- In JIT, these show up as `_CompileTimeError` at runtime. Note that
these can be caught. So in subsequent compilation steps we need to
ensure that we also throw the same compile-time error.
- We match on the call-sites (streaming_flowgraph_builder) rather than
method bodies (kernel_to_il) of AbiSpecific loads and stores so that
we can compile for the int-size of the call site.
API design decisions:
https://github.com/dart-lang/sdk/issues/42563#issuecomment-981774001
Closes: https://github.com/dart-lang/sdk/issues/42563
TEST=tests/ffi_2/abi_*_test.dart
TEST=tests/ffi/function_*_generated_test.dart
TEST=tests/ffi/vmspecific_static_checks_test.dart
Change-Id: I8c8df36fab939b6fb614c5f1ee8e1bf46b6e9521
Cq-Include-Trybots: luci.dart.try:analyzer-linux-release-try,analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,benchmark-linux-try,dart-sdk-linux-try,front-end-linux-release-x64-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-fuchsia-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-linux-debug-x64c-try,vm-kernel-mac-debug-x64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/221501
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2021-12-16 22:07:00 +00:00
|
|
|
void doStoreUintPtr(Pointer<UintPtr> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
pointer[i] = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-19 14:59:57 +00:00
|
|
|
void doStoreFloat(Pointer<Float> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1.0;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreDouble(Pointer<Double> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 1.0;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStorePointer(
|
|
|
|
Pointer<Pointer<Int8>> pointer, int length, Pointer<Int8> data) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = data;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doStoreInt64Mint(Pointer<Int64> pointer, int length) {
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
pointer[i] = 0x7FFFFFFFFFFFFFFF;
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Pointer load.
|
|
|
|
//
|
|
|
|
|
|
|
|
int doLoadInt8(Pointer<Int8> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
2021-02-23 12:41:49 +00:00
|
|
|
int doLoadInt8TypedData(Int8List typedData, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
x += typedData[i];
|
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
2019-07-19 14:59:57 +00:00
|
|
|
int doLoadUint8(Pointer<Uint8> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
int doLoadInt16(Pointer<Int16> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
int doLoadUint16(Pointer<Uint16> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
int doLoadInt32(Pointer<Int32> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
int doLoadUint32(Pointer<Uint32> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
int doLoadInt64(Pointer<Int64> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
int doLoadUint64(Pointer<Uint64> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
[vm/ffi] ABI-specific integers
This CL adds support for users defining integers which are mapped to
differing sizes and signedness based on the application binary interface
the Dart VM is running on.
Notable implementation design decisions:
- ABIs are open world, so that adding an ABI to the Dart VM does not
break existing definitions. Thus, we only figure out in the VM that
we're missing a mapping. We throw compile-time errors.
- In AOT, these show up in the precompilation step.
- In JIT, these show up as `_CompileTimeError` at runtime. Note that
these can be caught. So in subsequent compilation steps we need to
ensure that we also throw the same compile-time error.
- We match on the call-sites (streaming_flowgraph_builder) rather than
method bodies (kernel_to_il) of AbiSpecific loads and stores so that
we can compile for the int-size of the call site.
API design decisions:
https://github.com/dart-lang/sdk/issues/42563#issuecomment-981774001
Closes: https://github.com/dart-lang/sdk/issues/42563
TEST=tests/ffi_2/abi_*_test.dart
TEST=tests/ffi/function_*_generated_test.dart
TEST=tests/ffi/vmspecific_static_checks_test.dart
Change-Id: I8c8df36fab939b6fb614c5f1ee8e1bf46b6e9521
Cq-Include-Trybots: luci.dart.try:analyzer-linux-release-try,analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,benchmark-linux-try,dart-sdk-linux-try,front-end-linux-release-x64-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-fuchsia-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-linux-debug-x64c-try,vm-kernel-mac-debug-x64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/221501
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2021-12-16 22:07:00 +00:00
|
|
|
int doLoadUintPtr(Pointer<UintPtr> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
|
|
|
x += pointer[i];
|
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
2019-07-19 14:59:57 +00:00
|
|
|
double doLoadFloat(Pointer<Float> pointer, int length) {
|
|
|
|
double x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
double doLoadDouble(Pointer<Double> pointer, int length) {
|
|
|
|
double x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
2022-12-20 12:36:37 +00:00
|
|
|
// Aggregates pointers through aggregating their addresses.
|
2019-07-19 14:59:57 +00:00
|
|
|
int doLoadPointer(Pointer<Pointer<Int8>> pointer, int length) {
|
|
|
|
Pointer<Int8> x;
|
|
|
|
int address_xor = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x = pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
address_xor ^= x.address;
|
|
|
|
}
|
|
|
|
return address_xor;
|
|
|
|
}
|
|
|
|
|
|
|
|
int doLoadInt64Mint(Pointer<Int64> pointer, int length) {
|
|
|
|
int x = 0;
|
|
|
|
for (int i = 0; i < length; i++) {
|
[vm/ffi] Migrate tests/samples/benchmarks to extension methods
I used the regex replaces documented on the `load` and `store` deprecated methods.
I manually replaced some `.val` to `.ref` when a regex could not detect whether something was a primitive value or a struct.
Issue: https://github.com/dart-lang/sdk/issues/37773
Change-Id: I3534b6dd00d9ac45fa1a11fe75c80fb3cccc07dc
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118993
Reviewed-by: Samir Jindel <sjindel@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2019-10-08 16:49:41 +00:00
|
|
|
x += pointer[i];
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Benchmark fixtures.
|
|
|
|
//
|
|
|
|
|
|
|
|
// Number of repeats: 1000
|
|
|
|
// * CPU: Intel(R) Xeon(R) Gold 6154
|
|
|
|
// * Architecture: x64
|
|
|
|
// * 48000 - 125000 us (without optimizations)
|
|
|
|
// * 14 - ??? us (expected with optimizations, on par with typed data)
|
|
|
|
const N = 1000;
|
|
|
|
|
|
|
|
class PointerInt8 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Int8> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerInt8() : super('FfiMemory.PointerInt8');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreInt8(pointer, N);
|
|
|
|
final int x = doLoadInt8(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-23 12:41:49 +00:00
|
|
|
class PointerInt8TypedDataNew extends BenchmarkBase {
|
|
|
|
Pointer<Int8> pointer = nullptr;
|
|
|
|
PointerInt8TypedDataNew() : super('FfiMemory.PointerInt8TypedDataNew');
|
|
|
|
|
|
|
|
@override
|
|
|
|
void setup() {
|
|
|
|
pointer = calloc(N);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void teardown() {
|
|
|
|
calloc.free(pointer);
|
|
|
|
pointer = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void run() {
|
|
|
|
final typedData = pointer.asTypedList(N);
|
|
|
|
doStoreInt8TypedData(typedData, N);
|
|
|
|
final int x = doLoadInt8TypedData(typedData, N);
|
|
|
|
if (x != N) {
|
|
|
|
throw Exception('$name: Unexpected result: $x, expected $N');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
final emptyTypedData = Int8List(0);
|
|
|
|
|
|
|
|
class PointerInt8TypedDataReuse extends BenchmarkBase {
|
|
|
|
Pointer<Int8> pointer = nullptr;
|
|
|
|
Int8List typedData = emptyTypedData;
|
|
|
|
PointerInt8TypedDataReuse() : super('FfiMemory.PointerInt8TypedDataReuse');
|
|
|
|
|
|
|
|
@override
|
|
|
|
void setup() {
|
|
|
|
pointer = calloc(N);
|
|
|
|
typedData = pointer.asTypedList(N);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void teardown() {
|
|
|
|
calloc.free(pointer);
|
|
|
|
pointer = nullptr;
|
|
|
|
typedData = emptyTypedData;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void run() {
|
|
|
|
doStoreInt8TypedData(typedData, N);
|
|
|
|
final int x = doLoadInt8TypedData(typedData, N);
|
|
|
|
if (x != N) {
|
|
|
|
throw Exception('$name: Unexpected result: $x, expected $N');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-19 14:59:57 +00:00
|
|
|
class PointerUint8 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Uint8> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerUint8() : super('FfiMemory.PointerUint8');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreUint8(pointer, N);
|
|
|
|
final int x = doLoadUint8(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerInt16 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Int16> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerInt16() : super('FfiMemory.PointerInt16');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreInt16(pointer, N);
|
|
|
|
final int x = doLoadInt16(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerUint16 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Uint16> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerUint16() : super('FfiMemory.PointerUint16');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreUint16(pointer, N);
|
|
|
|
final int x = doLoadUint16(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerInt32 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Int32> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerInt32() : super('FfiMemory.PointerInt32');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreInt32(pointer, N);
|
|
|
|
final int x = doLoadInt32(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerUint32 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Uint32> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerUint32() : super('FfiMemory.PointerUint32');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreUint32(pointer, N);
|
|
|
|
final int x = doLoadUint32(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[vm/ffi] Exercise unaligned reads/writes
This CL validates the hypothesis that the only misaligned reads/writes
which are not supported are double and float, and only on arm32.
Running these on the CI and Golem will validate this hypothesis.
Bug: https://github.com/dart-lang/sdk/issues/45009
Change-Id: I0a77fd1f47a388d1f454c1ded50cd7ecaeadb0f0
Cq-Include-Trybots: luci.dart.try:dart-sdk-linux-try,dart-sdk-mac-try,dart-sdk-win-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-mac-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-mac-release-x64-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-nnbd-linux-debug-x64-try,vm-kernel-precomp-win-release-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-precomp-msan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,analyzer-analysis-server-linux-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/190523
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
2021-03-16 20:17:31 +00:00
|
|
|
class PointerUint32Unaligned extends BenchmarkBase {
|
|
|
|
Pointer<Uint32> pointer = nullptr;
|
|
|
|
Pointer<Uint32> unalignedPointer = nullptr;
|
|
|
|
PointerUint32Unaligned() : super('FfiMemory.PointerUint32Unaligned');
|
|
|
|
|
|
|
|
@override
|
|
|
|
void setup() {
|
|
|
|
pointer = calloc(N + 1);
|
|
|
|
unalignedPointer = Pointer.fromAddress(pointer.address + 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void teardown() => calloc.free(pointer);
|
|
|
|
|
|
|
|
@override
|
|
|
|
void run() {
|
|
|
|
doStoreUint32(unalignedPointer, N);
|
|
|
|
final int x = doLoadUint32(unalignedPointer, N);
|
|
|
|
if (x != N) {
|
|
|
|
throw Exception('$name: Unexpected result: $x');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-19 14:59:57 +00:00
|
|
|
class PointerInt64 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Int64> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerInt64() : super('FfiMemory.PointerInt64');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreInt64(pointer, N);
|
|
|
|
final int x = doLoadInt64(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerUint64 extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Uint64> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerUint64() : super('FfiMemory.PointerUint64');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreUint64(pointer, N);
|
|
|
|
final int x = doLoadUint64(pointer, N);
|
|
|
|
if (x != N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[vm/ffi] ABI-specific integers
This CL adds support for users defining integers which are mapped to
differing sizes and signedness based on the application binary interface
the Dart VM is running on.
Notable implementation design decisions:
- ABIs are open world, so that adding an ABI to the Dart VM does not
break existing definitions. Thus, we only figure out in the VM that
we're missing a mapping. We throw compile-time errors.
- In AOT, these show up in the precompilation step.
- In JIT, these show up as `_CompileTimeError` at runtime. Note that
these can be caught. So in subsequent compilation steps we need to
ensure that we also throw the same compile-time error.
- We match on the call-sites (streaming_flowgraph_builder) rather than
method bodies (kernel_to_il) of AbiSpecific loads and stores so that
we can compile for the int-size of the call site.
API design decisions:
https://github.com/dart-lang/sdk/issues/42563#issuecomment-981774001
Closes: https://github.com/dart-lang/sdk/issues/42563
TEST=tests/ffi_2/abi_*_test.dart
TEST=tests/ffi/function_*_generated_test.dart
TEST=tests/ffi/vmspecific_static_checks_test.dart
Change-Id: I8c8df36fab939b6fb614c5f1ee8e1bf46b6e9521
Cq-Include-Trybots: luci.dart.try:analyzer-linux-release-try,analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,benchmark-linux-try,dart-sdk-linux-try,front-end-linux-release-x64-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-fuchsia-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-linux-debug-x64c-try,vm-kernel-mac-debug-x64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/221501
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2021-12-16 22:07:00 +00:00
|
|
|
class PointerUintPtr extends BenchmarkBase {
|
|
|
|
Pointer<UintPtr> pointer = nullptr;
|
|
|
|
PointerUintPtr() : super('FfiMemory.PointerUintPtr');
|
|
|
|
|
|
|
|
@override
|
|
|
|
void setup() => pointer = calloc(N);
|
|
|
|
@override
|
|
|
|
void teardown() => calloc.free(pointer);
|
|
|
|
|
|
|
|
@override
|
|
|
|
void run() {
|
|
|
|
doStoreUintPtr(pointer, N);
|
|
|
|
final int x = doLoadUintPtr(pointer, N);
|
|
|
|
if (x != N) {
|
|
|
|
throw Exception('$name: Unexpected result: $x');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-19 14:59:57 +00:00
|
|
|
class PointerFloat extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Float> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerFloat() : super('FfiMemory.PointerFloat');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreFloat(pointer, N);
|
|
|
|
final double x = doLoadFloat(pointer, N);
|
|
|
|
if (0.99 * N > x || x > 1.01 * N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerDouble extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Double> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerDouble() : super('FfiMemory.PointerDouble');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreDouble(pointer, N);
|
|
|
|
final double x = doLoadDouble(pointer, N);
|
|
|
|
if (0.99 * N > x || x > 1.01 * N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerPointer extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Pointer<Int8>> pointer = nullptr;
|
|
|
|
Pointer<Int8> data = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerPointer() : super('FfiMemory.PointerPointer');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void setup() {
|
2021-01-14 12:35:58 +00:00
|
|
|
pointer = calloc(N);
|
|
|
|
data = calloc();
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void teardown() {
|
2021-01-14 12:35:58 +00:00
|
|
|
calloc.free(pointer);
|
|
|
|
calloc.free(data);
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStorePointer(pointer, N, data);
|
|
|
|
final int x = doLoadPointer(pointer, N);
|
|
|
|
if (x != 0 || x == data.address) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class PointerInt64Mint extends BenchmarkBase {
|
2020-06-30 14:44:27 +00:00
|
|
|
Pointer<Int64> pointer = nullptr;
|
2020-06-30 14:44:27 +00:00
|
|
|
PointerInt64Mint() : super('FfiMemory.PointerInt64Mint');
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void setup() => pointer = calloc(N);
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2021-01-14 12:35:58 +00:00
|
|
|
void teardown() => calloc.free(pointer);
|
2019-07-19 14:59:57 +00:00
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
@override
|
2019-07-19 14:59:57 +00:00
|
|
|
void run() {
|
|
|
|
doStoreInt64Mint(pointer, N);
|
|
|
|
final int x = doLoadInt64Mint(pointer, N);
|
|
|
|
// Using overflow semantics in aggregation.
|
|
|
|
if (x != -N) {
|
2020-06-30 14:44:27 +00:00
|
|
|
throw Exception('$name: Unexpected result: $x');
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Main driver.
|
|
|
|
//
|
|
|
|
|
2020-06-30 14:44:27 +00:00
|
|
|
void main() {
|
2019-07-19 14:59:57 +00:00
|
|
|
final benchmarks = [
|
|
|
|
() => PointerInt8(),
|
2021-02-23 12:41:49 +00:00
|
|
|
() => PointerInt8TypedDataNew(),
|
|
|
|
() => PointerInt8TypedDataReuse(),
|
2019-07-19 14:59:57 +00:00
|
|
|
() => PointerUint8(),
|
|
|
|
() => PointerInt16(),
|
|
|
|
() => PointerUint16(),
|
|
|
|
() => PointerInt32(),
|
|
|
|
() => PointerUint32(),
|
[vm/ffi] Exercise unaligned reads/writes
This CL validates the hypothesis that the only misaligned reads/writes
which are not supported are double and float, and only on arm32.
Running these on the CI and Golem will validate this hypothesis.
Bug: https://github.com/dart-lang/sdk/issues/45009
Change-Id: I0a77fd1f47a388d1f454c1ded50cd7ecaeadb0f0
Cq-Include-Trybots: luci.dart.try:dart-sdk-linux-try,dart-sdk-mac-try,dart-sdk-win-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-mac-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-mac-release-x64-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-nnbd-linux-debug-x64-try,vm-kernel-precomp-win-release-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-precomp-msan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,analyzer-analysis-server-linux-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/190523
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
2021-03-16 20:17:31 +00:00
|
|
|
() => PointerUint32Unaligned(),
|
2019-07-19 14:59:57 +00:00
|
|
|
() => PointerInt64(),
|
|
|
|
() => PointerInt64Mint(),
|
|
|
|
() => PointerUint64(),
|
[vm/ffi] ABI-specific integers
This CL adds support for users defining integers which are mapped to
differing sizes and signedness based on the application binary interface
the Dart VM is running on.
Notable implementation design decisions:
- ABIs are open world, so that adding an ABI to the Dart VM does not
break existing definitions. Thus, we only figure out in the VM that
we're missing a mapping. We throw compile-time errors.
- In AOT, these show up in the precompilation step.
- In JIT, these show up as `_CompileTimeError` at runtime. Note that
these can be caught. So in subsequent compilation steps we need to
ensure that we also throw the same compile-time error.
- We match on the call-sites (streaming_flowgraph_builder) rather than
method bodies (kernel_to_il) of AbiSpecific loads and stores so that
we can compile for the int-size of the call site.
API design decisions:
https://github.com/dart-lang/sdk/issues/42563#issuecomment-981774001
Closes: https://github.com/dart-lang/sdk/issues/42563
TEST=tests/ffi_2/abi_*_test.dart
TEST=tests/ffi/function_*_generated_test.dart
TEST=tests/ffi/vmspecific_static_checks_test.dart
Change-Id: I8c8df36fab939b6fb614c5f1ee8e1bf46b6e9521
Cq-Include-Trybots: luci.dart.try:analyzer-linux-release-try,analyzer-nnbd-linux-release-try,app-kernel-linux-debug-x64-try,benchmark-linux-try,dart-sdk-linux-try,front-end-linux-release-x64-try,front-end-nnbd-linux-release-x64-try,pkg-linux-debug-try,vm-canary-linux-debug-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-fuchsia-release-x64-try,vm-kernel-checked-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-linux-debug-x64c-try,vm-kernel-mac-debug-x64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-android-release-arm64c-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/221501
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2021-12-16 22:07:00 +00:00
|
|
|
() => PointerUintPtr(),
|
2019-07-19 14:59:57 +00:00
|
|
|
() => PointerFloat(),
|
|
|
|
() => PointerDouble(),
|
|
|
|
() => PointerPointer(),
|
|
|
|
];
|
2020-06-30 14:44:27 +00:00
|
|
|
for (final benchmark in benchmarks) {
|
|
|
|
benchmark().report();
|
|
|
|
}
|
2019-07-19 14:59:57 +00:00
|
|
|
}
|