Skip to content

Commit 7865dfc

Browse files
sndmitrievbader
authored andcommitted
[SYCL] Fix for cl::sycl::sub_sat() issue on host
Signed-off-by: Sergey Dmitriev <[email protected]>
1 parent 5635959 commit 7865dfc

File tree

3 files changed

+61
-33
lines changed

3 files changed

+61
-33
lines changed

sycl/source/detail/builtins_integer.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,12 @@ template <typename T> inline T __u_sub_sat(T x, T y) {
167167
}
168168

169169
template <typename T> inline T __s_sub_sat(T x, T y) {
170-
if (y > 0)
171-
return (y < (x - d::min_v<T>()) ? x - y : d::min_v<T>());
172-
if (y < 0)
173-
return (y > (x - d::max_v<T>()) ? x - y : d::max_v<T>());
174-
return x;
170+
using UT = typename std::make_unsigned<T>::type;
171+
T result = UT(x) - UT(y);
172+
// Saturate result if (+) - (-) = (-) or (-) - (+) = (+).
173+
if (((x < 0) ^ (y < 0)) && ((x < 0) ^ (result < 0)))
174+
result = result < 0 ? d::max_v<T>() : d::min_v<T>();
175+
return result;
175176
}
176177

177178
template <typename T1, typename T2>

sycl/test/built-ins/scalar_integer.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -337,18 +337,29 @@ int main() {
337337
}
338338
// sub_sat
339339
{
340-
s::cl_int r{ 0 };
341-
{
342-
s::buffer<s::cl_int, 1> BufR(&r, s::range<1>(1));
343-
s::queue myQueue;
344-
myQueue.submit([&](s::handler &cgh) {
345-
auto AccR = BufR.get_access<s::access::mode::write>(cgh);
346-
cgh.single_task<class sub_satSI1SI1>([=]() {
347-
AccR[0] = s::sub_sat(s::cl_int{ 10 }, s::cl_int(0x80000000));
348-
}); // 10 - (-2^31(minimum value)) = saturates on Maximum value
349-
});
350-
}
351-
assert(r == 0x7FFFFFFF);
340+
auto TestSubSat = [](s::cl_int x, s::cl_int y) {
341+
s::cl_int r{ 0 };
342+
{
343+
s::buffer<s::cl_int, 1> BufR(&r, s::range<1>(1));
344+
s::queue myQueue;
345+
myQueue.submit([&](s::handler &cgh) {
346+
auto AccR = BufR.get_access<s::access::mode::write>(cgh);
347+
cgh.single_task<class sub_satSI1SI1>([=]() {
348+
AccR[0] = s::sub_sat(x, y);
349+
});
350+
});
351+
}
352+
return r;
353+
};
354+
// 10 - (-2^31(minimum value)) = saturates on Maximum value
355+
s::cl_int r1 = TestSubSat(10, 0x80000000);
356+
assert(r1 == 0x7FFFFFFF);
357+
s::cl_int r2 = TestSubSat(0x7FFFFFFF, 0xFFFFFFFF);
358+
assert(r2 == 0x7FFFFFFF);
359+
s::cl_int r3 = TestSubSat(0x80000000, 0x00000001);
360+
assert(r3 == 0x80000000);
361+
s::cl_int r4 = TestSubSat(10499, 30678);
362+
assert(r4 == -20179);
352363
}
353364

354365
// upsample - 1

sycl/test/built-ins/vector_integer.cpp

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -481,22 +481,38 @@ int main() {
481481

482482
// sub_sat
483483
{
484-
s::cl_int2 r{ 0 };
485-
{
486-
s::buffer<s::cl_int2, 1> BufR(&r, s::range<1>(1));
487-
s::queue myQueue;
488-
myQueue.submit([&](s::handler &cgh) {
489-
auto AccR = BufR.get_access<s::access::mode::write>(cgh);
490-
cgh.single_task<class sub_satSI2SI2>([=]() {
491-
AccR[0] = s::sub_sat(s::cl_int2{ 10, 10 },
492-
s::cl_int2{ int(0x80000000), int(0x80000000) });
493-
});
494-
});
495-
}
496-
s::cl_int r1 = r.x();
497-
s::cl_int r2 = r.y();
498-
assert(r1 == 0x7FFFFFFF);
499-
assert(r2 == 0x7FFFFFFF);
484+
auto TestSubSat = [](s::cl_int2 x, s::cl_int2 y) {
485+
s::cl_int2 r{ 0 };
486+
{
487+
s::buffer<s::cl_int2, 1> BufR(&r, s::range<1>(1));
488+
s::queue myQueue;
489+
myQueue.submit([&](s::handler &cgh) {
490+
auto AccR = BufR.get_access<s::access::mode::write>(cgh);
491+
cgh.single_task<class sub_satSI2SI2>([=]() {
492+
AccR[0] = s::sub_sat(x, y);
493+
});
494+
});
495+
}
496+
return r;
497+
};
498+
s::cl_int2 r1 = TestSubSat(s::cl_int2{ 10, 10 },
499+
s::cl_int2{ 0x80000000, 0x80000000 });
500+
s::cl_int r1x = r1.x();
501+
s::cl_int r1y = r1.y();
502+
assert(r1x == 0x7FFFFFFF);
503+
assert(r1y == 0x7FFFFFFF);
504+
s::cl_int2 r2 = TestSubSat(s::cl_int2{ 0x7FFFFFFF, 0x80000000 },
505+
s::cl_int2{ 0xFFFFFFFF, 0x00000001 });
506+
s::cl_int r2x = r2.x();
507+
s::cl_int r2y = r2.y();
508+
assert(r2x == 0x7FFFFFFF);
509+
assert(r2y == 0x80000000);
510+
s::cl_int2 r3 = TestSubSat(s::cl_int2{ 10499, 30678 },
511+
s::cl_int2{ 30678, 10499 });
512+
s::cl_int r3x = r3.x();
513+
s::cl_int r3y = r3.y();
514+
assert(r3x == -20179);
515+
assert(r3y == 20179);
500516
}
501517

502518
// upsample - 1

0 commit comments

Comments
 (0)