diff --git a/docs/2026.html b/docs/2026.html
index c86a3e3607..ea14622f96 100644
--- a/docs/2026.html
+++ b/docs/2026.html
@@ -164,6 +164,7 @@
Removing
HVX optimization of function AbsDifference.
HVX optimization of function AbsDifferenceSum.
HVX optimization of function AbsGradientSaturatedSum.
+ HVX optimization of function AddFeatureDifference.
Python wrapper
diff --git a/prj/vs2022/Hvx.vcxproj b/prj/vs2022/Hvx.vcxproj
index 49f60020bf..a0f45b352c 100644
--- a/prj/vs2022/Hvx.vcxproj
+++ b/prj/vs2022/Hvx.vcxproj
@@ -21,7 +21,6 @@
-
diff --git a/prj/vs2022/Hvx.vcxproj.filters b/prj/vs2022/Hvx.vcxproj.filters
index 50e073b9c6..7a6668dfb7 100644
--- a/prj/vs2022/Hvx.vcxproj.filters
+++ b/prj/vs2022/Hvx.vcxproj.filters
@@ -83,9 +83,6 @@
Hvx\Statistics
-
- Hvx\Motion
-
Hvx\Image
diff --git a/src/Simd/SimdHvx.h b/src/Simd/SimdHvx.h
index b63682d184..b30265218b 100644
--- a/src/Simd/SimdHvx.h
+++ b/src/Simd/SimdHvx.h
@@ -12,10 +12,6 @@ namespace Simd
#ifdef SIMD_HVX_ENABLE
namespace Hvx
{
- void AddFeatureDifference(const uint8_t* value, size_t valueStride, size_t width, size_t height,
- const uint8_t* lo, size_t loStride, const uint8_t* hi, size_t hiStride,
- uint16_t weight, uint8_t* difference, size_t differenceStride);
-
void BgrToGray(const uint8_t* bgr, size_t width, size_t height, size_t bgrStride,
uint8_t* gray, size_t grayStride);
diff --git a/src/Simd/SimdHvxAddFeatureDifference.cpp b/src/Simd/SimdHvxAddFeatureDifference.cpp
deleted file mode 100644
index ea0488c1b7..0000000000
--- a/src/Simd/SimdHvxAddFeatureDifference.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
- * SPDX-License-Identifier: MIT
- */
-#include "Simd/SimdMemory.h"
-#include "Simd/SimdStore.h"
-
-namespace Simd
-{
-#ifdef SIMD_HVX_ENABLE
- namespace Hvx
- {
- SIMD_INLINE HVX_Vector FeatureDifference(HVX_Vector value, HVX_Vector lo, HVX_Vector hi)
- {
- return Q6_Vub_vmax_VubVub(Q6_Vub_vsub_VubVub_sat(value, hi), Q6_Vub_vsub_VubVub_sat(lo, value));
- }
-
- SIMD_INLINE HVX_Vector ShiftedWeightedSquare(HVX_Vector diff, int weight)
- {
- // diff^2 as 16-bit unsigned: even/odd byte products
- HVX_VectorPair sq = Q6_Wuh_vmpy_VubVub(diff, diff);
- HVX_Vector sq_even = Q6_V_lo_W(sq);
- HVX_Vector sq_odd = Q6_V_hi_W(sq);
-
- // Multiply 16-bit squares by weight -> 32-bit results
- // vmpy_VuhRuh uses Rt.uh[0] for even and Rt.uh[1] for odd halfwords,
- // so pack weight into both halfword lanes.
- int w2 = weight | (weight << 16);
- HVX_VectorPair pe = Q6_Wuw_vmpy_VuhRuh(sq_even, w2);
- HVX_VectorPair po = Q6_Wuw_vmpy_VuhRuh(sq_odd, w2);
-
- // Shift 32-bit products right by 16 bits
- HVX_Vector pe_lo = Q6_Vuw_vlsr_VuwR(Q6_V_lo_W(pe), 16);
- HVX_Vector pe_hi = Q6_Vuw_vlsr_VuwR(Q6_V_hi_W(pe), 16);
- HVX_Vector po_lo = Q6_Vuw_vlsr_VuwR(Q6_V_lo_W(po), 16);
- HVX_Vector po_hi = Q6_Vuw_vlsr_VuwR(Q6_V_hi_W(po), 16);
-
- // Pack 32-bit -> 16-bit with unsigned saturation (interleaved)
- HVX_Vector r_even = Q6_Vuh_vsat_VuwVuw(pe_hi, pe_lo);
- HVX_Vector r_odd = Q6_Vuh_vsat_VuwVuw(po_hi, po_lo);
-
- // Clamp 16-bit values to 255 before extracting low bytes
- HVX_Vector max255 = Q6_V_vsplat_R(0x00FF00FF);
- r_even = Q6_Vuh_vmin_VuhVuh(r_even, max255);
- r_odd = Q6_Vuh_vmin_VuhVuh(r_odd, max255);
-
- return Q6_Vb_vshuffe_VbVb(r_odd, r_even);
- }
-
- template void AddFeatureDifference(const uint8_t* value, size_t valueStride, size_t width, size_t height,
- const uint8_t* lo, size_t loStride, const uint8_t* hi, size_t hiStride,
- uint16_t weight, uint8_t* difference, size_t differenceStride)
- {
- assert(width >= A);
- if (align)
- {
- assert(Aligned(value) && Aligned(valueStride));
- assert(Aligned(lo) && Aligned(loStride));
- assert(Aligned(hi) && Aligned(hiStride));
- assert(Aligned(difference) && Aligned(differenceStride));
- }
-
- size_t alignedWidth = AlignLo(width, A);
-
- for (size_t row = 0; row < height; ++row)
- {
- for (size_t col = 0; col < alignedWidth; col += A)
- {
- const HVX_Vector _value = Load(value + col);
- const HVX_Vector _lo = Load(lo + col);
- const HVX_Vector _hi = Load(hi + col);
- HVX_Vector _difference = Load(difference + col);
-
- const HVX_Vector fd = FeatureDifference(_value, _lo, _hi);
- const HVX_Vector inc = ShiftedWeightedSquare(fd, weight);
- Store(difference + col, Q6_Vub_vadd_VubVub_sat(_difference, inc));
- }
- for (size_t col = alignedWidth; col < width; ++col)
- {
- int v = value[col], l = lo[col], h = hi[col];
- int fd1 = (v > h) ? (v - h) : 0;
- int fd2 = (l > v) ? (l - v) : 0;
- int fd = (fd1 > fd2) ? fd1 : fd2;
- int inc = (fd * fd * weight) >> 16;
- int sum = difference[col] + inc;
- difference[col] = (uint8_t)(sum > 255 ? 255 : sum);
- }
- value += valueStride;
- lo += loStride;
- hi += hiStride;
- difference += differenceStride;
- }
- }
-
- void AddFeatureDifference(const uint8_t* value, size_t valueStride, size_t width, size_t height,
- const uint8_t* lo, size_t loStride, const uint8_t* hi, size_t hiStride,
- uint16_t weight, uint8_t* difference, size_t differenceStride)
- {
- if (Aligned(value) && Aligned(valueStride) && Aligned(lo) && Aligned(loStride) &&
- Aligned(hi) && Aligned(hiStride) && Aligned(difference) && Aligned(differenceStride))
- AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride);
- else
- AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride);
- }
- }
-#endif
-}
diff --git a/src/Simd/SimdLib.cpp b/src/Simd/SimdLib.cpp
index cd96c3a44a..850dfc894a 100644
--- a/src/Simd/SimdLib.cpp
+++ b/src/Simd/SimdLib.cpp
@@ -506,11 +506,6 @@ SIMD_API void SimdAddFeatureDifference(const uint8_t * value, size_t valueStride
if (Neon::Enable && width >= Neon::A)
Neon::AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride);
else
-#endif
-#ifdef SIMD_HVX_ENABLE
- if (Hvx::Enable && width >= Hvx::A)
- Hvx::AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride);
- else
#endif
Base::AddFeatureDifference(value, valueStride, width, height, lo, loStride, hi, hiStride, weight, difference, differenceStride);
}
diff --git a/src/Test/TestAddFeatureDifference.cpp b/src/Test/TestAddFeatureDifference.cpp
index 02655bc8d2..745044a4eb 100644
--- a/src/Test/TestAddFeatureDifference.cpp
+++ b/src/Test/TestAddFeatureDifference.cpp
@@ -127,11 +127,6 @@ namespace Test
result = result && AddFeatureDifferenceAutoTest(FUNC(Simd::Neon::AddFeatureDifference), FUNC(SimdAddFeatureDifference));
#endif
-#ifdef SIMD_HVX_ENABLE
- if (Simd::Hvx::Enable && TestHvx(options) && W >= Simd::Hvx::A)
- result = result && AddFeatureDifferenceAutoTest(FUNC(Simd::Hvx::AddFeatureDifference), FUNC(SimdAddFeatureDifference));
-#endif
-
return result;
}
}