#include "test/cctest/wasm/wasm-simd-utils.h"
#include <cmath>
#include <type_traits>
#include "src/base/logging.h"
#include "src/base/memory.h"
#include "src/common/globals.h"
#include "src/wasm/compilation-environment.h"
#include "src/wasm/value-type.h"
#include "src/wasm/wasm-opcodes-inl.h"
#include "src/wasm/wasm-opcodes.h"
#include "test/cctest/wasm/wasm-run-utils.h"
#include "test/common/c-signature.h"
#include "test/common/value-helper.h"
#include "test/common/wasm/wasm-macro-gen.h"
#include "third_party/fp16/src/include/fp16.h"
namespace v8 {
namespace internal {
namespace wasm {
void RunI8x16UnOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int8UnOp expected_op) { … }
template <typename T, typename OpType>
void RunI8x16BinOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
OpType expected_op) { … }
template void RunI8x16BinOpTest<int8_t>(TestExecutionTier, WasmOpcode,
Int8BinOp);
template void RunI8x16BinOpTest<uint8_t>(TestExecutionTier, WasmOpcode,
Uint8BinOp);
void RunI8x16ShiftOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int8ShiftOp expected_op) { … }
void RunI8x16MixedRelationalOpTest(TestExecutionTier execution_tier,
WasmOpcode opcode, Int8BinOp expected_op) { … }
void RunI16x8UnOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int16UnOp expected_op) { … }
template <typename T, typename OpType>
void RunI16x8BinOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
OpType expected_op) { … }
template void RunI16x8BinOpTest<int16_t>(TestExecutionTier, WasmOpcode,
Int16BinOp);
template void RunI16x8BinOpTest<uint16_t>(TestExecutionTier, WasmOpcode,
Uint16BinOp);
void RunI16x8ShiftOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int16ShiftOp expected_op) { … }
void RunI16x8MixedRelationalOpTest(TestExecutionTier execution_tier,
WasmOpcode opcode, Int16BinOp expected_op) { … }
void RunI32x4UnOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int32UnOp expected_op) { … }
void RunI32x4BinOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int32BinOp expected_op) { … }
void RunI32x4ShiftOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int32ShiftOp expected_op) { … }
void RunI64x2UnOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int64UnOp expected_op) { … }
void RunI64x2BinOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int64BinOp expected_op) { … }
void RunI64x2ShiftOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
Int64ShiftOp expected_op) { … }
bool IsCanonical(uint16_t actual) { … }
bool isnan(uint16_t f) { … }
void CheckFloat16LaneResult(float x, float y, uint16_t expected,
uint16_t actual, bool exact) { … }
void CheckFloat16LaneResult(float x, float y, float z, uint16_t expected,
uint16_t actual, bool exact) { … }
void RunF16x8UnOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
HalfUnOp expected_op, bool exact) { … }
void RunF16x8BinOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
HalfBinOp expected_op) { … }
void RunF16x8CompareOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
HalfCompareOp expected_op) { … }
bool IsExtreme(float x) { … }
bool IsCanonical(float actual) { … }
void CheckFloatResult(float x, float y, float expected, float actual,
bool exact) { … }
void RunF32x4UnOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
FloatUnOp expected_op, bool exact) { … }
namespace {
template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, bool>::type
ShouldSkipTestingConstants(WasmOpcode opcode, T lhs, T rhs) { … }
}
void RunF32x4BinOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
FloatBinOp expected_op) { … }
void RunF32x4CompareOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
FloatCompareOp expected_op) { … }
bool IsExtreme(double x) { … }
bool IsCanonical(double actual) { … }
void CheckDoubleResult(double x, double y, double expected, double actual,
bool exact) { … }
void RunF64x2UnOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
DoubleUnOp expected_op, bool exact) { … }
void RunF64x2BinOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
DoubleBinOp expected_op) { … }
void RunF64x2CompareOpTest(TestExecutionTier execution_tier, WasmOpcode opcode,
DoubleCompareOp expected_op) { … }
#ifdef V8_ENABLE_WASM_SIMD256_REVEC
template <typename T, typename OpType>
void RunI8x32BinOpRevecTest(WasmOpcode opcode, OpType expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
template void RunI8x32BinOpRevecTest<int8_t>(
WasmOpcode, Int8BinOp, compiler::IrOpcode::Value revec_opcode);
template void RunI8x32BinOpRevecTest<uint8_t>(
WasmOpcode, Uint8BinOp, compiler::IrOpcode::Value revec_opcode);
void RunI16x16UnOpRevecTest(WasmOpcode opcode, Int16UnOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
template <typename T, typename OpType>
void RunI16x16BinOpRevecTest(WasmOpcode opcode, OpType expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
template void RunI16x16BinOpRevecTest<int16_t>(
WasmOpcode, Int16BinOp, compiler::IrOpcode::Value revec_opcode);
template void RunI16x16BinOpRevecTest<uint16_t>(
WasmOpcode, Uint16BinOp, compiler::IrOpcode::Value revec_opcode);
void RunI16x16ShiftOpRevecTest(WasmOpcode opcode, Int16ShiftOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunI32x8UnOpRevecTest(WasmOpcode opcode, Int32UnOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
template <typename T, typename OpType>
void RunI32x8BinOpRevecTest(WasmOpcode opcode, OpType expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
template void RunI32x8BinOpRevecTest<int32_t>(WasmOpcode, Int32BinOp,
compiler::IrOpcode::Value);
template void RunI32x8BinOpRevecTest<uint32_t>(WasmOpcode, Uint32BinOp,
compiler::IrOpcode::Value);
void RunI32x8ShiftOpRevecTest(WasmOpcode opcode, Int32ShiftOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunI64x4BinOpRevecTest(WasmOpcode opcode, Int64BinOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunI64x4ShiftOpRevecTest(WasmOpcode opcode, Int64ShiftOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunF32x8UnOpRevecTest(WasmOpcode opcode, FloatUnOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunF32x8BinOpRevecTest(WasmOpcode opcode, FloatBinOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunF64x4UnOpRevecTest(WasmOpcode opcode, DoubleUnOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunF64x4BinOpRevecTest(WasmOpcode opcode, DoubleBinOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
void RunI8x32UnOpRevecTest(WasmOpcode opcode, Int8UnOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
template <typename T>
void RunI32x8ConvertF32x8RevecTest(WasmOpcode opcode,
ConvertToIntOp expected_op,
compiler::IrOpcode::Value revec_opcode) { … }
template void RunI32x8ConvertF32x8RevecTest<int32_t>(WasmOpcode, ConvertToIntOp,
compiler::IrOpcode::Value);
template void RunI32x8ConvertF32x8RevecTest<uint32_t>(
WasmOpcode, ConvertToIntOp, compiler::IrOpcode::Value);
#endif
}
}
}