8243155: AArch64: Add support for SqrtVF

Reviewed-by: aph
diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad
index 234e8f2..b72ecef 100644
--- a/src/hotspot/cpu/aarch64/aarch64.ad
+++ b/src/hotspot/cpu/aarch64/aarch64.ad
@@ -13227,7 +13227,7 @@
 %}
 
 instruct sqrtF_reg(vRegF dst, vRegF src) %{
-  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
+  match(Set dst (SqrtF src));
 
   ins_cost(INSN_COST * 50);
   format %{ "fsqrts  $dst, $src" %}
@@ -17041,6 +17041,28 @@
 
 // --------------------------------- SQRT -------------------------------------
 
+instruct vsqrt2F(vecD dst, vecD src)
+%{
+  predicate(n->as_Vector()->length() == 2);
+  match(Set dst (SqrtVF src));
+  format %{ "fsqrt  $dst, $src\t# vector (2F)" %}
+  ins_encode %{
+    __ fsqrt(as_FloatRegister($dst$$reg), __ T2S, as_FloatRegister($src$$reg));
+  %}
+  ins_pipe(vunop_fp64);
+%}
+
+instruct vsqrt4F(vecX dst, vecX src)
+%{
+  predicate(n->as_Vector()->length() == 4);
+  match(Set dst (SqrtVF src));
+  format %{ "fsqrt  $dst, $src\t# vector (4F)" %}
+  ins_encode %{
+    __ fsqrt(as_FloatRegister($dst$$reg), __ T4S, as_FloatRegister($src$$reg));
+  %}
+  ins_pipe(vsqrt_fp128);
+%}
+
 instruct vsqrt2D(vecX dst, vecX src)
 %{
   predicate(n->as_Vector()->length() == 2);
diff --git a/test/hotspot/jtreg/compiler/c2/cr6340864/TestDoubleVect.java b/test/hotspot/jtreg/compiler/c2/cr6340864/TestDoubleVect.java
index 5139ea5..3a94079 100644
--- a/test/hotspot/jtreg/compiler/c2/cr6340864/TestDoubleVect.java
+++ b/test/hotspot/jtreg/compiler/c2/cr6340864/TestDoubleVect.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -90,6 +90,7 @@
       test_rint(a0, a1);
       test_ceil(a0, a1);
       test_floor(a0, a1);
+      test_sqrt(a0, a1);
     }
     // Test and verify results
     System.out.println("Verification");
@@ -404,6 +405,22 @@
       errn += verify("test_rint_cc: ", 0, other_corner_cases_res[0], -0.0);
       errn += verify("test_rint_cc: ", 1, other_corner_cases_res[1], 0.0);
       errn += verify("test_rint_cc: ", 2, other_corner_cases_res[2], 9.007199254740992E15);
+
+      // Overwrite with +0.0/-0.0 values
+      a1[6] = (double)0.0;
+      a1[7] = (double)-0.0;
+      test_sqrt(a0, a1);
+      errn += verify("test_sqrt: ", 0, a0[0], (Double.NaN));
+      errn += verify("test_sqrt: ", 1, a0[1], (Double.POSITIVE_INFINITY));
+      errn += verify("test_sqrt: ", 2, a0[2], (Double.NaN));
+      errn += verify("test_sqrt: ", 3, a0[3], Math.sqrt(Double.MAX_VALUE));
+      errn += verify("test_sqrt: ", 4, a0[4], Math.sqrt(Double.MIN_VALUE));
+      errn += verify("test_sqrt: ", 5, a0[5], Math.sqrt(Double.MIN_NORMAL));
+      errn += verify("test_sqrt: ", 6, a0[6], (double)0.0);
+      errn += verify("test_sqrt: ", 7, a0[7], (double)-0.0);
+      for (int i=8; i<ARRLEN; i++) {
+        errn += verify("test_sqrt: ", i, a0[i], Math.sqrt((double)(ADD_INIT+i)));
+      }
     }
 
     if (errn > 0)
