Commit 25b78853 authored by Clemens Hammacher's avatar Clemens Hammacher Committed by Commit Bot

Reland "[test] Avoid unnecessary std::vector allocations"

This is a reland of e737b4ce.
The issue on windows bots was fixed in https://crrev.com/c/725733.

Original change's description:
> [test] Avoid unnecessary std::vector allocations
> 
> Instead of copying an array of fixed values into an std::vector for
> each usage of the FOR_INPUTS macro, just iterate the constant data
> directly.
> This also makes the <type>_vector() functions return {constexpr Vector}
> instead of {std::vector}.
> 
> R=tebbi@chromium.org
> 
> Change-Id: Ifc3e5509b2fbf5e383c967c2f46acf2b07f7b5b4
> Reviewed-on: https://chromium-review.googlesource.com/725427
> Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
> Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#48688}

Change-Id: I9ad5d22803bbbf35c458965497acc603cfa01b20
Reviewed-on: https://chromium-review.googlesource.com/725979Reviewed-by: 's avatarTobias Tebbi <tebbi@chromium.org>
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48726}
parent 8e6d29e3
...@@ -19,14 +19,14 @@ namespace internal { ...@@ -19,14 +19,14 @@ namespace internal {
template <typename T> template <typename T>
class Vector { class Vector {
public: public:
Vector() : start_(nullptr), length_(0) {} constexpr Vector() : start_(nullptr), length_(0) {}
Vector(T* data, size_t length) : start_(data), length_(length) { Vector(T* data, size_t length) : start_(data), length_(length) {
DCHECK(length == 0 || data != nullptr); DCHECK(length == 0 || data != nullptr);
} }
template <int N> template <int N>
explicit Vector(T (&arr)[N]) : start_(arr), length_(N) {} explicit constexpr Vector(T (&arr)[N]) : start_(arr), length_(N) {}
static Vector<T> New(int length) { static Vector<T> New(int length) {
return Vector<T>(NewArray<T>(length), length); return Vector<T>(NewArray<T>(length), length);
...@@ -47,13 +47,13 @@ class Vector { ...@@ -47,13 +47,13 @@ class Vector {
} }
// Returns the length of the vector as a size_t. // Returns the length of the vector as a size_t.
size_t size() const { return length_; } constexpr size_t size() const { return length_; }
// Returns whether or not the vector is empty. // Returns whether or not the vector is empty.
bool is_empty() const { return length_ == 0; } constexpr bool is_empty() const { return length_ == 0; }
// Returns the pointer to the start of the data in the vector. // Returns the pointer to the start of the data in the vector.
T* start() const { return start_; } constexpr T* start() const { return start_; }
// Access individual vector elements - checks bounds in debug mode. // Access individual vector elements - checks bounds in debug mode.
T& operator[](size_t index) const { T& operator[](size_t index) const {
...@@ -65,11 +65,14 @@ class Vector { ...@@ -65,11 +65,14 @@ class Vector {
T& first() { return start_[0]; } T& first() { return start_[0]; }
T& last() { return start_[length_ - 1]; } T& last() {
DCHECK_LT(0, length_);
return start_[length_ - 1];
}
typedef T* iterator; typedef T* iterator;
inline iterator begin() const { return &start_[0]; } constexpr iterator begin() const { return start_; }
inline iterator end() const { return &start_[length_]; } constexpr iterator end() const { return start_ + length_; }
// Returns a clone of this vector with a new backing store. // Returns a clone of this vector with a new backing store.
Vector<T> Clone() const { Vector<T> Clone() const {
...@@ -130,8 +133,8 @@ class Vector { ...@@ -130,8 +133,8 @@ class Vector {
// Factory method for creating empty vectors. // Factory method for creating empty vectors.
static Vector<T> empty() { return Vector<T>(nullptr, 0); } static Vector<T> empty() { return Vector<T>(nullptr, 0); }
template<typename S> template <typename S>
static Vector<T> cast(Vector<S> input) { static constexpr Vector<T> cast(Vector<S> input) {
return Vector<T>(reinterpret_cast<T*>(input.start()), return Vector<T>(reinterpret_cast<T*>(input.start()),
input.length() * sizeof(S) / sizeof(T)); input.length() * sizeof(S) / sizeof(T));
} }
...@@ -214,7 +217,7 @@ inline Vector<char> MutableCStrVector(char* data, int max) { ...@@ -214,7 +217,7 @@ inline Vector<char> MutableCStrVector(char* data, int max) {
} }
template <typename T, int N> template <typename T, int N>
inline Vector<T> ArrayVector(T (&arr)[N]) { inline constexpr Vector<T> ArrayVector(T (&arr)[N]) {
return Vector<T>(arr); return Vector<T>(arr);
} }
......
...@@ -87,6 +87,7 @@ v8_source_set("cctest_sources") { ...@@ -87,6 +87,7 @@ v8_source_set("cctest_sources") {
"compiler/test-run-unwinding-info.cc", "compiler/test-run-unwinding-info.cc",
"compiler/test-run-variables.cc", "compiler/test-run-variables.cc",
"compiler/test-run-wasm-machops.cc", "compiler/test-run-wasm-machops.cc",
"compiler/value-helper.cc",
"compiler/value-helper.h", "compiler/value-helper.h",
"expression-type-collector-macros.h", "expression-type-collector-macros.h",
"gay-fixed.cc", "gay-fixed.cc",
......
...@@ -75,6 +75,7 @@ ...@@ -75,6 +75,7 @@
'compiler/test-run-stubs.cc', 'compiler/test-run-stubs.cc',
'compiler/test-run-variables.cc', 'compiler/test-run-variables.cc',
'compiler/test-run-wasm-machops.cc', 'compiler/test-run-wasm-machops.cc',
'compiler/value-helper.cc',
'compiler/value-helper.h', 'compiler/value-helper.h',
'cctest.cc', 'cctest.cc',
'cctest.h', 'cctest.h',
......
...@@ -285,7 +285,7 @@ TEST(CompareWrapper) { ...@@ -285,7 +285,7 @@ TEST(CompareWrapper) {
void Int32BinopInputShapeTester::TestAllInputShapes() { void Int32BinopInputShapeTester::TestAllInputShapes() {
std::vector<int32_t> inputs = ValueHelper::int32_vector(); Vector<const int32_t> inputs = ValueHelper::int32_vector();
int num_int_inputs = static_cast<int>(inputs.size()); int num_int_inputs = static_cast<int>(inputs.size());
if (num_int_inputs > 16) num_int_inputs = 16; // limit to 16 inputs if (num_int_inputs > 16) num_int_inputs = 16; // limit to 16 inputs
......
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "test/cctest/compiler/value-helper.h"
namespace v8 {
namespace internal {
namespace compiler {
// Define constexpr arrays of ValueHelper for external references.
constexpr int8_t ValueHelper::int8_array[];
constexpr int16_t ValueHelper::int16_array[];
constexpr uint32_t ValueHelper::uint32_array[];
constexpr uint64_t ValueHelper::uint64_array[];
constexpr float ValueHelper::float32_array[];
constexpr double ValueHelper::float64_array[];
} // namespace compiler
} // namespace internal
} // namespace v8
...@@ -7,9 +7,11 @@ ...@@ -7,9 +7,11 @@
#include <stdint.h> #include <stdint.h>
#include "src/base/template-utils.h"
#include "src/compiler/common-operator.h" #include "src/compiler/common-operator.h"
#include "src/compiler/node.h"
#include "src/compiler/node-matchers.h" #include "src/compiler/node-matchers.h"
#include "src/compiler/node.h"
#include "src/heap/heap-inl.h"
#include "src/isolate.h" #include "src/isolate.h"
#include "src/objects.h" #include "src/objects.h"
#include "test/cctest/cctest.h" #include "test/cctest/cctest.h"
...@@ -60,9 +62,7 @@ class ValueHelper { ...@@ -60,9 +62,7 @@ class ValueHelper {
CheckHeapConstant(isolate_->heap()->false_value(), node); CheckHeapConstant(isolate_->heap()->false_value(), node);
} }
static std::vector<float> float32_vector() { static constexpr float float32_array[] = {
static const float nan = std::numeric_limits<float>::quiet_NaN();
static const float kValues[] = {
-std::numeric_limits<float>::infinity(), -std::numeric_limits<float>::infinity(),
-2.70497e+38f, -2.70497e+38f,
-1.4698e+37f, -1.4698e+37f,
...@@ -176,15 +176,15 @@ class ValueHelper { ...@@ -176,15 +176,15 @@ class ValueHelper {
3.31899e+38f, 3.31899e+38f,
3.40282e+38f, 3.40282e+38f,
std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity(),
nan, std::numeric_limits<float>::quiet_NaN(),
-nan, -std::numeric_limits<float>::quiet_NaN()};
};
return std::vector<float>(&kValues[0], &kValues[arraysize(kValues)]); static constexpr Vector<const float> float32_vector() {
return ArrayVector(float32_array);
} }
static std::vector<double> float64_vector() { static constexpr double float64_array[] = {
static const double nan = std::numeric_limits<double>::quiet_NaN(); -2e66,
static const double values[] = {-2e66,
-2.220446049250313e-16, -2.220446049250313e-16,
-9223373136366403584.0, -9223373136366403584.0,
-9223372036854775808.0, // INT64_MIN -9223372036854775808.0, // INT64_MIN
...@@ -231,18 +231,14 @@ class ValueHelper { ...@@ -231,18 +231,14 @@ class ValueHelper {
2e66, 2e66,
V8_INFINITY, V8_INFINITY,
-V8_INFINITY, -V8_INFINITY,
-nan, std::numeric_limits<double>::quiet_NaN(),
nan}; -std::numeric_limits<double>::quiet_NaN()};
return std::vector<double>(&values[0], &values[arraysize(values)]);
}
static const std::vector<int32_t> int32_vector() { static constexpr Vector<const double> float64_vector() {
std::vector<uint32_t> values = uint32_vector(); return ArrayVector(float64_array);
return std::vector<int32_t>(values.begin(), values.end());
} }
static const std::vector<uint32_t> uint32_vector() { static constexpr uint32_t uint32_array[] = {
static const uint32_t kValues[] = {
0x00000000, 0x00000001, 0xffffffff, 0x1b09788b, 0x04c5fce8, 0xcc0de5bf, 0x00000000, 0x00000001, 0xffffffff, 0x1b09788b, 0x04c5fce8, 0xcc0de5bf,
// This row is useful for testing lea optimizations on intel. // This row is useful for testing lea optimizations on intel.
0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000008, 0x00000009, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000008, 0x00000009,
...@@ -253,16 +249,16 @@ class ValueHelper { ...@@ -253,16 +249,16 @@ class ValueHelper {
0xeeeeeeee, 0xfffffffd, 0xf0000000, 0x007fffff, 0x003fffff, 0x001fffff, 0xeeeeeeee, 0xfffffffd, 0xf0000000, 0x007fffff, 0x003fffff, 0x001fffff,
0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff, 0x0000ffff, 0x00007fff, 0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff, 0x0000ffff, 0x00007fff,
0x00003fff, 0x00001fff, 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff}; 0x00003fff, 0x00001fff, 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff};
return std::vector<uint32_t>(&kValues[0], &kValues[arraysize(kValues)]);
static constexpr Vector<const uint32_t> uint32_vector() {
return ArrayVector(uint32_array);
} }
static const std::vector<int64_t> int64_vector() { static constexpr Vector<const int32_t> int32_vector() {
std::vector<uint64_t> values = uint64_vector(); return Vector<const int32_t>::cast(uint32_vector());
return std::vector<int64_t>(values.begin(), values.end());
} }
static const std::vector<uint64_t> uint64_vector() { static constexpr uint64_t uint64_array[] = {
static const uint64_t kValues[] = {
0x00000000, 0x00000001, 0xffffffff, 0x00000000, 0x00000001, 0xffffffff,
0x1b09788b, 0x04c5fce8, 0xcc0de5bf, 0x1b09788b, 0x04c5fce8, 0xcc0de5bf,
0x00000002, 0x00000003, 0x00000004, 0x00000002, 0x00000003, 0x00000004,
...@@ -289,54 +285,54 @@ class ValueHelper { ...@@ -289,54 +285,54 @@ class ValueHelper {
0x000007ffffffffff, 0x000003ffffffffff, 0x000001ffffffffff, 0x000007ffffffffff, 0x000003ffffffffff, 0x000001ffffffffff,
0x8000008000000000, 0x8000008000000001, 0x8000000000000400, 0x8000008000000000, 0x8000008000000001, 0x8000000000000400,
0x8000000000000401, 0x0000000000000020}; 0x8000000000000401, 0x0000000000000020};
return std::vector<uint64_t>(&kValues[0], &kValues[arraysize(kValues)]);
static constexpr Vector<const uint64_t> uint64_vector() {
return ArrayVector(uint64_array);
} }
static const std::vector<double> nan_vector(size_t limit = 0) { static constexpr Vector<const int64_t> int64_vector() {
static const double nan = std::numeric_limits<double>::quiet_NaN(); return Vector<const int64_t>::cast(uint64_vector());
static const double values[] = {-nan, -V8_INFINITY * -0.0,
-V8_INFINITY * 0.0, V8_INFINITY * -0.0,
V8_INFINITY * 0.0, nan};
return std::vector<double>(&values[0], &values[arraysize(values)]);
} }
static const std::vector<int16_t> int16_vector() { static constexpr int16_t int16_array[] = {
static const int16_t kValues[] = {
0, 1, 2, INT16_MAX - 1, INT16_MAX, INT16_MIN, INT16_MIN + 1, -2, -1}; 0, 1, 2, INT16_MAX - 1, INT16_MAX, INT16_MIN, INT16_MIN + 1, -2, -1};
return std::vector<int16_t>(&kValues[0], &kValues[arraysize(kValues)]);
static constexpr Vector<const int16_t> int16_vector() {
return ArrayVector(int16_array);
} }
static const std::vector<uint16_t> uint16_vector() { static constexpr Vector<const uint16_t> uint16_vector() {
std::vector<int16_t> values = int16_vector(); return Vector<const uint16_t>::cast(int16_vector());
return std::vector<uint16_t>(values.begin(), values.end());
} }
static const std::vector<int8_t> int8_vector() { static constexpr int8_t int8_array[] = {
static const int8_t kValues[] = {
0, 1, 2, INT8_MAX - 1, INT8_MAX, INT8_MIN, INT8_MIN + 1, -2, -1}; 0, 1, 2, INT8_MAX - 1, INT8_MAX, INT8_MIN, INT8_MIN + 1, -2, -1};
return std::vector<int8_t>(&kValues[0], &kValues[arraysize(kValues)]);
static constexpr Vector<const int8_t> int8_vector() {
return ArrayVector(int8_array);
} }
static const std::vector<uint8_t> uint8_vector() { static constexpr Vector<const uint8_t> uint8_vector() {
std::vector<int8_t> values = int8_vector(); return Vector<const uint8_t>::cast(ArrayVector(int8_array));
return std::vector<uint8_t>(values.begin(), values.end());
} }
static const std::vector<uint32_t> ror_vector() { static constexpr uint32_t ror_array[31] = {
static const uint32_t kValues[31] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
return std::vector<uint32_t>(&kValues[0], &kValues[arraysize(kValues)]);
static constexpr Vector<const uint32_t> ror_vector() {
return ArrayVector(ror_array);
} }
}; };
// Helper macros that can be used in FOR_INT32_INPUTS(i) { ... *i ... } // Helper macros that can be used in FOR_INT32_INPUTS(i) { ... *i ... }
// Watch out, these macros aren't hygenic; they pollute your scope. Thanks STL. // Watch out, these macros aren't hygenic; they pollute your scope. Thanks STL.
#define FOR_INPUTS(ctype, itype, var) \ #define FOR_INPUTS(ctype, itype, var) \
std::vector<ctype> var##_vec = \ Vector<const ctype> var##_vec = \
::v8::internal::compiler::ValueHelper::itype##_vector(); \ ::v8::internal::compiler::ValueHelper::itype##_vector(); \
for (std::vector<ctype>::iterator var = var##_vec.begin(); \ for (Vector<const ctype>::iterator var = var##_vec.begin(), \
var != var##_vec.end(); ++var) var##_end = var##_vec.end(); \
var != var##_end; ++var)
#define FOR_INT32_INPUTS(var) FOR_INPUTS(int32_t, int32, var) #define FOR_INT32_INPUTS(var) FOR_INPUTS(int32_t, int32, var)
#define FOR_UINT32_INPUTS(var) FOR_INPUTS(uint32_t, uint32, var) #define FOR_UINT32_INPUTS(var) FOR_INPUTS(uint32_t, uint32, var)
......
...@@ -100,8 +100,7 @@ TEST(TestCWasmEntryArgPassing_int32) { ...@@ -100,8 +100,7 @@ TEST(TestCWasmEntryArgPassing_int32) {
WASM_I32_ADD(WASM_I32_MUL(WASM_I32V_1(2), WASM_GET_LOCAL(0)), WASM_ONE)}, WASM_I32_ADD(WASM_I32_MUL(WASM_I32V_1(2), WASM_GET_LOCAL(0)), WASM_ONE)},
[](int32_t a) { return 2 * a + 1; }); [](int32_t a) { return 2 * a + 1; });
std::vector<int32_t> test_values = compiler::ValueHelper::int32_vector(); FOR_INT32_INPUTS(v) { tester.CheckCall(*v); }
for (int32_t v : test_values) tester.CheckCall(v);
} }
// Pass int64_t, return double. // Pass int64_t, return double.
...@@ -111,10 +110,7 @@ TEST(TestCWasmEntryArgPassing_double_int64) { ...@@ -111,10 +110,7 @@ TEST(TestCWasmEntryArgPassing_double_int64) {
WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))}, WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))},
[](int64_t a) { return static_cast<double>(a); }); [](int64_t a) { return static_cast<double>(a); });
std::vector<int64_t> test_values_i64 = compiler::ValueHelper::int64_vector(); FOR_INT64_INPUTS(v) { tester.CheckCall(*v); }
for (int64_t v : test_values_i64) {
tester.CheckCall(v);
}
} }
// Pass double, return int64_t. // Pass double, return int64_t.
...@@ -124,9 +120,7 @@ TEST(TestCWasmEntryArgPassing_int64_double) { ...@@ -124,9 +120,7 @@ TEST(TestCWasmEntryArgPassing_int64_double) {
WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))}, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))},
[](double d) { return static_cast<int64_t>(d); }); [](double d) { return static_cast<int64_t>(d); });
for (int64_t i : compiler::ValueHelper::int64_vector()) { FOR_INT64_INPUTS(i) { tester.CheckCall(*i); }
tester.CheckCall(i);
}
} }
// Pass float, return double. // Pass float, return double.
...@@ -138,8 +132,7 @@ TEST(TestCWasmEntryArgPassing_float_double) { ...@@ -138,8 +132,7 @@ TEST(TestCWasmEntryArgPassing_float_double) {
WASM_F64(1))}, WASM_F64(1))},
[](float f) { return 2. * static_cast<double>(f) + 1.; }); [](float f) { return 2. * static_cast<double>(f) + 1.; });
std::vector<float> test_values = compiler::ValueHelper::float32_vector(); FOR_FLOAT32_INPUTS(f) { tester.CheckCall(*f); }
for (float f : test_values) tester.CheckCall(f);
} }
// Pass two doubles, return double. // Pass two doubles, return double.
...@@ -149,11 +142,8 @@ TEST(TestCWasmEntryArgPassing_double_double) { ...@@ -149,11 +142,8 @@ TEST(TestCWasmEntryArgPassing_double_double) {
WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))}, WASM_F64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))},
[](double a, double b) { return a + b; }); [](double a, double b) { return a + b; });
std::vector<double> test_values = compiler::ValueHelper::float64_vector(); FOR_FLOAT64_INPUTS(d1) {
for (double d1 : test_values) { FOR_FLOAT64_INPUTS(d2) { tester.CheckCall(*d1, *d2); }
for (double d2 : test_values) {
tester.CheckCall(d1, d2);
}
} }
} }
...@@ -176,10 +166,11 @@ TEST(TestCWasmEntryArgPassing_AllTypes) { ...@@ -176,10 +166,11 @@ TEST(TestCWasmEntryArgPassing_AllTypes) {
return 0. + a + b + c + d; return 0. + a + b + c + d;
}); });
std::vector<int32_t> test_values_i32 = compiler::ValueHelper::int32_vector(); Vector<const int32_t> test_values_i32 = compiler::ValueHelper::int32_vector();
std::vector<int64_t> test_values_i64 = compiler::ValueHelper::int64_vector(); Vector<const int64_t> test_values_i64 = compiler::ValueHelper::int64_vector();
std::vector<float> test_values_f32 = compiler::ValueHelper::float32_vector(); Vector<const float> test_values_f32 = compiler::ValueHelper::float32_vector();
std::vector<double> test_values_f64 = compiler::ValueHelper::float64_vector(); Vector<const double> test_values_f64 =
compiler::ValueHelper::float64_vector();
size_t max_len = size_t max_len =
std::max(std::max(test_values_i32.size(), test_values_i64.size()), std::max(std::max(test_values_i32.size(), test_values_i64.size()),
std::max(test_values_f32.size(), test_values_f64.size())); std::max(test_values_f32.size(), test_values_f64.size()));
......
...@@ -101,8 +101,7 @@ TEST(TestArgumentPassing_int32) { ...@@ -101,8 +101,7 @@ TEST(TestArgumentPassing_int32) {
WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())}, WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())},
[](int32_t a) { return 2 * a + 1; }); [](int32_t a) { return 2 * a + 1; });
std::vector<int32_t> test_values = compiler::ValueHelper::int32_vector(); FOR_INT32_INPUTS(v) { helper.CheckCall(*v); }
for (int32_t v : test_values) helper.CheckCall(v);
} }
// Pass int64_t, return double. // Pass int64_t, return double.
...@@ -125,17 +124,13 @@ TEST(TestArgumentPassing_double_int64) { ...@@ -125,17 +124,13 @@ TEST(TestArgumentPassing_double_int64) {
return static_cast<double>(a64 | b64); return static_cast<double>(a64 | b64);
}); });
std::vector<int32_t> test_values_i32 = compiler::ValueHelper::int32_vector(); FOR_INT32_INPUTS(v1) {
for (int32_t v1 : test_values_i32) { FOR_INT32_INPUTS(v2) { helper.CheckCall(*v1, *v2); }
for (int32_t v2 : test_values_i32) {
helper.CheckCall(v1, v2);
}
} }
std::vector<int64_t> test_values_i64 = compiler::ValueHelper::int64_vector(); FOR_INT64_INPUTS(v) {
for (int64_t v : test_values_i64) { int32_t v1 = static_cast<int32_t>(*v);
int32_t v1 = static_cast<int32_t>(v); int32_t v2 = static_cast<int32_t>(*v >> 32);
int32_t v2 = static_cast<int32_t>(v >> 32);
helper.CheckCall(v1, v2); helper.CheckCall(v1, v2);
helper.CheckCall(v2, v1); helper.CheckCall(v2, v1);
} }
...@@ -176,8 +171,7 @@ TEST(TestArgumentPassing_float_double) { ...@@ -176,8 +171,7 @@ TEST(TestArgumentPassing_float_double) {
WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())}, WASM_GET_LOCAL(0), WASM_CALL_FUNCTION0(f2.function_index())},
[](float f) { return 2. * static_cast<double>(f) + 1.; }); [](float f) { return 2. * static_cast<double>(f) + 1.; });
std::vector<float> test_values = compiler::ValueHelper::float32_vector(); FOR_FLOAT32_INPUTS(f) { helper.CheckCall(*f); }
for (float f : test_values) helper.CheckCall(f);
} }
// Pass two doubles, return double. // Pass two doubles, return double.
...@@ -193,11 +187,8 @@ TEST(TestArgumentPassing_double_double) { ...@@ -193,11 +187,8 @@ TEST(TestArgumentPassing_double_double) {
WASM_CALL_FUNCTION0(f2.function_index())}, WASM_CALL_FUNCTION0(f2.function_index())},
[](double a, double b) { return a + b; }); [](double a, double b) { return a + b; });
std::vector<double> test_values = compiler::ValueHelper::float64_vector(); FOR_FLOAT64_INPUTS(d1) {
for (double d1 : test_values) { FOR_FLOAT64_INPUTS(d2) { helper.CheckCall(*d1, *d2); }
for (double d2 : test_values) {
helper.CheckCall(d1, d2);
}
} }
} }
...@@ -242,10 +233,11 @@ TEST(TestArgumentPassing_AllTypes) { ...@@ -242,10 +233,11 @@ TEST(TestArgumentPassing_AllTypes) {
helper.CheckCall(a, b1, b0, c, d); helper.CheckCall(a, b1, b0, c, d);
}; };
std::vector<int32_t> test_values_i32 = compiler::ValueHelper::int32_vector(); Vector<const int32_t> test_values_i32 = compiler::ValueHelper::int32_vector();
std::vector<int64_t> test_values_i64 = compiler::ValueHelper::int64_vector(); Vector<const int64_t> test_values_i64 = compiler::ValueHelper::int64_vector();
std::vector<float> test_values_f32 = compiler::ValueHelper::float32_vector(); Vector<const float> test_values_f32 = compiler::ValueHelper::float32_vector();
std::vector<double> test_values_f64 = compiler::ValueHelper::float64_vector(); Vector<const double> test_values_f64 =
compiler::ValueHelper::float64_vector();
size_t max_len = size_t max_len =
std::max(std::max(test_values_i32.size(), test_values_i64.size()), std::max(std::max(test_values_i32.size(), test_values_i64.size()),
std::max(test_values_f32.size(), test_values_f64.size())); std::max(test_values_f32.size(), test_values_f64.size()));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment