6627d81c68
This CL more or less reverts commit https://codereview.chromium.org/2107733002/ The use of the MathPow code stub that was introduced by that commit caused problems on arm64, and the MathPow code stub was also an obstacle in the implementation of parallel code generation. In addition this CL turns on the mjsunit/wasm/embenchen tests for arm64 which were turned off because of problems with MathPow on arm64. R=titzer@chromium.org, bradnelson@chromium.org Review-Url: https://codereview.chromium.org/2166793002 Cr-Commit-Position: refs/heads/master@{#37911}
252 lines
8.9 KiB
C++
252 lines
8.9 KiB
C++
// Copyright 2014 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 "src/wasm/wasm-external-refs.h"
|
|
#include "test/cctest/cctest.h"
|
|
#include "test/cctest/compiler/codegen-tester.h"
|
|
#include "test/cctest/compiler/value-helper.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
namespace compiler {
|
|
|
|
template <typename P>
|
|
void TestExternalReference(BufferedRawMachineAssemblerTester<int32_t>* m,
|
|
ExternalReference ref, void (*comparison)(P*),
|
|
P param) {
|
|
P comparison_param = param;
|
|
|
|
Node* function = m->ExternalConstant(ref);
|
|
m->CallCFunction1(MachineType::Pointer(), MachineType::Pointer(), function,
|
|
m->PointerConstant(¶m));
|
|
m->Return(m->Int32Constant(4356));
|
|
|
|
m->Call();
|
|
comparison(&comparison_param);
|
|
|
|
CHECK_EQ(comparison_param, param);
|
|
}
|
|
|
|
template <typename P1, typename P2>
|
|
void TestExternalReference(BufferedRawMachineAssemblerTester<int32_t>* m,
|
|
ExternalReference ref, void (*comparison)(P1*, P2*),
|
|
P1 param1, P2 param2) {
|
|
P1 comparison_param1 = param1;
|
|
P2 comparison_param2 = param2;
|
|
|
|
Node* function = m->ExternalConstant(ref);
|
|
m->CallCFunction2(MachineType::Pointer(), MachineType::Pointer(),
|
|
MachineType::Pointer(), function,
|
|
m->PointerConstant(¶m1), m->PointerConstant(¶m2));
|
|
m->Return(m->Int32Constant(4356));
|
|
|
|
m->Call();
|
|
comparison(&comparison_param1, &comparison_param2);
|
|
|
|
CHECK_EQ(comparison_param1, param1);
|
|
CHECK_EQ(comparison_param2, param2);
|
|
}
|
|
|
|
template <typename R, typename P>
|
|
void TestExternalReference(BufferedRawMachineAssemblerTester<R>* m,
|
|
ExternalReference ref, R (*comparison)(P*),
|
|
P param) {
|
|
P comparison_param = param;
|
|
|
|
Node* function = m->ExternalConstant(ref);
|
|
m->Return(m->CallCFunction1(MachineType::Pointer(), MachineType::Pointer(),
|
|
function, m->PointerConstant(¶m)));
|
|
|
|
CHECK_EQ(comparison(&comparison_param), m->Call());
|
|
|
|
CHECK_EQ(comparison_param, param);
|
|
}
|
|
|
|
template <typename R, typename P1, typename P2>
|
|
void TestExternalReference(BufferedRawMachineAssemblerTester<R>* m,
|
|
ExternalReference ref, R (*comparison)(P1*, P2*),
|
|
P1 param1, P2 param2) {
|
|
P1 comparison_param1 = param1;
|
|
P2 comparison_param2 = param2;
|
|
|
|
Node* function = m->ExternalConstant(ref);
|
|
m->Return(m->CallCFunction2(
|
|
MachineType::Pointer(), MachineType::Pointer(), MachineType::Pointer(),
|
|
function, m->PointerConstant(¶m1), m->PointerConstant(¶m2)));
|
|
|
|
CHECK_EQ(comparison(&comparison_param1, &comparison_param2), m->Call());
|
|
|
|
CHECK_EQ(comparison_param1, param1);
|
|
CHECK_EQ(comparison_param2, param2);
|
|
}
|
|
|
|
TEST(RunCallF32Trunc) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f32_trunc(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f32_trunc_wrapper, 1.25f);
|
|
}
|
|
|
|
TEST(RunCallF32Floor) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f32_floor(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f32_floor_wrapper, 1.25f);
|
|
}
|
|
|
|
TEST(RunCallF32Ceil) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f32_ceil(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f32_ceil_wrapper, 1.25f);
|
|
}
|
|
|
|
TEST(RunCallF32RoundTiesEven) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f32_nearest_int(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f32_nearest_int_wrapper, 1.25f);
|
|
}
|
|
|
|
TEST(RunCallF64Trunc) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f64_trunc(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f64_trunc_wrapper, 1.25);
|
|
}
|
|
|
|
TEST(RunCallF64Floor) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f64_floor(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f64_floor_wrapper, 1.25);
|
|
}
|
|
|
|
TEST(RunCallF64Ceil) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f64_ceil(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f64_ceil_wrapper, 1.25);
|
|
}
|
|
|
|
TEST(RunCallF64RoundTiesEven) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_f64_nearest_int(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::f64_nearest_int_wrapper, 1.25);
|
|
}
|
|
|
|
TEST(RunCallInt64ToFloat32) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_int64_to_float32(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::int64_to_float32_wrapper, int64_t(-2124),
|
|
1.25f);
|
|
}
|
|
|
|
TEST(RunCallUint64ToFloat32) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref =
|
|
ExternalReference::wasm_uint64_to_float32(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::uint64_to_float32_wrapper,
|
|
uint64_t(2124), 1.25f);
|
|
}
|
|
|
|
TEST(RunCallInt64ToFloat64) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_int64_to_float64(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::int64_to_float64_wrapper, int64_t(2124),
|
|
1.25);
|
|
}
|
|
|
|
TEST(RunCallUint64ToFloat64) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref =
|
|
ExternalReference::wasm_uint64_to_float64(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::uint64_to_float64_wrapper,
|
|
uint64_t(2124), 1.25);
|
|
}
|
|
|
|
TEST(RunCallFloat32ToInt64) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_float32_to_int64(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::float32_to_int64_wrapper, 1.25f,
|
|
int64_t(2124));
|
|
}
|
|
|
|
TEST(RunCallFloat32ToUint64) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref =
|
|
ExternalReference::wasm_float32_to_uint64(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::float32_to_uint64_wrapper, 1.25f,
|
|
uint64_t(2124));
|
|
}
|
|
|
|
TEST(RunCallFloat64ToInt64) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_float64_to_int64(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::float64_to_int64_wrapper, 1.25,
|
|
int64_t(2124));
|
|
}
|
|
|
|
TEST(RunCallFloat64ToUint64) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref =
|
|
ExternalReference::wasm_float64_to_uint64(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::float64_to_uint64_wrapper, 1.25,
|
|
uint64_t(2124));
|
|
}
|
|
|
|
TEST(RunCallInt64Div) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_int64_div(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::int64_div_wrapper, int64_t(1774),
|
|
int64_t(21));
|
|
}
|
|
|
|
TEST(RunCallInt64Mod) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_int64_mod(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::int64_mod_wrapper, int64_t(1774),
|
|
int64_t(21));
|
|
}
|
|
|
|
TEST(RunCallUint64Div) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_uint64_div(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::uint64_div_wrapper, uint64_t(1774),
|
|
uint64_t(21));
|
|
}
|
|
|
|
TEST(RunCallUint64Mod) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_uint64_mod(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::uint64_mod_wrapper, uint64_t(1774),
|
|
uint64_t(21));
|
|
}
|
|
|
|
TEST(RunCallWord32Ctz) {
|
|
BufferedRawMachineAssemblerTester<uint32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_word32_ctz(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::word32_ctz_wrapper, uint32_t(1774));
|
|
}
|
|
|
|
TEST(RunCallWord64Ctz) {
|
|
BufferedRawMachineAssemblerTester<uint32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_word64_ctz(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::word64_ctz_wrapper, uint64_t(1774));
|
|
}
|
|
|
|
TEST(RunCallWord32Popcnt) {
|
|
BufferedRawMachineAssemblerTester<uint32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_word32_popcnt(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::word32_popcnt_wrapper, uint32_t(1774));
|
|
}
|
|
|
|
TEST(RunCallWord64Popcnt) {
|
|
BufferedRawMachineAssemblerTester<uint32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_word64_popcnt(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::word64_popcnt_wrapper, uint64_t(1774));
|
|
}
|
|
|
|
TEST(RunCallFloat64Pow) {
|
|
BufferedRawMachineAssemblerTester<int32_t> m;
|
|
ExternalReference ref = ExternalReference::wasm_float64_pow(m.isolate());
|
|
TestExternalReference(&m, ref, wasm::float64_pow_wrapper, 1.5, 1.5);
|
|
}
|
|
} // namespace compiler
|
|
} // namespace internal
|
|
} // namespace v8
|