<div dir="ltr"><span style="font-size:12.8000001907349px">Hi,</span><br style="font-size:12.8000001907349px"><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">    I would like to contribute support for vectorizing fabs & fneg instructions on aarch64 architecture.</span><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">    The patch takes a similar way as adding support for vectorizing double precision sqrt on Intel architectures.  And two new tests are added.</span><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">    The performance gain for the "sumReductionImplement" function is: 30% for single precision and </span><span style="font-size:12.8000001907349px">10% for double precision </span><span style="font-size:12.8000001907349px">with LoopMaxUnroll=16.</span><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">    I have tested this with JTreg hotspot+langtools+jdk with no regressions.  Is it OK?</span><div>    <span style="font-size:12.8000001907349px">As this patch involves changes to shared code, I also need an Oracle sponsor for it if approved.</span><br style="font-size:12.8000001907349px"><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">Thanks,</span><br style="font-size:12.8000001907349px"><span style="font-size:12.8000001907349px">Felix</span><br><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">PATCH:</span></div><div><div>diff -r 66d90f141fd8 src/cpu/aarch64/vm/<a href="http://aarch64.ad">aarch64.ad</a></div><div>--- a/src/cpu/aarch64/vm/<a href="http://aarch64.ad">aarch64.ad</a><span class="" style="white-space:pre">    </span>Tue Sep 22 13:42:09 2015 +0200</div><div>+++ b/src/cpu/aarch64/vm/<a href="http://aarch64.ad">aarch64.ad</a><span class="" style="white-space:pre">    </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -15190,6 +15190,88 @@</div><div>   ins_pipe(pipe_class_default);</div><div> %}</div><div> </div><div>+// --------------------------------- ABS --------------------------------------</div><div>+</div><div>+instruct vabs2F(vecD dst, vecD src)</div><div>+%{</div><div>+  predicate(n->as_Vector()->length() == 2);</div><div>+  match(Set dst (AbsVF src));</div><div>+  ins_cost(INSN_COST * 3);</div><div>+  format %{ "fabs  $dst,$src\t# vector (2S)" %}</div><div>+  ins_encode %{</div><div>+    __ fabs(as_FloatRegister($dst$$reg), __ T2S,</div><div>+            as_FloatRegister($src$$reg));</div><div>+  %}</div><div>+  ins_pipe(pipe_class_default);</div><div>+%}</div><div>+</div><div>+instruct vabs4F(vecX dst, vecX src)</div><div>+%{</div><div>+  predicate(n->as_Vector()->length() == 4);</div><div>+  match(Set dst (AbsVF src));</div><div>+  ins_cost(INSN_COST * 3);</div><div>+  format %{ "fabs  $dst,$src\t# vector (4S)" %}</div><div>+  ins_encode %{</div><div>+    __ fabs(as_FloatRegister($dst$$reg), __ T4S,</div><div>+            as_FloatRegister($src$$reg));</div><div>+  %}</div><div>+  ins_pipe(pipe_class_default);</div><div>+%}</div><div>+</div><div>+instruct vabs2D(vecX dst, vecX src)</div><div>+%{</div><div>+  predicate(n->as_Vector()->length() == 2);</div><div>+  match(Set dst (AbsVD src));</div><div>+  ins_cost(INSN_COST * 3);</div><div>+  format %{ "fabs  $dst,$src\t# vector (2D)" %}</div><div>+  ins_encode %{</div><div>+    __ fabs(as_FloatRegister($dst$$reg), __ T2D,</div><div>+            as_FloatRegister($src$$reg));</div><div>+  %}</div><div>+  ins_pipe(pipe_class_default);</div><div>+%}</div><div>+</div><div>+// --------------------------------- NEG --------------------------------------</div><div>+</div><div>+instruct vneg2F(vecD dst, vecD src)</div><div>+%{</div><div>+  predicate(n->as_Vector()->length() == 2);</div><div>+  match(Set dst (NegVF src));</div><div>+  ins_cost(INSN_COST * 3);</div><div>+  format %{ "fneg  $dst,$src\t# vector (2S)" %}</div><div>+  ins_encode %{</div><div>+    __ fneg(as_FloatRegister($dst$$reg), __ T2S,</div><div>+            as_FloatRegister($src$$reg));</div><div>+  %}</div><div>+  ins_pipe(pipe_class_default);</div><div>+%}</div><div>+</div><div>+instruct vneg4F(vecX dst, vecX src)</div><div>+%{</div><div>+  predicate(n->as_Vector()->length() == 4);</div><div>+  match(Set dst (NegVF src));</div><div>+  ins_cost(INSN_COST * 3);</div><div>+  format %{ "fneg  $dst,$src\t# vector (4S)" %}</div><div>+  ins_encode %{</div><div>+    __ fneg(as_FloatRegister($dst$$reg), __ T4S,</div><div>+            as_FloatRegister($src$$reg));</div><div>+  %}</div><div>+  ins_pipe(pipe_class_default);</div><div>+%}</div><div>+</div><div>+instruct vneg2D(vecX dst, vecX src)</div><div>+%{</div><div>+  predicate(n->as_Vector()->length() == 2);</div><div>+  match(Set dst (NegVD src));</div><div>+  ins_cost(INSN_COST * 3);</div><div>+  format %{ "fneg  $dst,$src\t# vector (2D)" %}</div><div>+  ins_encode %{</div><div>+    __ fneg(as_FloatRegister($dst$$reg), __ T2D,</div><div>+            as_FloatRegister($src$$reg));</div><div>+  %}</div><div>+  ins_pipe(pipe_class_default);</div><div>+%}</div><div>+</div><div> // --------------------------------- AND --------------------------------------</div><div> </div><div> instruct vand8B(vecD dst, vecD src1, vecD src2)</div><div>diff -r 66d90f141fd8 src/cpu/aarch64/vm/assembler_aarch64.hpp</div><div>--- a/src/cpu/aarch64/vm/assembler_aarch64.hpp<span class="" style="white-space:pre">      </span>Tue Sep 22 13:42:09 2015 +0200</div><div>+++ b/src/cpu/aarch64/vm/assembler_aarch64.hpp<span class="" style="white-space:pre">       </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -2106,6 +2106,19 @@</div><div> </div><div> #undef INSN</div><div> </div><div>+#define INSN(NAME, opc, opc2) \</div><div>+  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {                   \</div><div>+    starti;                                                                             \</div><div>+    assert(T == T2S || T == T4S || T == T2D, "invalid arrangement");                    \</div><div>+    f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24), f(1, 23);              \</div><div>+    f(T==T2D ? 1:0, 22), f(opc2, 21, 10), rf(Vn, 5), rf(Vd, 0);                         \</div><div>+  }</div><div>+</div><div>+  INSN(fabs, 0, 0b100000111110);</div><div>+  INSN(fneg, 1, 0b100000111110);</div><div>+</div><div>+#undef INSN</div><div>+</div><div> #define INSN(NAME, opc)                                                                 \</div><div>   void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \</div><div>     starti;                                                                             \</div><div>diff -r 66d90f141fd8 src/share/vm/adlc/formssel.cpp</div><div>--- a/src/share/vm/adlc/formssel.cpp<span class="" style="white-space:pre">     </span>Tue Sep 22 13:42:09 2015 +0200</div><div>+++ b/src/share/vm/adlc/formssel.cpp<span class="" style="white-space:pre"> </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -4143,6 +4143,8 @@</div><div>     "SubVB","SubVS","SubVI","SubVL","SubVF","SubVD",</div><div>     "MulVS","MulVI","MulVL","MulVF","MulVD",</div><div>     "DivVF","DivVD",</div><div>+    "AbsVF","AbsVD",</div><div>+    "NegVF","NegVD",</div><div>     "SqrtVD",</div><div>     "AndV" ,"XorV" ,"OrV",</div><div>     "AddReductionVI", "AddReductionVL",</div><div>diff -r 66d90f141fd8 src/share/vm/opto/classes.hpp</div><div>--- a/src/share/vm/opto/classes.hpp<span class="" style="white-space:pre">       </span>Tue Sep 22 13:42:09 2015 +0200</div><div>+++ b/src/share/vm/opto/classes.hpp<span class="" style="white-space:pre">  </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -290,6 +290,10 @@</div><div> macro(MulReductionVD)</div><div> macro(DivVF)</div><div> macro(DivVD)</div><div>+macro(AbsVF)</div><div>+macro(AbsVD)</div><div>+macro(NegVF)</div><div>+macro(NegVD)</div><div> macro(SqrtVD)</div><div> macro(LShiftCntV)</div><div> macro(RShiftCntV)</div><div>diff -r 66d90f141fd8 src/share/vm/opto/superword.cpp</div><div>--- a/src/share/vm/opto/superword.cpp<span class="" style="white-space:pre">        </span>Tue Sep 22 13:42:09 2015 +0200</div><div>+++ b/src/share/vm/opto/superword.cpp<span class="" style="white-space:pre">        </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -1858,8 +1858,8 @@</div><div>           vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n));</div><div>           vlen_in_bytes = vn->as_Vector()->length_in_bytes();</div><div>         }</div><div>-      } else if (opc == Op_SqrtD) {</div><div>-        // Promote operand to vector (Sqrt is a 2 address instruction)</div><div>+      } else if (opc == Op_SqrtD || opc == Op_AbsF || opc == Op_AbsD || opc == Op_NegF || opc == Op_NegD) {</div><div>+        // Promote operand to vector (Sqrt/Abs/Neg are 2 address instructions)</div><div>         Node* in = vector_opd(p, 1);</div><div>         vn = VectorNode::make(opc, in, NULL, vlen, velt_basic_type(n));</div><div>         vlen_in_bytes = vn->as_Vector()->length_in_bytes();</div><div>diff -r 66d90f141fd8 src/share/vm/opto/vectornode.cpp</div><div>--- a/src/share/vm/opto/vectornode.cpp<span class="" style="white-space:pre">      </span>Tue Sep 22 13:42:09 2015 +0200</div><div>+++ b/src/share/vm/opto/vectornode.cpp<span class="" style="white-space:pre">       </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -92,6 +92,18 @@</div><div>   case Op_DivD:</div><div>     assert(bt == T_DOUBLE, "must be");</div><div>     return Op_DivVD;</div><div>+  case Op_AbsF:</div><div>+    assert(bt == T_FLOAT, "must be");</div><div>+    return Op_AbsVF;</div><div>+  case Op_AbsD:</div><div>+    assert(bt == T_DOUBLE, "must be");</div><div>+    return Op_AbsVD;</div><div>+  case Op_NegF:</div><div>+    assert(bt == T_FLOAT, "must be");</div><div>+    return Op_NegVF;</div><div>+  case Op_NegD:</div><div>+    assert(bt == T_DOUBLE, "must be");</div><div>+    return Op_NegVD;</div><div>   case Op_SqrtD:</div><div>     assert(bt == T_DOUBLE, "must be");</div><div>     return Op_SqrtVD;</div><div>@@ -280,6 +292,12 @@</div><div>   case Op_DivVF: return new DivVFNode(n1, n2, vt);</div><div>   case Op_DivVD: return new DivVDNode(n1, n2, vt);</div><div> </div><div>+  case Op_AbsVF: return new AbsVFNode(n1, vt);</div><div>+  case Op_AbsVD: return new AbsVDNode(n1, vt);</div><div>+</div><div>+  case Op_NegVF: return new NegVFNode(n1, vt);</div><div>+  case Op_NegVD: return new NegVDNode(n1, vt);</div><div>+</div><div>   // Currently only supports double precision sqrt</div><div>   case Op_SqrtVD: return new SqrtVDNode(n1, vt);</div><div> </div><div>diff -r 66d90f141fd8 src/share/vm/opto/vectornode.hpp</div><div>--- a/src/share/vm/opto/vectornode.hpp<span class="" style="white-space:pre">     </span>Tue Sep 22 13:42:09 2015 +0200</div><div>+++ b/src/share/vm/opto/vectornode.hpp<span class="" style="white-space:pre">       </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -309,6 +309,38 @@</div><div>   virtual int Opcode() const;</div><div> };</div><div> </div><div>+//------------------------------AbsVFNode--------------------------------------</div><div>+// Vector Abs float</div><div>+class AbsVFNode : public VectorNode {</div><div>+ public:</div><div>+  AbsVFNode(Node* in, const TypeVect* vt) : VectorNode(in,vt) {}</div><div>+  virtual int Opcode() const;</div><div>+};</div><div>+</div><div>+//------------------------------AbsVDNode--------------------------------------</div><div>+// Vector Abs double</div><div>+class AbsVDNode : public VectorNode {</div><div>+ public:</div><div>+  AbsVDNode(Node* in, const TypeVect* vt) : VectorNode(in,vt) {}</div><div>+  virtual int Opcode() const;</div><div>+};</div><div>+</div><div>+//------------------------------NegVFNode--------------------------------------</div><div>+// Vector Neg float</div><div>+class NegVFNode : public VectorNode {</div><div>+ public:</div><div>+  NegVFNode(Node* in, const TypeVect* vt) : VectorNode(in,vt) {}</div><div>+  virtual int Opcode() const;</div><div>+};</div><div>+</div><div>+//------------------------------NegVDNode--------------------------------------</div><div>+// Vector Neg double</div><div>+class NegVDNode : public VectorNode {</div><div>+ public:</div><div>+  NegVDNode(Node* in, const TypeVect* vt) : VectorNode(in,vt) {}</div><div>+  virtual int Opcode() const;</div><div>+};</div><div>+</div><div> //------------------------------SqrtVDNode--------------------------------------</div><div> // Vector Sqrt double</div><div> class SqrtVDNode : public VectorNode {</div><div>diff -r 66d90f141fd8 test/compiler/loopopts/superword/SumRedAbsNeg_Double.java</div><div>--- /dev/null<span class="" style="white-space:pre">     </span>Thu Jan 01 00:00:00 1970 +0000</div><div>+++ b/test/compiler/loopopts/superword/SumRedAbsNeg_Double.java<span class="" style="white-space:pre">      </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -0,0 +1,98 @@</div><div>+/*</div><div>+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.</div><div>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.</div><div>+ *</div><div>+ * This code is free software; you can redistribute it and/or modify it</div><div>+ * under the terms of the GNU General Public License version 2 only, as</div><div>+ * published by the Free Software Foundation.</div><div>+ *</div><div>+ * This code is distributed in the hope that it will be useful, but WITHOUT</div><div>+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</div><div>+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License</div><div>+ * version 2 for more details (a copy is included in the LICENSE file that</div><div>+ * accompanied this code).</div><div>+ *</div><div>+ * You should have received a copy of the GNU General Public License version</div><div>+ * 2 along with this work; if not, write to the Free Software Foundation,</div><div>+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.</div><div>+ *</div><div>+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA</div><div>+ * or visit <a href="http://www.oracle.com">www.oracle.com</a> if you need additional information or have any</div><div>+ * questions.</div><div>+ *</div><div>+ */</div><div>+</div><div>+/**</div><div>+ * @test</div><div>+ * @summary Add C2 AArch64 Superword support for scalar sum reduction optimizations : double abs & neg test</div><div>+ * @requires os.arch=="aarch64"</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=2 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=2 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=4 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=4 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=8 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=8 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=16 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=16 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Double</div><div>+ */</div><div>+</div><div>+public class SumRedAbsNeg_Double</div><div>+{</div><div>+  public static void main(String[] args) throws Exception {</div><div>+    double[] a = new double[256*1024];</div><div>+    double[] b = new double[256*1024];</div><div>+    double[] c = new double[256*1024];</div><div>+    double[] d = new double[256*1024];</div><div>+    sumReductionInit(a,b,c);</div><div>+    double total = 0;</div><div>+    double valid = 3.6028590866691944E19;</div><div>+</div><div>+    for(int j = 0; j < 2000; j++) {</div><div>+      total = sumReductionImplement(a,b,c,d,total);</div><div>+    }</div><div>+</div><div>+    if(total == valid) {</div><div>+      System.out.println("Success");</div><div>+    } else {</div><div>+      System.out.println("Invalid sum of elements variable in total: " + total);</div><div>+      System.out.println("Expected value = " + valid);</div><div>+      throw new Exception("Failed");</div><div>+    }</div><div>+  }</div><div>+</div><div>+  public static void sumReductionInit(</div><div>+    double[] a,</div><div>+    double[] b,</div><div>+    double[] c)</div><div>+  {</div><div>+    for(int j = 0; j < 1; j++)</div><div>+    {</div><div>+      for(int i = 0; i < a.length; i++)</div><div>+      {</div><div>+        a[i] = i * 1 + j;</div><div>+        b[i] = i * 1 - j;</div><div>+        c[i] = i + j;</div><div>+      }</div><div>+    }</div><div>+  }</div><div>+</div><div>+  public static double sumReductionImplement(</div><div>+    double[] a,</div><div>+    double[] b,</div><div>+    double[] c,</div><div>+    double[] d,</div><div>+    double total)</div><div>+  {</div><div>+    for(int i = 0; i < a.length; i++)</div><div>+    {</div><div>+      d[i] = Math.abs(-a[i] * -b[i]) + Math.abs(-a[i] * -c[i]) + Math.abs(-b[i] * -c[i]);</div><div>+      total += d[i];</div><div>+    }</div><div>+    return total;</div><div>+  }</div><div>+</div><div>+}</div><div>diff -r 66d90f141fd8 test/compiler/loopopts/superword/SumRedAbsNeg_Float.java</div><div>--- /dev/null<span class="" style="white-space:pre"> </span>Thu Jan 01 00:00:00 1970 +0000</div><div>+++ b/test/compiler/loopopts/superword/SumRedAbsNeg_Float.java<span class="" style="white-space:pre">       </span>Wed Sep 23 12:27:37 2015 +0800</div><div>@@ -0,0 +1,98 @@</div><div>+/*</div><div>+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.</div><div>+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.</div><div>+ *</div><div>+ * This code is free software; you can redistribute it and/or modify it</div><div>+ * under the terms of the GNU General Public License version 2 only, as</div><div>+ * published by the Free Software Foundation.</div><div>+ *</div><div>+ * This code is distributed in the hope that it will be useful, but WITHOUT</div><div>+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</div><div>+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License</div><div>+ * version 2 for more details (a copy is included in the LICENSE file that</div><div>+ * accompanied this code).</div><div>+ *</div><div>+ * You should have received a copy of the GNU General Public License version</div><div>+ * 2 along with this work; if not, write to the Free Software Foundation,</div><div>+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.</div><div>+ *</div><div>+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA</div><div>+ * or visit <a href="http://www.oracle.com">www.oracle.com</a> if you need additional information or have any</div><div>+ * questions.</div><div>+ *</div><div>+ */</div><div>+</div><div>+/**</div><div>+ * @test</div><div>+ * @summary Add C2 AArch64 Superword support for scalar sum reduction optimizations : float abs & neg test</div><div>+ * @requires os.arch=="aarch64"</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=2 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=2 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=4 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=4 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=8 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=8 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ *</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=16 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-SuperWordReductions -XX:LoopUnrollLimit=250 -XX:LoopMaxUnroll=16 -XX:CompileThresholdScaling=0.1 SumRedAbsNeg_Float</div><div>+ */</div><div>+</div><div>+public class SumRedAbsNeg_Float</div><div>+{</div><div>+  public static void main(String[] args) throws Exception {</div><div>+    float[] a = new float[256*1024];</div><div>+    float[] b = new float[256*1024];</div><div>+    float[] c = new float[256*1024];</div><div>+    float[] d = new float[256*1024];</div><div>+    sumReductionInit(a,b,c);</div><div>+    float total = 0;</div><div>+    float valid = (float)4.611686E18;</div><div>+</div><div>+    for(int j = 0; j < 2000; j++) {</div><div>+      total = sumReductionImplement(a,b,c,d,total);</div><div>+    }</div><div>+</div><div>+    if(total == valid) {</div><div>+      System.out.println("Success");</div><div>+    } else {</div><div>+      System.out.println("Invalid sum of elements variable in total: " + total);</div><div>+      System.out.println("Expected value = " + valid);</div><div>+      throw new Exception("Failed");</div><div>+    }</div><div>+  }</div><div>+</div><div>+  public static void sumReductionInit(</div><div>+    float[] a,</div><div>+    float[] b,</div><div>+    float[] c)</div><div>+  {</div><div>+    for(int j = 0; j < 1; j++)</div><div>+    {</div><div>+      for(int i = 0; i < a.length; i++)</div><div>+      {</div><div>+        a[i] = i * 1 + j;</div><div>+        b[i] = i * 1 - j;</div><div>+        c[i] = i + j;</div><div>+      }</div><div>+    }</div><div>+  }</div><div>+</div><div>+  public static float sumReductionImplement(</div><div>+    float[] a,</div><div>+    float[] b,</div><div>+    float[] c,</div><div>+    float[] d,</div><div>+    float total)</div><div>+  {</div><div>+    for(int i = 0; i < a.length; i++)</div><div>+    {</div><div>+      d[i] = Math.abs(-a[i] * -b[i]) + Math.abs(-a[i] * -c[i]) + Math.abs(-b[i] * -c[i]);</div><div>+      total += d[i];</div><div>+    }</div><div>+    return total;</div><div>+  }</div><div>+</div><div>+}</div></div><div><br></div></div></div>