Perform sse float comparisons with the floating-point intrinsics (#5115)

Signed-off-by: Chris Burel <burelc@amazon.com>
monroegm-disable-blank-issue-2
Chris Burel 4 years ago committed by GitHub
parent d948d78b2e
commit 8f56dc10c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -383,36 +383,36 @@ namespace AZ
AZ_MATH_INLINE bool CmpAllEq(__m128 arg1, __m128 arg2, int32_t mask) AZ_MATH_INLINE bool CmpAllEq(__m128 arg1, __m128 arg2, int32_t mask)
{ {
const __m128i compare = CastToInt(CmpNeq(arg1, arg2)); const __m128 compare = CmpEq(arg1, arg2);
return (_mm_movemask_epi8(compare) & mask) == 0; return (_mm_movemask_ps(compare) & mask) == mask;
} }
AZ_MATH_INLINE bool CmpAllLt(__m128 arg1, __m128 arg2, int32_t mask) AZ_MATH_INLINE bool CmpAllLt(__m128 arg1, __m128 arg2, int32_t mask)
{ {
const __m128i compare = CastToInt(CmpGtEq(arg1, arg2)); const __m128 compare = CmpLt(arg1, arg2);
return (_mm_movemask_epi8(compare) & mask) == 0; return (_mm_movemask_ps(compare) & mask) == mask;
} }
AZ_MATH_INLINE bool CmpAllLtEq(__m128 arg1, __m128 arg2, int32_t mask) AZ_MATH_INLINE bool CmpAllLtEq(__m128 arg1, __m128 arg2, int32_t mask)
{ {
const __m128i compare = CastToInt(CmpGt(arg1, arg2)); const __m128 compare = CmpLtEq(arg1, arg2);
return (_mm_movemask_epi8(compare) & mask) == 0; return (_mm_movemask_ps(compare) & mask) == mask;
} }
AZ_MATH_INLINE bool CmpAllGt(__m128 arg1, __m128 arg2, int32_t mask) AZ_MATH_INLINE bool CmpAllGt(__m128 arg1, __m128 arg2, int32_t mask)
{ {
const __m128i compare = CastToInt(CmpLtEq(arg1, arg2)); const __m128 compare = CmpGt(arg1, arg2);
return (_mm_movemask_epi8(compare) & mask) == 0; return (_mm_movemask_ps(compare) & mask) == mask;
} }
AZ_MATH_INLINE bool CmpAllGtEq(__m128 arg1, __m128 arg2, int32_t mask) AZ_MATH_INLINE bool CmpAllGtEq(__m128 arg1, __m128 arg2, int32_t mask)
{ {
const __m128i compare = CastToInt(CmpLt(arg1, arg2)); const __m128 compare = CmpGtEq(arg1, arg2);
return (_mm_movemask_epi8(compare) & mask) == 0; return (_mm_movemask_ps(compare) & mask) == mask;
} }

@ -331,31 +331,32 @@ namespace AZ
AZ_MATH_INLINE bool Vec1::CmpAllEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec1::CmpAllEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllEq(arg1, arg2, 0x000F); // Only check the first bit for Vector1
return Sse::CmpAllEq(arg1, arg2, 0b0001);
} }
AZ_MATH_INLINE bool Vec1::CmpAllLt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec1::CmpAllLt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLt(arg1, arg2, 0x000F); return Sse::CmpAllLt(arg1, arg2, 0b0001);
} }
AZ_MATH_INLINE bool Vec1::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec1::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLtEq(arg1, arg2, 0x000F); return Sse::CmpAllLtEq(arg1, arg2, 0b0001);
} }
AZ_MATH_INLINE bool Vec1::CmpAllGt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec1::CmpAllGt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGt(arg1, arg2, 0x000F); return Sse::CmpAllGt(arg1, arg2, 0b0001);
} }
AZ_MATH_INLINE bool Vec1::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec1::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGtEq(arg1, arg2, 0x000F); return Sse::CmpAllGtEq(arg1, arg2, 0b0001);
} }
@ -397,7 +398,7 @@ namespace AZ
AZ_MATH_INLINE bool Vec1::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2) AZ_MATH_INLINE bool Vec1::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2)
{ {
return Sse::CmpAllEq(arg1, arg2, 0x000F); return Sse::CmpAllEq(arg1, arg2, 0b0001);
} }

