blob: 6d4852d836b236b56410b5e31beb733b91ae87f4 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Benchmarks for a reference encoder / decoder specialized to PaddedStructTree.
#include <cstdint>
#include "builder.h"
#include "decode_benchmark_util.h"
#include "encode_benchmark_util.h"
#include "util.h"
namespace {
bool EncodePaddedStructTree(void* value, const char** error,
fit::function<void(const uint8_t*, size_t)> callback) {
uint8_t buf[sizeof(llcpp::benchmarkfidl::PaddedStructTree8)];
uint64_t mask = 0xffffffff000000ff;
uint64_t* in = reinterpret_cast<uint64_t*>(value);
uint64_t* in_end = reinterpret_cast<uint64_t*>(
reinterpret_cast<llcpp::benchmarkfidl::PaddedStructTree8*>(value) + 1);
uint64_t* out = reinterpret_cast<uint64_t*>(buf);
for (; in < in_end; ++in, ++out) {
// Note: padding bytes are blindly zeroed rather than checking that existing padding data is
// zero because LLCPP does not require that padding bytes in values are zero.
*out = *in & mask;
}
callback(buf, sizeof(buf));
return true;
}
bool DecodePaddedStructTree(uint8_t* bytes, size_t bytes_size, zx_handle_t* handles,
size_t handles_size, const char** error) {
if (handles_size != 0) {
*error = "no handles expected";
return false;
}
uint64_t mask = 0x00000000ffffff00;
uint64_t* cur = reinterpret_cast<uint64_t*>(bytes);
uint64_t* end =
reinterpret_cast<uint64_t*>(bytes + sizeof(llcpp::benchmarkfidl::PaddedStructTree8));
for (; cur < end; ++cur) {
if ((*cur & mask) != 0) {
*error = "non-zero padding byte";
return false;
}
}
return true;
}
bool BenchmarkEncodePaddedStructTree(perftest::RepeatState* state) {
return encode_benchmark_util::EncodeBenchmark(
state, benchmark_suite::Build_PaddedStructTree_Depth8, EncodePaddedStructTree);
}
bool BenchmarkDecodePaddedStructTree(perftest::RepeatState* state) {
return decode_benchmark_util::DecodeBenchmark(
state, benchmark_suite::Build_PaddedStructTree_Depth8, DecodePaddedStructTree);
}
void RegisterTests() {
perftest::RegisterTest("Reference/Encode/PaddedStructTree/Depth8",
BenchmarkEncodePaddedStructTree);
perftest::RegisterTest("Reference/Decode/PaddedStructTree/Depth8",
BenchmarkDecodePaddedStructTree);
}
PERFTEST_CTOR(RegisterTests)
} // namespace