Преглед на файлове

Fixed CmpAllLt and CmpAllGt functions in Neon Vec3 class. (#7917)

Signed-off-by: moraaar <[email protected]>
moraaar преди 3 години
родител
ревизия
ed0c96e440
променени са 1 файла, в които са добавени 18 реда и са изтрити 2 реда
  1. 18 2
      Code/Framework/AzCore/AzCore/Math/Internal/SimdMathVec3_neon.inl

+ 18 - 2
Code/Framework/AzCore/AzCore/Math/Internal/SimdMathVec3_neon.inl

@@ -353,26 +353,40 @@ namespace AZ
 
 
         AZ_MATH_INLINE bool Vec3::CmpAllEq(FloatArgType arg1, FloatArgType arg2)
         AZ_MATH_INLINE bool Vec3::CmpAllEq(FloatArgType arg1, FloatArgType arg2)
         {
         {
+            // NeonQuad::CmpAllEq compares all 4 elements.
+            // The fourth elements are already equal since it's not used in Vec3.
             return NeonQuad::CmpAllEq(arg1, arg2);
             return NeonQuad::CmpAllEq(arg1, arg2);
         }
         }
 
 
         AZ_MATH_INLINE bool Vec3::CmpAllLt(FloatArgType arg1, FloatArgType arg2)
         AZ_MATH_INLINE bool Vec3::CmpAllLt(FloatArgType arg1, FloatArgType arg2)
         {
         {
-            return NeonQuad::CmpAllLt(arg1, arg2);
+            // NeonQuad::CmpAllLt compares all 4 elements.
+            // This makes sure unused fourth element of arg1 < arg2.
+            return NeonQuad::CmpAllLt(
+                NeonQuad::ReplaceFourth(arg1, 0.0f),
+                NeonQuad::ReplaceFourth(arg2, 1.0f));
         }
         }
 
 
         AZ_MATH_INLINE bool Vec3::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2)
         AZ_MATH_INLINE bool Vec3::CmpAllLtEq(FloatArgType arg1, FloatArgType arg2)
         {
         {
+            // NeonQuad::CmpAllLtEq compares all 4 elements.
+            // The fourth elements are already equal since it's not used in Vec3.
             return NeonQuad::CmpAllLtEq(arg1, arg2);
             return NeonQuad::CmpAllLtEq(arg1, arg2);
         }
         }
 
 
         AZ_MATH_INLINE bool Vec3::CmpAllGt(FloatArgType arg1, FloatArgType arg2)
         AZ_MATH_INLINE bool Vec3::CmpAllGt(FloatArgType arg1, FloatArgType arg2)
         {
         {
-            return NeonQuad::CmpAllGt(arg1, arg2);
+            // NeonQuad::CmpAllGt compares all 4 elements.
+            // This makes sure unused fourth element of arg1 > arg2.
+            return NeonQuad::CmpAllLt(
+                NeonQuad::ReplaceFourth(arg1, 1.0f),
+                NeonQuad::ReplaceFourth(arg2, 0.0f));
         }
         }
 
 
         AZ_MATH_INLINE bool Vec3::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2)
         AZ_MATH_INLINE bool Vec3::CmpAllGtEq(FloatArgType arg1, FloatArgType arg2)
         {
         {
+            // NeonQuad::CmpAllGtEq compares all 4 elements.
+            // The fourth elements are already equal since it's not used in Vec3.
             return NeonQuad::CmpAllGtEq(arg1, arg2);
             return NeonQuad::CmpAllGtEq(arg1, arg2);
         }
         }
 
 
@@ -408,6 +422,8 @@ namespace AZ
 
 
         AZ_MATH_INLINE bool Vec3::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2)
         AZ_MATH_INLINE bool Vec3::CmpAllEq(Int32ArgType arg1, Int32ArgType arg2)
         {
         {
+            // NeonQuad::CmpAllEq compares all 4 elements.
+            // The fourth elements are already equal since it's not used in Vec3.
             return NeonQuad::CmpAllEq(arg1, arg2);
             return NeonQuad::CmpAllEq(arg1, arg2);
         }
         }