Jelajahi Sumber

Merge pull request #2944 from huwpascoe/perf-3

Optimized Float<M,E> multiplication
Weiyi Wang 8 tahun lalu
induk
melakukan
a81536f53f
1 mengubah file dengan 7 tambahan dan 11 penghapusan
  1. 7 11
      src/video_core/pica_types.h

+ 7 - 11
src/video_core/pica_types.h

@@ -58,11 +58,12 @@ public:
     }
     }
 
 
     Float<M, E> operator*(const Float<M, E>& flt) const {
     Float<M, E> operator*(const Float<M, E>& flt) const {
-        if ((this->value == 0.f && !std::isnan(flt.value)) ||
-            (flt.value == 0.f && !std::isnan(this->value)))
-            // PICA gives 0 instead of NaN when multiplying by inf
-            return Zero();
-        return Float<M, E>::FromFloat32(ToFloat32() * flt.ToFloat32());
+        float result = value * flt.ToFloat32();
+        // PICA gives 0 instead of NaN when multiplying by inf
+        if (!std::isnan(value) && !std::isnan(flt.ToFloat32()))
+            if (std::isnan(result))
+                result = 0.f;
+        return Float<M, E>::FromFloat32(result);
     }
     }
 
 
     Float<M, E> operator/(const Float<M, E>& flt) const {
     Float<M, E> operator/(const Float<M, E>& flt) const {
@@ -78,12 +79,7 @@ public:
     }
     }
 
 
     Float<M, E>& operator*=(const Float<M, E>& flt) {
     Float<M, E>& operator*=(const Float<M, E>& flt) {
-        if ((this->value == 0.f && !std::isnan(flt.value)) ||
-            (flt.value == 0.f && !std::isnan(this->value)))
-            // PICA gives 0 instead of NaN when multiplying by inf
-            *this = Zero();
-        else
-            value *= flt.ToFloat32();
+        value = operator*(flt).value;
         return *this;
         return *this;
     }
     }