Skip to content

Commit 03d4c57

Browse files
Add SVE2 background adjust range
Co-authored-by: Ihar Yermalayeu <ermig1979@gmail.com>
1 parent b8624b9 commit 03d4c57

5 files changed

Lines changed: 71 additions & 0 deletions

File tree

docs/2026.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ <h5>New features</h5>
5656
<li>SVE2 optimizations of function ConditionalSum.</li>
5757
<li>SVE2 optimizations of function ConditionalSquareSum.</li>
5858
<li>SVE2 optimizations of function ConditionalSquareGradientSum.</li>
59+
<li>SVE2 optimizations of function BackgroundAdjustRange.</li>
5960
</ul>
6061

6162
<h4>Documentation</h4>

src/Simd/SimdLib.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,12 @@ SIMD_API void SimdBackgroundAdjustRange(uint8_t * loCount, size_t loCountStride,
837837
hiCount, hiCountStride, hiValue, hiValueStride, threshold);
838838
else
839839
#endif
840+
#ifdef SIMD_SVE2_ENABLE
841+
if (Sve2::Enable)
842+
Sve2::BackgroundAdjustRange(loCount, loCountStride, width, height, loValue, loValueStride,
843+
hiCount, hiCountStride, hiValue, hiValueStride, threshold);
844+
else
845+
#endif
840846
#ifdef SIMD_NEON_ENABLE
841847
if (Neon::Enable && width >= Neon::A)
842848
Neon::BackgroundAdjustRange(loCount, loCountStride, width, height, loValue, loValueStride,

src/Simd/SimdSve2.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ namespace Simd
3535
const uint8_t* loValue, size_t loValueStride, const uint8_t* hiValue, size_t hiValueStride,
3636
uint8_t* loCount, size_t loCountStride, uint8_t* hiCount, size_t hiCountStride);
3737

38+
void BackgroundAdjustRange(uint8_t* loCount, size_t loCountStride, size_t width, size_t height,
39+
uint8_t* loValue, size_t loValueStride, uint8_t* hiCount, size_t hiCountStride,
40+
uint8_t* hiValue, size_t hiValueStride, uint8_t threshold);
41+
3842
void BgraToGray(const uint8_t* bgra, size_t width, size_t height, size_t bgraStride, uint8_t* gray, size_t grayStride);
3943

4044
void BgrToGray(const uint8_t* bgr, size_t width, size_t height, size_t bgrStride, uint8_t* gray, size_t grayStride);

src/Simd/SimdSve2Background.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,61 @@ namespace Simd
6767
hiCount += hiCountStride;
6868
}
6969
}
70+
71+
SIMD_INLINE svuint8_t AdjustLo(const svbool_t& mask, const svuint8_t& count, const svuint8_t& value,
72+
const svuint8_t& threshold, const svuint8_t& _1)
73+
{
74+
svuint8_t dec = svand_u8_z(svcmpgt_u8(mask, count, threshold), _1, _1);
75+
svuint8_t inc = svand_u8_z(svcmplt_u8(mask, count, threshold), _1, _1);
76+
return svqsub_u8(svqadd_u8(value, inc), dec);
77+
}
78+
79+
SIMD_INLINE svuint8_t AdjustHi(const svbool_t& mask, const svuint8_t& count, const svuint8_t& value,
80+
const svuint8_t& threshold, const svuint8_t& _1)
81+
{
82+
svuint8_t inc = svand_u8_z(svcmpgt_u8(mask, count, threshold), _1, _1);
83+
svuint8_t dec = svand_u8_z(svcmplt_u8(mask, count, threshold), _1, _1);
84+
return svqsub_u8(svqadd_u8(value, inc), dec);
85+
}
86+
87+
SIMD_INLINE void BackgroundAdjustRange(uint8_t* loCount, uint8_t* loValue, uint8_t* hiCount, uint8_t* hiValue,
88+
const svuint8_t& threshold, const svuint8_t& _1, const svuint8_t& _0, const svbool_t& mask)
89+
{
90+
svuint8_t _loCount = svld1_u8(mask, loCount);
91+
svuint8_t _loValue = svld1_u8(mask, loValue);
92+
svuint8_t _hiCount = svld1_u8(mask, hiCount);
93+
svuint8_t _hiValue = svld1_u8(mask, hiValue);
94+
95+
svst1_u8(mask, loValue, AdjustLo(mask, _loCount, _loValue, threshold, _1));
96+
svst1_u8(mask, hiValue, AdjustHi(mask, _hiCount, _hiValue, threshold, _1));
97+
svst1_u8(mask, loCount, _0);
98+
svst1_u8(mask, hiCount, _0);
99+
}
100+
101+
void BackgroundAdjustRange(uint8_t* loCount, size_t loCountStride, size_t width, size_t height,
102+
uint8_t* loValue, size_t loValueStride, uint8_t* hiCount, size_t hiCountStride,
103+
uint8_t* hiValue, size_t hiValueStride, uint8_t threshold)
104+
{
105+
size_t A = svlen(svuint8_t());
106+
size_t widthA = AlignLo(width, A);
107+
const svbool_t body = svptrue_b8();
108+
const svbool_t tail = svwhilelt_b8(widthA, width);
109+
svuint8_t _threshold = svdup_n_u8(threshold);
110+
svuint8_t _1 = svdup_n_u8(1);
111+
svuint8_t _0 = svdup_n_u8(0);
112+
for (size_t row = 0; row < height; ++row)
113+
{
114+
size_t col = 0;
115+
for (; col < widthA; col += A)
116+
BackgroundAdjustRange(loCount + col, loValue + col, hiCount + col, hiValue + col, _threshold, _1, _0, body);
117+
if (widthA < width)
118+
BackgroundAdjustRange(loCount + col, loValue + col, hiCount + col, hiValue + col, _threshold, _1, _0, tail);
119+
loValue += loValueStride;
120+
hiValue += hiValueStride;
121+
loCount += loCountStride;
122+
hiCount += hiCountStride;
123+
}
124+
}
70125
}
71126
#endif
72127
}

src/Test/TestBackground.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,11 @@ namespace Test
568568
if (Simd::Neon::Enable && TestNeon(options) && W >= Simd::Neon::A)
569569
result = result && BackgroundAdjustRangeAutoTest(FUNC3(Simd::Neon::BackgroundAdjustRange), FUNC3(SimdBackgroundAdjustRange));
570570
#endif
571+
572+
#ifdef SIMD_SVE2_ENABLE
573+
if (Simd::Sve2::Enable && TestSve2(options))
574+
result = result && BackgroundAdjustRangeAutoTest(FUNC3(Simd::Sve2::BackgroundAdjustRange), FUNC3(SimdBackgroundAdjustRange));
575+
#endif
571576
return result;
572577
}
573578

0 commit comments

Comments
 (0)