Author: | Wojciech Muła |
---|---|

Added on: | 2018-03-11 |

With signed numbers it is really easy. We can subtract two numbers (instruction
`psub`) and then calculate `abs` directly, as all Intel's SIMD instruction
sets support the `abs` operation.

To calculate the abs of difference of two unsigned numbers we can use the
**saturated arithmetic**. The saturated subtract (instructions `psubusX`) is
equivalent to max(a - b, 0); it means that whenever subtraction would yield a
negative result, the final result is zero.

We need to calculate two saturated subtracts, one for a - b, another for b - a; then merge them with bitwise or -- it's safe, because one of the subtract results is zero.

Below is an SSE implementation; full source code is available.

__m128i abs_sub_epu8(const __m128i a, const __m128i b) { const __m128i ab = _mm_subs_epu8(a, b); const __m128i ba = _mm_subs_epu8(b, a); return _mm_or_si128(ab, ba); }