Version 1.8.4

svn merge -c 42044 https://dart.googlecode.com/svn/branches/bleeding_edge 1.8

R=kasperl@google.com

Review URL: https://codereview.chromium.org//828433005

git-svn-id: http://dart.googlecode.com/svn/branches/1.8@42732 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index c6993f1..03aae79 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1689,11 +1689,19 @@
     Exchange(source.base_reg(), source.ToStackSlotOffset(),
              destination.base_reg(), destination.ToStackSlotOffset());
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
-    const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
-    DRegister src = EvenDRegisterOf(source.fpu_reg());
-    __ vmovd(DTMP, src);
-    __ vmovd(src, dst);
-    __ vmovd(dst, DTMP);
+    if (TargetCPUFeatures::neon_supported()) {
+      const QRegister dst = destination.fpu_reg();
+      const QRegister src = source.fpu_reg();
+      __ vmovq(QTMP, src);
+      __ vmovq(src, dst);
+      __ vmovq(dst, QTMP);
+    } else {
+      const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+      const DRegister src = EvenDRegisterOf(source.fpu_reg());
+      __ vmovd(DTMP, src);
+      __ vmovd(src, dst);
+      __ vmovd(dst, DTMP);
+    }
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
            destination.IsQuadStackSlot() ||
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index efe6b32..1ade094 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1670,9 +1670,9 @@
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
     const VRegister dst = destination.fpu_reg();
     const VRegister src = source.fpu_reg();
-    __ fmovdd(VTMP, src);
-    __ fmovdd(src, dst);
-    __ fmovdd(dst, VTMP);
+    __ vmov(VTMP, src);
+    __ vmov(src, dst);
+    __ vmov(dst, VTMP);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
            destination.IsQuadStackSlot() ||
@@ -1696,7 +1696,7 @@
     } else {
       __ LoadQFromOffset(VTMP, base_reg, slot_offset, PP);
       __ StoreQToOffset(reg, base_reg, slot_offset, PP);
-      __ fmovdd(reg, VTMP);
+      __ vmov(reg, VTMP);
     }
   } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
     const intptr_t source_offset = source.ToStackSlotOffset();
diff --git a/tools/VERSION b/tools/VERSION
index 2b04169..b02fbca 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -26,6 +26,6 @@
 CHANNEL stable
 MAJOR 1
 MINOR 8
-PATCH 3
+PATCH 4
 PRERELEASE 0
 PRERELEASE_PATCH 0