diff --git a/gfx/src/nsRegion.cpp b/gfx/src/nsRegion.cpp
--- a/gfx/src/nsRegion.cpp
+++ b/gfx/src/nsRegion.cpp
@@ -5,16 +5,20 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 
 #include "nsRegion.h"
 #include "nsTArray.h"
 #include "gfxUtils.h"
 #include "mozilla/ToString.h"
 
+#if !defined(NS_COORD_IS_FLOAT) && defined(_MSC_VER) && defined(_M_IX86)
+#include <intrin.h>
+#endif
+
 bool nsRegion::Contains(const nsRegion& aRgn) const
 {
   // XXX this could be made faster by iterating over
   // both regions at the same time some how
   for (auto iter = aRgn.RectIter(); !iter.Done(); iter.Next()) {
     if (!Contains(iter.Get())) {
       return false;
     }
@@ -552,17 +556,21 @@ void nsRegion::SimplifyInward (uint32_t 
   SetEmpty();
 }
 
 uint64_t nsRegion::Area () const
 {
   uint64_t area = 0;
   for (auto iter = RectIter(); !iter.Done(); iter.Next()) {
     const nsRect& rect = iter.Get();
+#if !defined(NS_COORD_IS_FLOAT) && defined(_MSC_VER) && defined(_M_IX86)
+    area += __emul(rect.Width(), rect.Height());
+#else
     area += uint64_t(rect.Width()) * rect.Height();
+#endif
   }
   return area;
 }
 
 nsRegion& nsRegion::ScaleRoundOut (float aXScale, float aYScale)
 {
   if (mozilla::gfx::FuzzyEqual(aXScale, 1.0f) &&
       mozilla::gfx::FuzzyEqual(aYScale, 1.0f)) {