@@ -540,6 +557,13 @@
     end = System.currentTimeMillis();
     System.out.println("test_negc_n: " + (end - start));
 
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_sqrt(a0, a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_sqrt_n: " + (end - start));
+
     return errn;
   }
 
@@ -661,6 +685,12 @@
     }
   }
 
+  static void test_sqrt(double[] a0, double[] a1) {
+    for (int i = 0; i < a0.length; i+=1) {
+      a0[i] = (double)(Math.sqrt((double)a1[i]));
+    }
+  }
+
   static int verify(String text, int i, double elem, double val) {
     if (elem != val && !(Double.isNaN(elem) && Double.isNaN(val))) {
       System.err.println(text + "[" + i + "] = " + elem + " != " + val);
diff --git a/test/hotspot/jtreg/compiler/c2/cr6340864/TestFloatVect.java b/test/hotspot/jtreg/compiler/c2/cr6340864/TestFloatVect.java
index 96106e4..2ce6aa5 100644
--- a/test/hotspot/jtreg/compiler/c2/cr6340864/TestFloatVect.java
+++ b/test/hotspot/jtreg/compiler/c2/cr6340864/TestFloatVect.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -87,6 +87,7 @@
       test_divv(a0, a1, -VALUE);
       test_diva(a0, a1, a3);
       test_negc(a0, a1);
+      test_sqrt(a0, a1);
     }
     // Test and verify results
     System.out.println("Verification");
@@ -352,6 +353,22 @@
         errn += verify("test_negc: ", i, a0[i], (float)(-((float)(ADD_INIT+i))));
       }
 
+      // Overwrite with +0.0/-0.0 values
+      a1[6] = (float)0.0;
+      a1[7] = (float)-0.0;
+      test_sqrt(a0, a1);
+      errn += verify("test_sqrt: ", 0, a0[0], (Float.NaN));
+      errn += verify("test_sqrt: ", 1, a0[1], (Float.POSITIVE_INFINITY));
+      errn += verify("test_sqrt: ", 2, a0[2], (Float.NaN));
+      errn += verify("test_sqrt: ", 3, a0[3], (float)(Math.sqrt((double)Float.MAX_VALUE)));
+      errn += verify("test_sqrt: ", 4, a0[4], (float)(Math.sqrt((double)Float.MIN_VALUE)));
+      errn += verify("test_sqrt: ", 5, a0[5], (float)(Math.sqrt((double)Float.MIN_NORMAL)));
+      errn += verify("test_sqrt: ", 6, a0[6], (float)0.0);
+      errn += verify("test_sqrt: ", 7, a0[7], (float)-0.0);
+      for (int i=8; i<ARRLEN; i++) {
+        errn += verify("test_sqrt: ", i, a0[i], (float)(Math.sqrt((double)(ADD_INIT+i))));
+      }
+
     }
 
     if (errn > 0)
@@ -488,6 +505,13 @@
     end = System.currentTimeMillis();
     System.out.println("test_negc_n: " + (end - start));
 
+    start = System.currentTimeMillis();
+    for (int i=0; i<ITERS; i++) {
+      test_sqrt(a0, a1);
+    }
+    end = System.currentTimeMillis();
+    System.out.println("test_sqrt_n: " + (end - start));
+
     return errn;
   }
 
@@ -579,6 +603,12 @@
     }
   }
 
+  static void test_sqrt(float[] a0, float[] a1) {
+    for (int i = 0; i < a0.length; i+=1) {
+      a0[i] = (float)(Math.sqrt((double)a1[i]));
+    }
+  }
+
   static int verify(String text, int i, float elem, float val) {
     if (elem != val && !(Float.isNaN(elem) && Float.isNaN(val))) {
       System.err.println(text + "[" + i + "] = " + elem + " != " + val);