Comparisons for Streaming SIMD Extensions

Each comparison intrinsic performs a comparison of a and b. For the packed form, the four SP FP values of a and b are compared, and a 128-bit mask is returned. For the scalar form, the lower SP FP values of a and b are compared, and a 32-bit mask is returned; the upper three SP FP values are passed through from a. The mask is set to 0xffffffff for each element where the comparison is true and 0x0 where the comparison is false.

The compare intrinsics are listed in the following table and are followed by a description of each intrinsic.

Compare Intrinsics

Intrinsic Name Comparison Corresponding Instruction

_mm_cmpeq_ss

Equal

CMPEQSS

_mm_cmpeq_ps

Equal

CMPEQPS

_mm_cmplt_ss

Less Than

CMPLTSS

_mm_cmplt_ps

Less Than

CMPLTPS

_mm_cmple_ss

Less Than or Equal

CMPLESS

_mm_cmple_ps

Less Than or Equal

CMPLEPS

_mm_cmpgt_ss

Greater Than

CMPLTSS

_mm_cmpgt_ps

Greater Than

CMPLTPS

_mm_cmpge_ss

Greater Than or Equal

CMPLESS

_mm_cmpge_ps

Greater Than or Equal

CMPLEPS

_mm_cmpneq_ss

Not Equal

CMPNEQSS

_mm_cmpneq_ps

Not Equal

CMPNEQPS

_mm_cmpnlt_ss

Not Less Than

CMPNLTSS

_mm_cmpnlt_ps

Not Less Than

CMPNLTPS

_mm_cmpnle_ss

Not Less Than or Equal

CMPNLESS

_mm_cmple_ps

Not Less Than or Equal

CMPNLEPS

_mm_cmpngt_ss

Not Greater Than

CMPNLTSS

_mm_cmpngt_ps

Not Greater Than

CMPNLTPS

_mm_cmpnge_ss

Not Greater Than or Equal

CMPNLESS

_mm_cmpnge_ps

Not Greater Than or Equal

CMPNLEPS

_mm_cmpord_ss

Ordered

CMPORDSS

_mm_cmpord_ps

Ordered

CMPORDPS

_mm_cmpunord_ss

Unordered

CMPUNORDSS

_mm_cmpunord_ps

Unordered

CMPUNORDPS

_mm_comieq_ss

Equal

COMISS

_mm_comilt_ps

Less Than

COMISS

_mm_comile_ss

Less Than or Equal

COMISS

_mm_comigt_ss

Greater Than

COMISS

_mm_comige_ss

Greater Than or Equal

COMISS

_mm_comineq_ss

Not Equal

COMISS

_mm_ucomieq_ss

Equal

UCOMISS

_mm_ucomilt_ss

Less Than

UCOMISS

_mm_ucomile_ss

Less Than or Equal

UCOMISS

_mm_ucomigt_ss

Greater Than

UCOMISS

_mm_ucomige_ss

Greater Than or Equal

UCOMISS

_mm_ucomineq_ss

Not Equal

UCOMISS

 

__m128 _mm_cmpeq_ss(__m128 a, __m128 b )

Compare for equality.

