Author: | Wojciech Muła |
---|---|
Added on: | 2008-06-02 |
Updated on: | 2015-04-03 — added proofs |
Relation greater or equal can be expressed with min function:
(x <= y) = (min(x, y) = x)
Likewise relation less or equal can be expressed with max function:
(x >= y) = (max(x, y) = x)
SSE4.1 introduced instructions PMAXUB, PMAXUW, PMINUB and PMINUW that operate on unsigned bytes and words. With help of these instructions we can compare unsigned words using presented equivalences.
Here is a sample code that test if all bytes from xmm0 lie in range [lo .. hi]:
; xmm0 - vector ; lo - lower bound ; hi - higher bound movdqa %xmm0, %xmm1 ; clone vector pminub lo, %xmm0 pmaxub hi, %xmm1 pcmpeqb lo, %xmm0 ; xmm0 = (vector >= lo) pcmpeqb hi, %xmm1 ; xmm1 = (vector <= hi) pand %xmm1, %xmm0 ; xmm1 = (vector >= lo) and (vector <= hi)
In the proof we consider three cases: x < y, x = y and x > y.
The second and the last column (i.e. left and right side of equivalence) are the same in both cases. QED
case | x <= y | min(x, y) | min(x, y) = x |
---|---|---|---|
x < y | true | x | true |
x = y | true | x | true |
x > y | false | y | false |
case | x >= y | max(x, y) | max(x, y) = x |
---|---|---|---|
x < y | false | y | false |
x = y | true | x | true |
x > y | true | x | true |