@ -383,31 +383,32 @@ namespace AZ
AZ_MATH_INLINE bool Vec2::CmpAllEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec2::CmpAllEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllEq(arg1, arg2, 0x00FF); // Only check the first two bits for Vector2
return Sse::CmpAllEq(arg1, arg2, 0b0011);
} }
AZ_MATH_INLINE bool Vec2::CmpAllLt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec2::CmpAllLt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLt(arg1, arg2, 0x00FF); return Sse::CmpAllLt(arg1, arg2, 0b0011);
} }
AZ_MATH_INLINE bool Vec2::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec2::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLtEq(arg1, arg2, 0x00FF); return Sse::CmpAllLtEq(arg1, arg2, 0b0011);
} }
AZ_MATH_INLINE bool Vec2::CmpAllGt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec2::CmpAllGt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGt(arg1, arg2, 0x00FF); return Sse::CmpAllGt(arg1, arg2, 0b0011);
} }
AZ_MATH_INLINE bool Vec2::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec2::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGtEq(arg1, arg2, 0x00FF); return Sse::CmpAllGtEq(arg1, arg2, 0b0011);
} }

@ -419,31 +419,32 @@ namespace AZ
AZ_MATH_INLINE bool Vec3::CmpAllEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec3::CmpAllEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllEq(arg1, arg2, 0x0FFF); // Only check the first three bits for Vector3
return Sse::CmpAllEq(arg1, arg2, 0b0111);
} }
AZ_MATH_INLINE bool Vec3::CmpAllLt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec3::CmpAllLt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLt(arg1, arg2, 0x0FFF); return Sse::CmpAllLt(arg1, arg2, 0b0111);
} }
AZ_MATH_INLINE bool Vec3::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec3::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLtEq(arg1, arg2, 0x0FFF); return Sse::CmpAllLtEq(arg1, arg2, 0b0111);
} }
AZ_MATH_INLINE bool Vec3::CmpAllGt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec3::CmpAllGt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGt(arg1, arg2, 0x0FFF); return Sse::CmpAllGt(arg1, arg2, 0b0111);
} }
AZ_MATH_INLINE bool Vec3::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec3::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGtEq(arg1, arg2, 0x0FFF); return Sse::CmpAllGtEq(arg1, arg2, 0b0111);
} }
@ -485,7 +486,7 @@ namespace AZ
AZ_MATH_INLINE bool Vec3::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2) AZ_MATH_INLINE bool Vec3::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2)
{ {
return Sse::CmpAllEq(arg1, arg2, 0x0FFF); return Sse::CmpAllEq(arg1, arg2, 0b0111);
} }

@ -455,31 +455,32 @@ namespace AZ
AZ_MATH_INLINE bool Vec4::CmpAllEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec4::CmpAllEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllEq(arg1, arg2, 0xFFFF); // Check the first four bits for Vector4
return Sse::CmpAllEq(arg1, arg2, 0b1111);
} }
AZ_MATH_INLINE bool Vec4::CmpAllLt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec4::CmpAllLt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLt(arg1, arg2, 0xFFFF); return Sse::CmpAllLt(arg1, arg2, 0b1111);
} }
AZ_MATH_INLINE bool Vec4::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec4::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllLtEq(arg1, arg2, 0xFFFF); return Sse::CmpAllLtEq(arg1, arg2, 0b1111);
} }
AZ_MATH_INLINE bool Vec4::CmpAllGt(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec4::CmpAllGt(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGt(arg1, arg2, 0xFFFF); return Sse::CmpAllGt(arg1, arg2, 0b1111);
} }
AZ_MATH_INLINE bool Vec4::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2) AZ_MATH_INLINE bool Vec4::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2)
{ {
return Sse::CmpAllGtEq(arg1, arg2, 0xFFFF); return Sse::CmpAllGtEq(arg1, arg2, 0b1111);
} }
@ -521,7 +522,7 @@ namespace AZ
AZ_MATH_INLINE bool Vec4::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2) AZ_MATH_INLINE bool Vec4::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2)
{ {
return Sse::CmpAllEq(arg1, arg2, 0xFFFF); return Sse::CmpAllEq(arg1, arg2, 0b1111);
} }

Loading…
Cancel
Save