SSE4: grater/less or equal relations for unsigned bytes/words

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)

Proof

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

Greater or equal

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

Less or equal

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