| 84 | }; |
| 85 | |
| 86 | inline Status |
| 87 | validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst, ConvertPolicy policy) |
| 88 | { |
| 89 | ARM_COMPUTE_UNUSED(policy); |
| 90 | ARM_COMPUTE_RETURN_ERROR_ON_CPU_F16_UNSUPPORTED(&src0); |
| 91 | ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(&src0, 1, DataType::U8, DataType::QASYMM8, |
| 92 | DataType::QASYMM8_SIGNED, DataType::QSYMM16, DataType::S16, |
| 93 | DataType::S32, DataType::F16, DataType::F32); |
| 94 | ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(&src0, &src1); |
| 95 | ARM_COMPUTE_RETURN_ERROR_ON_SIZE_UNSUPPORTED(&src0, &src1); |
| 96 | |
| 97 | const auto can_use_fixedpoint = sub_q8_neon_fixedpoint_possible(&src0, &src1, &dst); |
| 98 | const auto can_use_sme2_add_impl = false; |
| 99 | |
| 100 | const auto uk = |
| 101 | CpuSubKernel::get_implementation<CpuSubKernelDataTypeISASelectorData>(CpuSubKernelDataTypeISASelectorData{ |
| 102 | src0.data_type(), CPUInfo::get().get_isa(), can_use_fixedpoint, can_use_sme2_add_impl}); |
| 103 | |
| 104 | ARM_COMPUTE_RETURN_ERROR_ON(uk == nullptr || uk->ukernel == nullptr); |
| 105 | |
| 106 | const TensorShape out_shape = TensorShape::broadcast_shape(src0.tensor_shape(), src1.tensor_shape()); |
| 107 | ARM_COMPUTE_RETURN_ERROR_ON_MSG(out_shape.total_size() == 0, "Inputs are not broadcast compatible"); |
| 108 | |
| 109 | ARM_COMPUTE_RETURN_ERROR_ON_MSG(is_data_type_quantized(src0.data_type()) && (policy == ConvertPolicy::WRAP), |
| 110 | "Convert policy cannot be WRAP if datatype is quantized"); |
| 111 | |
| 112 | // Validate in case of configured dst |
| 113 | if (dst.total_size() > 0) |
| 114 | { |
| 115 | ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(&src0, &dst); |
| 116 | ARM_COMPUTE_RETURN_ERROR_ON_MSG(detail::have_different_dimensions(out_shape, dst.tensor_shape(), 0), |
| 117 | "Wrong shape for dst"); |
| 118 | ARM_COMPUTE_RETURN_ERROR_ON_SIZE_UNSUPPORTED(&dst); |
| 119 | } |
| 120 | else |
| 121 | { |
| 122 | const auto dst_info = TensorInfo(out_shape, 1, src0.data_type()); |
| 123 | ARM_COMPUTE_RETURN_ERROR_ON_SIZE_UNSUPPORTED(&dst_info); |
| 124 | } |
| 125 | return Status{}; |
| 126 | } |
| 127 | } // namespace |
| 128 | |
| 129 | void CpuSubKernel::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst, ConvertPolicy policy) |
no test coverage detected