Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Unified Diff: test/unittests/wasm/asm-types-unittest.cc

Issue 2078053002: V8. ASM-2-WASM. Another asm-types.h revision. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: git pull Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/wasm/asm-types.cc ('K') | « src/wasm/asm-types.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/unittests/wasm/asm-types-unittest.cc
diff --git a/test/unittests/wasm/asm-types-unittest.cc b/test/unittests/wasm/asm-types-unittest.cc
index 49f4320a8e60f2d4e83cd2ac491c362f46bad432..9b29362537225f1978f96974816700f5183b1c47 100644
--- a/test/unittests/wasm/asm-types-unittest.cc
+++ b/test/unittests/wasm/asm-types-unittest.cc
@@ -225,8 +225,14 @@ TEST_F(AsmTypeTest, Names) {
StrEq("(int, int...) -> signed"));
EXPECT_THAT(Type::MinMaxType(zone(), Type::Float(), Type::Floatish())->Name(),
StrEq("(floatish, floatish...) -> float"));
- EXPECT_THAT(Type::MinMaxType(zone(), Type::Double(), Type::Double())->Name(),
- StrEq("(double, double...) -> double"));
+ EXPECT_THAT(Type::MinMaxType(zone(), Type::Double(), Type::DoubleQ())->Name(),
+ StrEq("(double?, double?...) -> double"));
+
+ EXPECT_THAT(Type::FFIType(zone())->Name(), StrEq("Function"));
+
+ auto* ft =
+ Type::FunctionTableType(zone(), 15, Function(Type::Double)(Type::Int));
+ EXPECT_THAT(ft->Name(), StrEq("(int) -> double[15]"));
}
TEST_F(AsmTypeTest, IsExactly) {
@@ -240,6 +246,8 @@ TEST_F(AsmTypeTest, IsExactly) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
@@ -263,6 +271,8 @@ TEST_F(AsmTypeTest, IsA) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
@@ -284,13 +294,21 @@ TEST_F(AsmTypeTest, ValidateCall) {
auto* iiii2s =
Function(Type::Signed)(Type::Int, Type::Int, Type::Int, Type::Int);
- EXPECT_EQ(Type::Signed(),
- min_max_int->AsCallableType()->ValidateCall(min_max_int));
- EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(ii2s));
- EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(iii2s));
- EXPECT_EQ(Type::Signed(),
- min_max_int->AsCallableType()->ValidateCall(iiii2s));
- EXPECT_EQ(Type::None(), min_max_int->AsCallableType()->ValidateCall(i2s));
+ EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(
+ min_max_int->AsFunctionType()->ReturnType(),
+ min_max_int->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(
+ ii2s->AsFunctionType()->ReturnType(),
+ ii2s->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(
+ iii2s->AsFunctionType()->ReturnType(),
+ iii2s->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(
+ iiii2s->AsFunctionType()->ReturnType(),
+ iiii2s->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::None(), min_max_int->AsCallableType()->ValidateCall(
+ i2s->AsFunctionType()->ReturnType(),
+ i2s->AsFunctionType()->Arguments()));
auto* min_max_double =
Type::MinMaxType(zone(), Type::Double(), Type::Double());
@@ -300,49 +318,88 @@ TEST_F(AsmTypeTest, ValidateCall) {
Function(Type::Double)(Type::Double, Type::Double, Type::Double);
auto* dddd2d = Function(Type::Double)(Type::Double, Type::Double,
Type::Double, Type::Double);
- EXPECT_EQ(Type::Double(),
- min_max_double->AsCallableType()->ValidateCall(min_max_double));
- EXPECT_EQ(Type::Double(),
- min_max_double->AsCallableType()->ValidateCall(dd2d));
- EXPECT_EQ(Type::Double(),
- min_max_double->AsCallableType()->ValidateCall(ddd2d));
- EXPECT_EQ(Type::Double(),
- min_max_double->AsCallableType()->ValidateCall(dddd2d));
- EXPECT_EQ(Type::None(), min_max_double->AsCallableType()->ValidateCall(d2d));
+ EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall(
+ min_max_double->AsFunctionType()->ReturnType(),
+ min_max_double->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall(
+ dd2d->AsFunctionType()->ReturnType(),
+ dd2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall(
+ ddd2d->AsFunctionType()->ReturnType(),
+ ddd2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall(
+ dddd2d->AsFunctionType()->ReturnType(),
+ dddd2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::None(), min_max_double->AsCallableType()->ValidateCall(
+ d2d->AsFunctionType()->ReturnType(),
+ d2d->AsFunctionType()->Arguments()));
auto* min_max = Overload(min_max_int, min_max_double);
- EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(min_max));
- EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(i2s));
- EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(d2d));
- EXPECT_EQ(Type::Signed(),
- min_max->AsCallableType()->ValidateCall(min_max_int));
- EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(ii2s));
- EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(iii2s));
- EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(iiii2s));
- EXPECT_EQ(Type::Double(),
- min_max->AsCallableType()->ValidateCall(min_max_double));
- EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(dd2d));
- EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(ddd2d));
- EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(dddd2d));
+ EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(
+ i2s->AsFunctionType()->ReturnType(),
+ i2s->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(
+ d2d->AsFunctionType()->ReturnType(),
+ d2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(
+ min_max_int->AsFunctionType()->ReturnType(),
+ min_max_int->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(
+ ii2s->AsFunctionType()->ReturnType(),
+ ii2s->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(
+ iii2s->AsFunctionType()->ReturnType(),
+ iii2s->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(
+ iiii2s->AsFunctionType()->ReturnType(),
+ iiii2s->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(
+ min_max_double->AsFunctionType()->ReturnType(),
+ min_max_double->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(
+ dd2d->AsFunctionType()->ReturnType(),
+ dd2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(
+ ddd2d->AsFunctionType()->ReturnType(),
+ ddd2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(
+ dddd2d->AsFunctionType()->ReturnType(),
+ dddd2d->AsFunctionType()->Arguments()));
auto* fround = Type::FroundType(zone());
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::Floatish)));
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::FloatQ)));
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::Float)));
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::DoubleQ)));
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::Double)));
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::Signed)));
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::Unsigned)));
- EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
- Function(Type::Float)(Type::FixNum)));
+ ZoneVector<AsmType*> arg(zone());
+ arg.push_back(Type::Floatish());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
+ arg.clear();
+ arg.push_back(Type::FloatQ());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
+ arg.clear();
+ arg.push_back(Type::Float());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
+ arg.clear();
+ arg.push_back(Type::DoubleQ());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
+ arg.clear();
+ arg.push_back(Type::Double());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
+ arg.clear();
+ arg.push_back(Type::Signed());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
+ arg.clear();
+ arg.push_back(Type::Unsigned());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
+ arg.clear();
+ arg.push_back(Type::FixNum());
+ EXPECT_EQ(Type::Float(),
+ fround->AsCallableType()->ValidateCall(Type::Float(), arg));
auto* idf2v = Function(Type::Void)(Type::Int, Type::Double, Type::Float);
auto* i2d = Function(Type::Double)(Type::Int);
@@ -351,12 +408,88 @@ TEST_F(AsmTypeTest, ValidateCall) {
auto* idif2i =
Function(Type::Int)(Type::Int, Type::Double, Type::Int, Type::Float);
auto* overload = Overload(idf2v, i2f, /*i2d missing, */ fi2d, idif2i);
- EXPECT_EQ(Type::Void(), overload->AsCallableType()->ValidateCall(idf2v));
- EXPECT_EQ(Type::Float(), overload->AsCallableType()->ValidateCall(i2f));
- EXPECT_EQ(Type::Double(), overload->AsCallableType()->ValidateCall(fi2d));
- EXPECT_EQ(Type::Int(), overload->AsCallableType()->ValidateCall(idif2i));
- EXPECT_EQ(Type::None(), overload->AsCallableType()->ValidateCall(i2d));
- EXPECT_EQ(Type::None(), i2f->AsCallableType()->ValidateCall(i2d));
+ EXPECT_EQ(Type::Void(), overload->AsCallableType()->ValidateCall(
+ idf2v->AsFunctionType()->ReturnType(),
+ idf2v->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Float(), overload->AsCallableType()->ValidateCall(
+ i2f->AsFunctionType()->ReturnType(),
+ i2f->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Double(), overload->AsCallableType()->ValidateCall(
+ fi2d->AsFunctionType()->ReturnType(),
+ fi2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::Int(), overload->AsCallableType()->ValidateCall(
+ idif2i->AsFunctionType()->ReturnType(),
+ idif2i->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::None(), overload->AsCallableType()->ValidateCall(
+ i2d->AsFunctionType()->ReturnType(),
+ i2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::None(), i2f->AsCallableType()->ValidateCall(
+ i2d->AsFunctionType()->ReturnType(),
+ i2d->AsFunctionType()->Arguments()));
+
+ auto* ffi = Type::FFIType(zone());
+ AsmType* (*kReturnTypes[])() = {
+ Type::Void, Type::Double, Type::Signed,
+ };
+ AsmType* (*kParameterTypes[])() = {
+ Type::Double, Type::Signed, Type::FixNum,
+ };
+ for (size_t ii = 0; ii < arraysize(kReturnTypes); ++ii) {
+ for (size_t jj = 0; jj < arraysize(kParameterTypes); ++jj) {
+ auto* f = Function(kReturnTypes[ii])(kParameterTypes[jj]);
+ EXPECT_EQ(kReturnTypes[ii](), ffi->AsCallableType()->ValidateCall(
+ f->AsFunctionType()->ReturnType(),
+ f->AsFunctionType()->Arguments()))
+ << kReturnTypes[ii]()->Name();
+
+ // Call with non-parameter type type should fail.
+ f = Function(kReturnTypes[ii])(kParameterTypes[jj], Type::Int);
+ EXPECT_EQ(Type::None(), ffi->AsCallableType()->ValidateCall(
+ f->AsFunctionType()->ReturnType(),
+ f->AsFunctionType()->Arguments()))
+ << kReturnTypes[ii]()->Name();
+ }
+ }
+
+ auto* ft0 = Type::FunctionTableType(zone(), 10, fi2d);
+ EXPECT_EQ(Type::Double(), ft0->AsCallableType()->ValidateCall(
+ fi2d->AsFunctionType()->ReturnType(),
+ fi2d->AsFunctionType()->Arguments()));
+ EXPECT_EQ(Type::None(), ft0->AsCallableType()->ValidateCall(
+ i2d->AsFunctionType()->ReturnType(),
+ i2d->AsFunctionType()->Arguments()));
+}
+
+TEST_F(AsmTypeTest, ToReturnType) {
+ std::unordered_map<AsmType*, AsmType*> kToReturnType = {
+ {Type::Signed(), Type::Signed()}, {Type::FixNum(), Type::Signed()},
+ {Type::Double(), Type::Double()}, {Type::Float(), Type::Float()},
+ {Type::Void(), Type::Void()},
+ };
+
+ Type* test_types[] = {
+#define CREATE(CamelName, string_name, number, parent_types) Type::CamelName(),
+ FOR_EACH_ASM_VALUE_TYPE_LIST(CREATE)
+#undef CREATE
+ Function(Type::Int)(Type::Double),
+ Function(Type::Int)(Type::DoubleQ),
+ Overload(Function(Type::Int)(Type::Double)),
+ Function(Type::Int)(Type::Int, Type::Int),
+ Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
+ Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
+ };
+
+ for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
+ auto* return_type = Type::None();
+ auto to_return_type_iter = kToReturnType.find(test_types[ii]);
+ if (to_return_type_iter != kToReturnType.end()) {
+ return_type = to_return_type_iter->second;
+ }
+ EXPECT_EQ(return_type, test_types[ii]->ToReturnType())
+ << return_type->Name() << " != " << test_types[ii]->ToReturnType();
+ }
}
TEST_F(AsmTypeTest, IsReturnType) {
@@ -370,6 +503,8 @@ TEST_F(AsmTypeTest, IsReturnType) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
std::unordered_set<Type*> return_types{
@@ -384,6 +519,39 @@ TEST_F(AsmTypeTest, IsReturnType) {
}
}
+TEST_F(AsmTypeTest, ToParameterType) {
+ std::unordered_map<AsmType*, AsmType*> kToParameterType = {
+ {Type::Int(), Type::Int()}, {Type::Signed(), Type::Int()},
+ {Type::Unsigned(), Type::Int()}, {Type::FixNum(), Type::Int()},
+ {Type::Double(), Type::Double()}, {Type::Float(), Type::Float()},
+ };
+
+ Type* test_types[] = {
+#define CREATE(CamelName, string_name, number, parent_types) Type::CamelName(),
+ FOR_EACH_ASM_VALUE_TYPE_LIST(CREATE)
+#undef CREATE
+ Function(Type::Int)(Type::Double),
+ Function(Type::Int)(Type::DoubleQ),
+ Overload(Function(Type::Int)(Type::Double)),
+ Function(Type::Int)(Type::Int, Type::Int),
+ Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
+ Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
+ };
+
+ for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
+ auto* parameter_type = Type::None();
+ auto to_parameter_type_iter = kToParameterType.find(test_types[ii]);
+ if (to_parameter_type_iter != kToParameterType.end()) {
+ parameter_type = to_parameter_type_iter->second;
+ }
+ EXPECT_EQ(parameter_type, test_types[ii]->ToParameterType())
+ << parameter_type->Name()
+ << " != " << test_types[ii]->ToParameterType();
+ }
+}
+
TEST_F(AsmTypeTest, IsParameterType) {
Type* test_types[] = {
#define CREATE(CamelName, string_name, number, parent_types) Type::CamelName(),
@@ -395,6 +563,8 @@ TEST_F(AsmTypeTest, IsParameterType) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
std::unordered_set<Type*> parameter_types{
@@ -421,6 +591,8 @@ TEST_F(AsmTypeTest, IsComparableType) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
std::unordered_set<Type*> comparable_types{
@@ -447,6 +619,8 @@ TEST_F(AsmTypeTest, ElementSizeInBytes) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
auto ElementSizeInBytesForType = [](Type* type) -> int32_t {
@@ -483,6 +657,8 @@ TEST_F(AsmTypeTest, LoadType) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
auto LoadTypeForType = [](Type* type) -> Type* {
@@ -519,6 +695,8 @@ TEST_F(AsmTypeTest, StoreType) {
Function(Type::Int)(Type::Int, Type::Int),
Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
Function(Type::Int)(Type::Float), Type::FroundType(zone()),
+ Type::FFIType(zone()),
+ Type::FunctionTableType(zone(), 10, Function(Type::Void)()),
};
auto StoreTypeForType = [](Type* type) -> Type* {
« src/wasm/asm-types.cc ('K') | « src/wasm/asm-types.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698