r0 := (a0 == b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpeq_ps(__m128 a, __m128 b )

Compare for equality.

r0 := (a0 == b0) ? 0xffffffff : 0x0

r1 := (a1 == b1) ? 0xffffffff : 0x0

r2 := (a2 == b2) ? 0xffffffff : 0x0

r3 := (a3 == b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmplt_ss(__m128 a, __m128 b )

Compare for less-than.

r0 := (a0 < b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmplt_ps(__m128 a, __m128 b)

Compare for less-than.

r0 := (a0 < b0) ? 0xffffffff : 0x0

r1 := (a1 < b1) ? 0xffffffff : 0x0

r2 := (a2 < b2) ? 0xffffffff : 0x0

r3 := (a3 < b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmple_ss(__m128 a, __m128 b )

Compare for less-than-or-equal.

r0 := (a0 <= b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmple_ps(__m128 a, __m128 b )

Compare for less-than-or-equal.

r0 := (a0 <= b0) ? 0xffffffff : 0x0

r1 := (a1 <= b1) ? 0xffffffff : 0x0

r2 := (a2 <= b2) ? 0xffffffff : 0x0

r3 := (a3 <= b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpgt_ss(__m128 a, __m128 b )r1

Compare for greater-than.

r0 := (a0 > b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpgt_ps(__m128 a, __m128 b )r

Compare for greater-than.

r0 := (a0 > b0) ? 0xffffffff : 0x0

r1 := (a1 > b1) ? 0xffffffff : 0x0

r2 := (a2 > b2) ? 0xffffffff : 0x0

r3 := (a3 > b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpge_ss(__m128 a, __m128 b ) r

Compare for greater-than-or-equal.

r0 := (a0 >= b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpge_ps(__m128 a, __m128 b ) r

Compare for greater-than-or-equal.

r0 := (a0 >= b0) ? 0xffffffff : 0x0

r1 := (a1 >= b1) ? 0xffffffff : 0x0

r2 := (a2 >= b2) ? 0xffffffff : 0x0

r3 := (a3 >= b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpneq_ss(__m128 a, __m128 b )

Compare for inequality.

r0 := (a0 != b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpneq_ps(__m128 a, __m128 b )

Compare for inequality.

r0 := (a0 != b0) ? 0xffffffff : 0x0

r1 := (a1 != b1) ? 0xffffffff : 0x0

r2 := (a2 != b2) ? 0xffffffff : 0x0

r3 := (a3 != b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpnlt_ss(__m128 a, __m128 b )

Compare for not-less-than.

r0 := !(a0 < b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpnlt_ps(__m128 a, __m128 b )

Compare for not-less-than.

r0 := !(a0 < b0) ? 0xffffffff : 0x0

r1 := !(a1 < b1) ? 0xffffffff : 0x0

r2 := !(a2 < b2) ? 0xffffffff : 0x0

r3 := !(a3 < b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpnle_ss(__m128 a, __m128 b )

Compare for not-less-than-or-equal.

r0 := !(a0 <= b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpnle_ps(__m128 a, __m128 b )

Compare for not-less-than-or-equal.

r0 := !(a0 <= b0) ? 0xffffffff : 0x0

r1 := !(a1 <= b1) ? 0xffffffff : 0x0

r2 := !(a2 <= b2) ? 0xffffffff : 0x0

r3 := !(a3 <= b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpngt_ss(__m128 a, __m128 b ) r

Compare for not-greater-than.

r0 := !(a0 > b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpngt_ps(__m128 a, __m128 b ) r

Compare for not-greater-than.

r0 := !(a0 > b0) ? 0xffffffff : 0x0

r1 := !(a1 > b1) ? 0xffffffff : 0x0

r2 := !(a2 > b2) ? 0xffffffff : 0x0

r3 := !(a3 > b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpnge_ss(__m128 a, __m128 b )r

Compare for not-greater-than-or-equal.

r0 := !(a0 >= b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpnge_ps(__m128 a, __m128 b )r

Compare for not-greater-than-or-equal.

r0 := !(a0 >= b0) ? 0xffffffff : 0x0

r1 := !(a1 >= b1) ? 0xffffffff : 0x0

r2 := !(a2 >= b2) ? 0xffffffff : 0x0

r3 := !(a3 >= b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpord_ss(__m128 a, __m128 b )

Compare for ordered.

r0 := (a0 ord? b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpord_ps(__m128 a, __m128 b )

Compare for ordered.

r0 := (a0 ord? b0) ? 0xffffffff : 0x0

r1 := (a1 ord? b1) ? 0xffffffff : 0x0

r2 := (a2 ord? b2) ? 0xffffffff : 0x0

r3 := (a3 ord? b3) ? 0xffffffff : 0x0

 

__m128 _mm_cmpunord_ss(__m128 a, __m128 b )

Compare for unordered.

r0 := (a0 unord? b0) ? 0xffffffff : 0x0

r1 := a1 ; r2 := a2 ; r3 := a3

 

__m128 _mm_cmpunord_ps(__m128 a, __m128 b )

Compare for unordered.

r0 := (a0 unord? b0) ? 0xffffffff : 0x0

r1 := (a1 unord? b1) ? 0xffffffff : 0x0

r2 := (a2 unord? b2) ? 0xffffffff : 0x0

r3 := (a3 unord? b3) ? 0xffffffff : 0x0

 

int _mm_comieq_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a equal to b. If a and b are equal, 1 is returned. Otherwise 0 is returned.

r := (a0 == b0) ? 0x1 : 0x0

 

int _mm_comilt_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a less than b. If a is less than b, 1 is returned. Otherwise 0 is returned.

r := (a0 < b0) ? 0x1 : 0x0

 

int _mm_comile_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a less than or equal to b. If a is less than or equal to b, 1 is returned. Otherwise 0 is returned.

r := (a0 <= b0) ? 0x1 : 0x0

 

int _mm_comigt_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a greater than b. If a is greater than b are equal, 1 is returned. Otherwise 0 is returned.

r := (a0 > b0) ? 0x1 : 0x0

 

int _mm_comige_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a greater than or equal to b. If a is greater than or equal to b, 1 is returned. Otherwise 0 is returned.

r := (a0 >= b0) ? 0x1 : 0x0

 

int _mm_comineq_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a not equal to b. If a and b are not equal, 1 is returned. Otherwise 0 is returned.

r := (a0 != b0) ? 0x1 : 0x0

 

int _mm_ucomieq_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a equal to b. If a and b are equal, 1 is returned. Otherwise 0 is returned.

r := (a0 == b0) ? 0x1 : 0x0

 

int _mm_ucomilt_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a less than b. If a is less than b, 1 is returned. Otherwise 0 is returned.

r := (a0 < b0) ? 0x1 : 0x0

 

int _mm_ucomile_ss ( __m128 a, __m128 b)

Compares the lower SP FP value of a and b for a less than or equal to b. If a is less than or equal to b, 1 is returned. Otherwise 0 is returned.

r := (a0 <= b0) ? 0x1 : 0x0

 

int _mm_ucomigt_ss ( __ m128 a, __ m128 b)

Compares the lower SP FP value of a and b for a greater than b. If a is greater than b are equal, 1 is returned. Otherwise 0 is returned.

r := (a0 > b0) ? 0x1 : 0x0

 

int _mm_ucomige_ss ( __ m128 a, __ m128 b)

Compares the lower SP FP value of a and b for a greater than or equal to b. If a is greater than or equal to b, 1 is returned. Otherwise 0 is returned.

r := (a0 >= b0) ? 0x1 : 0x0

 

int _mm_ucomineq_ss ( __ m128 a, __ m128 b)

Compares the lower SP FP value of a and b for a not equal to b. If a and b are not equal, 1 is returned. Otherwise 0 is returned.

r := (a0 != b0) ? 0x1 : 0x0

 

The superscript "r" on the instruction indicates that the operands are reversed in the instruction implementation.