diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/validation/NEON/ElementwiseDivision.cpp | 13 | ||||
-rw-r--r-- | tests/validation/fixtures/ElementwiseOperationsFixture.h | 25 | ||||
-rw-r--r-- | tests/validation/reference/ElementwiseOperations.cpp | 11 |
3 files changed, 39 insertions, 10 deletions
diff --git a/tests/validation/NEON/ElementwiseDivision.cpp b/tests/validation/NEON/ElementwiseDivision.cpp index f6e0a65e84..4b613cbd0a 100644 --- a/tests/validation/NEON/ElementwiseDivision.cpp +++ b/tests/validation/NEON/ElementwiseDivision.cpp @@ -44,6 +44,9 @@ namespace { RelativeTolerance<float> tolerance_fp32(0.000001f); /** Input data sets **/ +const auto ElementwiseDivisionS32Dataset = combine(combine(framework::dataset::make("DataType", DataType::S32), + framework::dataset::make("DataType", DataType::S32)), + framework::dataset::make("DataType", DataType::S32)); #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC RelativeTolerance<half> tolerance_fp16(static_cast<half>(0.01f)); const auto ElementwiseDivisionFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)), @@ -135,6 +138,16 @@ FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEElementwiseDivisionBroadcastFixture< TEST_SUITE_END() // F32 TEST_SUITE_END() // Float +TEST_SUITE(Integer) +TEST_SUITE(S32) +FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseDivisionFixture<int32_t>, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), ElementwiseDivisionS32Dataset)) +{ + // Validate output + validate(Accessor(_target), _reference); +} +TEST_SUITE_END() // S32 +TEST_SUITE_END() // Integer + TEST_SUITE_END() // ElementwiseDivision TEST_SUITE_END() // NEON } // namespace validation diff --git a/tests/validation/fixtures/ElementwiseOperationsFixture.h b/tests/validation/fixtures/ElementwiseOperationsFixture.h index ebc52d5083..dcb408c801 100644 --- a/tests/validation/fixtures/ElementwiseOperationsFixture.h +++ b/tests/validation/fixtures/ElementwiseOperationsFixture.h @@ -59,16 +59,23 @@ protected: template <typename U> void fill(U &&tensor, int i) { - switch(_op) + if(is_data_type_float(tensor.data_type())) { - case ArithmeticOperation::DIV: - library->fill_tensor_uniform_ranged(tensor, i, { std::pair<float, float>(-0.001f, 0.001f) }); - break; - case ArithmeticOperation::POWER: - library->fill_tensor_uniform(tensor, i, 0.0f, 5.0f); - break; - default: - library->fill_tensor_uniform(tensor, i); + switch(_op) + { + case ArithmeticOperation::DIV: + library->fill_tensor_uniform_ranged(tensor, i, { std::pair<float, float>(-0.001f, 0.001f) }); + break; + case ArithmeticOperation::POWER: + library->fill_tensor_uniform(tensor, i, 0.0f, 5.0f); + break; + default: + library->fill_tensor_uniform(tensor, i); + } + } + else + { + library->fill_tensor_uniform(tensor, i); } } diff --git a/tests/validation/reference/ElementwiseOperations.cpp b/tests/validation/reference/ElementwiseOperations.cpp index aab9d9d00c..f22c84e153 100644 --- a/tests/validation/reference/ElementwiseOperations.cpp +++ b/tests/validation/reference/ElementwiseOperations.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2019 Arm Limited. + * Copyright (c) 2018-2020 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -74,6 +74,15 @@ T arithm_op(ArithmeticOperation op, T src1, T src2, ConvertPolicy convert_policy case ArithmeticOperation::DIV: { val = (static_cast<intermediate_type>(src1) / static_cast<intermediate_type>(src2)); + if(std::is_integral<T>::value) + { + // Implement flooring division + val = (src2 == 0) ? 0 : val; + if(static_cast<int32_t>(src1) % static_cast<int32_t>(src2) != 0 && ((src1 < 0) != (src2 < 0))) + { + --val; + } + } break; } case ArithmeticOperation::POWER: |